news.utdallas.edu!hermes.chpc.utexas.edu!cs.utexas.edu!sdd.hp.com!decwrl!netcomsv!netcomsv!spud.Hyperion.COM!spud.Hyperion.COM!not-for-mail Mon Mar 22 20:49:55 CST 1993
Article: 706 of alt.sources
Xref: feenix.metronet.com alt.sources:706
Path: feenix.metronet.com!news.utdallas.edu!hermes.chpc.utexas.edu!cs.utexas.edu!sdd.hp.com!decwrl!netcomsv!netcomsv!spud.Hyperion.COM!spud.Hyperion.COM!not-for-mail
From:
[email protected] (Steven Grimm)
Newsgroups: alt.sources
#Subject: deadgroups.pl -- Scan for unused newsgroups
Date: 19 Mar 1993 22:30:46 -0800
Organization: Hyperion, Mountain View, CA, USA
Lines: 219
Message-ID: <
[email protected]>
NNTP-Posting-Host: spud.hyperion.com
Keywords: perl, INN
Archive-name: deadgroups.pl
Submitted-by:
[email protected]
This is a little perl script I hacked together last weekend to tell me which
groups weren't being used on my system. It scans all the users' .newsrc files
and the INN "newsfeeds" file and spits out a list of groups which are in the
active file but not being read or fed.
Removing the unused groups from my feed added about 3 days to my expire time.
Bugs:
The script must be run as root.
If you're feeding comp.* to someone, all "comp" groups are marked as fed.
(But a feed of "*" is ignored by the script.)
If a user puts the .newsrc file someplace strange, e.g. in a file with
a name other than ".newsrc", the script won't find it. It will, however,
deal with users who set $HOME to something other than the directory
listed in passwd.
-Steve
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: deadgroups.pl
# Wrapped by
[email protected] on Fri Mar 19 22:24:57 1993
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'deadgroups.pl' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'deadgroups.pl'\"
else
echo shar: Extracting \"'deadgroups.pl'\" \(3649 characters\)
sed "s/^X//" >'deadgroups.pl' <<'END_OF_FILE'
X#!/usr/local/bin/perl
X#
X# deadgroups.pl v2.0 93/03/14
[email protected]
X#
X# Figure out which newsgroups aren't being used on your system. Scans through
X# the news active file to get a list of groups, then sees which groups are
X# being read (by looking at users' .newsrc files) and fed (by looking through
X# the newsfeeds file).
X#
X# Feeds of "*" are ignored, as are .newsrc files older than a certain age.
X#
X# Any groups in active but not being read or fed are spit out to stdout at
X# the end.
X#
X
X# Define active file location here.
X$active = '/home/spud/news/lib/active';
X# And newsfeeds file location.
X$newsfeeds = '/home/spud/news/lib/newsfeeds';
X# How recently touched a .newsrc should be (in days)
X$newsage = 60;
X# Minimum uid to scan, so we don't waste time looking at system accounts
X$minuid = 100;
X
X$debug = 0;
X
X#
X# Get the group list into the associative array 'groups'.
X#
Xopen(ACTIVE, $active) || die "Can't open $active: $!\n";
X
Xwhile (<ACTIVE>) {
X /^([^ ]*) /; # Extract the group name from the line
X $groups{$1} = 1; # Add it to the array
X}
X
Xclose ACTIVE;
X
X# Nobody reads "control" or "junk", but we need them around.
Xdelete $groups{"control"};
Xdelete $groups{"junk"};
X
X#
X# Now loop through the user list.
X#
Xopen(SAVEERR, ">&STDERR");
Xwhile (($name,$x,$uid,$x,$x,$x,$x,$dir,$shell) = getpwent) {
X next if ($uid < $minuid);
X
X print STDERR "$name";
X #
X # If the user doesn't have a .newsrc, his home directory might be
X # screwy.
X #
X unless (open(NEWSRC, "$dir/.newsrc")) {
X #
X # So run a shell as the user and ask what it is.
X #
X open(STDERR, ">/dev/null");
X unless (open(HOMEDIR, "su $name -c 'echo \$HOME'|")) {
X open(STDERR, ">&SAVEERR");
X print STDERR "! ";
X next;
X }
X open(STDERR, ">&SAVEERR");
X $dir = <HOMEDIR>;
X chop $dir;
X close HOMEDIR;
X
X unless (open(NEWSRC, "$dir/.newsrc")) {
X print STDERR " ";
X next;
X }
X }
X
X #
X # Ignore old .newsrc files.
X #
X if (-M NEWSRC > $newsage) {
X print STDERR "- ";
X close NEWSRC;
X next;
X }
X
X print STDERR "+ ";
X
X #
X # Now delete all subscribed groups in the .newsrc from our groups array.
X #
X while (<NEWSRC>) {
X if (/^([^:]*):/) {
X delete $groups{$1};
X }
X }
X
X close NEWSRC;
X}
X
Xendpwent;
Xprint STDERR "\nnewsfeeds";
X
X#
X# Now scan the newsfeeds file. Glom each entry together into a big string
X# and extract the group list.
X#
Xif (open(FEEDS, $newsfeeds)) {
X while (<FEEDS>) {
X next if (/^#/ || /^[\s]*$/);
X chop;
X $entry = $_;
X
X #
X # Continue reading if a line ends in a backslash.
X #
X while ($entry =~ /.*\\$/) {
X chop $entry;
X $_ = <FEEDS> || die "Bad newsfeeds entry!\n";
X chop;
X s/^\s*(.*)/\1/;
X $entry .= $_;
X }
X
X #
X # Extract the group list into fedgroups[].
X #
X $entry =~ s#^[^:]*:([^:]*):.*#\1#;
X $entry =~ s#/.*$##;
X @fedgroups = split(/,/, $entry);
X next if (! @fedgroups);
X
X #
X # Mark groups as fed, but don't remove them yet since there
X # could be "!" entries. "!" entries put the appropriate
X # groups back in the list.
X #
X foreach $entry (@fedgroups) {
X next if $entry eq "*";
X
X $entry =~ s/([.+])/\\\1/g;
X $entry =~ s/\*/.\*/g;
X $entry =~ s/\?/./g;
X
X print STDERR "$entry\n" if $debug;
X if ($entry !~ /^!/) {
X foreach $g (grep(/^$entry$/, keys %groups)) {
X print STDERR "\tusing $g\n" if $debug;
X $groups{$g} = 0;
X }
X } else {
X $entry =~ s/^!//;
X
X foreach $g (grep(/^$entry$/, keys %groups)) {
X print STDERR "\tunusing $g\n" if $debug;
X $groups{$g} = 1;
X }
X }
X }
X
X #
X # Delete groups that ended up being fed.
X #
X foreach $g (keys %groups) {
X delete $groups{$g} if ($groups{$g} == 0);
X }
X }
X}
X
Xprint STDERR "\n";
X
X$, = "\n";
Xprint sort keys %groups;
Xprint "\n";
END_OF_FILE
if test 3649 -ne `wc -c <'deadgroups.pl'`; then
echo shar: \"'deadgroups.pl'\" unpacked with wrong size!
fi
# end of 'deadgroups.pl'
fi
echo shar: End of shell archive.
exit 0