Skip to content

Ssh resource model generator

ahonor edited this page Dec 14, 2010 · 11 revisions

#!/bin/bash
# Requires: mktemp
#
# DESCRIPTION
#  Takes a set of newline delimited hosts and runs a remote
#  script to collect host metadata to generate resources.xml document. 
#
# DISCOVERING HOSTS
#  Hosts lists can be generated with a tool like nmap. Here an nmap script
#  returns hosts listening on SSH port 22 on the specified subnet:
#     nmap -sP 10.0.1.* -PS22 -oG nmap.out && \
#         awk '/Status: Up/ {print $2}' nmap.out > hosts

die() { echo $* 1>&2 ; exit 1 ; }

PROG=`basename $0`
WORKSPACE=$(mktemp -d /tmp/${PROG}.XXXX) || die
SSH_ARGS=

# Option defaults
SSH_USER=$(whoami)
VERBOSE=0
NODE_SCRIPT=
HOST_FILE=
SSHID_FILE=
usage()
{
cat < resources.xml
  Read hosts from a file
      $PROG -f hostsfile > resources.xml
  Use an external collection script
      $PROG -f hostsfile -s myscript.sh > resources.xml
EOF
}

while getopts "hvu:i:f:s:" OPTION
do
    case $OPTION in
	h)
	    usage
	    exit 1
	    ;;
	v)
	    VERBOSE=1
	    ;;
	u)
	    SSH_USER=$OPTARG
	    ;;
	i)
	    SSHID_FILE=$OPTARG
	    ;;
	f)
	    HOST_FILE=$OPTARG
	    ;;
	s)
	    NODE_SCRIPT=$OPTARG
	    ;;
	*)
	    usage
	    exit 1
    esac
done

verbose() { [ "$VERBOSE" == "1" ] && { echo "VERBOSE : $*" 1>&2 ; } }

[ -s "$HOST_FILE" -a ! -r "$HOST_FILE" ] && {
    die "file not readable: $HOST_FILE"
}
[ -s "$SSHID_FILE" -a ! -r "$SSHID_FILE" ] && {
    die "file not readable: $SSHID_FILE"
} || {
    SSH_ARGS="$SSH_ARGS -i $SSHID_FILE"
}

mkdir -p ${WORKSPACE} || { die "Failed creating data directory: $WORKSPACE" ; }

if [ -z "${NODE_SCRIPT}" ] 
then
NODE_SCRIPT=`mktemp ${WORKSPACE}/node-collect.XXXX`
# here doc generates collection script template
cat > ${NODE_SCRIPT} <" > \$outputfile
EOF
fi

# Reasign fd0 to the specified host file
[ -f "$HOST_FILE" ] && { exec 0<> $HOST_FILE ; }

verbose "{SSH_USER=\"$SSH_USER\", WORKSPACE=\"$WORKSPACE\", HOST_FILE=\"$HOST_FILE\", SSH_ARGS=\"$SSH_ARGS\"}"

numProcessed=0
while read line
do
    echo $line | egrep -q '^#' && continue ;#skip comment lines
    hostinfo=( $line )                     ;#parse the line into an array
    [ ${#hostinfo[*]} -lt 1 ]  && continue ;#skip lines with no info
    host=${hostinfo[0]}
    verbose "collecting node info from host: ${host} ..."
    scp $SSH_ARGS $NODE_SCRIPT ${SSH_USER}@${host}:/tmp/$(basename $NODE_SCRIPT) || {
	die "Failed copying collection script on host: ${host}"
    }
    ssh $SSH_ARGS -n ${SSH_USER}@${host} sh /tmp/$(basename $NODE_SCRIPT) /tmp/node.xml.$$ || {
     	die "Failed executing collection script on host: ${host}"
    }
    scp $SSH_ARGS ${SSH_USER}@${host}:/tmp/node.xml.$$ ${WORKSPACE}/${host}.xml || {
    	die "Failed copying resources data from host: ${host}"
    }
    numProcessed=$(expr "$numProcessed" + 1)
done 

if [ "$numProcessed" -gt 0 ]
then
    verbose "Generating resources.xml for $i hosts ..."
    echo "" 
    cat ${WORKSPACE}/*.xml || die "Failure due to internal script error"
    echo ""
    verbose "Done."
fi

#
# clean up the temporary files
#
verbose "cleaning up temporary files"
rm -rf ${WORKSPACE}