syntax check before parsing config files
[grml-debootstrap.git] / grml-debootstrap
index 2124614..5173dc1 100755 (executable)
@@ -244,11 +244,11 @@ check4progs(){
 # helper functions {{{
 cleanup() {
   if [ -n "$CHROOT_VARIABLES" ] ; then
-    einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $?
+    einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" || eend $?
   fi
 
   if [ -n "$STAGES" ] ; then
-    einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?
+    einfo "Removing ${STAGES}" ; rmdir "$STAGES" || eend $?
   fi
 
   if [ -n "$ARM_EFI_TARGET" ]; then
@@ -258,7 +258,7 @@ cleanup() {
   # Remove temporary mountpoint again
   if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
     if [ -d "$MNTPOINT" ] ; then
-      rmdir "$MNTPOINT" 2>/dev/null
+      rmdir "$MNTPOINT"
     fi
   fi
 
@@ -299,8 +299,10 @@ cleanup() {
 
       # remove directory only if we used the default with process id inside the name
       if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
-        einfo "Removing directory ${MNTPOINT}"
-        rmdir "$MNTPOINT" || eend $?
+        if test -d "$MNTPOINT" ; then
+          einfo "Removing directory ${MNTPOINT}"
+          rmdir "$MNTPOINT" || eend $?
+        fi
       fi
     fi
   fi
@@ -344,6 +346,7 @@ stage() {
 
 # source main configuration file {{{
 if [ -r /etc/debootstrap/config ] ; then
+  bash -n /etc/debootstrap/config
   # shellcheck disable=SC1091
   . /etc/debootstrap/config
 fi
@@ -352,11 +355,10 @@ fi
 # cmdline handling {{{
 CMDLINE_OPTS=mirror:,iso:,release:,target:,mntpoint:,debopt:,defaultinterfaces,interactive,nodebootstrap,nointerfaces,nokernel,nopackages,filesystem:,config:,confdir:,packages:,chroot-scripts:,scripts:,post-scripts:,pre-scripts:,debconf:,vm,vmfile,vmsize:,vmefi,keep_src_list,hostname:,password:,nopassword,grmlrepos,backportrepos,bootappend:,grub:,efi:,arch:,insecure,verbose,help,version,force,debug,contrib,non-free,remove-configs,sshcopyid,sshcopyauth
 
-_opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
-  $CMDLINE_OPTS -- "$@")
-
-if [ $? != 0 ]; then
-  eerror "Try 'grml-debootstrap --help' for more information."; eend 1; exit 1
+if ! _opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
+  $CMDLINE_OPTS -- "$@"); then
+  eerror "Try 'grml-debootstrap --help' for more information."
+  bailout 1
 fi
 eval set -- "$_opt_temp"
 
@@ -656,6 +658,7 @@ fi
 # source specified configuration file {{{
 if [ -n "$CONFIGFILE" ] ; then
   einfo "Reading specified config file $CONFIGFILE."
+  bash -n "$CONFIGFILE"
   # shellcheck disable=SC1091 source=config
   if ! . "$CONFIGFILE" ; then
     eerror "Error reading config file $CONFIGFILE" ; bailout 1
@@ -698,8 +701,7 @@ prompt_for_target()
      dialog --title "$PN" --trim \
      --msgbox "Sorry, no partitions found. Please configure your
      harddisks (see /proc/partitions) using a tool like fdisk,
-     cfdisk, gpart, gparted,..." 0 0
-     bailout 1
+     cfdisk, gpart, gparted,..." 0 0 || bailout 1
   fi
 
   PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do
@@ -712,8 +714,7 @@ prompt_for_target()
   # shellcheck disable=SC2086
   TARGET=$(dialog --title "$PN" --single-quoted --stdout \
          --menu "Please select the target partition:" 0 0 0 \
-         $PARTITION_LIST)
-  [ $? -eq 0 ] || bailout 1
+         $PARTITION_LIST) || bailout 1
 }
 # }}}
 
@@ -761,8 +762,7 @@ prompt_for_bootmanager()
           --menu "Where do you want to install the bootmanager grub?" 0 0 0 \
             mbr       "install bootmanager into $MBRPART" \
             nowhere   "do not install bootmanager at all" \
-          ${ADDITIONAL_PARAMS})
-  [ $? -eq 0 ] || bailout 3
+          ${ADDITIONAL_PARAMS}) || bailout 3
   IFS="$OIFS"
 
   case "$GETMBR" in
