head	1.2;
access;
symbols
	RELENG_4_11_0_RELEASE:1.1.1.1
	RELENG_4_11:1.1.1.1.0.20
	RELENG_4_11_BP:1.1.1.1
	RELENG_4_10_0_RELEASE:1.1.1.1
	RELENG_4_10:1.1.1.1.0.18
	RELENG_4_10_BP:1.1.1.1
	RELENG_4_9_0_RELEASE:1.1.1.1
	RELENG_4_9:1.1.1.1.0.16
	RELENG_4_9_BP:1.1.1.1
	RELENG_4_8_0_RELEASE:1.1.1.1
	RELENG_4_8:1.1.1.1.0.14
	RELENG_4_8_BP:1.1.1.1
	RELENG_4_7_0_RELEASE:1.1.1.1
	RELENG_4_7:1.1.1.1.0.12
	RELENG_4_7_BP:1.1.1.1
	RELENG_4_6_2_RELEASE:1.1.1.1
	RELENG_4_6_1_RELEASE:1.1.1.1
	RELENG_4_6_0_RELEASE:1.1.1.1
	RELENG_4_6:1.1.1.1.0.10
	RELENG_4_6_BP:1.1.1.1
	v5_006_01:1.1.1.1
	RELENG_4_5_0_RELEASE:1.1.1.1
	RELENG_4_5:1.1.1.1.0.8
	RELENG_4_5_BP:1.1.1.1
	RELENG_4_4_0_RELEASE:1.1.1.1
	RELENG_4_4:1.1.1.1.0.6
	RELENG_4_4_BP:1.1.1.1
	RELENG_4_3_0_RELEASE:1.1.1.1
	RELENG_4_3:1.1.1.1.0.4
	RELENG_4_3_BP:1.1.1.1
	RELENG_4_2_0_RELEASE:1.1.1.1
	RELENG_4_1_1_RELEASE:1.1.1.1
	PRE_SMPNG:1.1.1.1
	RELENG_4_1_0_RELEASE:1.1.1.1
	v5_006:1.1.1.1
	RELENG_4_0_0_RELEASE:1.1.1.1
	RELENG_4:1.1.1.1.0.2
	RELENG_4_BP:1.1.1.1
	v5_005_03:1.1.1.1
	LWALL:1.1.1;
locks; strict;
comment	@# @;


1.2
date	2002.05.16.10.07.51;	author markm;	state dead;
branches;
next	1.1;

1.1
date	99.05.02.14.19.11;	author markm;	state Exp;
branches
	1.1.1.1;
next	;

1.1.1.1
date	99.05.02.14.19.11;	author markm;	state Exp;
branches;
next	;


desc
@@


1.2
log
@Perl is no longer in base. Long live the port!
@
text
@#! /usr/bin/perl

# $RCSfile: gsh,v $$Revision: 4.1 $$Date: 92/08/07 17:20:20 $

# Do rsh globally--see man page

$SIG{'QUIT'} = 'quit';			# install signal handler for SIGQUIT

sub getswitches {
    while ($ARGV[0] =~ /^-/) {		# parse switches
	$ARGV[0] =~ /^-h/ && ($showhost++,$silent++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-s/ && ($silent++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-d/ && ($dodist++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-n/ && ($n=' -n',shift(@@ARGV),next);
	$ARGV[0] =~ /^-l/ && ($l=' -l ' . $ARGV[1],shift(@@ARGV),shift(@@ARGV),
				next);
	last;
    }
}

do getswitches();			# get any switches before class
$systype = shift;			# get name representing set of hosts
do getswitches();			# same switches allowed after class

if ($dodist) {				# distribute input over all rshes?
    `cat >/tmp/gsh$$`;			#  get input into a handy place
    $dist = " </tmp/gsh$$";		#  each rsh takes input from there
}

$cmd = join(' ',@@ARGV);			# remaining args constitute the command
$cmd =~ s/'/'"'"'/g;			# quote any embedded single quotes

$one_of_these = ":$systype:";		# prepare to expand "macros"
$one_of_these =~ s/\+/:/g;		# we hope to end up with list of
$one_of_these =~ s/-/:-/g;		#  colon separated attributes

@@ARGV = ();
push(@@ARGV,'.grem') if -f '.grem';
push(@@ARGV,'.ghosts') if -f '.ghosts';
push(@@ARGV,'/etc/ghosts');

$remainder = '';

line: while (<>) {		# for each line of ghosts

    s/[ \t]*\n//;			# trim trailing whitespace
    if (!$_ || /^#/) {			# skip blank line or comment
	next line;
    }

    if (/^(\w+)=(.+)/) {		# a macro line?
	$name = $1; $repl = $2;
	$repl =~ s/\+/:/g;
	$repl =~ s/-/:-/g;
	$one_of_these =~ s/:$name:/:$repl:/;	# do expansion in "wanted" list
	$repl =~ s/:/:-/g;
	$one_of_these =~ s/:-$name:/:-$repl:/;
	next line;
    }

    # we have a normal line

    @@attr = split(' ');			# a list of attributes to match against
					#   which we put into an array
    $host = $attr[0];			# the first attribute is the host name
    if ($showhost) {
	$showhost = "$host:\t";
    }

    $wanted = 0;
    foreach $attr (@@attr) {		# iterate over attribute array
	$wanted++ if index($one_of_these,":$attr:") >= 0;
	$wanted = -9999 if index($one_of_these,":-$attr:") >= 0;
    }
    if ($wanted > 0) {
	print "rsh $host$l$n '$cmd'\n" unless $silent;
	$SIG{'INT'} = 'DEFAULT';
	if (open(PIPE,"rsh $host$l$n '$cmd'$dist 2>&1|")) {	# start an rsh
	    $SIG{'INT'} = 'cont';
	    for ($iter=0; <PIPE>; $iter++) {
		unless ($iter) {
		    $remainder .= "$host+"
			if /Connection timed out|Permission denied/;
		}
		print $showhost,$_;
	    }
	    close(PIPE);
	} else {
	    print "(Can't execute rsh: $!)\n";
	    $SIG{'INT'} = 'cont';
	}
    }
}

unlink "/tmp/gsh$$" if $dodist;

if ($remainder) {
    chop($remainder);
    open(grem,">.grem") || (printf stderr "Can't make a .grem file: $!\n");
    print grem 'rem=', $remainder, "\n";
    close(grem);
    print 'rem=', $remainder, "\n";
}

# here are a couple of subroutines that serve as signal handlers

sub cont {
    print "\rContinuing...\n";
    $remainder .= "$host+";
}

sub quit {
    $| = 1;
    print "\r";
    $SIG{'INT'} = '';
    kill 2, $$;
}
@


1.1
log
@Initial revision
@
text
@@


1.1.1.1
log
@Maintenance releace 3 of perl5.005. Includes support for threads.
@
text
@@
