git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.8@15341 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| # 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"  ]; 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.8"
 | |
|     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
 | |
| 
 | |
| if [ -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
 | |
| 	if [ ! -f $HOME/.consolerc ]; then
 | |
| 	    echo 'config * {' > $HOME/.consolerc
 | |
| 	    echo "	port 782;" >> $HOME/.consolerc
 | |
| 	    echo "	sslenabled yes;" >> $HOME/.consolerc
 | |
| 	    echo "	sslauthority $HOME/.xcat/ca.pem;" >> $HOME/.consolerc
 | |
| 	    echo "	sslcredentials $HOME/.xcat/client-cred.pem;" >> $HOME/.consolerc
 | |
| 	    echo '}' >> $HOME/.consolerc
 | |
| 	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`
 | |
|         ifconfig |grep "$cons_ip"
 | |
|         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
 |