| #Number of times to sleep |
| BOOT_TIMEOUT="5"; |
| |
| #Path to memboot binary |
| #MEMBOOT=${MEMBOOT:-memboot}; |
| |
| #Username/password for ssh to BMC machines |
| SSHUSER=${SSHUSER:-sysadmin}; |
| export SSHPASS=${SSHPASS:-superuser}; |
| |
| #Username/password for IPMI |
| IPMI_AUTH="-U ${IPMI_USER:-admin} -P ${IPMI_PASS:-admin}" |
| PFLASH_TO_COPY=${PFLASH_TO_COPY:-} |
| PFLASH_BINARY=/usr/local/bin/pflash |
| |
| # Strip control characters from IPMI before grepping? |
| STRIP_CONTROL=0 |
| |
| # How do we SSH/SCP in? |
| SSHCMD="sshpass -e ssh -l $SSHUSER -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $target"; |
| |
| function sshcmd { |
| $SSHCMD $*; |
| } |
| |
| # remotecp file target target_location |
| function remotecp { |
| sshpass -e ssh -o User=$SSHUSER -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $2 dd of=$3 < $1; |
| } |
| |
| function is_off { |
| return $([ "$($IPMI_COMMAND chassis power status)" = "Chassis Power is off" ]); |
| } |
| |
| function poweroff { |
| $IPMI_COMMAND chassis power off |
| # give it some time |
| sleep 10 |
| } |
| |
| function force_primary_side { |
| # Now we force booting from primary (not golden) side |
| $IPMI_COMMAND raw 0x04 0x30 0x5c 0x01 0x00 0x00 0 0 0 0 0 0 |
| # and from somewhere else we get this raw command. Obvious really. |
| $IPMI_COMMAND raw 0x04 0x30 0xd2 0x01 0x00 0x00 0 0 0 0 0 0 |
| sleep 8 |
| } |
| |
| function flash { |
| if [ ! -z "$PFLASH_TO_COPY" ]; then |
| remotecp $PFLASH_TO_COPY $target /tmp/pflash |
| $SSHCMD chmod +x /tmp/pflash |
| PFLASH_BINARY=/tmp/pflash |
| fi |
| if [ ! -z "$PNOR" ]; then |
| remotecp $PNOR $target /tmp/image.pnor; |
| fi |
| if [ "${LID[0]}" != "" ]; then |
| remotecp ${LID[0]} $target /tmp/skiboot.lid; |
| fi |
| if [ "${LID[1]}" != "" ]; then |
| remotecp ${LID[1]} $target /tmp/bootkernel |
| fi |
| if [ "${arbitrary_lid[1]}" != "" ]; then |
| remotecp ${arbitrary_lid[1]} $target /tmp/$(basename ${arbitrary_lid[1]}) |
| fi |
| |
| if [ "$?" -ne "0" ] ; then |
| error "Couldn't copy firmware image"; |
| fi |
| |
| # Habenaro doesn't have md5sum |
| #flash_md5=$(md5sum "$1" | cut -f 1 -d ' '); |
| #$SSHCMD "flash_md5r=\$(md5sum /tmp/image.pnor | cut -f 1 -d ' '); |
| # if [ \"$flash_md5\" != \"\$flash_md5r\" ] ; then |
| # exit 1; |
| # fi"; |
| #if [ "$?" -ne "0" ] ; then |
| # error "Firmware MD5s don't match"; |
| #fi |
| |
| # flash it |
| if [ ! -z "$PNOR" ]; then |
| msg "Flashing full PNOR" |
| $SSHCMD "$PFLASH_BINARY -E -f -p /tmp/image.pnor" |
| if [ "$?" -ne "0" ] ; then |
| error "An unexpected pflash error has occurred"; |
| fi |
| msg "Removing /tmp/image.pnor" |
| $SSHCMD "rm /tmp/image.pnor" |
| fi |
| |
| if [ ! -z "${LID[0]}" ] ; then |
| msg "Flashing PAYLOAD PNOR partition" |
| $SSHCMD "$PFLASH_BINARY -e -f -P PAYLOAD -p /tmp/skiboot.lid" |
| if [ "$?" -ne "0" ] ; then |
| error "An unexpected pflash error has occurred"; |
| fi |
| msg "Removing /tmp/pskiboot.lid" |
| $SSHCMD "rm /tmp/skiboot.lid" |
| fi |
| |
| if [ ! -z "${LID[1]}" ] ; then |
| msg "Flashing BOOTKERNEL PNOR partition" |
| $SSHCMD "$PFLASH_BINARY -e -f -P BOOTKERNEL -p /tmp/bootkernel" |
| if [ "$?" -ne "0" ] ; then |
| error "An unexpected pflash error has occurred"; |
| fi |
| msg "Removing /tmp/bootkernel" |
| $SSHCMD "rm /tmp/bootkernel" |
| fi |
| |
| if [ ! -z "${arbitrary_lid[0]}" -a ! -z "${arbitrary_lid[1]}" ] ; then |
| msg "Flashing ${arbitrary_lid[0]} PNOR partition" |
| $SSHCMD "$PFLASH_BINARY -e -f -P ${arbitrary_lid[0]} -p /tmp/$(basename ${arbitrary_lid[1]})" |
| if [ "$?" -ne "0" ] ; then |
| error "An unexpected pflash error has occurred"; |
| fi |
| msg "Removing /tmp/$(basename ${arbitrary_lid[1]})" |
| $SSHCMD "rm /tmp/$(basename ${arbitrary_lid[1]})" |
| fi |
| |
| } |
| |
| function boot_firmware { |
| $IPMI_COMMAND chassis power on > /dev/null; |
| i=0; |
| while [ "$($IPMI_COMMAND chassis power status)" = "Chassis Power is off" -a \( "$i" -lt "$BOOT_TIMEOUT" \) ] ; do |
| msg -n "."; |
| sleep $BOOT_SLEEP_PERIOD; |
| i=$(expr $i + 1); |
| done |
| if [ "$i" -eq "$BOOT_TIMEOUT" ] ; then |
| error "Couldn't power on $target"; |
| fi |
| } |
| |
| function machine_sanity_test { |
| sshcmd true; |
| if [ $? -ne 0 ]; then |
| echo "$target: Failed to SSH to $target..." |
| echo "$target: Command was: $SSHCMD true" |
| error "Try connecting manually to diagnose the issue." |
| fi |
| # No further sanity tests for BMC machines. |
| true |
| } |