* Allow /etc/ikiwiki/wikilist to list just the names of users, if so then
~user/.ikiwiki/wikilist will be read.master
parent
7abb1190e9
commit
c9983bc7d8
|
@ -1,3 +1,10 @@
|
|||
ikiwiki (1.34.2) UNRELEASED; urgency=low
|
||||
|
||||
* Allow /etc/ikiwiki/wikilist to list just the names of users, if so then
|
||||
~user/.ikiwiki/wikilist will be read.
|
||||
|
||||
-- Joey Hess <joeyh@debian.org> Tue, 28 Nov 2006 00:16:40 -0500
|
||||
|
||||
ikiwiki (1.34.1) unstable; urgency=low
|
||||
|
||||
* Add libtime-duraiton-perl to build deps, as it's used by the svn module
|
||||
|
|
|
@ -10,10 +10,15 @@ ikiwiki-mass-rebuild
|
|||
|
||||
`ikiwiki-mass-rebuild` can be used to force a rebuild of all the wikis
|
||||
on a system. You will need to list the wikis it shuld build in the file
|
||||
/etc/ikiwiki/wikilist, which has the format:
|
||||
`/etc/ikiwiki/wikilist`, which has the format:
|
||||
|
||||
user /path/to/wiki
|
||||
|
||||
It's also possible to let a user list setup files in `~user/.ikiwiki/wikilist`
|
||||
in their home directory. To do so, list only the user's name, without a
|
||||
setup file. The format of `~/.ikiwiki/wikilist` is the same as
|
||||
`/etc/ikiwiki/wikilist`.
|
||||
|
||||
# OPTIONS
|
||||
|
||||
All options are passed on to ikiwiki.
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
Currently, ikiwiki has the configuration file `/etc/ikiwiki/wikilist`, which `ikiwiki-mass-rebuild` can use to rebuild all the ikiwikis on the system, such as when upgrading ikiwiki. This file includes usernames, and `ikiwiki-mass-rebuild` (which must run as root) changes to the specified user to rebuild their wiki. However, this means that adding new ikiwikis to the list must require administrator action, since editing the file would allow you to run ikiwiki as any user. What about a user-subdirectory mechanism for this? If each user could have their own `/etc/ikiwiki/users/$user/wikilist`, which only contained wikis (no users), `ikiwiki-mass-rebuild` could rebuild each wiki in this list as the corresponding user only. This would mean that an administrator need only create the directory and provide user or group write permission, and the user or group can then create wikis as needed.
|
||||
|
||||
[[todo/Done]], though somewhat differently. --[[Joey]]
|
||||
|
|
|
@ -1,29 +1,80 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
#!/usr/bin/perl
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
action="$@"
|
||||
|
||||
wikilist=/etc/ikiwiki/wikilist
|
||||
|
||||
processline () {
|
||||
user="$1"
|
||||
setup="$2"
|
||||
sub processline {
|
||||
my $user=shift;
|
||||
my $setup=shift;
|
||||
|
||||
if [ -z "$user" ] || [ -z "$setup" ]; then
|
||||
echo "parse failure in /etc/ikiwiki/wikilist, line: '$user $setup'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$setup" ]; then
|
||||
echo "warning: $setup specified in /etc/ikiwiki/wikilist does not exist, skipping" >&2
|
||||
else
|
||||
echo "Processing $setup as user $user ..."
|
||||
su "$user" -c "ikiwiki -setup $setup $action"
|
||||
fi
|
||||
if (! getpwnam("$user")) {
|
||||
print STDERR "warning: user $user does not exist\n";
|
||||
return
|
||||
}
|
||||
if (! -f "$setup") {
|
||||
print STDERR "warning: $setup does not exist, skipping\n";
|
||||
return;
|
||||
}
|
||||
print "Processing $setup as user $user ...\n";
|
||||
# su is not used because it passes arguments through the shell,
|
||||
# which is not safe for untrusted setup file names.
|
||||
defined(my $pid = fork) or die "Can’t fork: $!";
|
||||
if (! $pid) {
|
||||
my ($uuid, $ugid) = (getpwnam($user))[2, 3];
|
||||
$)="$ugid $ugid";
|
||||
$(=$ugid;
|
||||
$>=$uuid;
|
||||
$<=$uuid;
|
||||
if ($< != $uuid || $> != $uuid || $( != $ugid || $) ne "$ugid $ugid") {
|
||||
die "failed to drop permissions to $user";
|
||||
}
|
||||
%ENV=();
|
||||
$ENV{HOME}=(getpwnam($user))[7];
|
||||
exec("ikiwiki", "-setup", $setup, @ARGV);
|
||||
die "failed to run ikiwiki: $!";
|
||||
}
|
||||
waitpid($pid,0);
|
||||
if ($?) {
|
||||
print STDERR "Processing $setup as user $user failed with code $?\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub processlist {
|
||||
my $file=shift;
|
||||
my $forceuser=shift;
|
||||
|
||||
my $list;
|
||||
open ($list, "<$file") || die "$file: $!";
|
||||
while (<$list>) {
|
||||
chomp;
|
||||
s/^\s+//;
|
||||
s/\s+$//;
|
||||
next if /^#/ || ! length;
|
||||
|
||||
if (/^([^\s]+)\s+([^\s]+)$/) {
|
||||
my $user=$1;
|
||||
my $setup=$2;
|
||||
if (defined $forceuser && $forceuser ne $user) {
|
||||
print STDERR "warning: in $file line $., attempt to set user to $user, but user forced to $forceuser. Skipping\n";
|
||||
}
|
||||
processline($user, $setup);
|
||||
}
|
||||
elsif (/^([^\s]+)$/) {
|
||||
my $user=$1;
|
||||
my $home=(getpwnam($user))[7];
|
||||
if (defined $home && -d $home) {
|
||||
my $dotfile="$home/.ikiwiki/wikilist";
|
||||
if (-e $dotfile) {
|
||||
processlist($dotfile, $user);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
close $list;
|
||||
}
|
||||
|
||||
my $wikilist="/etc/ikiwiki/wikilist";
|
||||
|
||||
if (-e $wikilist) {
|
||||
processlist($wikilist);
|
||||
}
|
||||
|
||||
if [ -e "$wikilist" ]; then
|
||||
grep -v '^#' $wikilist | grep -v '^$' | while read line; do
|
||||
processline $line
|
||||
done
|
||||
fi
|
||||
|
|
4
wikilist
4
wikilist
|
@ -4,5 +4,9 @@
|
|||
#
|
||||
# ikiwiki-mass-rebuild su's to the listed user and then runs ikiwiki -setup
|
||||
# on the specified ikiwiki setup file.
|
||||
#
|
||||
# It's also possible to let a user list setup files in ~user/.ikiwiki/wikilist
|
||||
# in their home directory. To do so, list only the user's name, without a
|
||||
# setup file. The format of ~/.ikiwiki/wikilist is the same as this file.
|
||||
|
||||
#joey /home/joey/.ikiwiki/ikiwiki.setup
|
||||
|
|
Loading…
Reference in New Issue