#! /usr/usc/bin/perl
#
# $Id: rdistcf.pl,v 6.6 1992/12/02 22:45:56 mcooper Exp $
#
# compact-rdist-output: takes output of cooper's rdist and sorts
# it by host, producing a more compact report for casual perusal.
#
# Based on suggestions by J Greely. code by Steve Romig.
#
# Basic idea: for each line of rdsit output (assumed to be of form
# "host: message", record the list of hosts that it was seen on. Sort
# the messages in order of increasing number of hosts, and print a
# report that lists each set of hosts and the messages that appeared for
# those hosts, running from least number of hosts to the greatest.
#
# In other words, if rdist was run on bird, tree, fish and fruit, the
# output might look something like this:
#
# fish:
# installing /export/local/bin/less
#
# bird tree fruit:
# updating /export/local/bin/less
#
#
# Format to use for printing the start of the report.
#
format STDOUT =
user: @<<<<<<<<<<<<<<<<<<<<<<<<<
$user
directories: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$dirs
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$dirs
hosts: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$hosts
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$hosts
.
#
# Format to use for body
#
format BODY =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
$host_string
@*
$host_data
.
#
# Use this to sort the lists of hosts by increasing number of hosts.
#
sub increasing {
$host_number{$a} <=> $host_number{$b};
}
if ($#ARGV == 2) {
$user = shift(@ARGV);
$dirs = shift(@ARGV);
$hosts = shift(@ARGV);
write;
print "\n";
} elsif ($#ARGV != -1) {
die "usage: compact-rdist-output [user dirs hosts]\n";
}
#
# read lines of rdist output, deal with the types of messages that
# appear
#
$lineno = 0;
while (<>) {
#
# ignore these
#
next if /: updating of /;
next if /: updating host /;
next if /^updating /;
next if /^notify /;
#
# if it's a host: line, save it...
#
if (/^(\S+):[ \t]+(.*)$/) {
$data = $2;
if (defined($seen{$data})) {
$seen{$data} .= " $1";
} else {
$seen{$data} = $1;
}
#
# otherwise print it at the top of the report
#
} else {
print "$_\n";
}
}
#
# for each distinct message, work out the list of hosts that it
# appeared on (sorted in alphabetical order) and update the
# report text for that list of hosts.
#
foreach $line (keys %seen) {
@host_list = sort split(/ /, $seen{$line});
$host_string = join(' ', @host_list);
$seen{$line} = $host_string;
#
# save the number of hosts in this list - use that for
# sorting the report later
#
$host_number{$host_string} = $#host_list;
#
# append this message to the text for this list of hosts
#
$host_text{$host_string} .= " " . $line . "\n";
}
$: = " \n"; # Break characters
$~ = BODY; # Format to use
#
# sort the host lists by increasing number, and print the
# report for each. The text data is sorted numerically by
# line number.
#
foreach $host_string (sort increasing keys %host_number) {
#
# Split the text data into an array, then do a sort
# and put the result back into a normal string variable.
#
$host_data = join("\n", sort split(/\n/, $host_text{$host_string}));
# print the data
write;
}
exit 0;
syntax highlighted by Code2HTML, v. 0.9.1