chiark / gitweb /
better usage
[d.git] / fyvzl
diff --git a/fyvzl b/fyvzl
index 97b1d9b4e7dca71e2d9bb72a96e046445be592a1..4fa8fbdd10cf40bcc59eaf2a8d34383ba5739895 100755 (executable)
--- a/fyvzl
+++ b/fyvzl
@@ -1,17 +1,21 @@
 #!/usr/bin/perl -w
-#
-# usage: ../fyvzl [-lLENGTH] [-mMAXPERUSER] [-qQUALDOM] DATABASE-FILE ACTION ARG
-# actions
-#   create [REDIRECT-TO]
-#   update LOCAL-PART REDIRECT-TO
-#   reject LOCAL-PART
-#   show LOCAL-PART
-#   list
-# privileged actions
-#   list-user USER
-#   insert-exact LOCAL-PART USER REDIRECT
-#   donate LOCAL-PART USER
-#   enable-user|disable-user USER
+our $usage1 = <<'END';
+usage: ../fyvzl [-lLENGTH] [-mMAXPERUSER] [-dDOM] [-qQUALDOM] DATABASE-FILE ACTION ARG
+END
+our $usage2 = <<'END';
+actions
+  create [REDIRECT-TO]
+  update LOCAL-PART REDIRECT-TO
+  reject LOCAL-PART
+  show LOCAL-PART
+  list
+  list-actions
+privileged actions
+  list-user USER
+  insert-exact LOCAL-PART USER REDIRECT
+  donate LOCAL-PART USER
+  enable-user|disable-user USER
+END
 
 use strict;
 
@@ -22,6 +26,7 @@ our $randlength = 6;
 our $maxperuser = 10000;
 our $qualdom;
 our $dbh;
+our $dom;
 our $user;
 our $priv;
 
@@ -53,10 +58,12 @@ sub prow ($) {
        print "# user $u ".(isdisabled($u) ? 'disabled' : 'enabled')."\n";
        $last_u = $u;
     }
+    my $pa = $row->{'localpart'};
+    $pa .= '@'.$dom if defined $dom;
     if (defined $row->{'redirect'}) {
-       print "$row->{'localpart'}: $row->{'redirect'}\n";
+       print "$pa: $row->{'redirect'}\n";
     } else {
-       print "# reject $row->{'localpart'}\n";
+       print "# reject $pa\n";
     }
 }
 
@@ -95,6 +102,11 @@ sub action_create {
     $redirect = qualify $redirect;
     open R, "/dev/urandom" or die $!;
     binmode R;
+    my $countq = $dbh->prepare("SELECT count(*) FROM addrs WHERE user=?");
+    $countq->execute($user);
+    my ($count) = $countq->fetchrow_array();
+    die unless defined $count;
+    die "too many aliases for this user\n" if $count >= $maxperuser;
     my $q = $dbh->prepare("SELECT localpart FROM addrs WHERE localpart=?");
     my $s;
     for (;;) {
@@ -208,6 +220,10 @@ sub action_disable_user {
     $dbh->commit;
 }
 
+sub action_list_actions {
+    print $usage2 or die $!;
+}
+
 while (@ARGV) {
     last unless $ARGV[0] =~ m/^-/;
     $_ = shift @ARGV;
@@ -216,8 +232,12 @@ while (@ARGV) {
        $randlength = $1;
     } elsif (m/^-m(\d+)$/) {
        $maxperuser = $1;
+    } elsif (m/^-d(\S+)$/) {
+       $dom = $1;
     } elsif (m/^-q(\S+)$/) {
        $qualdom = $1;
+    } elsif (m/^-h$/) {
+       print $usage1.$usage2 or die $!;
     } else {
        die "unknown option \`$_'\n";
     }
@@ -233,6 +253,11 @@ if (defined $ENV{'USERV_USER'}) {
     $user = ((getpwuid $<)[0]) or die;
 }
 
+$usage2 .= "LOCAL-PART is implicitly qualified with \@$dom\n"
+    if defined $qualdom;
+$usage2 .= "REDIRECT is implicitly qualified with \@$qualdom if it has no \@\n"
+    if defined $qualdom;
+
 $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","",
                    { PrintError => 0, AutoCommit => 0, RaiseError => 1 }) 
     or die "$dbfile $!";