#!/usr/bin/perl -w
-
#
# onak-mail.pl - Mail processing interface for onak, an OpenPGP Keyserver.
#
#
use strict;
+use Fcntl ':flock';
use IPC::Open3;
my %config;
# 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;
}
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", "-u", "add");
+ $config{'pks_bin_dir'}."/onak", "-u", "add");
print MERGEIN @data;
close MERGEIN;
@mergedata = <MERGEOUT>;
+ close MERGEOUT;
@errors = <MERGEERR>;
+ close MERGEERR;
- open (LOG, ">>/home/noodles/onak-0.0.3/keyadd.log");
- print LOG "[".localtime(time)."] ", @errors;
- close LOG;
+ flock(LOCKFILE, LOCK_UN);
+ close(LOCKFILE);
return @mergedata;
}
push @body, $_;
}
}
+if (! defined($replyto)) {
+ $replyto = $from;
+}
# HELP, ADD, INCREMENTAL, VERBOSE INDEX <keyid>, INDEX <keyid>, GET <keyid>,
# LAST <days>
my $count;
my $i;
my @newupdate = submitupdate(@body);
+ my @time;
$count = 0;
foreach $i (@{$config{'syncsites'}}) {
}
}
- open (LOG, ">>/home/noodles/logs/keyadd.log");
- print LOG "[".localtime(time)."] Syncing with $count sites.\n";
+ 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 ($newupdate[0] eq '') {
- open (LOG, ">>/home/noodles/logs/keyadd.log");
- print LOG "[".localtime(time)."] Nothing to sync.\n";
+ 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;
}
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: application/pgp-keys\n";
print MAIL "\n";
- print @newupdate;
+ 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 = <INDEXOUT>;
+ 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;
}