#!/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);
