199 lines
5.7 KiB
Bash
Executable File
199 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Provide serial console access to nodes
|
|
|
|
# To handle cases like running this via sudo, get the home dir properly
|
|
os=`uname`
|
|
if [ "$os" == "Linux" ]; then
|
|
HOME=`getent passwd $(whoami)|cut -d: -f 6`
|
|
export HOME
|
|
fi
|
|
if [ "$os" == "AIX" ]; then
|
|
HOME=`lsuser -a home $(whoami)|cut -d= -f 2`
|
|
export HOME
|
|
fi
|
|
|
|
if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
|
|
echo "rcons - remotely accesses the serial console of a node"
|
|
echo "rcons <singlenode> [conserver] [-f]"
|
|
echo "rcons <singlenode> [conserver] [-s]"
|
|
echo "rcons [-h|--help|-v|--version]"
|
|
exit 0
|
|
fi
|
|
if [ "$1" = "-v" ]; then
|
|
echo "Version 2.9"
|
|
exit 0
|
|
fi
|
|
if [ "$1" = "--version" ]; then
|
|
echo "Version 2.9"
|
|
exit 0
|
|
fi
|
|
|
|
if [ -n "$3" ] && [ "$3" = "-f" ]; then
|
|
FORCE=-f
|
|
CONSERVER=$2
|
|
fi
|
|
|
|
#console spy mode
|
|
if [ -n "$3" ] && [ "$3" = "-s" ]; then
|
|
FORCE=-s
|
|
CONSERVER=$2
|
|
fi
|
|
|
|
if [ -n "$2" ]; then
|
|
if [ "$2" = "-f" ]; then
|
|
FORCE=-f
|
|
else
|
|
if [ "$2" = "-s" ]; then
|
|
FORCE=-s
|
|
else
|
|
CONSERVER=$2
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# xCAT 2.9.1 allows for an option to use confluent as a rcons replacement and only use
|
|
# confluent if this keyword is defined in the site table. This allows for confluent to
|
|
# be installed on the xCAT management node and switch between conserver & confluent
|
|
USE_CONFLUENT=0
|
|
CONSOLE_SERVICE_KEYWORD=`tabdump site | grep consoleservice | cut -d, -f1 | tr -d '"'`
|
|
CONSOLE_SERVICE_VALUE=`tabdump site | grep consoleservice | cut -d, -f2 | tr -d '"'`
|
|
|
|
if [ "$CONSOLE_SERVICE_KEYWORD" == "consoleservice" ]; then
|
|
if [ "$CONSOLE_SERVICE_VALUE" == "confluent" ]; then
|
|
USE_CONFLUENT=1
|
|
fi
|
|
fi
|
|
|
|
if [ $USE_CONFLUENT == "1" ] && ([ -x "/opt/confluent/bin/confetty" ] || [ -x "/usr/bin/confetty" ] || [ -x "/usr/local/bin/confetty" ]); then
|
|
#use confluent
|
|
CONFETTY="confetty"
|
|
if [ -x "/opt/confluent/bin/confetty" ]; then
|
|
CONFETTY="/opt/confluent/bin/confetty"
|
|
fi
|
|
if [ ! -z "$CONSCONTROLPATH" ]; then
|
|
CONSCONTROLPATH="-c $CONSCONTROLPATH"
|
|
fi
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=`nodels $1 nodehm.conserver 2>/dev/null | awk -F: '{print $2}' | tr -d ' '`
|
|
fi
|
|
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=$XCATHOST
|
|
fi
|
|
if [ ! -z "$CONSERVER" ]; then
|
|
CONSERVER="-s $CONSERVER"
|
|
fi
|
|
$CONFETTY $CONSCONTROLPATH $CONSERVER $1
|
|
elif [ -f "/usr/bin/console" ] || [ -f "/bin/console" ]; then
|
|
#use conserver
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=`nodels $1 nodehm.conserver 2>/dev/null | awk -F: '{print $2}' | tr -d ' '`
|
|
fi
|
|
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=$XCATHOST
|
|
fi
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=localhost
|
|
fi
|
|
#NOTE: IPv6 is not good with the below if going by IP, needs more sophisticated
|
|
#parsing
|
|
CONSERVER=`echo $CONSERVER|cut -d: -f 1`
|
|
|
|
#Detect console support of SSL, only fixup consolerc if encryption is detected
|
|
if ! console -h 2>&1 | grep "encryption not compiled" > /dev/null; then
|
|
# generate .consolerc if it does not exist or is empty
|
|
if [ ! -s $HOME/.consolerc ]; then
|
|
cat > $HOME/.consolerc << EOF
|
|
config * {
|
|
port 782;
|
|
sslenabled yes;
|
|
sslauthority $HOME/.xcat/ca.pem;
|
|
sslcredentials $HOME/.xcat/client-cred.pem;
|
|
}
|
|
EOF
|
|
fi
|
|
else
|
|
# ssl is not enabled, comment out the ssl settings in .consolerc
|
|
if [ -f $HOME/.consolerc ]; then
|
|
sed -i 's/\Wssl/#ssl/1' $HOME/.consolerc
|
|
fi
|
|
fi
|
|
|
|
exec console $FORCE -M $CONSERVER $1
|
|
else
|
|
if [[ "$FORCE" == "-s" ]]; then
|
|
echo "Read-only mode is not supported, please run rcons without -s option."
|
|
exit 1
|
|
fi
|
|
#deal with consoles directly
|
|
output=`nodels $1 nodehm.conserver nodehm.cons nodehm.mgt 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
echo "$output"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$CONSERVER" ]; then
|
|
CONSERVER=`echo "$output"|grep nodehm.conserver|cut -d: -f3|tr -d ' \n'`
|
|
fi
|
|
CONS=`echo "$output" |grep /nodehm.cons$/|cut -d: -f3 | tr -d ' \n'`
|
|
if [ -z "$CONS" ]; then
|
|
CONS=`echo "$output"|grep nodehm.mgt|cut -d: -f3 | tr -d ' \n'`
|
|
fi
|
|
if [ -z "$CONS" ]; then
|
|
echo "Error: nodehm.mgt or nodehm.cons for node $1 not setup."
|
|
exit 1;
|
|
fi
|
|
|
|
#check if conserver is local host
|
|
result=`ping -c1 $CONSERVER 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
index1=`expr index "$result" "\("`
|
|
index2=`expr index "$result" "\)"`
|
|
pos=`expr $index1 + 1`
|
|
length=`expr $index2 - $index1`
|
|
length=`expr $length - 1`
|
|
cons_ip=`expr substr "$result" $pos $length`
|
|
if [ "$os" == "AIX" ]; then
|
|
ifconfig |grep "$cons_ip"
|
|
else
|
|
ip addr |grep "$cons_ip"
|
|
fi
|
|
if [ $? -eq 0 ]; then
|
|
CONSERVER=""
|
|
fi
|
|
else
|
|
echo "Error: conserver $CONSERVER is not reachable."
|
|
exit 1;
|
|
fi
|
|
#echo "CONS=$CONS CONSERVER=$CONSERVER"
|
|
|
|
# check if others are using the console
|
|
if [[ -n $CONSERVER ]]; then
|
|
ssh $CONSERVER ps -ef |grep $1 |grep -v grep |grep "$XCATROOT/share/xcat/cons" > /dev/null
|
|
else
|
|
ps -ef |grep $1 |grep -v grep |grep "$XCATROOT/share/xcat/cons" > /dev/null
|
|
fi
|
|
if [ $? -eq 0 ]; then
|
|
if [[ "$FORCE" == "-f" ]] ; then
|
|
echo "Only one console can be run at a time for a node. Other consoles will be closed."
|
|
else
|
|
echo "Only one console can be run at a time for a node. Please close other consoles or run rcons with -f option."
|
|
exit 1;
|
|
fi
|
|
fi
|
|
|
|
echo "**** Enter ~? for help *****"
|
|
if [ -z "$XCATROOT" ]; then
|
|
cmdpath="/opt/xcat/share/xcat/cons"
|
|
else
|
|
cmdpath="$XCATROOT/share/xcat/cons"
|
|
fi
|
|
if [ -z "$CONSERVER" ]; then
|
|
exec $cmdpath/$CONS $1
|
|
else
|
|
exec ssh -t $CONSERVER "$cmdpath/$CONS $1"
|
|
fi
|
|
fi
|