chiark / gitweb /
52e995e61298ab943da3682c65e828cbcbd636b7
[userv-utils.git] / newsrc-lg / getgroups
1 #!/usr/bin/perl
2
3 $minreaddays= 21;
4 $maxperuser= 250;
5 $fetchdir= "/var/lib/news/fetch";
6 chdir("/etc/news") || die $!;
7
8 open(CONF,"nntp-merge.conf") || die $!;
9 while(<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
21 open IGN,"</etc/news/newsrc-ignoredusers" or die $!;
22 while (<IGN>) {
23     chomp;
24     next if m/^\#/;
25     s/\s*$//;
26     $ign{$_}= 1;
27 }
28 close IGN or die $!;
29
30 open PASS,"</etc/userlist" or die $!;
31 while (<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 }
40 close PASS or die $!;
41
42 for $f (@extrarc) {
43     open GL,"< $f" or die $!;
44     scan("file $f",0);
45     close GL or die $!;
46 }
47
48 chdir($fetchdir) || die $!;
49 open(NG,">all-read-groups.new") || die $!;
50 print(NG join("\n",sort keys %yes)."\n") || die $!;
51 close(NG) || die $!;
52 rename("all-read-groups.new","all-read-groups") || die $!;
53
54 printf "total %d groups\n",scalar(keys %yes);
55 exit(0);
56
57 sub 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 }