our $usage2 = <<'END';
actions
create [REDIRECT] [#COMMENT] (default for REDIRECT is your username)
+ choose [REDIRECT] [#COMMENT] (interactively see and allocate suggestions)
update ADDR [REDIRECT] [#COMMENT]
show ADDR
list
return $v;
}
-sub nextarg_addr () {
- my $addr = nextarg;
+sub addr2localpart ($) {
+ my ($addr) = @_;
return $addr if $addr !~ m/\@/;
die "address not in correct domain (\@$dom)\n" unless $' eq $dom; #';
return $`; #`;
}
+sub nextarg_addr () {
+ return addr2localpart nextarg;
+}
+
sub nomoreargs () {
die "too many arguments\n" if @ARGV;
}
return !!$row;
}
-sub prow ($) {
- my ($row) = @_;
- my $u = $row->{'user'};
+sub puser ($) {
+ my ($u) = @_;
our $last_u;
if (!defined $last_u or $last_u ne $u) {
print "# user $u ".(isdisabled($u) ? 'disabled' : 'enabled')."\n";
$last_u = $u;
}
+}
+
+sub prow ($) {
+ my ($row) = @_;
+ my $u = $row->{'user'};
+ puser($u);
my $pa = $row->{'localpart'};
$pa .= '@'.$dom if defined $dom;
if (length $row->{'redirect'}) {
return $row;
}
-sub generate_local_part () {
+sub local_part_inuse ($) {
+ my ($s) = @_;
our $checkexist_q ||=
$dbh->prepare("SELECT localpart FROM addrs WHERE localpart=?");
+ $checkexist_q->execute($s);
+ my $row = $checkexist_q->fetchrow_arrayref();
+ return !!$row;
+}
+
+sub generate_local_part () {
my $s;
for (;;) {
$s = chr(ord('a')+goodrand(26));
: ord('0')+($v-26));
}
# print STDERR "$s\n";
- $checkexist_q->execute($s);
- my $row = $checkexist_q->fetchrow_arrayref();
- last if !$row;
+ last if !local_part_inuse($s);
}
return $s;
}
prow($newrow);
}
+sub action_choose {
+ my $template = rhsargs({'redirect'=>$user, 'comment'=>''});
+ $template->{'user'} = $user;
+ prepare_create();
+ puser($user);
+ my %s;
+ while (keys %s < 10) {
+ my $s = generate_local_part();
+ next if $s{$s};
+ print $s or die $!;
+ print "\@$dom" or die $! if $dom;
+ print "\n" or die $!;
+ $s{$s} = 1;
+ }
+ print "# ready - enter addrs or local-parts to create,".
+ " then \`.' on a line by itself\n"
+ or die $!;
+
+ while (<STDIN>) {
+ chomp;
+ last if m/^\.$/;
+ my $s;
+ if (eval {
+ $s = addr2localpart $_;
+ $s{$s} or die "not an (as-yet-unused) suggestion\n";
+ delete $s{$s};
+ die "just taken in the meantime (bad luck!)\n"
+ if local_part_inuse $s;
+ 1;
+ }) {
+ my $newrow = { %$template, 'localpart' => $s };
+ $dbh->commit();
+ prow($newrow);
+ } else {
+ $dbh->rollback();
+ print "! error: $@" or die $!;
+ }
+ }
+}
+
sub selectrow ($) {
my ($localpart) = @_;
our $row_q ||= $dbh->prepare("SELECT * FROM addrs WHERE localpart=?");