91 lines
1.6 KiB
Perl
Executable File
91 lines
1.6 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
use warnings;
|
|
use strict;
|
|
|
|
my $etcfile="/etc/ikiwiki/wikilist";
|
|
|
|
sub root {
|
|
$> == 0;
|
|
}
|
|
|
|
sub username {
|
|
(getpwuid($>))[0];
|
|
}
|
|
|
|
sub processline {
|
|
my $setup=shift;
|
|
|
|
if (! -f "$setup") {
|
|
print STDERR "warning: $setup does not exist, skipping\n";
|
|
return;
|
|
}
|
|
print "Processing $setup as user ".username()." ...\n";
|
|
my $ret=system("ikiwiki", "--setup", $setup, @ARGV);
|
|
if ($ret != 0) {
|
|
print STDERR "warning: processing $setup failed with code $ret\n";
|
|
}
|
|
}
|
|
|
|
my %users;
|
|
sub processuser {
|
|
my $user=shift;
|
|
return if $user=~/^-/ || $users{$user};
|
|
$users{$user}=1;
|
|
my $ret=system("su", $user, "-s", "/bin/sh", "-c", "--", "$0 --nonglobal @ARGV");
|
|
if ($ret != 0) {
|
|
print STDERR "warning: processing for $user failed with code $ret\n";
|
|
}
|
|
}
|
|
|
|
sub processlist {
|
|
my $file=shift;
|
|
|
|
return unless -e $file;
|
|
|
|
my $list;
|
|
open ($list, "<$file") || die "$file: $!";
|
|
while (<$list>) {
|
|
chomp;
|
|
s/^\s+//;
|
|
s/\s+$//;
|
|
next if /^#/ || ! length;
|
|
if (/^([-\w]+)\s+([^\s]+)$/) {
|
|
my $user=$1;
|
|
my $setup=$2;
|
|
if (root()) {
|
|
processuser($user);
|
|
}
|
|
else {
|
|
if (username() eq $user) {
|
|
processline($setup);
|
|
}
|
|
}
|
|
}
|
|
elsif (/^([-\w]+)$/) {
|
|
my $user=$1;
|
|
if (root()) {
|
|
processuser($user);
|
|
}
|
|
else {
|
|
my $home=(getpwnam($user))[7];
|
|
if (defined $home && -d $home) {
|
|
my $dotfile="$home/.ikiwiki/wikilist";
|
|
processlist($dotfile);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
close $list;
|
|
}
|
|
|
|
if (@ARGV && $ARGV[0] eq "--nonglobal") {
|
|
shift;
|
|
# avoid recursively processing if the wikilist file has a root
|
|
# user in it
|
|
if (root()) {
|
|
exit 1;
|
|
}
|
|
}
|
|
|
|
processlist($etcfile);
|