#!/bin/bash
# Script to execute commands on multiple nodes
# Do "export NODES=<path to file with nodenames>" to use 
# file other than /etc/nodes
# Add a "-a" flag to append the node name before each line of output

shell="ssh"
waitcomplete=false
prefixname=false
while getopts ":aw" options; do
  case $options in
    a )  prefixname=true
         ;;
    w )  waitcomplete=true
	 ;;
  esac
done
shift $((OPTIND-1))
        
if [ "$rcommand" == "" ] ; then
  if [ "$1" == "" ] ; then
    echo "Usage:"
    echo "$0 [-a] <command>"
    exit 1
  fi 

  if [ "$NODES" != "" ] ; then
    Nodes=$NODES
  else	
    Nodes=/etc/nodes
  fi 
  Head=`head -1 $Nodes`
  Nodelist=`cat $Nodes|grep -v -x $Head`

  if [ $prefixname == true ] ; then
    MaxNameLength=`cat $Nodes | xargs -i echo "echo {} | wc -c " | sh | sort -nr | head -n 1`
    for node in $Nodelist ; do
      Padnode=$node
      NodeNameLength=`echo $node | wc -c`
      while [ "$NodeNameLength" != "$MaxNameLength" ]; do
        Padtmp=$Padnode
        Padnode=`echo "$Padtmp" | sed "s/$/ /1"`
        NodeNameLength=`echo "$Padnode" | wc -c`
      done
      $shell $node $* | sed "s/^/$Padnode: /1"&
    done
  else
    for node in $Nodelist ; do
      $shell $node $* &
    done
  fi
fi
if [ $waitcomplete == true ] ; then wait ; fi
