chiark / gitweb /
Update statuses.
[userv-utils] / newsrc-lg / getgroups
CommitLineData
2ab84d52 1#!/usr/bin/perl
2
3$minreaddays= 21;
4$maxperuser= 250;
5$fetchdir= "/var/lib/news/fetch";
6chdir("/etc/news") || die $!;
7
8open(CONF,"nntp-merge.conf") || die $!;
9while(<CONF>) {
10 next if m/^\#/ || !m/^\S/;
11 next if m/^(myfqdn|xref|server|server-nosearch|fetch|read|post|permit|believe|minreaddays)\s/;
12 if (m/^maxperuser\s+(\d+)\s+$/) {
13 $maxperuser= $1;
14 } elsif (m/^extrarc\s+(\S+)\s+$/) {
15 push(@extrarc,$1);
16 } else {
17 die "$_ ?";
18 }
19}
20
21open IGN,"</etc/news/newsrc-ignoredusers" or die $!;
22while (<IGN>) {
23 chomp;
24 next if m/^\#/;
25 s/\s*$//;
26 $ign{$_}= 1;
27}
28close IGN or die $!;
29
30open PASS,"</etc/userlist" or die $!;
31while (<PASS>) {
32 chomp;
33 next if m/^\#/;
34 $user= $_;
35 next if $ign{$user};
36 open GL,"userv -t 30 $user newsrc-listgroups |" or die $!;
37 scan("user $user",1);
38 close GL; $? and warn "getgroups: error getting groups for $user (code $?)";
39}
40close PASS or die $!;
41
42for $f (@extrarc) {
43 open GL,"< $f" or die $!;
44 scan("file $f",0);
45 close GL or die $!;
46}
47
48chdir($fetchdir) || die $!;
49open(NG,">all-read-groups.new") || die $!;
50print(NG join("\n",sort keys %yes)."\n") || die $!;
51close(NG) || die $!;
52rename("all-read-groups.new","all-read-groups") || die $!;
53
54printf "total %d groups\n",scalar(keys %yes);
55exit(0);
56
57sub scan ($) {
58 my ($where,$toomanyenf) = @_;
59 @g= ();
60 while (<GL>) {
61 die "bad group in $where" unless m/^[-a-z0-9+]+\.[-a-z0-9+._]+$/i;
62 push @g, $&;
63 }
64 warn("too many from $where"), return if $toomanyenf && @g > $maxperuser;
65 map { $yes{$_}=1; } @g;
66 printf "%-20s - %4d groups\n",$where,scalar(@g);
67}