umask 077;
# import from fex.pp
-our ($FEXHOME,$FHS,$hostname,$spooldir,@logdir,$akeydir,$docdir);
+our ($FEXHOME,$FHS,$hostname,$spooldir,@logdir,$logdir,$akeydir,$docdir);
our ($durl,@durl,$mdomain,$admin,$mailmode);
our ($autodelete,$keep_default,$keep_max,$recipient_quota,$sender_quota);
our (@local_rdomains);
$EDITOR = $ENV{EDITOR} || $ENV{VISUAL} ||
(-x '/usr/bin/editor' ? '/usr/bin/editor' : 'vi');
-$opt_c = $opt_v = $opt_l = $opt_L = $opt_h = $opt_w = $opt_u = $opt_R = 0;
+$opt_c = $opt_v = $opt_l = $opt_L = $opt_h = $opt_w = $opt_u = 0;
$opt_M = $opt_E = 0;
$opt_r = $opt_d = $opt_q = $opt_a = $opt_n = $opt_k = $opt_m = '';
-$opt_y = $opt_S = $opt_C = $opt_D = $opt_A = $opt_V = $opt_P = '';
+$opt_y = $opt_S = $opt_C = $opt_D = $opt_A = $opt_V = $opt_P = $opt_R = '';
${'opt_/'} = '';
@__ = @ARGV;
if (abs_path($spooldir) ne abs_path("$FEXHOME/spool")) {
warn "WARNING: \$spooldir differs from $FEXHOME/spool !\n";
}
-
-getopts('hcvlLwuMRE/q:r:d:a:n:k:m:y:S:C:A:V:D:P:') or usage(2);
+
+getopts('hcvlLwuME/q:r:d:a:n:k:m:y:S:C:A:V:D:P:R:') or usage(2);
usage(0) if $opt_h;
examples() if $opt_E;
close $aa or die "$0: cannot write $aa - $!\n";
my $fph = "$FEXLIB/fex.ph";
$_ = slurp($fph) or die "$0: cannot read $fph\n";
- s/^\s*\$admin\s*=.*/\$admin = '$admin';/m or
+ s/^\s*\$admin\s*=.*/\$admin = '$admin';/m or
$_ = "\$admin = '$admin';\n".$_;
open $fph,">$fph.new" or die "$0: cannot write $fph.new\n";
print {$fph} $_;
if ($opt_M) {
my ($mtime,$comment,$file,$keep);
local $_;
-
+
if (@ARGV) {
foreach $file (glob("@ARGV")) {
$mtime = mtime("$file/data") or next;
$comment = slurp("$file/comment")||'';
next if $comment =~ /NOMAIL/;
- $keep = readlink "$file/keep"
- || readlink "$file/../../\@KEEP"
+ $keep = readlink "$file/keep"
+ || readlink "$file/../../\@KEEP"
|| $keep_default;
$keep = $keep - int((time-mtime("$file/data"))/60/60/24);
# show logfile
if ($opt_w) {
- $log = $logdir[0]."/fexsrv.log";
+ $log = "$logdir/fexsrv.log";
warn "$0: polling $log\n\n";
exec "$FEXHOME/bin/logwatch",$log;
die "$0: logwatch not found\n";
my ($file,$dkey,@L);
chdir $spooldir or die "$0: $spooldir - $!\n";
foreach $file (glob "*/*/*") {
- if (-s "$file/data" and
- $dkey = readlink("$file/dkey") and
+ if (-s "$file/data" and
+ $dkey = readlink("$file/dkey") and
-l ".dkeys/$dkey"
) {
push @L,sprintf "%2\$s --> %1\$s : $durl/$dkey/%3\$s\n",split "/",$file;
my $filter = shift;
my ($comment,$file,$keep,$old,$size,$download);
local $_;
-
+
foreach $file (glob "*/*/*/data") {
next if $file =~ m:(.+?)/: and -l $1;
$size = -s $file or next;
$download = join(' & ',split("\n",(slurp("$file/download")||'')));
print "\n$file\n";
printf " comment: %s\n",decode_utf8($comment);
- printf " size: %s\n",d3($size);
+ printf " size: %s\n",d3($size);
printf " sender ip: %s\n",readlink("$file/ip")||'';
printf " expire in: %s days\n",$keep-$old;
printf " upload speed: %s kB/s\n",readlink("$file/speed")||0;
exit;
}
-# delete user
+# delete user
if ($opt_d) {
$idf = "$spooldir/$opt_d/\@";
die "$0: no such user $opt_d\n" unless -f $idf;
# set user restriction file
if ($opt_R) {
- $user = shift or die "usage: $0 -R user\n";
- $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
- die "$0: no user $user\n" unless -d "$spooldir/$user";
- unless (@local_rdomains) {
- die "$0: no \@local_rdomains in server config\n";
- }
- my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
- open $rf,'>',$rf or die "$0: cannot open $rf - $!";
- print {$rf} "\@LOCAL_RDOMAINS\n";
- close $rf;
- print "$user restricted\n";
+ if ($opt_R eq 'i') {
+ $user = shift or die "usage: $0 -Ri user\n";
+ $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
+ die "$0: no user $user\n" unless -d "$spooldir/$user";
+ unless (@local_rdomains) {
+ die "$0: no \@local_rdomains in server config\n";
+ }
+ my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
+ open $rf,'>',$rf or die "$0: cannot open $rf - $!";
+ print {$rf} "\@LOCAL_RDOMAINS\n";
+ close $rf;
+ print "$user restricted to internal recipients\n";
+ exit;
+ } elsif ($opt_R eq 'l') {
+ $user = shift or die "usage: $0 -Rl user\n";
+ $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
+ die "$0: no user $user\n" unless -d "$spooldir/$user";
+ my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
+ open $rf,'>',$rf or die "$0: cannot open $rf - $!";
+ print {$rf} "\@LOCAL_USERS\n";
+ close $rf;
+ print "$user restricted to local recipients\n";
+ exit;
+ } else {
+ usage(2);
+ }
exit;
}
EOD
} elsif ($opt_r eq 'UPLOAD_HOSTS') {
print {$rf}<<EOD;
-# Restrict allowed upload hosts.
+# Restrict allowed upload hosts.
# Only listed addresses are allowed as upload hosts.
# Make this file COMPLETLY empty if you want to disable the restriction.
# You can add single ip adresses or ip ranges.
EOD
} elsif ($opt_r eq 'DOWNLOAD_HOSTS') {
print {$rf}<<EOD;
-# Restrict allowed download hosts.
+# Restrict allowed download hosts.
# Only listed addresses are allowed as download hosts.
# Make this file COMPLETLY empty if you want to disable the restriction.
# You can add single ip adresses or ip ranges.
# add virtual server
if ($opt_A) {
- if ($opt_A =~ /(.+):(.+)/) {
+ if ($opt_A =~ /(.+):(.+)/) {
$vhost = $1;
$hhost = $2;
- } else {
+ } else {
die "usage: $0 -A alias:hostname\n".
"example: $0 -A flupp:fex.flupp.org\n";
}
if (/^n/i) { $autodelete = 'no' }
elsif (/^y/i) { $autodelete = 'yes' }
elsif (/^d/i) { $autodelete = 'delay' }
- else {
+ else {
die "usage: $0 -a user yes\n".
"usage: $0 -a user no\n".
"usage: $0 -a user delay\n".
if (/^n/i) { $notification = 'no' }
elsif (/^[sb]/i) { $notification = 'short' }
elsif (/^[fd]/i) { $notification = '' }
- else {
+ else {
die "usage: $0 -n user no\n".
"usage: $0 -n user brief\n".
"usage: $0 -n user detailed\n".
if ($opt_D) {
$user = lc $opt_D;
$user .= '@'.$mdomain if $mdomain and $user !~ /@/;
- $_ = shift @ARGV || '';
- if (/^y/i) {
- open $user,">>$spooldir/$user/\@DISABLED";
- close $user;
- print "$user is now disabled\n";
- } elsif (/^n/i) {
+ $_ = $ARGV[0] || '';
+ if (/^no?$/i) {
unlink "$spooldir/$user/\@DISABLED";
print "$user is now enabled\n";
} else {
- die "usage: $0 -D user yes\n".
- "usage: $0 -D user no\n".
- "example: $0 -D framstag\@rus.uni-stuttgart.de no\n";
+ open $user,">>$spooldir/$user/\@DISABLED";
+ print {$user} "@ARGV\n";
+ close $user;
+ print "$user is now disabled\n";
}
exit;
}
print "login: DELETED\n";
}
}
+ my $disabled = 'no';
+ if (-e "$spooldir/$user/\@DISABLED") {
+ $disabled = slurp("$spooldir/$user/\@DISABLED");
+ chomp $disabled;
+ $disabled ||= 'yes';
+ }
printf "fex yourself web default: %s\n",
-e "$spooldir/$user/\@FEXYOURSELF" ? 'yes' : 'no';
printf "persistent: %s\n",
-e "$spooldir/$user/\@PERSISTENT" ? 'yes' : 'no';
printf "captive: %s\n",
-e "$spooldir/$user/\@CAPTIVE" ? 'yes' : 'no';
- printf "disabled: %s\n",
- -e "$spooldir/$user/\@DISABLED" ? 'yes' : 'no';
+ printf "disabled: %s\n",$disabled;
printf "recipients restrictions: %s\n",
-e "$spooldir/$user/\@ALLOWED_RECIPIENTS" ? 'yes' : 'no';
printf "upload restrictions: %s\n",
$squota = $1 if /^s.*:(\d*)/i;
}
open $qf,'>',$qf or die "$0: cannot write $qf - $!\n";
- print {$qf} "recipient:$rquota\n" if $rquota =~ /\d/;
- print {$qf} "sender:$squota\n" if $squota =~ /\d/;
+ print {$qf} "recipient:$rquota\n" if $rquota;
+ print {$qf} "sender:$squota\n" if $squota;
close $qf;
}
- $rquota = $recipient_quota if $rquota !~ /\d/;
- $squota = $sender_quota if $squota !~ /\d/;
- printf "recpient quota (used): %d (%d) MB\n",
- check_recipient_quota($user) if $rquota;
- printf "sender quota (used): %d (%d) MB\n",
- check_sender_quota($user) if $squota;
+ printf "recpient quota (used): %d (%d) MB\n",check_recipient_quota($user);
+ printf "sender quota (used): %d (%d) MB\n",check_sender_quota($user);
}
my ($log,$u,$d,$z);
my $Z = 0;
- if (-t) { $log = $logdir[0].'/fup.log' }
+ if (-t) { $log = "$logdir/fup.log" }
else { $log = '>&=STDIN' }
open $log,$log or die "$0: cannot open $log - $!\n";
my ($log,$u,$d,$z);
my (%user,%domain,%du);
- if (-t) { $log = $logdir[0].'/fop.log' }
+ if (-t) { $log = "$logdir/fop.log" }
else { $log = '>&=STDIN' }
open $log,$log or die "$0: cannot open $log - $!\n";
sub check_admin {
-
+
my $admin_id = slurp("$spooldir/$admin/@") or
die "$0: no admin account - you have to create it with:\n".
"$0 -/ $admin ".randstring(8)."\n";
warn "$0: moving $fid to ${fid}_save\n";
rename $fid,$fid.'_save';
}
- }
+ }
unless (-f $fid) {
mkdir dirname($fid);
open $fid,'>',$fid or die "$0: cannot create $fid - $!\n";
$0 -/ admin auth-ID # set new admin and auth-ID
$0 -q user s:quota # set new disk quota (MB) for sender user
$0 -q user r:quota # set new disk quota (MB) for recipient user
-$0 -R user # restrict user: only internal recipients allowed
+$0 -Ri user # restrict user: only internal domain recipients allowed
+$0 -Rl user # restrict user: only local users as recipients allowed
$0 -rr user # edit user recipients restriction
$0 -ru user # edit user upload restriction
$0 -rd user # edit user download restriction
$0 -d user # delete user
-$0 -D user [yn] # disable user (yes,no)
+$0 -D user "reason" # disable user
+$0 -D user "no" # re-enable user
$0 -P user [yn] # make user persistent = no account expiration (yes,no)
$0 -a user [ynd] # set user autodelete default (yes,no,delay)
$0 -n user [dbn] # set user notification default (detailed,brief,no)