X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/42bcfe2cae29f375af4cf2cd3ccfa196b77a3946..e94ac8da0e87d66927f746e6053fdafbee85cd16:/onak-mail.pl?ds=sidebyside diff --git a/onak-mail.pl b/onak-mail.pl index 0e3c2b5..6799b3d 100755 --- a/onak-mail.pl +++ b/onak-mail.pl @@ -1,5 +1,4 @@ #!/usr/bin/perl -w - # # onak-mail.pl - Mail processing interface for onak, an OpenPGP Keyserver. # @@ -9,6 +8,7 @@ # use strict; +use Fcntl ':flock'; use IPC::Open3; my %config; @@ -29,10 +29,16 @@ sub readconfig { # Ignore; comment line. } elsif (/^this_site (.*)/) { $config{'thissite'} = $1; + } elsif (/^logfile (.*)/) { + $config{'logfile'} = $1; } elsif (/^maintainer_email (.*)/) { $config{'adminemail'} = $1; } elsif (/^mail_delivery_client (.*)/) { $config{'mta'} = $1; + } elsif (/^pks_bin_dir (.*)/) { + $config{'pks_bin_dir'} = $1; + } elsif (/^db_dir (.*)/) { + $config{'db_dir'} = $1; } elsif (/^syncsite (.*)/) { push @{$config{'syncsites'}}, $1; } @@ -54,22 +60,27 @@ sub submitupdate { my @data = @_; my (@errors, @mergedata); + open(LOCKFILE, '>'.$config{'db_dir'}.'/onak-mail.lck'); + flock(LOCKFILE, LOCK_EX); + print LOCKFILE "$$"; + open3(\*MERGEIN, \*MERGEOUT, \*MERGEERR, - "/home/noodles/onak-0.0.3/onak", "add"); + $config{'pks_bin_dir'}."/onak", "-u", "add"); print MERGEIN @data; close MERGEIN; - @errors = ; @mergedata = ; + close MERGEOUT; + @errors = ; + close MERGEERR; - open (LOG, ">>/home/noodles/onak-0.0.3/keyadd.log"); - print LOG @errors; - close LOG; + flock(LOCKFILE, LOCK_UN); + close(LOCKFILE); return @mergedata; } -my ($inheader, %syncsites, $subject, $from, $replyto, @body, @syncmail); +my ($inheader, %seenby, $subject, $from, $replyto, @body, @syncmail); $inheader = 1; $subject = ""; @@ -80,7 +91,7 @@ while (<>) { if (/^Subject:\s*(.*)\s*$/i) { $subject = $1; } elsif (/^X-KeyServer-Sent:\s*(.*)\s*$/i) { - $syncsites{$1} = 1; + $seenby{$1} = 1; } elsif (/^From:\s*(.*)\s*$/i) { $from = $1; } elsif (/^Reply-To:\s*(.*)\s*$/i) { @@ -93,10 +104,98 @@ while (<>) { push @body, $_; } } +if (! defined($replyto)) { + $replyto = $from; +} # HELP, ADD, INCREMENTAL, VERBOSE INDEX , INDEX , GET , # LAST if ($subject =~ /^INCREMENTAL$/i) { - submitupdate(@body); + my $site; + my $count; + my $i; + my @newupdate = submitupdate(@body); + my @time; + + $count = 0; + foreach $i (@{$config{'syncsites'}}) { + if (! defined($seenby{$i})) { + $count++; + } + } + + open (LOG, ">>$config{'logfile'}"); + @time = localtime(time); + print LOG "["; + print LOG sprintf "%02d/%02d/%04d %02d:%02d:%02d", + $time[3], $time[4] + 1, $time[5] + 1900, + $time[2], $time[1], $time[0]; + print LOG "] onak-mail[$$]: Syncing with $count sites.\n"; + close LOG; + + if ((! defined($newupdate[0])) || $newupdate[0] eq '') { + open (LOG, ">>$config{'logfile'}"); + print LOG "["; + print LOG sprintf "%02d/%02d/%04d %02d:%02d:%02d", + $time[3], $time[4] + 1, $time[5] + 1900, + $time[2], $time[1], $time[0]; + print LOG "] onak-mail[$$]: Nothing to sync.\n"; + close LOG; + $count = 0; + } + + if ($count > 0) { + open(MAIL, "|$config{mta}"); + print MAIL "From: $config{adminemail}\n"; + print MAIL "To: "; + foreach $i (@{$config{'syncsites'}}) { + if (! defined($seenby{$i})) { + print MAIL "$i"; + $count--; + if ($count > 0) { + print MAIL ", "; + } + } + } + print MAIL "\n"; + print MAIL "Subject: incremental\n"; + foreach $site (keys %seenby) { + print MAIL "X-KeyServer-Sent: $site\n"; + } + print MAIL "X-KeyServer-Sent: $config{thissite}\n"; + print MAIL "Precedence: list\n"; + print MAIL "MIME-Version: 1.0\n"; + print MAIL "Content-Type: application/pgp-keys\n"; + print MAIL "\n"; + print MAIL @newupdate; + close MAIL; + } +} elsif ($subject =~ /^(VERBOSE )?INDEX (.*)$/i) { + my (@indexdata, $command); + + $command = "index"; + if (defined($1)) { + $command = "vindex"; + } + + open3(\*INDEXIN, \*INDEXOUT, \*INDEXERR, + $config{'pks_bin_dir'}."/onak", $command, "$2"); + close INDEXIN; + @indexdata = ; + close INDEXOUT; + close INDEXERR; + + open(MAIL, "|$config{mta}"); + print MAIL "From: $config{adminemail}\n"; + print MAIL "To: $replyto\n"; + print MAIL "Subject: Reply to INDEX $2\n"; + print MAIL "Precedence: list\n"; + print MAIL "MIME-Version: 1.0\n"; + print MAIL "Content-Type: text/plain\n"; + print MAIL "\n"; + print MAIL "Below follows the reply to your recent keyserver query:\n"; + print MAIL "\n"; + print MAIL @indexdata; + close MAIL; }