summaryrefslogtreecommitdiff
path: root/trunk/Echolot/Commands.pm
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/Echolot/Commands.pm')
-rw-r--r--trunk/Echolot/Commands.pm131
1 files changed, 131 insertions, 0 deletions
diff --git a/trunk/Echolot/Commands.pm b/trunk/Echolot/Commands.pm
new file mode 100644
index 0000000..0602bf2
--- /dev/null
+++ b/trunk/Echolot/Commands.pm
@@ -0,0 +1,131 @@
+package Echolot::Commands;
+
+#
+# $Id$
+#
+# This file is part of Echolot - a Pinger for anonymous remailers.
+#
+# Copyright (c) 2002, 2003, 2004 Peter Palfrader <peter@palfrader.org>
+#
+# This program is free software. you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+=pod
+
+=head1 Name
+
+Echolot::Commands - manage commands like add key, set ttl etc.
+
+=head1 DESCRIPTION
+
+This package provides functions for sending out and receiving pings.
+
+=cut
+
+use strict;
+use Echolot::Log;
+use Fcntl ':flock'; # import LOCK_* constants
+#use Fcntl ':seek'; # import SEEK_* constants
+use POSIX; # import SEEK_* constants (older perls don't have SEEK_ in Fcntl)
+use English;
+
+sub addCommand($) {
+ my ($command) = @_;
+
+ my $filename = Echolot::Config::get()->{'commands_file'};
+ open(FH, ">>$filename" ) or
+ Echolot::Log::warn("Cannot open $filename for appending $!."),
+ return 0;
+ flock(FH, LOCK_EX) or
+ Echolot::Log::warn("Cannot get exclusive lock on $filename: $!."),
+ return 0;
+
+ print FH $command,"\n";
+
+ flock(FH, LOCK_UN) or
+ Echolot::Log::warn("Cannot unlock $filename: $!.");
+ close(FH) or
+ Echolot::Log::warn("Cannot close $filename: $!.");
+};
+
+sub processCommands($) {
+ my $filename = Echolot::Config::get()->{'commands_file'};
+
+ (-e $filename) or
+ return 1;
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks)= stat $filename;
+ ($size > 0) or
+ return 1;
+
+ open(FH, "+<$filename" ) or
+ Echolot::Log::warn("Cannot open $filename for reading: $!."),
+ return 0;
+ flock(FH, LOCK_EX) or
+ Echolot::Log::warn("Cannot get exclusive lock on $filename: $!."),
+ return 0;
+
+
+ while (<FH>) {
+ chomp;
+ my ($command, @args) = split;
+
+ if ($command eq 'add') {
+ Echolot::Globals::get()->{'storage'}->add_address(@args);
+ } elsif ($command eq 'set') {
+ Echolot::Globals::get()->{'storage'}->set_stuff(@args);
+ } elsif ($command eq 'getkeyconf') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('getkeyconf', 0, time(), \@args );
+ } elsif ($command eq 'sendpings') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('ping', 0, time(), \@args );
+ } elsif ($command eq 'sendchainpings') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('chainping', 0, time(), \@args );
+ } elsif ($command eq 'buildstats') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('buildstats', 0, time() );
+ } elsif ($command eq 'buildkeys') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('buildkeys', 0, time() );
+ } elsif ($command eq 'buildthesaurus') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('buildthesaurus', 0, time() );
+ } elsif ($command eq 'buildfromlines') {
+ Echolot::Globals::get()->{'scheduler'}->schedule('buildfromlines', 0, time() );
+ } elsif ($command eq 'summary') {
+ @args = ('manual');
+ Echolot::Globals::get()->{'scheduler'}->schedule('summary', 0, time(), \@args );
+ } elsif ($command eq 'delete') {
+ Echolot::Globals::get()->{'storage'}->delete_remailer(@args);
+ } elsif ($command eq 'setremailercaps') {
+ my $addr = shift @args;
+ my $conf = join(' ', @args);
+ Echolot::Conf::set_caps_manually($addr, $conf);
+ } elsif ($command eq 'deleteremailercaps') {
+ Echolot::Globals::get()->{'storage'}->delete_remailercaps(@args);
+ } else {
+ Echolot::Log::warn("Unkown command: '$_'.");
+ };
+ };
+
+ seek(FH, 0, SEEK_SET) or
+ Echolot::Log::warn("Cannot seek to start '$filename': $!."),
+ return 0;
+ truncate(FH, 0) or
+ Echolot::Log::warn("Cannot truncate '$filename' to zero length: $!."),
+ return 0;
+ flock(FH, LOCK_UN) or
+ Echolot::Log::warn("Cannot unlock '$filename': $!.");
+ close(FH) or
+ Echolot::Log::warn("Cannot close '$filename': $!.");
+};
+
+1;
+# vim: set ts=4 shiftwidth=4: