#0 -1 » [script/bash] post-installation pour Ubuntu 13.04 » Le 12/05/2013, à 18:58
- nicolas66
- Réponses : 4
Bonjour à tous,
Pour gagner du temps, j'ai récemment écrit un script de post-installation pour Ubuntu 13.04. J'ai hésité longuement à soumettre ce script car il est souvent propre à chacun et celui-ci n'échappe pas à la règle. Il peut néanmoins servir facilement de base pour d'autres personnes.
#!/bin/bash
#########################################################################
# Filename : post-installation_ubuntu_13.04.sh #
# Description : post-installation script on Ubuntu 13.04 #
# Authors : nicolas66 #
# Last release: 12-05-2013 #
# Requirements: zenity #
#########################################################################
function upgrade_system()
{
sudo apt-get dist-upgrade
}
function install_nvidia_drivers()
{
sudo apt-get update
sudo apt-get install -y linux-headers-generic
sudo apt-get dist-upgrade
if [ -f ~/.reboot1 ]; then
\rm -f ~/.reboot{0..1}
fi
if [ ! -f ~/.reboot0 ]; then
touch ~/.reboot0
zenity --info --text="L'ordinateur va rebooter une première fois (relancer cette étape)"
sudo reboot
fi
sudo apt-get install -y nvidia-current-updates
nvidia-xconfig
if [ ! -f ~/.reboot1 ]; then
touch ~/.reboot1
zenity --info --text="L'ordinateur va rebooter une seconde et dernière fois (le logo nvidia doit apparaître)"
sudo reboot
fi
}
function remove_dash_shell()
{
zenity --info --text="Répondre 'yes' puis 'ok' sur l'écran qui suit"
sudo dpkg-reconfigure dash
}
function get_bash_scripts()
{
sudo apt-get install -y lftp
local_dir=$(zenity --entry --text="Veuillez saisir le dossier local des scripts :" --entry-text="")
remote_dir=$(zenity --entry --text="Veuillez saisir le dossier distant des scripts :" --entry-text="")
ftp_servername=$(zenity --entry --text="Veuillez saisir le nom du serveur ftp :" --entry-text="")
username=$(zenity --entry --text="Veuillez saisir le login du compte ftp :" --entry-text="")
c1="[ -d ${local_dir} ] && (lftp -e \"open ${ftp_servername}; user ${username}; mirror -v ${remote_dir} ${local_dir}; bye\"; chmod -R 755 ${local_dir}) || echo \"error: directory ${local_dir} does not exist\""
c2="[ -d ${local_dir} ] && lftp -e \"open ${ftp_servername}; user ${username}; mirror -v -R ${local_dir} ${remote_dir}; bye\" || echo \"error: directory ${local_dir} does not exist\""
if [ ! -d "${local_dir}" ]; then
mkdir "${local_dir}"
eval "${c1}"
else
zenity --question --text="Le répertoire ${local_dir} existe déjà. L'écraser ?"
[ $? -eq 0 ] && eval "${c1}"
fi
if [ ! -f ${local_dir}/bash_aliases_common.sh ]; then
touch ${local_dir}/bash_aliases_common.sh
fi
if [ ! -f ~/.bash_aliases ] || zenity --question --text="Le fichier ~/.bash_aliases existe déjà. L'écraser ?"; then
(
echo -e '#!/bin/bash\n'
echo -e "alias get_scripts='${c1}'"
echo -e "alias put_scripts='${c2}'"
echo -e "source ${local_dir}/bash_aliases_common.sh"
echo -e "source ${local_dir}/bash_aliases_${HOSTNAME}.sh"
) > ~/.bash_aliases
fi
zenity --info --text "Pensez à fermer et ouvrir à nouveau votre terminal pour que les changements soient pris en compte."
}
function mount_nas()
{
user=$(zenity --entry --text="Veuillez saisir le login du NAS :" --entry-text="")
ip=$(zenity --entry --text="Veuillez saisir l'adresse ip du NAS :" --entry-text="")
port=$(zenity --entry --text="Veuillez saisir le port SSH du NAS :" --entry-text="")
local_dir=$(zenity --entry --text="Veuillez saisir le dossier de stockage local :" --entry-text="")
remote_dir=$(zenity --entry --text="Veuillez saisir le dossier de stockage distant :" --entry-text="")
[ ! -d "${local_dir}" ] && sudo mkdir "${local_dir}"
line="${ip}:${remote_dir} ${local_dir} nfs defaults,_netdev 0 2"
zenity --entry --text="Veuillez copier la ligne suivante et l'ajouter à la fin du fichier qui suit :" --entry-text="${line}" &>/dev/null
sudo gedit /etc/fstab
sudo mount -a
}
function remove_plugins_and_lenses()
{
sudo apt-get remove -y --purge account-plugin-aim \
account-plugin-facebook \
account-plugin-flickr \
account-plugin-google \
account-plugin-icons \
account-plugin-identica \
account-plugin-jabber \
account-plugin-salut \
account-plugin-twitter \
account-plugin-windows-live \
account-plugin-yahoo \
gnome-online-accounts \
unity-lens-*
}
function restore_old_scrollbars()
{
sudo apt-get remove -y --purge overlay-scrollbar
}
function install_ssmtp()
{
sudo apt-get install -y ssmtp
sending_mail=$(zenity --entry --text="Veuillez saisir l'adresse gmail d'envoi :" --entry-text="")
mail_server=$(zenity --entry --text="Veuillez saisir le serveur smtp :" --entry-text="smtp.gmail.com:587")
user_login=$(zenity --entry --text="Veuillez saisir l'identifiant du compte gmail :" --entry-text="")
user_passwd=$(zenity --entry --text="Veuillez saisir le mot de passe du compte gmail :" --entry-text="")
host_name=$(hostname)
str=$(cat << EOF
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=${sending_mail}
# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=${mail_server}
# Where will the mail seem to come from?
#rewriteDomain=
# The full hostname
hostname=${host_name}
# User
AuthUser=${user_login}
AuthPass=${user_passwd}
# TLS
UseSTARTTLS=YES
# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=NO
EOF
)
echo "${str}" | sudo tee /etc/ssmtp/ssmtp.conf >/dev/null
}
function move_window_buttons()
{
# move window buttons on right
sudo gsettings set org.gnome.desktop.wm.preferences button-layout ':minimize,maximize,close'
}
function active_history_completion()
{
cat > ~/.inputrc << EOF
"\e[A": history-search-backward
"\e[B": history-search-forward
set show-all-if-ambiguous on
set completion-ignore-case on
EOF
}
function customize_grub2()
{
# install grub-customizer
sudo apt-add-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install -y grub-customizer
# backup original config
sudo cp -Rv /etc/grub.d /etc/grub.d.ori
# remove memtest entries
sudo chmod -x /etc/grub.d/20_memtest86+
# edit configuration file
zenity --info --text="Dans ce qui suit, mettre la variable 'GRUB_DISABLE_RECOVERY' à 'false'."
sudo gedit /etc/default/grub
sudo update-grub
# run grub-customizer
zenity --info --text="Dans ce qui suit:\n- Renommer les entrées 'Ubuntu' et 'Windows'\n- Supprimer le sous-menu 'Options avancées'"
sudo grub-customizer
}
function customize_firefox()
{
sudo mkdir /usr/share/ubuntu
sudo ln -s /usr/share/unity-webapps /usr/share/gnome/unity-webapps
sudo ln -s /usr/share/unity-webapps /usr/share/ubuntu/unity-webapps
sudo ln -s /usr/share/unity-webapps /usr/local/share/unity-webapps
zenity --entry --text="Veuillez saisir la clé pour configurer Firefox Sync :" --entry-text=""
firefox
}
function install_java()
{
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install -y oracle-java7-installer
cd /usr/lib/jvm
sudo ln -s java-7-oracle default-java
cd - &> /dev/null
}
function install_lamp_server()
{
# packages
sudo apt-get install -y apache2 \
php5 \
mysql-server \
libapache2-mod-php5 \
php5-mysql \
phpmyadmin \
libapache2-mod-auth-mysql \
php5-curl \
php5-xsl
# modules activation
sudo a2enmod auth_mysql userdir ssl
sudo a2ensite default-ssl
# creation of public_html directory
mkdir ~/public_html
chmod o+x ~ ~/public_html/
# edit files
zenity --info --text="Dans ce qui suit, mettre en commentaire la ligne contenant 'php_admin_value'."
sudo gedit /etc/apache2/mods-available/php5.conf
zenity --info --text="Dans ce qui suit, ajouter la ligne 'ServerName 127.0.0.1'."
sudo gedit /etc/apache2/apache2.conf
zenity --info --text="Dans ce qui suit, remplacer resp. les directives 'AllowOverride' et 'Options' par :\n- AllowOverride All\n- Options Indexes FollowSymLinks"
sudo gedit /etc/apache2/mods-enabled/userdir.conf
# reloading
sudo service apache2 restart
sudo /etc/init.d/apache2 reload
}
function install_ssh_server()
{
# install package
sudo apt-get install -y ssh
# edit server config file
zenity --info --text="Dans ce qui suit, indiquer la valeur du port SSH et basculer 'PermitRootLogin' à 'no'."
sudo gedit /etc/ssh/sshd_config
}
function install_web_dev_kit()
{
sudo apt-get update
sudo apt-get install -y python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install -y nodejs
sudo npm install jshint recess connect hogan.js uglify-js@1 -g
sudo ln -s /usr/bin/nodejs /usr/bin/node
}
function install_latex()
{
sudo apt-get install -y texlive \
texlive-bibtex-extra \
texlive-fonts-extra \
texlive-lang-french \
texlive-math-extra \
texlive-pictures \
texlive-science
}
function install_extra_packages()
{
# general
sudo apt-get install -y gedit-plugins \
subversion \
bum \
libtool \
autoconf \
g++ \
moc \
filezilla \
imagemagick \
manpages-fr-extra \
ispell \
ifrench \
obextool \
pdftk \
pidgin \
libjpeg-turbo-progs \
exiftran \
rar \
unrar \
ntfsprogs \
gparted \
doxygen \
mesa-utils \
nfs-common \
easytag \
fuse-utils \
curlftpfs \
meld \
gnuplot-x11 \
libglew-dev \
libsdl1.2-dev \
qtikz \
gle-graphics \
apt-file \
gimp
sudo apt-file update
}
function repair_splash_screen()
{
sudo apt-get install -y v86d
resolution=$(zenity --entry --text="Veuillez saisir la résolution maximum supportée par grub. Si vous ne la connaissez pas, tapez la commande 'vbeinfo' dans grub au démarrage :" --entry-text="1440x900")
depth=$(zenity --entry --text="Veuillez saisir la profondeur associée :" --entry-text="32")
zenity --info --text="Dans ce qui suit, remplacer :\n- Le contenu de la variable 'GRUB_CMDLINE_LINUX_DEFAULT' par : quiet splash nomodeset video=uvesafb:mode_option=${resolution}-${depth},mtrr=3,scroll=ywrap\n- Le contenu de la variable 'GRUB_GFXMODE' par : ${resolution}"
sudo gedit /etc/default/grub
zenity --info --text="Dans ce qui suit, rajouter à la fin du fichier la ligne suivante :\nuvesafb mode_option=${resolution}-${depth} mtrr=3 scroll=ywrap"
sudo gedit /etc/initramfs-tools/modules
echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash
sudo update-grub2
sudo update-initramfs -u
}
########################
function run_step()
{
# $1 : function to call
# $2 : step name
if [ $# -eq 2 ]; then
r=$(zenity --question --text="Lancer l'étape '$2' ?")
[ $? -eq 0 ] && $1
fi
}
# check internet connection
ping -q -w 5 -c 1 google.fr &> /dev/null
if [ $? -ne 0 ]; then
echo "erreur: impossible de se connecter à internet"
exit 1
fi
# run all previous functions
run_step upgrade_system "Mise à jour du système"
run_step install_nvidia_drivers "Installation des drivers nvidia"
run_step remove_dash_shell "Enlever le shell dash par défaut"
run_step get_bash_scripts "Récupération des scripts bash"
run_step mount_nas "Montage d'un NAS"
run_step remove_plugins_and_lenses "Désinstallation des lentilles et plugins"
run_step restore_old_scrollbars "Restaurer les anciennes barres de défilement"
run_step install_ssmtp "Installation de sSMTP"
run_step move_window_buttons "Déplacement des boutons de fenêtre"
run_step active_history_completion "Complétion dans l'historique des commandes"
run_step customize_grub2 "Personnalisation de grub2"
run_step customize_firefox "Personnalisation de firefox"
run_step install_java "Installation de Java"
run_step install_lamp_server "Installation du serveur LAMP"
run_step install_ssh_server "Installation du serveur SSH"
run_step install_web_dev_kit "Installation du devkit web pour bootstrap"
run_step install_latex "Installation de LaTeX"
run_step install_extra_packages "Installation de paquets supplémentaires"
run_step repair_splash_screen "Réparation de l'écran de démarrage (nécessite les drivers nvidia)"Voilà, en espérant que ça puisse aider ![]()
--
Nicolas.
#1 Re : -1 » [script/bash] post-installation pour Ubuntu 13.04 » Le 12/05/2013, à 19:03
- nicolas66
- Réponses : 4
Rien n'est pompé, c'est du home-made à 100% ![]()
#2 Re : -1 » [script/bash] post-installation pour Ubuntu 13.04 » Le 12/05/2013, à 21:37
- nicolas66
- Réponses : 4
C'est juste que ça n'est jamais très flatteur d'être accusé à tort de plagiat ...
#3 Re : -1 » créer Labyrinthe en c » Le 04/03/2013, à 10:28
- nicolas66
- Réponses : 13
Une bonne habitude à prendre avant de se lancer dans un projet est d'écrire sur papier les structures de données et les algorithmes dont tu as besoin. Une fois que tout est clair sur papier, l'implémentation ne doit pas poser problème et doit donc être rapide (sous réserve de savoir coder en C).
Pour ton problème, je pense qu'une structure de données `labyrinthe' et `cellule' sont suffisantes. Je te laisse définir toi-même les champs de chaque structure. Dans un deuxième temps, il te faudra une fonction capable de lire un fichier contenant un labyrinthe et retournant la structure associée. Une fois que ta fonction de lecture est opérationnelle, il te restera à coder une fonction qui trouve un plus court chemin (par exemple avec l'algorithme Dijkstra) à partir d'un sommet donné.
Bon courage :-)
#4 Re : -1 » créer Labyrinthe en c » Le 19/04/2013, à 15:39
- nicolas66
- Réponses : 13
Bon grillage en règle ![]()
#5 Re : -1 » créer Labyrinthe en c » Le 21/04/2013, à 19:47
- nicolas66
- Réponses : 13
Pas tout compris et je pense qu'on dérive un peu du sujet initial ![]()
#7 Re : -1 » activité linux au sein des banques » Le 29/03/2013, à 10:24
- nicolas66
- Réponses : 24
S'il nous le dit ... ![]()
#8 Re : -1 » [C]char **argv » Le 21/03/2013, à 14:47
- nicolas66
- Réponses : 9
client(atoi(argv[1]), argv[2]);?
#9 Re : -1 » [C]char **argv » Le 21/03/2013, à 16:59
- nicolas66
- Réponses : 9
Dans ce cas, c'est à toi de coder ta propre fonction de conversion. A toi de jouer ![]()
#10 Re : -1 » [Standard] Format XML standard pour la traduction multilingue » Le 14/03/2013, à 10:39
- nicolas66
- Réponses : 7
Personnellement, j'avoue ne pas comprendre l'intérêt de certains de tes posts. Ca ressemble à un étalage de connaissances fait de manière presque pédante (comme ici ou là). A la base, ce forum est destiné à celles et ceux qui rencontrent un problème particulier. Si tu as une question, pose-là. Sinon, ouvre un blog ...
#11 Re : -1 » C++: chaine de caractères... (et NetCDF) » Le 14/02/2013, à 14:49
- nicolas66
- Réponses : 11
Petite remarque : le C++ gère très bien les chaînes de caractères avec la classe std::string. Pas besoin de se compliquer la vie. Sinon, on parle bien de C et non de C++.
#12 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 22/01/2013, à 21:20
- nicolas66
- Réponses : 21
Intérêt du script ? ![]()
#13 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 26/01/2013, à 18:59
- nicolas66
- Réponses : 21
Un truc qui me choque dans ton script c'est le "franglais". Ecris soit en anglais soit en français mais pas les deux ![]()
#14 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 26/01/2013, à 22:19
- nicolas66
- Réponses : 21
Ca n'est pas forcément très important. Tout dépend du public auquel les fichiers que tu produis sont destinés. J'étais dans la même situation il y a quelques années et je code depuis tout le temps en anglais pour avoir une portée plus grande.
#15 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 28/01/2013, à 18:21
- nicolas66
- Réponses : 21
-passage du mode franglais à francais
Pas complètement. Tu devrai passer tout en anglais (y compris les commentaires). C'est un bon exercice ![]()
#16 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 02/02/2013, à 23:03
- nicolas66
- Réponses : 21
Je ne suis pas modérateur mais vu la tournure que ça prend, je serai d'avis de déplacer ton sujet dans le forum "Vos développements libres" ...
#17 Re : -1 » Bash : permuter mots et creation de phrase à partir d'un dictionnaire » Le 03/02/2013, à 14:46
- nicolas66
- Réponses : 21
@nicolas66
Bon apres reflexion il est vrai que ce topic pourrait être deplacé , mais bon ...
Bah oui, le forum "Vos développements libres" serait tout de même plus adapté. Je laisse les modos décider ...
#18 Re : -1 » « HTML5, le nouveau langage du Web, est enfin prêt » » Le 31/12/2012, à 21:36
- nicolas66
- Réponses : 12
Qu'en est-il de XForms ? Le projet est-il abandonné avec l'arrivée de HTML5 et JQuery par exemple ?
#19 Re : -1 » « HTML5, le nouveau langage du Web, est enfin prêt » » Le 01/01/2013, à 16:06
- nicolas66
- Réponses : 12
P.S. jQuery n’est pas un standard, c’est une librairie JavaScript.
Tout à fait mais JQuery rend bien des services tout de même ![]()
#20 -1 » Invocation de bash [résolu] » Le 17/12/2012, à 15:38
- nicolas66
- Réponses : 8
Bonjour à tous,
Je dispose depuis qq temps d'un NAS synology. Depuis les dernières MAJ, un bug connu empêche un utilisateur de se connecter par ssh au NAS lorsque le shell pointe sur /opt/bin/bash dans /etc/passwd. En revanche, lorsque le shell pointe sur /bin/sh, pas de problèmes. Un contournement possible est de lancer /opt/bin/bash via la commande exec dans le .profile du répertoire utilisateur. Le souci c'est que les lignes suivantes dans ce fichier ne sont pas lues. Quelqu'un a-t-il une brillante idée pour surmonter ce problème ? D'avance, merci ![]()
--
Nicolas.
#21 Re : -1 » Invocation de bash [résolu] » Le 17/12/2012, à 18:40
- nicolas66
- Réponses : 8
mais peut-être qu'en stockant la config du shell bash dans un fichier ~/.bashrc, ça peut marcher ?
En fait, il y a un /etc/profile qui charge le .profile de l'utilisateur qui se connecte. Donc de côté-là, pas de soucis.
Normales : ces lignes sont lues successivement ; tant que ton bash ne se sera pas arrêté, les lignes suivantes ne seront pas lues ; elles seront lues quand tu fermeras ton bash. Pourquoi ne pas mettre /opt/bin/bash en tout dernier ?
Oui, j'avais bien compris. Comme je l'ai indiqué dans mon 1er post, je suis obligé de faire pointer le shell de l'utilisateur sur /bin/sh dans /etc/passwd. Du coup, lorsqu'un utilisateur se connecte, son .profile est lu avec ce shell. Or, la plupart des commandes contenues dans ce fichier ne sont compatibles qu'avec bash. Ce que j'aimerai, c'est lancer bash au début et interpréter les lignes qui suivent avec ce shell.
#22 Re : -1 » Invocation de bash [résolu] » Le 17/12/2012, à 20:43
- nicolas66
- Réponses : 8
Dans ce cas-là il faut utiliser un fichier chargé par bash.
Comme .bashrc par exemple. Comme l'a dit H4nnibal.
En fait je ne comprend pas ta réponse à sa proposition...
Encore faut-il indiquer de charger bash ... Au départ, le fichier /etc/profile est chargé avec /bin/sh. Comme l'indique H4nnibal, il y a bien un "source ~/.profile" (utiliser un .bashrc ne change rien) dans ce fichier. Ensuite le .profile de l'utilisateur est lu tjs avec /bin/sh. C'est pour cela que je lance la commande "exec /opt/bin/bash" à ce moment-là pour changer de shell.
#23 Re : -1 » Invocation de bash [résolu] » Le 18/12/2012, à 13:35
- nicolas66
- Réponses : 8
Désolé, j'avais mal compris l'idée de mettre les commandes dans un .bash_profile séparé du .profile. Bizarrement, le .bash_profile n'était pas appelé directement. J'ai donc rajouté l'option `--rcfile'. Ensuite, j'avais encore un souci avec l'historique des commandes tapées mais un export a réglé le problème. Merci beaucoup pour votre aide. Je passe le thread en résolu ![]()
#24 Re : -1 » Frequence audio en C++ » Le 10/12/2012, à 00:05
- nicolas66
- Réponses : 11
Ah j'oubliais : j'ai testé chez moi et ça fonctionne impec. Tiens-nous au courant pour la suite. Bon courage ![]()