# newmods.pl
# Updates an acl file to include new modules. Called with the parameters
# <config directory> <module>+
for($i=1; $i<@ARGV; $i++) {
if (!(-d "$ARGV[0]/$ARGV[$i]")) {
push(@new, $ARGV[$i]);
}
}
if (@new) {
# Read in the existing file
open(ACL, "$ARGV[0]/webmin.acl");
@acl = <ACL>;
close(ACL);
# Get the list of users to grant new modules to
if (open(NEWMODS, "$ARGV[0]/newmodules")) {
while(<NEWMODS>) {
s/\r|\n//g;
$users{$_}++ if (/\S/);
}
close(NEWMODS);
$newmods++;
}
if ($newmods) {
# Find the users to add to
for($i=0; $i<@acl; $i++) {
if ($acl[$i] =~ /^(\S+):/ && $users{$1}) {
push(@pos, $i);
}
}
}
else {
# Just use 'root' or 'admin' or the first user in the file
$pos[0] = 0;
for($i=0; $i<@acl; $i++) {
if ($acl[$i] =~ /^(\S+):/ &&
($1 eq 'root' || $1 eq 'admin')) {
$pos[0] = $i;
last;
}
}
}
# Update it with new modules
foreach $pos (@pos) {
$acl[$pos] =~ /^(\S+):\s*(.*)$/ || next;
$name = $1; @list = split(/\s+/, $2);
foreach $o (@list) { $old{$o}++; }
foreach $n (@new) {
push(@list, $n) if (!$old{$n});
}
$acl[$pos] = "$name: ".join(" ",@list)."\n";
}
# Write it out
open(ACL, ">$ARGV[0]/webmin.acl");
print ACL @acl;
close(ACL);
}
syntax highlighted by Code2HTML, v. 0.9.1