diff --git a/deployment.sh b/deployment.sh index afdf99e..065bde1 100755 --- a/deployment.sh +++ b/deployment.sh @@ -61,7 +61,6 @@ VLAN=false VLANID='' VLANIF='' RETRIEVE_MGMT_CONFIG=false -LINUX_HA3=false TRUNK_VERSION=false DEBIAN_RELEASE=jessie HALT=false @@ -106,7 +105,7 @@ enable_deploy_status_server() { # get rid of already running process PID=$(pgrep -f 'python.*SimpleHTTPServer') || true - [ -n "$PID" ] && kill $PID + [ -n "$PID" ] && kill "$PID" ( cd "${STATUS_DIRECTORY}" @@ -206,7 +205,8 @@ install_apt_transport_https () { fi # use temporary apt database for speed reasons - local TMPDIR=$(mktemp -d) + local TMPDIR + TMPDIR=$(mktemp -d) mkdir -p "${TMPDIR}/etc/preferences.d" "${TMPDIR}/statedir/lists/partial" \ "${TMPDIR}/cachedir/archives/partial" echo "deb http://${DEBIAN_REPO_HOST}/debian/ ${DEBIAN_RELEASE} main contrib non-free" > \ @@ -224,15 +224,19 @@ install_apt_transport_https () { grml_debootstrap_upgrade() { local required_version=0.74 - local present_version=$(dpkg-query --show --showformat='${Version}' grml-debootstrap) + local present_version - if dpkg --compare-versions $present_version lt $required_version ; then + present_version=$(dpkg-query --show --showformat="\${Version}" grml-debootstrap) + + if dpkg --compare-versions "${present_version}" lt "${required_version}" ; then echo "grml-deboostrap version $present_version is older than minimum required version $required_version - upgrading." # use temporary apt database for speed reasons - local TMPDIR=$(mktemp -d) + local TMPDIR + TMPDIR=$(mktemp -d) mkdir -p "${TMPDIR}/statedir/lists/partial" "${TMPDIR}/cachedir/archives/partial" - local debsrcfile=$(mktemp) + local debsrcfile + debsrcfile=$(mktemp) echo "deb ${SIPWISE_REPO_TRANSPORT}://${SIPWISE_REPO_HOST}/grml.org grml-testing main" >> "$debsrcfile" DEBIAN_FRONTEND='noninteractive' apt-get -o dir::cache="${TMPDIR}/cachedir" \ @@ -250,7 +254,8 @@ install_vbox_package() { echo "Installing virtualbox-guest-additions-iso" # use temporary apt database for speed reasons - local TMPDIR=$(mktemp -d) + local TMPDIR + TMPDIR=$(mktemp -d) mkdir -p "${TMPDIR}/etc/preferences.d" "${TMPDIR}/statedir/lists/partial" \ "${TMPDIR}/cachedir/archives/partial" echo "deb ${DEBIAN_REPO_TRANSPORT}://${DEBIAN_REPO_HOST}/debian/ ${DEBIAN_RELEASE} non-free" > \ @@ -275,7 +280,8 @@ ensure_augtool_present() { echo "augtool isn't present, installing augeas-tools package:" # use temporary apt database for speed reasons - local TMPDIR=$(mktemp -d) + local TMPDIR + TMPDIR=$(mktemp -d) mkdir -p "${TMPDIR}/etc/preferences.d" "${TMPDIR}/statedir/lists/partial" \ "${TMPDIR}/cachedir/archives/partial" echo "deb http://${DEBIAN_REPO_HOST}/debian/ ${DEBIAN_RELEASE} main contrib non-free" > \ @@ -352,7 +358,8 @@ else # otherwise try to find sane default # so better walk through all devices. for i in /sys/block/sd*; do if grep -q 0 "${i}/removable"; then - export DISK=$(basename "$i") + DISK=$(basename "$i") + export DISK break fi done @@ -375,11 +382,6 @@ if checkBootParam nocolorlogo ; then LOGO=false fi -if checkBootParam ngcphav3 ; then - LINUX_HA3=true - PRO_EDITION=true -fi - if checkBootParam ngcpnobonding ; then BONDING=false fi @@ -705,30 +707,28 @@ Usage examples: " } -for param in $* ; do +for param in "$@" ; do case $param in *-h*|*--help*|*help*) usage ; exit 0;; *ngcpsp1*) ROLE=sp1 ; TARGET_HOSTNAME=sp1; PRO_EDITION=true; CE_EDITION=false ; NGCP_INSTALLER=true ;; *ngcpsp2*) ROLE=sp2 ; TARGET_HOSTNAME=sp2; PRO_EDITION=true; CE_EDITION=false ; NGCP_INSTALLER=true ;; *ngcppro*) PRO_EDITION=true; CE_EDITION=false ; NGCP_INSTALLER=true ;; *ngcpce*) PRO_EDITION=false; CE_EDITION=true ; TARGET_HOSTNAME=spce ; ROLE='' ; NGCP_INSTALLER=true ;; - *ngcpvers=*) SP_VERSION=$(echo $param | sed 's/ngcpvers=//');; + *ngcpvers=*) SP_VERSION="${param//ngcpvers=/}";; *nongcp*) NGCP_INSTALLER=false;; - *nodebian*) DEBIAN_INSTALLER=false;; # TODO - *noinstall*) NGCP_INSTALLER=false; DEBIAN_INSTALLER=false;; + *noinstall*) NGCP_INSTALLER=false;; *ngcpinst*) NGCP_INSTALLER=true;; - *ngcphostname=*) TARGET_HOSTNAME=$(echo $param | sed 's/ngcphostname=//');; - *ngcpeiface=*) EIFACE=$(echo $param | sed 's/ngcpeiface=//');; - *ngcpeaddr=*) EADDR=$(echo $param | sed 's/ngcpeaddr=//');; - *ngcpip1=*) IP1=$(echo $param | sed 's/ngcpip1=//');; - *ngcpip2=*) IP2=$(echo $param | sed 's/ngcpip2=//');; - *ngcpipshared=*) IP_HA_SHARED=$(echo $param | sed 's/ngcpipshared=//');; - *ngcpnetmask=*) INTERNAL_NETMASK=$(echo $param | sed 's/ngcpnetmask=//');; - *ngcpextnetmask=*) EXTERNAL_NETMASK=$(echo $param | sed 's/ngcpextnetmask=//');; - *ngcpmcast=*) MCASTADDR=$(echo $param | sed 's/ngcpmcast=//');; - *ngcpcrole=*) CARRIER_EDITION=true; CROLE=$(echo $param | sed 's/ngcpcrole=//');; + *ngcphostname=*) TARGET_HOSTNAME="${param//ngcphostname=/}";; + *ngcpeiface=*) EIFACE="${param//ngcpeiface=/}";; + *ngcpeaddr=*) EADDR="${param//ngcpeaddr=/}";; + *ngcpip1=*) IP1="${param//ngcpip1=/}";; + *ngcpip2=*) IP2="${param//ngcpip2=/}";; + *ngcpipshared=*) IP_HA_SHARED="${param//ngcpipshared=/}";; + *ngcpnetmask=*) INTERNAL_NETMASK="${param//ngcpnetmask=/}";; + *ngcpextnetmask=*) EXTERNAL_NETMASK="${param//ngcpextnetmask=/}";; + *ngcpmcast=*) MCASTADDR="${param//ngcpmcast=/}";; + *ngcpcrole=*) CARRIER_EDITION=true; CROLE="${param//ngcpcrole=/}";; *ngcpnw.dhcp*) DHCP=true;; - *ngcphav3*) LINUX_HA3=true; PRO_EDITION=true;; *ngcpnobonding*) BONDING=false;; *ngcpbonding*) BONDING=true;; *ngcphalt*) HALT=true;; @@ -737,15 +737,15 @@ for param in $* ; do *lowperformance*) ADJUST_FOR_LOW_PERFORMANCE=true;; *enablevmservices*) ENABLE_VM_SERVICES=true;; *ngcpfillcache*) FILL_APPROX_CACHE=true;; - *ngcpvlanbootint*) VLAN_BOOT_INT=$(echo $param | sed 's/ngcpvlanbootint=//');; - *ngcpvlansshext*) VLAN_SSH_EXT=$(echo $param | sed 's/ngcpvlansshext=//');; - *ngcpvlanwebext*) VLAN_WEB_EXT=$(echo $param | sed 's/ngcpvlanwebext=//');; - *ngcpvlansipext*) VLAN_SIP_EXT=$(echo $param | sed 's/ngcpvlansipext=//');; - *ngcpvlansipint*) VLAN_SIP_INT=$(echo $param | sed 's/ngcpvlansipint=//');; - *ngcpvlanhaint*) VLAN_HA_INT=$(echo $param | sed 's/ngcpvlanhaint=//');; - *ngcpvlanrtpext*) VLAN_RTP_EXT=$(echo $param | sed 's/ngcpvlanrtpext=//');; - *ngcpppainstaller*) NGCP_PPA_INSTALLER=$(echo $param | sed 's/ngcpppainstaller=//');; - *ngcpppa*) NGCP_PPA=$(echo $param | sed 's/ngcpppa=//');; + *ngcpvlanbootint*) VLAN_BOOT_INT="${param//ngcpvlanbootint=/}";; + *ngcpvlansshext*) VLAN_SSH_EXT="${param//ngcpvlansshext=/}";; + *ngcpvlanwebext*) VLAN_WEB_EXT="${param//ngcpvlanwebext=/}";; + *ngcpvlansipext*) VLAN_SIP_EXT="${param//ngcpvlansipext=/}";; + *ngcpvlansipint*) VLAN_SIP_INT="${param//ngcpvlansipint=/}";; + *ngcpvlanhaint*) VLAN_HA_INT="${param//ngcpvlanhaint=/}";; + *ngcpvlanrtpext*) VLAN_RTP_EXT="${param//ngcpvlanrtpext=/}";; + *ngcpppainstaller*) NGCP_PPA_INSTALLER="${param//ngcpppainstaller=/}";; + *ngcpppa*) NGCP_PPA="${param//ngcpppa=/}";; esac shift done @@ -1020,31 +1020,31 @@ set_deploy_status "diskverify" # TODO - hardcoded for now, to avoid data damage check_for_supported_disk() { - if grep -q 'ServeRAID' /sys/block/${DISK}/device/model ; then + if grep -q 'ServeRAID' "/sys/block/${DISK}/device/model" ; then return 0 fi # IBM System x3250 M3 - if grep -q 'Logical Volume' /sys/block/${DISK}/device/model && \ - grep -q "LSILOGIC" /sys/block/${DISK}/device/vendor ; then + if grep -q 'Logical Volume' "/sys/block/${DISK}/device/model" && \ + grep -q "LSILOGIC" "/sys/block/${DISK}/device/vendor" ; then return 0 fi # IBM System HS23 LSISAS2004 - if grep -q 'Logical Volume' /sys/block/${DISK}/device/model && \ - grep -q "LSI" /sys/block/${DISK}/device/vendor ; then + if grep -q 'Logical Volume' "/sys/block/${DISK}/device/model" && \ + grep -q "LSI" "/sys/block/${DISK}/device/vendor" ; then return 0 fi # PERC H700, PERC H710,... - if grep -q 'PERC' /sys/block/${DISK}/device/model && \ - grep -q "DELL" /sys/block/${DISK}/device/vendor ; then + if grep -q 'PERC' "/sys/block/${DISK}/device/model" && \ + grep -q "DELL" "/sys/block/${DISK}/device/vendor" ; then return 0 fi # proxmox on blade, internal system - if grep -q 'COMSTAR' /sys/block/${DISK}/device/model && \ - grep -q "OI" /sys/block/${DISK}/device/vendor ; then + if grep -q 'COMSTAR' "/sys/block/${DISK}/device/model" && \ + grep -q "OI" "/sys/block/${DISK}/device/vendor" ; then FIRMWARE_PACKAGES="$FIRMWARE_PACKAGES firmware-qlogic" return 0 fi @@ -1086,13 +1086,13 @@ else else # make sure it runs only within qemu/kvm - if [[ "$DISK" == "vda" ]] && readlink -f /sys/block/vda/device | grep -q 'virtio' ; then + if [[ "${DISK}" == "vda" ]] && readlink -f /sys/block/vda/device | grep -q 'virtio' ; then echo "Looks like a virtio disk, ok." - elif grep -q 'QEMU HARDDISK' /sys/block/${DISK}/device/model ; then + elif grep -q 'QEMU HARDDISK' "/sys/block/${DISK}/device/model" ; then echo "Looks like a QEMU harddisk, ok." - elif grep -q 'VBOX HARDDISK' /sys/block/${DISK}/device/model ; then + elif grep -q 'VBOX HARDDISK' "/sys/block/${DISK}/device/model" ; then echo "Looks like a VBOX harddisk, ok." - elif grep -q 'Virtual disk' /sys/block/${DISK}/device/model && [[ $(imvirt) == "VMware ESX Server" ]] ; then + elif grep -q 'Virtual disk' "/sys/block/${DISK}/device/model" && [[ $(imvirt) == "VMware ESX Server" ]] ; then echo "Looks like a VMware ESX Server harddisk, ok." else die "Error: /dev/${DISK} does not look like a virtual disk. Exiting to avoid possible data damage. Note: imvirt output is $(imvirt)" @@ -1124,7 +1124,7 @@ echo "root:sipwise" | chpasswd set_deploy_status "disksetup" # 2000GB = 2097152000 blocks in /proc/partitions - so make a rough estimation -if [ $(awk "/ ${DISK}$/ {print \$3}" /proc/partitions) -gt 2000000000 ] ; then +if [ "$(awk "/ ${DISK}$/ {print \$3}" /proc/partitions)" -gt 2000000000 ] ; then TABLE=gpt else TABLE=msdos @@ -1133,8 +1133,8 @@ fi if "$LVM" ; then # make sure lvcreate understands the --yes option lv_create_opts='' - lvm_version=$(dpkg-query -W -f='${Version}\n' lvm2) || die "Unknown package lvm2" - setupstorage_version=$(dpkg-query --show --showformat='${Version}' fai-setup-storage) || die "Unknown package fai-setup-storage" + lvm_version=$(dpkg-query -W -f="\${Version}\n" lvm2) || die "Unknown package lvm2" + setupstorage_version=$(dpkg-query --show --showformat="\${Version}" fai-setup-storage) || die "Unknown package fai-setup-storage" if dpkg --compare-versions "$setupstorage_version" ge 5.0 ; then logit "Installed fai-setup-storage version ${setupstorage_version} doesn't need the LVM '--yes' workaround." @@ -1162,8 +1162,8 @@ ${VG_NAME}-swap swap RAM:50% swap sw $lv_create_opts EOF # make sure setup-storage doesn't fail if LVM is already present - dd if=/dev/zero of=/dev/${DISK} bs=1M count=1 - blockdev --rereadpt /dev/${DISK} + dd if=/dev/zero of="/dev/${DISK}" bs=1M count=1 + blockdev --rereadpt "/dev/${DISK}" export LOGDIR='/tmp/setup-storage' mkdir -p $LOGDIR @@ -1175,7 +1175,8 @@ EOF die "You are using an outdated ISO, please update it to have fai-setup-storage >=4.0.6 available." fi - export disklist=$(/usr/lib/fai/fai-disk-info | sort) + disklist=$(/usr/lib/fai/fai-disk-info | sort) + export disklist PATH=/usr/lib/fai:${PATH} setup-storage -f /tmp/partition_setup.txt -X || die "Failure during execution of setup-storage" # used later by installer @@ -1183,10 +1184,10 @@ EOF SWAP_PARTITION="/dev/mapper/${VG_NAME}-swap" else # no LVM - parted -s -a optimal /dev/${DISK} mktable "$TABLE" || die "Failed to set up partition table" + parted -s -a optimal "/dev/${DISK}" mktable "$TABLE" || die "Failed to set up partition table" # hw-raid with rootfs + swap partition - parted -s -a optimal /dev/${DISK} 'mkpart primary ext4 2048s 95%' || die "Failed to set up primary partition" - parted -s -a optimal /dev/${DISK} 'mkpart primary linux-swap 95% -1' || die "Failed to set up swap partition" + parted -s -a optimal "/dev/${DISK}" 'mkpart primary ext4 2048s 95%' || die "Failed to set up primary partition" + parted -s -a optimal "/dev/${DISK}" 'mkpart primary linux-swap 95% -1' || die "Failed to set up swap partition" sync # used later by installer @@ -1360,7 +1361,7 @@ fi # a GRUB installation failing with "error: no such disk" during boot. # This is only a problem if we're using a virtio disk and deploying # from a system running lvm2 v2.02.106 or newer. -if [ "$DISK" = "vda" ] ; then +if [ "${DISK}" = "vda" ] ; then case "$DEBIAN_RELEASE" in lenny|squeeze|wheezy) echo "Applying /dev/disk/by-id/lvm-pv-uuid-* workaround for virtio disk and Debian release <= wheezy" @@ -1378,7 +1379,7 @@ fi # install Debian echo y | grml-debootstrap \ --arch "${ARCH}" \ - --grub /dev/${DISK} \ + --grub "/dev/${DISK}" \ --filesystem "${FILESYSTEM}" \ --hostname "${TARGET_HOSTNAME}" \ --mirror "$MIRROR" \ @@ -1389,7 +1390,7 @@ echo y | grml-debootstrap \ -t "$ROOT_FS" \ --password 'sipwise' 2>&1 | tee -a /tmp/grml-debootstrap.log -if [ ${PIPESTATUS[1]} -ne 0 ]; then +if [ "${PIPESTATUS[1]}" != "0" ]; then die "Error during installation of Debian ${DEBIAN_RELEASE}. Find details via: mount $ROOT_FS $TARGET ; ls $TARGET/debootstrap/*.log" fi @@ -1559,7 +1560,8 @@ get_installer_path() { wget --timeout=30 -O Packages.gz "${repos_base_path}Packages.gz" # sed: display paragraphs matching the "Package: ..." string, then grab string "^Version: " and display the actual version via awk # sort -u to avoid duplicates in repositories shipping the ngcp-installer-pro AND ngcp-installer-pro-ha-v3 debs - local version=$(zcat Packages.gz | sed "/./{H;\$!d;};x;/Package: ${installer_package}/b;d" | awk '/^Version: / {print $2}' | sort -u) + local version + version=$(zcat Packages.gz | sed "/./{H;\$!d;};x;/Package: ${installer_package}/b;d" | awk '/^Version: / {print $2}' | sort -u) [ -n "$version" ] || die "Error: installer version for ngcp ${SP_VERSION}, Debian release $DEBIAN_RELEASE with installer package $installer_package could not be detected." @@ -1629,7 +1631,7 @@ gen_installer_config () { GW="$EXT_GW" else echo "Last resort, guesting gateway for external IP as first IP in EADDR" - GW=$(echo $EADDR | awk -F. '{print $1"."$2"."$3".1"}') + GW=$(echo "$EADDR" | awk -F. '{print $1"."$2"."$3".1"}') fi else GW="$(ip route show dev $DEFAULT_INSTALL_DEV | awk '/^default via/ {print $3}')" @@ -1748,9 +1750,9 @@ EOT # make sure services are stopped . "$NGCP_SERVICES_FILE" for service in ${HA_NGCP_SERVICES} ${NGCP_SERVICES} ${NON_NGCP_SERVICES} ; do - if [ -f "${TARGET}/etc/init.d/$service" ] ; then - echo "Stopping $service ..." - grml-chroot $TARGET /etc/init.d/$service stop || true + if [ -f "${TARGET}/etc/init.d/${service}" ] ; then + echo "Stopping ${service} ..." + grml-chroot ${TARGET} "/etc/init.d/${service}" stop || true fi done @@ -1772,10 +1774,12 @@ EOT cp /tmp/grml-debootstrap.log "${TARGET}"/var/log/ fi - echo "# deployment.sh running on $(date)" > "${TARGET}"/var/log/deployment.log - echo "SCRIPT_VERSION=${SCRIPT_VERSION}" >> "${TARGET}"/var/log/deployment.log - echo "CMD_LINE=\"${CMD_LINE}\"" >> "${TARGET}"/var/log/deployment.log - echo "NGCP_INSTALLER_CMDLINE=\"TRUNK_VERSION=$TRUNK_VERSION SKIP_SOURCES_LIST=$SKIP_SOURCES_LIST ngcp-installer $ROLE $IP1 $IP2 $EADDR $EIFACE $IP_HA_SHARED\"" >> "${TARGET}"/var/log/deployment.log + { + echo "# deployment.sh running on $(date)" + echo "SCRIPT_VERSION=${SCRIPT_VERSION}" + echo "CMD_LINE=\"${CMD_LINE}\"" + echo "NGCP_INSTALLER_CMDLINE=\"TRUNK_VERSION=$TRUNK_VERSION SKIP_SOURCES_LIST=$SKIP_SOURCES_LIST ngcp-installer $ROLE $IP1 $IP2 $EADDR $EIFACE $IP_HA_SHARED\"" + } > "${TARGET}"/var/log/deployment.log fi @@ -2351,8 +2355,8 @@ if "$LVM" ; then fi # make sure /etc/fstab is up2date -if ! blockdev --rereadpt /dev/$DISK ; then - echo "Something on disk /dev/$DISK (mountpoint $TARGET) seems to be still active, debugging output follows:" +if ! blockdev --rereadpt "/dev/${DISK}" ; then + echo "Something on disk /dev/${DISK} (mountpoint $TARGET) seems to be still active, debugging output follows:" ps auxwww || true fi @@ -2361,7 +2365,7 @@ echo "Installation finished. \o/" echo echo -[ -n "$start_seconds" ] && SECONDS="$[$(cut -d . -f 1 /proc/uptime)-$start_seconds]" || SECONDS="unknown" +[ -n "$start_seconds" ] && SECONDS="$(( $(cut -d . -f 1 /proc/uptime) - start_seconds))" || SECONDS="unknown" logit "Successfully finished deployment process [$(date) - running ${SECONDS} seconds]" echo "Successfully finished deployment process [$(date) - running ${SECONDS} seconds]"