######################################################################## # # # This software is part of the ast package # # Copyright (c) 1990-2011 AT&T Intellectual Property # # and is licensed under the # # Eclipse Public License, Version 1.0 # # by AT&T Intellectual Property # # # # A copy of the License is available at # # http://www.eclipse.org/org/documents/epl-v10.html # # (with md5 checksum b35adb5213ca9657e911e9befb180842) # # # # Information and Software Systems Research # # AT&T Research # # Florham Park NJ # # # # Glenn Fowler # # # ######################################################################## : generate local host info # # genlocal [options] [host ...] # # @(#)genlocal (AT&T Research) 2002-10-02 # # NOTE: this only works for hosts the caller can reach by rsh/ssh # case $RANDOM in $RANDOM) exec ksh $0 "$@"; echo "$0: ksh required" >&2; exit 1 ;; esac integer cluster=5 dir=. file= heading=1 list= rsh=rsh timeout=90 verbose=: while : do case $# in 0) break ;; esac case $1 in -[frt])case $# in 1) set -- '-?' break ;; esac case $1 in -f) file=$2 ;; -r) rsh=$2 ;; -t) timeout=$2 ;; esac shift ;; -h) heading= ;; -n) list=1 ;; -v) verbose='print -u2' ;; '-?') break ;; [-+]*) print -u2 "$0: $1: invalid option" set -- '-?' break ;; *) break ;; esac shift done case $1 in '-?') print -u2 "Usage: $0 [-hnv] [-f share-file] [-r rsh-path] [-t timeout] [host ...]"; exit 1 ;; esac case $file in "") ifs=${IFS-' '} IFS=: set "" $PATH "--" "$@" IFS=$ifs f=lib/cs/share while : do shift case $1 in "") continue ;; --) break ;; esac case $file in "") test -f ${1%bin}$f && file=${1%bin}$f ;; esac done shift case $file in "") print -u2 $0: $f: not found; exit 1 ;; esac ;; *) if test ! -f $file then print -u2 "$0: $file: cannot read share file"; exit 1 fi ;; esac print -u2 "$0: warning: $rsh may hang on some hosts -- monitor the progress with the -v option or ps $$" server= for host in $(egrep -v '^#' $file) do case $server in "") server=$host ;; *) server="$server|$host" ;; esac done hostname=$(package host name) hostname=${hostname%%.*} case $# in 0) domain=$( { cat /etc/hosts ypcat hosts } 2>/dev/null | egrep "[^#].*[ ]$hostname(\$|[. ])" | sed -e '1!d' -e 's/^[^ ]*//' -e 's/[^.]*.//' -e 's/[ ].*//' ) set -- $( { print "$hostname" egrep -v '^#' $file ruptime | fgrep -v 'no hosts' { for i in /etc/resolv.conf /usr/etc/resolv.conf do if test -f $i then echo "ls -t A $(sed -e '/^domain/!d' -e 's/.*[ ][ ]*//' $i)" | nslookup break fi done cat /etc/hosts ypcat hosts } | fgrep ".$domain" | awk '{print $2}' } 2>/dev/null | sed -e 's/[. ].*//' -e '/^[a-zA-Z].*[a-zA-Z0-9]$/!d' | sort -u ) case $list in ?*) print domain=$domain ;; esac ;; esac case $list in ?*) print hosts='"'$*'"'; exit ;; esac hosts= for host do case $host in local|localhost) host=$hostname ;; esac case " $hosts " in *" $host "*) continue ;; esac hosts="$hosts $host" $verbose -n "$host " case $host in $hostname) package host name type cpu rating ;; *) if ping -c 1 -w 4 $host >/dev/null 2>&1 then $rsh $host bin/package host name type cpu rating & info=$! { sleep $timeout kill -9 $info } & time=$! wait $info kill -9 $time fi ;; esac 2>/dev/null done | while read host type cpu rating do $verbose type=$type cpu=$cpu rating=$rating host=${host%%.*} eval "case '$host' in $server) idle= ;; *) idle=15m ;; esac" print $host" "type=$type" "${rating}${idle:+" idle=$idle"}${cpu:+" cpu=$cpu"} done | sort -b +2n -3 | { integer v c d i j k n ((n=0)) while read host type rate attr do ((n=n+1)) h[n]=$host t[n]=$type v[n]=$rate a[n]=$attr done c=1 while ((c)) do ((c=0)) ((i=1)) while ((i1&&d1||(v[j]-v[i])>cluster)) then break fi ((c=c+v[j])) ((k=k+1)) ((j=j+1)) done ((c=c/k)) ((d=c%10)) ((c=c-d)) if ((d>6)) then ((c=c+10)) elif ((d>3)) then ((c=c+5)) fi while ((i