request more information
[ikiwiki] / ikiwiki-update-wikilist
1 #!/usr/bin/perl -t
2 # Add a user to the system wide wikilist.
3 # This script can safely be made suid or put in /etc/sudoers.
4 no lib '.';
5 use warnings;
6 use strict;
7 use English;
8
9 my $remove=(@ARGV && $ARGV[0] eq '-r');
10
11 my $username=getpwuid($REAL_USER_ID);
12 if (! defined $username || ! length $username) {
13         die "unable to determine user name for UID $REAL_USER_ID\n";
14 }
15
16 my $wikilist="/etc/ikiwiki/wikilist";
17 if (! -e $wikilist) {
18         die "$wikilist does not exist\n";
19 }
20
21 my $changed=0;
22 my $seen=0;
23 my @lines;
24 open (my $list, "<$wikilist") || die "read $wikilist: $!";
25 while (<$list>) {
26         chomp;
27         if (/^\s*([^\s]+)\s*$/) {
28                 my $user=$1;
29                 if ($user eq $username) {
30                         if (! $remove) {
31                                 $seen=1;
32                                 push @lines, $_;
33                         }
34                         else {
35                                 $changed=1;
36                         }
37                 }
38                 else {
39                         push @lines, $_;
40                 }
41         }
42         else {
43                 push @lines, $_;
44         }
45 }
46 if (! $seen && ! $remove) {
47         push @lines, $username;
48         $changed=1;
49 }
50 if ($changed) {
51         close $list || die "ikiwiki-update-wikilist: error reading $list: $!\n";
52         open ($list, ">$wikilist") || die "ikiwiki-update-wikilist: cannot write to $wikilist\n";
53         foreach (@lines) {
54                 print $list "$_\n";
55         }
56         if ($remove) {
57                 print "ikiwiki-update-wikilist: removed user $username from $wikilist\n";
58         }
59         else {
60                 print "ikiwiki-update-wikilist: added user $username to $wikilist\n";
61         }
62         close $list || die "ikiwiki-update-wikilist: error writing $wikilist: $!\n";
63 }
64 else {
65         print "ikiwiki-update-wikilist: no changes need to be made\n";
66 }