#!/bin/rc # P - send command to remote power switch (APC AOS 3.7.x) # requires auth/userpasswd (cf. /sys/src/cmd/auth/userpasswd.c) rfork en fn usage { echo >[1=2] usage: P system [command] exit usage } if(~ $#* 0) usage if(~ $#* 1) cmd=3 if not switch($2){ case on # 1- Immediate On cmd=1 case off # 2- Immediate Off cmd=2 case reboot # 3- Immediate Reboot cmd=3 case * usage } outlet=`{ndb/query sys $1 outlet} if(~ $outlet ''){ echo >[1=2] P: unknown outlet for $1 exit nooutlet } power=`{ndb/query sys $1 power} if(~ $power ''){ echo >[1=2] P: unknown power for $1 exit nopower } if(! test -e /mnt/consoles/$power){ server=`{ndb/query sys $power console} if(~ $server ''){ echo >[1=2] P: unknown console server for $power exit noserver } switch($sysname){ case $server mount /srv/consoles /mnt/consoles case * import $server /mnt/consoles } } auth=`{auth/userpasswd 'service=power power='$power} # Unfortunately, AOS 3.7.x is menu-driven, though it is fairly # forgiving. We fire and forget a series of commands to a given # outlet. Use of an interrupt will always warp us to the topmost # menu; menus will ignore an authentication attempt if it is # unnecessary. { # Clear prompt echo; echo # User Name : echo $auth(1) # Password : echo $auth(2) # Send interrupt tt '^C' # 1- Device Manager echo 1 # 2- Outlet Management echo 2 # 1- Outlet Control/Configuration echo 1 # Select outlet echo $outlet # 1- Control Outlet echo 1 # Issue command; ignore result echo $cmd; echo YES; echo }>/mnt/consoles/$power