summaryrefslogtreecommitdiff
path: root/trunk/Echolot/Config.pm
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/Echolot/Config.pm')
-rw-r--r--trunk/Echolot/Config.pm344
1 files changed, 344 insertions, 0 deletions
diff --git a/trunk/Echolot/Config.pm b/trunk/Echolot/Config.pm
new file mode 100644
index 0000000..dd3d97e
--- /dev/null
+++ b/trunk/Echolot/Config.pm
@@ -0,0 +1,344 @@
+package Echolot::Config;
+
+#
+# $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::Config - echolot configuration
+
+=head1 DESCRIPTION
+
+Sets default configuration options and
+reads configuration from the config file.
+
+=head1 FILES
+
+The configuration file is searched in those places in that order:
+
+=over
+
+=item the file pointed to by the B<ECHOLOT_CONF> environment variable
+
+=item <basedir>/pingd.conf
+
+=item $HOME/echolot/pingd.conf
+
+=item $HOME/pingd.conf
+
+=item $HOME/.pingd.conf
+
+=item /etc/echolot/pingd.conf
+
+=item /etc/pingd.conf
+
+=back
+
+=cut
+
+use strict;
+use Carp;
+use English;
+
+my $CONFIG;
+
+sub init($) {
+ my ($params) = @_;
+
+ die ("Basedir is not defined\n") unless defined $params->{'basedir'};
+
+ my @CONFIG_FILES = ();
+ push(@CONFIG_FILES, $ENV{'ECHOLOT_CONF'}) if defined $ENV{'ECHOLOT_CONF'};
+ push(@CONFIG_FILES, $params->{'basedir'}.'/pingd.conf') if defined $params->{'basedir'};
+ push(@CONFIG_FILES, $ENV{'HOME'}.'/echolot/pingd.conf') if defined $ENV{'HOME'};
+ push(@CONFIG_FILES, $ENV{'HOME'}.'/pingd.conf') if defined $ENV{'HOME'};
+ push(@CONFIG_FILES, $ENV{'HOME'}.'/.pingd.conf') if defined $ENV{'HOME'};
+ push(@CONFIG_FILES, '/etc/echolot/pingd.conf');
+ push(@CONFIG_FILES, '/etc/pingd.conf');
+
+ my $DEFAULT;
+ $DEFAULT = {
+ # System Specific Options
+ recipient_delimiter => '+',
+ dev_random => '/dev/random',
+ dev_urandom => '/dev/urandom',
+ sendmail => '/usr/sbin/sendmail',
+
+ # Magic Numbers
+ hash_len => 8,
+ stats_days => 12,
+ seconds_per_day => 24 * 60 * 60,
+
+ # New Remailers
+ fetch_new => 1,
+ ping_new => 1,
+ show_new => 1,
+
+ # Statistics Generation
+ separate_rlists => 0,
+ combined_list => 0,
+ thesaurus => 1,
+ fromlines => 1,
+ stats_sort_by_latency => 0,
+
+ # Timers and Counters
+ processmail => 60, # process incomng mail every minute
+ buildstats => 5*60, # build statistics every 5 minutes
+ buildkeys => 8*60*60, # build keyring every 8 hours
+ buildthesaurus => 60*60, # hourly
+ buildfromlines => 60*60, # hourly
+ commitprospectives => 8*60*60, # commit prospective addresses every 8 hours
+ expire => 24*60*60, # daily
+ getkeyconf_interval => 5*60, # send out requests every 5 minutes
+ getkeyconf_every_nth_time => 24*60/5, # send out the same request to the same remailer once a day
+ check_resurrection => 7*24*60*60, # weekly
+ summary => 24*60*60, # daily
+
+ metadata_backup => 8*60*60, # make backups of metadata and rotate them every 8 hours
+ metadata_backup_count => 32, # keep 32 rotations of metadata
+
+ pinger_interval => 5*60, # send out pings every 5 minutes
+ ping_every_nth_time => 24, # send out pings to the same remailer every 24 calls, i.e. every 2 hours
+
+ chainpinger_interval => 5*60, # send out pings every 5 minutes
+ chainping_every_nth_time => 2016, # send out pings to the same chain every 2016 calls, i.e. week
+ chainping_ic_every_nth_time => 288, # send out pings to broken or unknown chains every 288 calls, i.e. every day
+ chainping_period => 10*24*60*60, # 12 days
+ chainping_fudge => 0.3, # if less than 0.3 * rel1 * rel2 make it, the chain is really broken
+ chainping_grace => 1.5, # don't count pings sent no longer than 1.5 * (lat1 + lat2) ago
+ chainping_update => 4*60*60, # chain stats should never be older than 4 hours
+ chainping_minsample => 3, # have at least sent 3 pings before judging any chain
+ chainping_allbad_factor => 0.5, # at least 50% of possible chains (A x) need to fail for (A *) to be listed in broken chains
+
+ addresses_default_ttl => 5, # getkeyconf seconds (days)
+ check_resurrection_ttl => 8, # check_resurrection seconds (weeks)
+ prospective_addresses_ttl => 5*24*60*60, # 5 days
+ reliable_auto_add_min => 6, # 6 remailes need to list new address
+
+ expire_keys => 5*24*60*60, # 5 days
+ expire_confs => 5*24*60*60, # 5 days
+ expire_pings => 12*24*60*60, # 12 days
+ expire_thesaurus => 21*24*60*60, # 21 days
+ expire_chainpings => 12*24*60*60, # 12 days
+ expire_fromlines => 5*24*60*60, # 5 days
+ cleanup_tmpdir => 24*60*60, # daily
+
+ random_garbage => 8192,
+
+
+ # Directories and files
+ mailin => 'mail',
+ mailerrordir => 'mail-errors',
+ resultdir => 'results',
+ thesaurusdir => 'results/thesaurus',
+ thesaurusindexfile => 'results/thesaurus/index',
+ fromlinesindexfile => 'results/from',
+ private_resultdir => 'results.private',
+ indexfilebasename => 'echolot',
+ gnupghome => 'gnupghome',
+ gnupg => '',
+ mixhome => 'mixhome',
+ mixmaster => 'mix',
+ tmpdir => 'tmp',
+ broken1 => 'broken1.txt',
+ broken2 => 'broken2.txt',
+ sameop => 'sameop.txt',
+ gzip => 'gzip',
+
+ commands_file => 'commands.txt',
+ pidfile => 'pingd.pid',
+
+ save_errormails => 0,
+ write_meta_files => 1,
+ meta_extension => '.meta',
+
+ storage => {
+ backend => 'File',
+ File => {
+ basedir => 'data'
+ }
+ },
+
+ # logging
+ logfile => 'pingd.log',
+ loglevel => 'info',
+
+
+ # ping types
+ do_pings => {
+ 'cpunk-dsa' => 1,
+ 'cpunk-rsa' => 1,
+ 'cpunk-clear' => 1,
+ 'mix' => 1
+ },
+ do_chainpings => 1,
+ show_chainpings => 1,
+ which_chainpings => {
+ 'cpunk' => [ qw{cpunk-dsa cpunk-rsa cpunk-clear} ],
+ 'mix' => [ qw{mix} ]
+ },
+ pings_weight => [ qw{0.5 1.0 1.0 1.0 1.0 0.9 0.8 0.5 0.3 0.2 0.2 0.1 } ],
+
+ # templates
+ templates => {
+ default => {
+ 'indexfile' => 'templates/echolot.html',
+ 'thesaurusindexfile' => 'templates/thesaurusindex.html',
+ 'fromlinesindexfile' => 'templates/fromlinesindex.html',
+ 'mlist' => 'templates/mlist.html',
+ 'mlist2' => 'templates/mlist2.html',
+ 'rlist' => 'templates/rlist.html',
+ 'rlist-rsa' => 'templates/rlist-rsa.html',
+ 'rlist-dsa' => 'templates/rlist-dsa.html',
+ 'rlist-clear' => 'templates/rlist-clear.html',
+ 'rlist2' => 'templates/rlist2.html',
+ 'rlist2-rsa' => 'templates/rlist2-rsa.html',
+ 'rlist2-dsa' => 'templates/rlist2-dsa.html',
+ 'rlist2-clear' => 'templates/rlist2-clear.html',
+ 'clist' => 'templates/clist.html',
+ },
+ },
+
+ 'echolot_css' => 'templates/echolot.css',
+
+ remailerxxxtext => "Hello,\n".
+ "\n".
+ "This message requests remailer configuration data. The pinging software thinks\n".
+ "<TMPL_VAR NAME=\"address\"> is a remailer. Either it has been told so by the\n".
+ "maintainer of the pinger or it found the address in a remailer-conf or\n".
+ "remailer-key reply of some other remailer.\n".
+ "\n".
+ "If this is _not_ a remailer, you can tell this pinger that and it will stop\n".
+ "sending you those requests immediately (otherwise it will try a few more times).\n".
+ "Just reply and make sure the following is the first line of your message:\n".
+ " not a remailer\n".
+ "\n".
+ "If you want to talk to a human please mail <TMPL_VAR NAME=\"operator_address\">.\n",
+
+ homedir => undef,
+ my_localpart => undef,
+ my_domain => undef,
+ operator_address => undef,
+ sitename => undef,
+ verbose => 0
+ };
+
+
+ my $configfile = undef;
+ for my $filename ( @CONFIG_FILES ) {
+ if ( defined $filename && -e $filename ) {
+ $configfile = $filename;
+ print "Using config file $configfile\n" if ($params->{'verbose'});
+ last;
+ };
+ };
+
+ die ("no Configuration file found\n") unless defined $configfile;
+
+ {
+ local $/ = undef;
+ open(CONFIGCODE, $configfile) or
+ confess("Could not open configfile '$configfile': $!");
+ my $config_code = <CONFIGCODE>;
+ close (CONFIGCODE);
+ ($config_code) = $config_code =~ /^(.*)$/s;
+ eval ($config_code);
+ ($EVAL_ERROR) and
+ confess("Evaling config code from '$configfile' returned error: $EVAL_ERROR");
+ }
+
+
+ for my $key (keys %$CONFIG) {
+ warn("Unkown option: $key\n") unless (exists $DEFAULT->{$key});
+ };
+
+ # Work around spelling bug until 2.0rc3
+ if (exists $CONFIG->{'seperate_rlists'}) {
+ if (exists $CONFIG->{'separate_rlists'}) {
+ warn ("seperate_rlists has been superseded by separate_rlists.");
+ } else {
+ warn ("seperate_rlists has been superseded by separate_rlists, please change it in your config file.\n");
+ $CONFIG->{'separate_rlists'} = $CONFIG->{'seperate_rlists'};
+ };
+ delete $CONFIG->{'seperate_rlists'};
+ }
+
+ # In 2.0.6: thesaurusindexfile and indexfilebasename config values
+ # should not longer have the extension (.html) in them
+ # Handle this gracefully for now:
+ if (exists $CONFIG->{'thesaurusindexfile'}) {
+ $CONFIG->{'thesaurusindexfile'} =~ s/\.html?$// and
+ warn ("thesaurusindexfile no longer should have the .html extension.\n");
+ }
+ if (exists $CONFIG->{'indexfilebasename'}) {
+ $CONFIG->{'indexfilebasename'} =~ s/\.html?$// and
+ warn ("indexfilebasename no longer should have the .html extension.\n");
+ }
+
+ for my $key (keys %$DEFAULT) {
+ $CONFIG->{$key} = $DEFAULT->{$key} unless exists $CONFIG->{$key};
+ };
+ $CONFIG->{'homedir'} = $params->{'basedir'} unless (defined $CONFIG->{'homedir'});
+ $CONFIG->{'verbose'} = $params->{'verbose'} if ($params->{'verbose'});
+
+ for my $key (keys %$CONFIG) {
+ warn ("Config option $key is not defined\n") unless defined $CONFIG->{$key};
+ };
+};
+
+sub check_binaries() {
+ for my $bin (qw{mixmaster}) {
+ my $path = get()->{$bin};
+
+ if ($path =~ m#/#) {
+ Echolot::Log::warn ("$bin binary $path does not exist or is not executeable")
+ unless -x $path;
+ } else {
+ my $found = 0;
+ if (defined $ENV{'PATH'}) {
+ for my $pathelem (split /:/, $ENV{'PATH'}) {
+ $found = $pathelem, last
+ if -e $pathelem.'/'.$path;
+ };
+ };
+ if ($found) {
+ Echolot::Log::warn ("$bin binary $found/$path is not executeable")
+ unless -x $found.'/'.$path;
+ } else {
+ Echolot::Log::warn ("$bin binary $path not found");
+ };
+ };
+ };
+};
+
+sub get() {
+ return $CONFIG;
+};
+
+sub dump() {
+ print Data::Dumper->Dump( [ $CONFIG ], [ 'CONFIG' ] );
+};
+
+1;
+# vim: set ts=4 shiftwidth=4: