28cb65ebac
management machine. Tests for /opt/confluent/bin/confetty Change to first check consoleservice keyword in site table before using confluent. This allows us to install confluent on the machine and control use with the keyword
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
|