diff options
Diffstat (limited to 'scripts/install/install-image')
| -rwxr-xr-x | scripts/install/install-image | 410 | 
1 files changed, 223 insertions, 187 deletions
diff --git a/scripts/install/install-image b/scripts/install/install-image index fecaeed8..b8dcb20d 100755 --- a/scripts/install/install-image +++ b/scripts/install/install-image @@ -1,10 +1,89 @@  #!/bin/bash +fail_exit () +{ +    echo "$*" +    echo 'Exiting...' +    exit 1 +} + +print_help () +{ +    echo "$*" +    echo "Help:" +    echo "  --username    use username for HTTP auth (optional)" +    echo "  --password    use password for HTTP auth (optional)" +    exit 1 +} + +clean_up () +{ +    if [ -n "$PART_FILE" ]; then +        rm -f $PART_FILE >&/dev/null +    fi +    umount $CD_SQUASH_ROOT >&/dev/null || true +    umount $CD_ROOT >&/dev/null || true +    umount $INST_ROOT >&/dev/null || true +    umount $READ_ROOT >&/dev/null || true +    umount $WRITE_ROOT >&/dev/null || true +    if [ -d "$TEMP_DIR" ]; then +        rm -rf $TEMP_DIR +    fi +} + +sig_handler () { +    echo "ERROR: Signal received. Exiting..." +    clean_up +    echo "Done" +    trap - EXIT +    exit 1 +} + +exit_handler () { +    clean_up +} + +# read in commandline - snipped thankfully copied from: +# https://unix.stackexchange.com/a/580258 +while [ $# -gt 0 ]; do +  case "$1" in +    --url*|-u) +        if [[ "$1" != *=* ]]; then shift; fi # Value is next arg if no `=` +        # the image to be installed. only used if installing from an installed, +        # running system. +        NEW_ISO="${1#*=}" +        ;; +    --vrf*|-v) +        if [[ "$1" != *=* ]]; then shift; fi # Value is next arg if no `=` +        VRF="${1#*=}" +        ;; +    --username*) +        if [[ "$1" != *=* ]]; then shift; fi +        # Username and password are optional +        USERNAME="${1#*=}" +        ;; +    --password*) +        if [[ "$1" != *=* ]]; then shift; fi +        PASSWORD="${1#*=}" +        ;; +    --help|-h) +        print_help +        exit 0 +        ;; +    *) +        print_help +        >&2 printf "Error: Invalid argument\n" +        exit 1 +        ;; +    esac +    shift +done +  # source in the functions  source /opt/vyatta/sbin/install-functions -if [ -f /etc/profile.d/vyos-system-proxy.sh ] - then . /etc/profile.d/vyos-system-proxy.sh +if [ -f /etc/profile.d/vyos-system-proxy.sh ]; then +    source /etc/profile.d/vyos-system-proxy.sh  fi  # export INSTALL_LOG for the scripts invoked @@ -18,40 +97,6 @@ PART_FILE=''  # Temp directory for downloaded ISO  TEMP_DIR="/var/tmp/install-image.$$" -fail_exit () -{ -  echo "$*" -  echo 'Exiting...' -  exit 1 -} - -clean_up () -{ -  if [ -n "$PART_FILE" ]; then -    rm -f $PART_FILE >&/dev/null -  fi -  umount $CD_SQUASH_ROOT >&/dev/null || true -  umount $CD_ROOT >&/dev/null || true -  umount $INST_ROOT >&/dev/null || true -  umount $READ_ROOT >&/dev/null || true -  umount $WRITE_ROOT >&/dev/null || true -  if [ -d "$TEMP_DIR" ]; then -      rm -rf $TEMP_DIR -  fi -} - -sig_handler () { -  echo "ERROR: Signal received. Exiting..." -  clean_up -  echo "Done" -  trap - EXIT -  exit 1 -} - -exit_handler () { -  clean_up -} -  # Try to fetch the ISO file using a URL provided by the user.  # If successful, we leave $NEW_ISO pointing to the ISO file that  # was downloaded. @@ -61,9 +106,9 @@ fetch_iso_by_url ()      echo "Trying to fetch ISO file from $NEW_ISO"      if [ -n "$USERNAME" ]; then -	auth="-u $USERNAME:$PASSWORD" +        auth="-u $USERNAME:$PASSWORD"      else -	auth="" +        auth=""      fi      # This is for statistics collection @@ -73,34 +118,33 @@ fetch_iso_by_url ()      curl -L -H "User-Agent: VyOS/$vyos_version" $auth -f -o $filename $NEW_ISO      curlerror=$?      if [ $curlerror -eq 51 ]; then -	host=${NEW_ISO##scp://} -	host=${host%%/*} -	rsa_key=$(ssh-keyscan -t rsa $host 2>/dev/null) +        host=${NEW_ISO##scp://} +        host=${host%%/*} +        rsa_key=$(ssh-keyscan -t rsa $host 2>/dev/null)          if [[ $VYATTA_PROCESS_CLIENT == "gui2_rest" ]]; then -		response="yes" -	else  -		echo "The authenticity of host '$host' can't be established." -		echo "RSA key fingerprint is $(ssh-keygen -lf /dev/stdin <<<$rsa_key \ -		| awk {' print $2 '} ) ." -		echo "Are you sure you want to continue connecting (yes/no) [yes]?" -       		response=$(get_response "Yes" "Yes No Y N") +            response="yes" +        else +            echo "The authenticity of host '$host' can't be established." +            echo "RSA key fingerprint is $(ssh-keygen -lf /dev/stdin <<<$rsa_key \ +                | awk {' print $2 '} ) ." +            echo "Are you sure you want to continue connecting (yes/no) [yes]?" +            response=$(get_response "Yes" "Yes No Y N") +        fi +        if [[ "$response" == "yes" || "$response" == "y" ]]; then +            mkdir -p ~/.ssh/ +            echo $rsa_key >> ~/.ssh/known_hosts +            curl $auth -f -o $filename $NEW_ISO +            curlerror=$?          fi -	if [[ "$response" == "yes" || "$response" == "y" ]]; then -		mkdir -p ~/.ssh/ -		echo $rsa_key >> ~/.ssh/known_hosts -		curl $auth -f -o $filename $NEW_ISO -		curlerror=$? -	fi      fi      if [ $curlerror -ne 0 ]; then -	echo "Unable to fetch ISO from $NEW_ISO" -	rm -f $filename -	exit 1 +        echo "Unable to fetch ISO from $NEW_ISO" +        rm -f $filename +        exit 1      fi -      if [ ! -e $filename ]; then -	echo "Download of $NEW_ISO failed" -	exit 1 +        echo "Download of $NEW_ISO failed" +        exit 1      fi      echo "ISO download succeeded." @@ -108,34 +152,33 @@ fetch_iso_by_url ()      echo "Checking for digital signature file..."      curl -L -H "User-Agent: VyOS/$vyos_version" $auth -f -o ${filename}.asc ${NEW_ISO}.asc      if [ $? -ne 0 ]; then -	echo "Unable to fetch digital signature file." -	echo -n "Do you want to continue without signature check? (yes/no) [yes] " - -	response=$(get_response "Yes" "Yes No Y N") -	if [ "$response" == "no" ] || [ "$response" == "n" ]; then -	    rm -f $filename -	    fail_exit 'OK.  Installation will not be performed.' -	fi +        echo "Unable to fetch digital signature file." +        echo -n "Do you want to continue without signature check? (yes/no) [yes] " -	# In case signature file was partially downloaded... -	rm -f ${filename}.asc +        response=$(get_response "Yes" "Yes No Y N") +        if [ "$response" == "no" ] || [ "$response" == "n" ]; then +            rm -f $filename +            fail_exit 'OK.  Installation will not be performed.' +        fi +        # In case signature file was partially downloaded... +        rm -f ${filename}.asc      fi      if [ -e ${filename}.asc ]; then -	echo "Found it.  Checking digital signature..." -	gpg --keyring /etc/apt/trusted.gpg --verify ${filename}.asc -	if [ $? -ne 0 ]; then -	    echo "Signature check FAILED." -	    echo -n "Do you want to continue anyway? (yes/no) [no] " -	    response=$(get_response "No" "Yes No Y N") -	    if [ "$response" == "no" ] || [ "$response" == "n" ]; then -		fail_exit 'OK.  Installation will not be performed.' -	    fi -	     -	    echo "OK. Proceeding with installation anyway." -	else -	    echo "Digital signature is valid." -	fi +        echo "Found it.  Checking digital signature..." +        gpg --keyring /etc/apt/trusted.gpg --verify ${filename}.asc +        if [ $? -ne 0 ]; then +            echo "Signature check FAILED." +            echo -n "Do you want to continue anyway? (yes/no) [no] " +            response=$(get_response "No" "Yes No Y N") +            if [ "$response" == "no" ] || [ "$response" == "n" ]; then +                fail_exit 'OK.  Installation will not be performed.' +            fi + +            echo "OK. Proceeding with installation anyway." +        else +            echo "Digital signature is valid." +        fi      fi      NEW_ISO=$filename @@ -147,105 +190,98 @@ set_up_new_iso ()      url_scheme=${NEW_ISO%%:*}      if [ "$url_scheme" != "$NEW_ISO" ]; then -	if [ "$url_scheme" = "http" -o "$url_scheme" = "https" -o \ -	    "$url_scheme" = "ftp" -o "$url_scheme" = "tftp" -o \ -	    "$url_scheme" = "scp" ]; then -	    fetch_iso_by_url -	fi +        if [ "$url_scheme" = "http" -o "$url_scheme" = "https" -o \ +             "$url_scheme" = "ftp" -o "$url_scheme" = "tftp" -o \ +             "$url_scheme" = "scp" ]; then +            fetch_iso_by_url +        fi +    fi + +    if [ ! -f "$NEW_ISO" ] || ! (grep -q ISO9660 $NEW_ISO); then +        fail_exit "\"$NEW_ISO\" is not a valid ISO image file."      fi -  if [ ! -f "$NEW_ISO" ] || ! (grep -q ISO9660 $NEW_ISO); then -    fail_exit "\"$NEW_ISO\" is not a valid ISO image file." -  fi - -  # make sure mount points exist -  mkdir -p $INST_ROOT $WRITE_ROOT $READ_ROOT $CD_ROOT $CD_SQUASH_ROOT  - -  # mount ISO -  margs="-o loop,ro $NEW_ISO $CD_ROOT" -  if ! try_mount "$margs"; then -    fail_exit 'Failed to mount the new image.' -  fi - -  # check squash image -  local squash_file=$CD_ROOT/live/filesystem.squashfs -  if [ ! -f "$squash_file" ] || ! (file $squash_file | grep -q Squashfs) \ -      || ! grep -q '^ii  vyatta-version ' $CD_ROOT/live/packages.txt; then -    fail_exit "\"$NEW_ISO\" is not a VyOS ISO image file." -  fi - -  # Verify checksums of all files in ISO image -  if [ ! -f $CD_ROOT/md5sum.txt ]; then -      fail_exit "MD5 checksum file is missing from ISO." -  fi - -  echo -n "Checking MD5 checksums of files on the ISO image..." -  resfile=`mktemp /tmp/install-image-md5check-XXXXXXXX` -  (cd $CD_ROOT ; md5sum -c md5sum.txt > $resfile) -  failures=`grep -v 'OK$' $resfile | wc -l` -  rm -f $resfile -  if [ $failures == 0 ]; then -      echo "OK." -  else -      echo "Failed!" -      echo "$failures checksum failures found!" -      echo "ISO image is corrupted and can not be used." -      exit 1 -  fi - -  # mount squash image -  margs="-o loop,ro $squash_file $CD_SQUASH_ROOT" -  if ! try_mount "$margs"; then +    # make sure mount points exist +    mkdir -p $INST_ROOT $WRITE_ROOT $READ_ROOT $CD_ROOT $CD_SQUASH_ROOT + +    # mount ISO +    margs="-o loop,ro $NEW_ISO $CD_ROOT" +    if ! try_mount "$margs"; then +        fail_exit 'Failed to mount the new image.' +    fi + +    # check squash image +    local squash_file=$CD_ROOT/live/filesystem.squashfs +    if [ ! -f "$squash_file" ] \ +        || ! (file $squash_file | grep -q Squashfs) \ +        || ! grep -q '^ii  vyatta-version ' $CD_ROOT/live/packages.txt; then +        fail_exit "\"$NEW_ISO\" is not a VyOS ISO image file." +    fi + +    # Verify checksums of all files in ISO image +    if [ ! -f $CD_ROOT/md5sum.txt ]; then +        fail_exit "MD5 checksum file is missing from ISO." +    fi + +    echo -n "Checking MD5 checksums of files on the ISO image..." +    resfile=`mktemp /tmp/install-image-md5check-XXXXXXXX` +    (cd $CD_ROOT ; md5sum -c md5sum.txt > $resfile) +    failures=`grep -v 'OK$' $resfile | wc -l` +    rm -f $resfile +    if [ $failures == 0 ]; then +        echo "OK." +    else +        echo "Failed!" +        echo "$failures checksum failures found!" +        echo "ISO image is corrupted and can not be used." +        exit 1 +    fi + +    # mount squash image +    margs="-o loop,ro $squash_file $CD_SQUASH_ROOT" +    if ! try_mount "$margs"; then      fail_exit 'Failed to mount the squashfs image.' -  fi +    fi  }  # install new image into a newly-formatted partition.  # will exit with error if installation fails.  install_new ()  { -  local root_part=$1 -  local inst_drv=$2 +    local root_part=$1 +    local inst_drv=$2 -  if [ ! -e "/dev/$root_part" ] || [ ! -e "/dev/$inst_drv" ]; then -    fail_exit "Invalid drive/partition ($inst_drv and $root_part)." -  fi +    if [ ! -e "/dev/$root_part" ] || [ ! -e "/dev/$inst_drv" ]; then +        fail_exit "Invalid drive/partition ($inst_drv and $root_part)." +    fi -  # install new image -  if ! /opt/vyatta/sbin/install-image-new "$root_part"; then -    exit 1 -  fi +    # install new image +    if ! /opt/vyatta/sbin/install-image-new "$root_part"; then +        exit 1 +    fi -  # postinst operations -  if ! /opt/vyatta/sbin/install-postinst-new \ -         "$inst_drv" "$root_part" union; then  -    exit 1 -  fi +    # postinst operations +    if ! /opt/vyatta/sbin/install-postinst-new "$inst_drv" "$root_part" union; then +        exit 1 +    fi  }  # install new image into the current boot partition.  # will exit with error if installation fails.  install_existing ()  { -  local ctype=$1 -  if ! /opt/vyatta/sbin/install-image-existing "$ctype"; then -    exit 1 -  fi +    local ctype=$1 +    if ! /opt/vyatta/sbin/install-image-existing "$ctype"; then +        exit 1 +    fi  } -# the image to be installed. only used if installing from an installed, -# running system. -NEW_ISO=$1 - -# Username and password are optional -if [ $# -eq 3 ]; then -    USERNAME=$2 -    PASSWORD=$3 -else -    USERNAME="" -    PASSWORD="" +if [ -z "$USERNAME" ] && [ -n "$PASSWORD" ]; then +    fail_exit "Password can not be specified without username" +fi +if [ -n "$USERNAME" ] && [ -z "$PASSWORD" ]; then +    fail_exit "Username can not be specified without password"  fi -  if [ $(id -u) != 0 ]; then      fail_exit "Image installation requires root privileges!"  fi @@ -263,32 +299,32 @@ EOF      response=''      while [ -z "$response" ]      do -	echo -n "Would you like to continue? (Yes/No) [Yes]: " -	response=$(get_response "Yes" "Yes No Y N") -	if [ "$response" == "no" ] || [ "$response" == "n" ]; then -	    fail_exit 'Ok then.' -	fi +        echo -n "Would you like to continue? (Yes/No) [Yes]: " +        response=$(get_response "Yes" "Yes No Y N") +        if [ "$response" == "no" ] || [ "$response" == "n" ]; then +            fail_exit 'Ok then.' +        fi      done  fi  if is_live_cd_boot; then -  if [ -n "$NEW_ISO" ]; then -    echo 'You are trying to install from a live CD boot. The live CD image' -    fail_exit 'will be used. Do not specify an ISO image file or URL.' -  fi +    if [ -n "$NEW_ISO" ]; then +        echo 'You are trying to install from a live CD boot. The live CD image' +        fail_exit 'will be used. Do not specify an ISO image file or URL.' +    fi  elif [ -z "$NEW_ISO" ]; then -  echo 'You are trying to install from an already installed system. An ISO' -  fail_exit 'image file to install or URL must be specified.' +    echo 'You are trying to install from an already installed system. An ISO' +    fail_exit 'image file to install or URL must be specified.'  else -  # installing on an installed system. set up the new image. -  set_up_new_iso +    # installing on an installed system. set up the new image. +    set_up_new_iso  fi  # get install partition  PART_FILE=$(mktemp /tmp/inst-get-part.XXXXXX) \    || fail_exit 'Failed to create temporary file'  if ! /opt/vyatta/sbin/install-get-partition $PART_FILE; then -  exit 1 +    exit 1  fi  # get the partition params @@ -300,15 +336,15 @@ rm -f $PART_FILE >&/dev/null  # handle different types  case "$root_part_type" in -  new) -    install_new "$root_part" "$inst_drv"  -    exit 0 -    ;; -  union|old) -    install_existing "$root_part_type" -    exit 0 -    ;; -  *) -    fail_exit "Unknown partition type \"$root_part_type\"." -    ;; +    new) +        install_new "$root_part" "$inst_drv" +        exit 0 +        ;; +    union|old) +        install_existing "$root_part_type" +        exit 0 +        ;; +    *) +        fail_exit "Unknown partition type \"$root_part_type\"." +        ;;  esac  | 
