diff --git a/README.md b/README.md index 46c94a5..cea414f 100644 --- a/README.md +++ b/README.md @@ -162,5 +162,24 @@ precheck_@template@() export -f @template@ export -f precheck_@template@ ``` +## Error code table + +The following table is giving a list of error code with explanation: + +| Code | Meaning | +|:----------|:----------------------------------------| +| 0 | No error | +| 1 | Command line syntax error | +| 2 | Unable to find configuration | +| 3 | Missing library file or function | +| 4 | No root rights | +| 5 | Malformed module list | +| 10 | Function call error | +| 11 | Bad function call | +| 12 | Error copying files | +| 13 | Bad target filesystem | +| 50..100 | Error in module execution | +| 128 | Abortion due to external cause | +| 150..200 | Error in module checks | ## Contact and more information diff --git a/init.sh b/init.sh index 575e5a7..89e95f2 100755 --- a/init.sh +++ b/init.sh @@ -45,7 +45,7 @@ function_exists() { function_exists prnt || ( echo "*** ERREUR FATALE !" echo "*** Il manque des fonctions vitales venant des bibliothèques." - exit 2 + exit 3 ) # ====================== @@ -62,51 +62,51 @@ export RESUME=false want_module=false for opt in $@; do if [[ $want_module == false ]]; then - case $opt in - "-h"|"--help") - disp_help - exit 0 - ;; - "-v"|"--version") - show_version - exit 0 - ;; - "-m"|"--module") - want_module=true - ;; - "-c"|"--check-only") - export CHECK_ONLY=true - ;; - "-j"|"--jump") - export JUMP=true - ;; - "-k"|"--keep-going") - export KEEPGOING=true - ;; - "-r"|"--resume") - if [[ -s $MYPATH/stage ]]; then - export RESUME=true - else - prnt E "Le fichier d'état n'existe pas ou est vide !" - prnt E "Sans ce fichier, la reprise n'est pas possible." - die 1 --force - fi - ;; - *) - prnt E "Paramètre \'$opt\' non géré." - disp_help - exit 1 - ;; - esac + case $opt in + "-h"|"--help") + disp_help + exit 0 + ;; + "-v"|"--version") + show_version + exit 0 + ;; + "-m"|"--module") + want_module=true + ;; + "-c"|"--check-only") + export CHECK_ONLY=true + ;; + "-j"|"--jump") + export JUMP=true + ;; + "-k"|"--keep-going") + export KEEPGOING=true + ;; + "-r"|"--resume") + if [[ -s $MYPATH/stage ]]; then + export RESUME=true + else + prnt E "Le fichier d'état n'existe pas ou est vide !" + prnt E "Sans ce fichier, la reprise n'est pas possible." + die 1 --force + fi + ;; + *) + prnt E "Paramètre \'$opt\' non géré." + disp_help + exit 1 + ;; + esac else - if [[ ! $MANUAL_MODULE_LIST ]]; then - MANUAL_MODULE_LIST=$opt - want_module=false - else - prnt E "Une liste de module à déjà été fournie !" - prnt E "La ligne de commande ne tolère qu'un paramètre --module." - die 1 --force - fi + if [[ ! $MANUAL_MODULE_LIST ]]; then + MANUAL_MODULE_LIST=$opt + want_module=false + else + prnt E "Une liste de module à déjà été fournie !" + prnt E "La ligne de commande ne tolère qu'un paramètre --module." + die 1 --force + fi fi done @@ -114,7 +114,7 @@ done # (--help and --version are allowed as unprivileged user) if [[ $EUID -ne 0 ]]; then prnt E "Ce script doit être démarré en tant que root. Arrêt." - die 1 --force + die 4 --force fi # Logfile variable treatment @@ -163,12 +163,12 @@ if [[ $CHECK_ONLY == true ]]; then fi if [[ $RESUME == true ]]; then [[ $CHECK_ONLY == true ]] && ( - prnt E "La reprise n'a pas de sens avec --check-only." - die 1 --force + prnt E "La reprise n'a pas de sens avec --check-only." + die 1 --force ) [[ $MANUAL_MODULE_LIST ]] && ( - prnt E "Le mode reprise ne fonctionne pas avec une liste de modules passé manuellement." - die 1 --force + prnt E "Le mode reprise ne fonctionne pas avec une liste de modules passé manuellement." + die 1 --force ) fi @@ -178,6 +178,17 @@ if [[ $MANUAL_MODULE_LIST ]]; then export MODULE_LIST=$(echo $MANUAL_MODULE_LIST | sed "s/,/ /g") fi +# Check for module list existance en basic syntax +if [[ -n $MODULE_LIST ]]; then + if [[ $(echo $MODULE_LIST | grep '-') ]]; then + prnt E "Le tiret est interdit dans les noms de module." + die 5 + fi +else + prnt E "Aucun module à exécuter !" + die 5 +fi + # Run prechecks [[ JUMP != true ]] && for mod in $MODULE_LIST; do . modules/$mod.sh diff --git a/lib/filefct.sh b/lib/filefct.sh index d38fe9f..1354641 100644 --- a/lib/filefct.sh +++ b/lib/filefct.sh @@ -11,14 +11,14 @@ export -f stdtime backupdist() { [[ $# -lt 1 ]] && - prnt E "backupdist(): Au moins un argument requis." && - exit 129 + prnt E "backupdist(): Au moins un argument requis." && + exit 11 for file in $@; do - if [[ -e ${file} ]]; then - local tmpstmp=$(stdtime) - prnt I "Création d'une sauvegarde de ${file} du $tmpstmp..." - cp -av $file $file.dist.$tmpstmp + if [[ -e ${file} ]]; then + local tmpstmp=$(stdtime) + prnt I "Création d'une sauvegarde de ${file} du $tmpstmp..." + cp -av $file $file.dist.$tmpstmp fi done } @@ -31,32 +31,35 @@ installfile() local i=0 [[ $# -lt 2 ]] && ( - prnt E "installfile(): Au moins deux arguments requis." - exit 129 + prnt E "installfile(): Au moins deux arguments requis." + die 11 ) [[ $(echo $@ | grep "\*\|\?") ]] && ( - prnt E "installfile(): Les wildcards sont interdits." - exit 10 + prnt E "installfile(): Les wildcards sont interdits." + die 10 ) for arg in $@; do - if [[ -f $MYPATH/repo/hosts/$HOSTNAME/$arg ]]; then - filelist="$filelist $MYPATH/repo/hosts/$HOSTNAME/$arg" - elif [[ -f $MYPATH/repo/common/$arg ]]; then - filelist="$filelist $MYPATH/repo/common/$arg" - else - # Not found in repository, we expect full name - filelist="$filelist $arg" - fi + if [[ -f $MYPATH/repo/hosts/$HOSTNAME/$arg ]]; then + filelist="$filelist $MYPATH/repo/hosts/$HOSTNAME/$arg" + elif [[ -f $MYPATH/repo/common/$arg ]]; then + filelist="$filelist $MYPATH/repo/common/$arg" + else + # Not found in repository, we expect full name + filelist="$filelist $arg" + fi done for i in $filelist; do :; done if [[ ! $i==/* ]]; then - prnt E "installfile(): Target must be on the root filesystem." - exit 3 + prnt E "installfile(): Target must be on the root filesystem." + die 13 fi prnt I "Création du répertoire $(dirname $i) si nécessaire..." mkdir -pv $(dirname $i) prnt I "Copie des fichiers ${filelist}..." - cp -av $filelist + cp -av $filelist || ( + prnt E "installfile(): Couldn't copy some required files..." && + die 12 + ) } export -f installfile diff --git a/lib/services.sh b/lib/services.sh index bb0d4b6..55fd0d6 100644 --- a/lib/services.sh +++ b/lib/services.sh @@ -4,8 +4,8 @@ exec_serv() { [[ $# -lt 2 ]] && ( - prnt E "exec_serv(): Erreur de syntaxe !" - exit 130 + prnt E "exec_serv(): Erreur de syntaxe !" + exit 11 ) local svcname=$1 command=$2 diff --git a/modules/conf_disks.sh b/modules/conf_disks.sh index d997139..a971f46 100644 --- a/modules/conf_disks.sh +++ b/modules/conf_disks.sh @@ -9,7 +9,7 @@ # * CALCDRV: Target drives, preferably through ID. # ------------------------------------------------------------------------------ -export VER_conf_disks="0.0.7" +export VER_conf_disks="0.0.8" # ------------------------------------------------------------------------------ # ZFS case @@ -25,39 +25,39 @@ conf_zfs() # Load ZFS module to check it works modprobe zfs || ( - prnt E "Échec de chargement du module noyau, abandon." - die 2 + prnt E "Échec de chargement du module noyau, abandon." + die 50 ) sleep 1 # Create filesystem prnt I "Création du pool zcalc..." if [[ $FORCEBLANK ]]; then - local opt="--force" - for drv in $CALCDRV; do - if [[ ! $(sfdisk -d $drv 2>&1) == "" ]]; then - prnt I "Effacement des donnée de $drv..." - dd if=/dev/zero of=$drv bs=1024 count 1000000 - fi + local opt="--force" + for drv in $CALCDRV; do + if [[ ! $(sfdisk -d $drv 2>&1) == "" ]]; then + prnt I "Effacement des donnée de $drv..." + dd if=/dev/zero of=$drv bs=1024 count 1000000 + fi - # Empty cache and inform kernel of the change - sync - partprobe - done + # Empty cache and inform kernel of the change + sync + partprobe + done fi if [[ $(zpool create zcalc -m $CALCMOUNTPOINT $CALCLEVEL $opt $CALCDRV) ]]; then - # We activate lz4 compression by default - zpool set zcalc compression=lz4 + # We activate lz4 compression by default + zpool set zcalc compression=lz4 # If a VM is projected we create associated volume - if [[ $WITH_VM == true ]]; then - prnt I "Création du conteneur pour la future VM..." - zfs create zcalc/vm - fi + if [[ $WITH_VM == true ]]; then + prnt I "Création du conteneur pour la future VM..." + zfs create zcalc/vm + fi else - prnt E "Erreur de création du pool zcalc ($CALCLEVEL) avec les disques $CALCDRV" - die 3 + prnt E "Erreur de création du pool zcalc ($CALCLEVEL) avec les disques $CALCDRV" + die 51 fi } @@ -92,16 +92,16 @@ conf_disks() [[ -n $STOP_CONF_DISK ]] && return 0 if [[ ! $CALCDRV ]]; then - prnt I "Pas de disque de calcul défini, rien à faire." - return 0 + prnt I "Pas de disque de calcul défini, rien à faire." + return 0 fi prnt I "Installation des outils de partitionnement..." pkginst parted conf_$CALCTYPE && ( - prnt I "Attribution des droits sur le disque de calcul." - chown -Rv $MAINUSER:$MAINUSER /calcul/$HOSTNAME + prnt I "Attribution des droits sur le disque de calcul." + chown -Rv $MAINUSER:$MAINUSER /calcul/$HOSTNAME ) } @@ -109,35 +109,35 @@ conf_disks() precheck_conf_disks() { if [[ ! $(type -t conf_$CALCTYPE) == "function" ]]; then - prnt E "Format de disque inconnu ($CALCTYPE) !" - die 5 + prnt E "Format de disque inconnu ($CALCTYPE) !" + die 150 fi prnt I "Vérification des lecteurs pour disque de calcul." local drvcount=0 for drv in $CALCDRV; do - if [[ -e $drv ]]; then - if [[ $(/sbin/sfdisk -d $drv 2>&1) == "" ]]; then - prnt I "Le dique $drv est vierge, il sera formaté en $CALCTYPE." - else - prnt W "Le disque $drv n'est pas vierge !" - if [[ $FORCEBLANK==true ]]; then - prnt W "Le disque $drv sera réinitialisé !" - else - prnt E "La réinitialisation de $drv n'est pas autorisé, rien ne sera fait !" - export STOP_CONF_DISK=1 - fi - fi - else - prnt E "Le disque $drv n'existe pas. Abandon." - die 5 - fi - (( drvcount+=1 )) + if [[ -e $drv ]]; then + if [[ $(/sbin/sfdisk -d $drv 2>&1) == "" ]]; then + prnt I "Le dique $drv est vierge, il sera formaté en $CALCTYPE." + else + prnt W "Le disque $drv n'est pas vierge !" + if [[ $FORCEBLANK==true ]]; then + prnt W "Le disque $drv sera réinitialisé !" + else + prnt E "La réinitialisation de $drv n'est pas autorisé, rien ne sera fait !" + export STOP_CONF_DISK=1 + fi + fi + else + prnt E "Le disque $drv n'existe pas. Abandon." + die 150 + fi + (( drvcount+=1 )) done if [[ ! $CALCTYPE=="zfs" && drvcount -gt 1 ]]; then - prnt E "Plusieurs diques impossibles avec Ext4 ou XFS !" - die 5 + prnt E "Plusieurs diques impossibles avec Ext4 ou XFS !" + die 150 fi } diff --git a/modules/conf_locale.sh b/modules/conf_locale.sh index e1410af..ff2ccb3 100644 --- a/modules/conf_locale.sh +++ b/modules/conf_locale.sh @@ -20,8 +20,8 @@ conf_locale() { backupdist /etc/locale.gen for loc in $LOCALESET; do - prnt I "Activation de la locale ${loc}..." - sed -i "/^# $loc /s/^# //" /etc/locale.gen + prnt I "Activation de la locale ${loc}..." + sed -i "/^# $loc /s/^# //" /etc/locale.gen done prnt I "Régénération du cache de locale..." locale-gen @@ -34,21 +34,21 @@ conf_locale() echo "LANG=$SYSLOCALE" >> $fname for cfg in ADDRESS IDENTIFICATION MEASUREMENT MONETARY NAME NUMERIC PAPER \ TELEPHONE TIME; do - echo "LC_$cfg=$SYSLOCALE" + echo "LC_$cfg=$SYSLOCALE" done } precheck_conf_locale() { if [[ -z $LOCALESET ]]; then - prnt W "Aucune locale définie !" + prnt W "Aucune locale définie !" else - prnt m "Les locales disponibles seront : $LOCALESET" + prnt m "Les locales disponibles seront : $LOCALESET" fi if [[ -z $SYSLOCALE ]]; then - prnt W "Pas de locale systême définie, C sera utilié." - export SYSLOCALE="C" + prnt W "Pas de locale systême définie, C sera utilié." + export SYSLOCALE="C" fi prnt m "La locale par défaut sera : $SYSLOCALE" } diff --git a/modules/conf_ntp.sh b/modules/conf_ntp.sh index b492aa3..8a60d6b 100644 --- a/modules/conf_ntp.sh +++ b/modules/conf_ntp.sh @@ -5,7 +5,7 @@ # * NTPSERVERS: list of NTP servers # ------------------------------------------------------------------------------ -export VER_conf_ntp="0.0.5" +export VER_conf_ntp="0.0.6" conf_ntp() { @@ -25,11 +25,11 @@ conf_ntp() installfile ntp.conf $dest local line="" for srv in $NTPSERVERS; do - line="${line}server $srv iburst\n" + line="${line}server $srv iburst\n" done sed -i -e "s/@SERVERLIST@/$line/" $dest && - echo "# Generated on $(stdtime)" >> $dest && - mv -fv $dest /etc/ntp.conf + echo "# Generated on $(stdtime)" >> $dest && + mv -fv $dest /etc/ntp.conf prnt I "Démarrage du service ntp..." svc_start ntp @@ -39,10 +39,10 @@ conf_ntp() precheck_conf_ntp() { if [[ -z $NTPSERVERS ]]; then - prnt E "Pas de serveur NTP configuré !" - die 5 + prnt E "Pas de serveur NTP configuré !" + die 151 else - prnt m "Les serveurs ntp utilisés seront : $NTPSERVERS" + prnt m "Les serveurs ntp utilisés seront : $NTPSERVERS" fi } diff --git a/modules/conf_ssh.sh b/modules/conf_ssh.sh index 818c0ef..e403b35 100644 --- a/modules/conf_ssh.sh +++ b/modules/conf_ssh.sh @@ -17,8 +17,8 @@ conf_ssh() prnt I "Installation des fichiers de configuration de SSH..." for f in /etc/ssh/ssh{,d}_config; do - backupdist $f - installfile $(basename $f) /etc/ssh/$(basename $f) + backupdist $f + installfile $(basename $f) /etc/ssh/$(basename $f) done prnt I "Démarrage du sevice ssh..." diff --git a/modules/install_desktop.sh b/modules/install_desktop.sh index 38376fe..6d50290 100644 --- a/modules/install_desktop.sh +++ b/modules/install_desktop.sh @@ -14,22 +14,22 @@ export VER_install_desktop="0.0.2" install_desktop() { [[ $X11_DRV ]] && - prnt I "Installation de pilotes supplémentaires X11..." && - pkginst $X11_DRV + prnt I "Installation de pilotes supplémentaires X11..." && + pkginst $X11_DRV [[ $UBUNTU_FLAVOR ]] && - prnt I "Installation de l'environnement $UBUNTU_FLAVOR..." && - pkginst ${UBUNTU_FLAVOR}-desktop + prnt I "Installation de l'environnement $UBUNTU_FLAVOR..." && + pkginst ${UBUNTU_FLAVOR}-desktop } precheck_install_desktop() { if [[ -z $UBUNTU_FLAVOR ]]; then - prnt W "Pas de saveur Ubuntu choisie, aucun environnement de bureau ne sera installé !" + prnt W "Pas de saveur Ubuntu choisie, aucun environnement de bureau ne sera installé !" else - prnt m "La saveur $UBUNTU_FLAVOR sera installée..." + prnt m "La saveur $UBUNTU_FLAVOR sera installée..." fi if [[ -n $X11_DRV ]]; then - prnt W "Des pilotes non libres seront installé." + prnt W "Des pilotes non libres seront installé." fi } diff --git a/modules/upgrade_dist.sh b/modules/upgrade_dist.sh index bf9952c..b5c0da3 100644 --- a/modules/upgrade_dist.sh +++ b/modules/upgrade_dist.sh @@ -7,7 +7,7 @@ # * PROXYAPTPORT: Working port for APT proxy # ------------------------------------------------------------------------------ -export VER_upgrade_dist="0.0.6" +export VER_upgrade_dist="0.0.7" upgrade_dist() { @@ -18,7 +18,7 @@ upgrade_dist() if [[ ! -d $(basedir $proxyfile) ]]; then mkdir -pv /etc/apt/apt.conf.d || ( prnt E "Impossiblle de créer le répertoire d'accueil pour la configuration d'APT." - exit 10 + die 60 ) fi backupdist $proxyfile @@ -42,11 +42,11 @@ precheck_upgrade_dist() wget -q --tries=10 --timeout=20 --spider http://www.cnrs.fr if [[ ! $? -eq 0 ]]; then prnt E "Réseau non fonctionnel ! Abandon." - die 5 + die 160 fi if [[ -n $PROXYAPT && -z $PROXYAPTPORT ]]; then prnt E "Un serveur proxy a été spécifié mais pas son port d'usage." - die 5 + die 160 fi }