On 02/24/2012 11:55 PM, Nishanth Aravamudan wrote: > IVM (comes with VIOS) has some differences from HMC, but is overall > pretty similar. Tested on VIOS 2.2.1.3 only.
Ok, pretty good, applied: https://github.com/autotest/autotest/commit/8a87b06208e9b0ea02e62c267b469c5de33bf92c Thank you! > Signed-off-by: Nishanth Aravamudan<[email protected]> > --- > conmux/drivers/ivm | 425 > ++++++++++++++++++++++++++++++++++++++++++++++ > conmux/drivers/module.mk | 2 +- > 2 files changed, 426 insertions(+), 1 deletions(-) > create mode 100755 conmux/drivers/ivm > > diff --git a/conmux/drivers/ivm b/conmux/drivers/ivm > new file mode 100755 > index 0000000..c134c7a > --- /dev/null > +++ b/conmux/drivers/ivm > @@ -0,0 +1,425 @@ > +#!/usr/bin/expect -- > +# > +# ivm -- handle consoles and rebooting of VIOS based systems > +# > +# Allow connecting to the console of and rebooting of HMC connected > +# machines. Machines are identified by the HMC IP address, connected > +# system name, and partition name. > +# > +# usage: > +# ivm open-term|reboot -h<ivm IP> -p<partition> \ > +# -U<user> -P<password> -V<ivm version> > +# > +# example: > +# ivm open-term -p FullSystemPartition -U hscroot -P passwd \ > +# -V 2.6 -h 1.2.3.4 > +# ivm reboot -p FullSystemPartition -U hscroot -P passwd \ > +# -V 2.6 -h 1.2.3.4 > +# > +# (C) Copyright IBM Corp. 2012 > +# Author: Nishanth Aravamudan<[email protected]> > +# Based off hmc script, which is > +# (C) Copyright IBM Corp. 2004, 2005, 2006 > +# Author: Andy Whitcroft<[email protected]> > +# > +# The Console Multiplexor is released under the GNU Public License V2 > +# > +set P "ivm" > + > +# See interactions. > +log_user 0 > +#exp_internal 1 > + > +proc note {m} { > + global P > + puts "$P: $m" > +} > +proc warn {m} { > + global P > + puts "$P: WARNING: $m" > +} > +proc winge {m} { > + global P > + puts "$P: MACHINE ERROR: $m" > +} > + > +# > +# OPTIONS: options parser. > +# > +proc shift {_list} { > + upvar $_list list > + > + set res [lindex $list 0] > + set list [lreplace $list 0 0] > + > + return $res > +} > +proc arg {_list arg} { > + upvar $_list list > + > + if {[llength $list]< 1} { > + winge "$arg: required argument missing" > + exit 1 > + } > + > + return [shift list] > +} > + > +set user {padmin} > +set host {} > +set lpar {} > +set mode {norm} > +set passwd {} > +set version {} > + > +set cmd [lindex $argv 0] > +shift argv > +while {[llength $argv]> 0} { > + switch -- [shift argv] { > + -h { set host [arg argv h]} > + -l { set lpar [arg argv l]} > + -p { set lpar [arg argv p]} > + -b { set mode [arg argv b]} > + -U { set user [arg argv P]} > + -P { set passwd [arg argv P]} > + -V { set version [arg argv P]} > + } > +} > + > +if {[llength $argv]> 0} { > + puts stderr "Usage: $P<cmd> -h<ivm> -p<lpar> -b<mode>" > + exit 1 > +} > +if {[string compare $host ""] == 0 || > + [string compare $lpar ""] == 0} \ > +{ > + winge "ivm (-h), and lpar (-p) required" > + exit 1 > +} > + > +set prompt {___EOF___IVM___EOF___} > +set iospath {/usr/ios/lpm/bin} > + > +#log_file -a "$logfile" > + > +set elapsed_time 0 > +set timeout 30 > + > +# Ensure we have a terminal so we don't get prompted for one. > +if {![info exists env(TERM)]} { > + set env(TERM) {vt100} > +} > + > +# If we have a password don't use any ssh-keys we may have been offered. > +if {[string compare $passwd ""] == 0} { > + set command "ssh $env(SSH_OPTIONS) $user@$host" > +} else { > + set command "ssh $user@$host" > +} > + > +# CONNECT: connect to the remote console. Set the prompt up so we > +# know when a command we execute has completed. > +note "Logging into IVM console with command \"$command\" ..." > +eval spawn $command > +send "PS1=$prompt\r" > +expect { > + -re {[pP]assword:} { > + if {[string compare $passwd ""] == 0} { > + winge "$host: requesting password - not hacked" > + exit 2 > + } > + send "$passwd\r" > + after 500 > + send "PS1=$prompt\r" > + exp_continue > + } > + "Connection timed out" { > + winge "$host: cannot connect to console" > + exit 2 > + } > + "Name or service not known" { > + winge "$host: IVM name invalid" > + exit 1 > + } > + "Permission denied" { > + winge "$host: authentication failure, permission denied" > + exit 2 > + } > + timeout { > + winge "$host: IVM did not prompt us, timed out" > + exit 2 > + } > + eof { > + winge "$host: IVM disconnected without prompting" > + exit 2 > + } > + > + "Terminal type?" { > + send "vt100\r" > + send "PS1=$prompt\r" > + exp_continue > + } > + > + "PS1=$prompt" { > + # Ignore us typing the change to the prompt. > + exp_continue > + } > + "$prompt" { > + # Prompt see, we are in and working, drop out. > + ## note "prompt seen" > + } > + > + -re "^\[^\n]*\n" { > + # We need to absorb any login information, motd etc. > + ## puts "NOISE<$expect_out(buffer)>" > + exp_continue > + } > +} > + > +proc runit {cmd _out} { > + upvar $_out out > + > + global prompt > + > + send "$cmd" > + > + set text "" > + set line 0 > + > + set timeout 120 > + expect { > + > + -re "^\[^\n]*\n" { > + ##note "LINE: $expect_out(buffer)" > + if { $line> 0 } { > + append text $expect_out(buffer) > + } > + incr line > + exp_continue > + } > + > + -re "$prompt" { > + #note "prompt seen" > + } > + > + timeout { > + set out "ivm: command timeout" > + return 255 > + } > + } > + set out [string trimright $text] > + > + send "echo \$?\r" > + set text "" > + set line 0 > + set timeout 30 > + expect { > + -re "^\[^\n]*\n" { > + ##note "LINE: $expect_out(buffer)" > + if { $line> 0 } { > + append text $expect_out(buffer) > + } > + incr line > + exp_continue > + } > + > + -re "$prompt" { > + #note "prompt seen" > + } > + > + timeout { > + set out "ivm: command status timeout" > + return 255 > + } > + } > + #note "EXIT: $text" > + > + return [string trimright $text] > +} > + > +proc extract_names {out} { > + set res {} > + foreach sys [split $out] { > + if {[string compare $sys ""] != 0} { > + lappend res $sys > + } > + } > + > + return $res > +} > + > +# Find out the current version of the IVM software. > +if {[string compare $version ""] == 0} { > + runit "ioslevel; echo ''\r" version > +} > +if {[string compare $version ""] == 0} { > + winge "unable to obtain IVM code version" > + exit 1 > +} > +note "IVM revision v$version" > + > +# Based on the version of the IVM software select payload. > +if {$version< 3} { > + # > + # VERSION 2.6/3.0 specific support. > + # > + proc lpar_list {} { > + global iospath > + > + # Ask for a list of lpars for this system. > + if {[runit "lssyscfg -r lpar -F name\r" out] != 0} { > + winge "unable to obtain list of lpars" > + exit 1 > + } > + > + return [extract_names $out] > + } > + proc state {lpar} { > + global iospath > + > + # Ask for the lpar status. > + if {[runit "lssyscfg -r lpar --filter lpar_names=$lpar -F > state\r" out] != 0} { > + winge "$lpar: failed to get lpar status" > + exit 1 > + } > + > + return $out > + } > + proc lparid {lpar} { > + global iospath > + > + # Ask for the corresponding ID of an LPAR by name > + if {[ runit "lssyscfg -r lpar --filter lpar_names=$lpar -F > lpar_id\r" out] != 0} { > + winge "$lpar: failed to get lpar ID" > + exit 1 > + } > + > + return $out > + } > + proc reboot {lpar mode} { > + global iospath > + > + # Partitions in Error state are tricky, you _may_ either > + # have to shut them down and then start them, or you may > + # just have to start them. So, if we are in Error start > + # the partition, if it fails we can just drop through > + # to the regular stop/start cycle. > + if {[string compare [state $lpar] "Error"] == 0} { > + note "starting lpar (from Error)" > + if {[runit "chsysstate -r lpar -n $lpar -b $mode -o > on\r" out] == 0} { > + note "started" > + return > + } > + note "start failed - attempting shutdown" > + } > + > + # See if the lpar is up, if so shut it down. > + if {[string compare [state $lpar] "Ready"] != 0} { > + note "shutting down lpar" > + if {[runit "chsysstate -r lpar -n $lpar -o shutdown\r" > out] != 0} { > + winge "$lpar: power off failed\n$out" > + exit 2 > + } > + } > + > + while {[string compare [state $lpar] "Not Activated"] != 0} { > + note "waiting for shutdown" > + sleep 15 > + } > + > + note "starting lpar" > + if {[runit "chsysstate -r lpar -n $lpar -b $mode -o on\r" out] > != 0} { > + winge "$lpar: power on failed\n$out" > + exit 2 > + } > + note "started" > + } > + > +} > + > +# > +# VERSION: common > +# > +proc open-term {lpar lparid} { > + global prompt > + global iospath > + global spawn_id > + > + note "opening console ..." > + send "ulimit -t 3600; mkvt -id $lparid\r" > + expect { > + "NVTS" { } > + "Open in progress.." { } > + "$prompt" { > + winge "$lpar: open console failed" > + exit 2 > + } > + } > + > + note "console open" > + interact { > + -i $spawn_id > + " Connection has closed" { > + winge "$lpar: console connection closed" > + exit 2 > + } > + {Error in communication path to the partition} { > + winge "$lpar: lost contact with lpar" > + exit 2 > + } > + "$prompt" { > + winge "$lpar: open console failed" > + exit 2 > + } > + eof { > + winge "$lpar: payload lost" > + exit 2 > + } > + \000 { > + } > + > + } > + note "console closed" > +} > + > +proc close-term {lpar lparid} { > + global iospath > + > + note "closing console ..." > + if {[runit "rmvt -id $lparid\r" out] != 0} { > + winge "$lpar: close console failed" > + exit 2 > + } > +} > + > +set lpars [lpar_list] > +if {[lsearch -exact $lpars $lpar]< 0} { > + winge "$system/$lpar: lpar not known; console knows: $lpars" > + exit 1 > +} > + > +# Ask for the lpar status, to see if it exists. > +set lstate [state $lpar] > +set lparid [lparid $lpar] > +note "$lpar (ID $lparid): found ($lstate)" > + > +# > +# COMMANDS: command. > +# > +switch -- $cmd { > + {open-term} { > + close-term $lpar $lparid > + open-term $lpar $lparid > + } > + {close-term} { > + close-term $lpar $lparid > + } > + {reboot} { > + reboot $lpar $mode > + } > + default { > + winge "$cmd: unknown command" > + } > +} > + > +exit 0 > diff --git a/conmux/drivers/module.mk b/conmux/drivers/module.mk > index 7c36663..c13fec0 100644 > --- a/conmux/drivers/module.mk > +++ b/conmux/drivers/module.mk > @@ -3,7 +3,7 @@ > # > # The Console Multiplexor is released under the GNU Public License V2 > > -DRIVERS:=blade dli-lpc hmc reboot-netfinity reboot-newisys reboot-numaq \ > +DRIVERS:=blade dli-lpc hmc ivm reboot-netfinity reboot-newisys reboot-numaq \ > reboot-rsa reboot-rsa2 zseries-console x3270_glue.expect \ > reboot-acs48 reboot-apc reboot-laurel fence_apc_snmp.py > _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