@@ -797,8 +797,8 @@ prompt_for_release()
             buster   Debian/10 \
             bullseye Debian/11 \
             bookworm Debian/12 \
-            sid      Debian/unstable)"
-  [ $? -eq 0 ] || bailout
+            sid      Debian/unstable)" \
+            || bailout
 }
 # }}}
 
@@ -807,8 +807,7 @@ prompt_for_hostname()
 {
   HOSTNAME="$(dialog --stdout --title "${PN}" --inputbox \
             "Please enter the hostname you would like to use for installation:" \
-            0 0 "$HOSTNAME")"
-  [ $? -eq 0 ] || bailout
+            0 0 "$HOSTNAME")" || bailout
 }
 # }}}
 
@@ -824,13 +823,11 @@ prompt_for_password()
   ROOTPW2='PW2'
   while [ "$ROOTPW1" != "$ROOTPW2" ]; do
     ROOTPW1=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
-    "Please enter the password for the root account:" 10 60)
-    [ $? -eq 0 ] || bailout
+    "Please enter the password for the root account:" 10 60) || bailout
 
     ROOTPW2=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
     "Please enter the password for the root account again for \
-    confirmation:" 10 60)
-    [ $? -eq 0 ] || bailout
+    confirmation:" 10 60) || bailout
 
     if [ "$ROOTPW1" != "$ROOTPW2" ]; then
       dialog --stdout --title "${PN}" --ok-label \
@@ -851,20 +848,18 @@ prompt_for_mirror()
             net   "install via network (downloading from mirror)" \
             local "install from local directory/mirror"
           )
-  [ $? -eq 0 ] || bailout
 
   if [ "$CHOOSE_MIRROR" = 'net' ] ; then
      [ -n "$MIRROR" ] || MIRROR='http://deb.debian.org/debian'
      MIRROR="$(dialog --stdout --title "${PN}" --inputbox \
                "Please enter Debian mirror you would like to use for installing packages." \
-               0 0 $MIRROR)"
-     [ $? -eq 0 ] || bailout
+               0 0 $MIRROR)" || bailout
+
   else # CHOOSE_MIRROR == local
      [ -n "$ISO" ] || ISO='/mnt/mirror'
      ISO="$(dialog --stdout --title "${PN}" --inputbox \
                "Please enter directory name you would like to use for installing packages." \
-               0 0 $ISO)"
-     [ $? -eq 0 ] || bailout
+               0 0 $ISO)" || bailout
   fi
 }
 # }}}
@@ -887,8 +882,7 @@ TARGET=$(dialog --stdout --title "$PN" --default-item /dev/md0 \
 --menu "Which device do you want to use for ${RAIDLEVEL}?
 
 Notice: activated devices will not be listed for security reasons. Anyway, please make sure the selected device is not in use already!" 0 0 0 \
-$MD_LIST)
-[ $? -eq 0 ] || bailout 20
+$MD_LIST) || bailout 20
 
 AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \
              sed 's/*//' | \
@@ -902,8 +896,8 @@ PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do
 # shellcheck disable=SC2086
 dialog --title "$PN" --separate-output \
        --checklist "Please select the partitions you would like to use for your $RAIDLEVEL on ${TARGET}:" 0 0 0 \
-       $PARTITION_LIST 2>"$TMPFILE"
-[ $? -eq 0 ] || bailout
+       $PARTITION_LIST 2>"$TMPFILE" || bailout
+
 SELECTED_PARTITIONS="$(cat "$TMPFILE")"
 
 NUM_PARTITIONS=0
@@ -1058,8 +1052,7 @@ elif [ -n "$INTERACTIVE" ] ; then
 Is this ok for you? Notice: selecting 'No' will exit ${PN}."
 
    dialog --title "$PN" --no-collapse \
-          --yesno "$INFOTEXT" 0 0
-   [ $? -eq 0 ] || bailout 0
+          --yesno "$INFOTEXT" 0 0 || bailout 0
 
 else # if not running automatic installation display configuration and prompt for execution:
    einfo "$PN [${VERSION}] - Please recheck configuration before execution:"
@@ -2159,11 +2152,8 @@ for i in format_efi_partition prepare_vm mkfs tunefs \
          remove_configs umount_chroot grub_install umount_target fscktool ; do
     if stage "${i}" ; then
       "$i"
-      if [ $? -eq 0 ]; then
-        stage "${i}" 'done' && rm -f "${STAGES}/${i}"
-      else
-        bailout 2 "$i"
-      fi
+      stage "${i}" 'done'
+      rm -f "${STAGES}/${i}"
     fi
 done