diff options
Diffstat (limited to 'trunk/doc/pingd.conf.pod')
-rw-r--r-- | trunk/doc/pingd.conf.pod | 910 |
1 files changed, 910 insertions, 0 deletions
diff --git a/trunk/doc/pingd.conf.pod b/trunk/doc/pingd.conf.pod new file mode 100644 index 0000000..ae3d5ac --- /dev/null +++ b/trunk/doc/pingd.conf.pod @@ -0,0 +1,910 @@ +# +# $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 + +pingd.conf - configuration file for the Echolot ping daemon + +=head1 DESCRIPTION + +The file B<pingd.conf> sets configuration parameters for Echolot pingd(1). +It is a Perl script that gets eval()ed from within pingd. It has to set the +values in the $CONFIG hash. + +=cut + +=head1 OPTIONS + +=head2 REQUIRED OPTIONS + +=over + +=item B<sitename> + +A short name for your site/pinger. It is used in the statistics produced. + + Default: none + Example: 'sitename' => 'testsite', + +=item B<my_localpart> + +The local part of the pinger's email address. + +In C<pinger@remailer.example.com> the localpart is C<pinger>. + + Default: none + Example: 'my_localpart' => 'pinger', + +=item B<my_domain> + +The domain part (FQDN) of the pinger's email address. + +In C<pinger@remailer.example.com> the domain part is C<remailer.example.com>. + + Default: none + Example: 'my_domain' => 'remailer.example.com', + +=item B<operator_address> + +The email address of the human operator that runs this pinger. + + Default: none + Example: 'operator_address' => 'remop@example.org', + +It is used in several templates. + +=back + + + +=head2 SYSTEM SPECIFIC OPTIONS + +=over + +=item B<recipient_delimiter> + +The B<recipient_delimiter> parameter specifies the separator between user names +and address extensions (user+foo). + +If it is an empty string Echolot does not make use of user defined mailboxes +but rather encodes the message type etc in a Comment/Realname part of an +address. + +The use of recipient_delimiter is strongly recommended if your MTA setup +supports it. + + Default: 'recipient_delimiter' => '+', + Example: 'recipient_delimiter' => '-', + 'recipient_delimiter' => '', + +Example addresses: + +with + as a recipient delimiter: + pinger+conf.1=1035540778=1dd23d97@example.org + +without recipient delimiter: + pinger@example.org (conf.2=1035541597=3baa2ae5) + +=item B<dev_random> + +Where to read strong random data from - currently used only for generating our +secret. + + Default: 'dev_random' => '/dev/random', + +=item B<dev_urandom> + +Where to read weak random data from - currently used only for +garbage generation. + + Default: 'dev_urandom' => '/dev/urandom', + +=item B<sendmail> + +Path to the sendmail binary. It is expected to accept the C<-f> and C<-t> +parameters. + + Default: 'sendmail' => '/usr/sbin/sendmail', + Example: 'sendmail' => '/usr/lib/sendmail', + +=back + + + +=head2 MAGIC NUMBERS + +=over + +=item B<hash_len> [integer] + +Echolot uses email addresses of the form C<foo+some_data=MAC@domain>. MAC +is a Message Authentication Code used to verify that the address +was actually generated by this pinger using a secret which is set +from random data the first time you run B<pingd>. Echolot uses MD5 +as the MAC hash function. + +B<hash_len> is the number of characters to include in the email address. + + Default: 'hash_len' => 8, + Example: 'hash_len' => 4, + +=item B<seconds_per_day> [integer] + +The length of one character in reliability and latency stats. One +character usually stands for exactly one day (hence the name of this +config option). Changing it in production use is probably a bad idea +but shortening it might come in handy during debugging. + + Default: 'seconds_per_day' => 24*60*60, + +=item B<stats_days> [integer] + +How many days (or whatever you configured seconds_per_day to really be) +to have in the stats. This is 12 days. + + Default: 'stats_days' => 12, + +=back + + + +=head2 NEW REMAILERS + +=over + +=item B<fetch_new> [bool] + +Query new remailers for remailer-xxx replies by default. + + Default: 'fetch_new' => 1, + Example: 'fetch_new' => 0, + +=item B<ping_new> [bool] + +Ping new remailers by default. + + Default: 'ping_new' => 1, + Example: 'ping_new' => 0, + +=item B<show_new> [bool] + +Show new remailers in public stats by default. + + Default: 'show_new' => 1, + Example: 'show_new' => 0, + +=back + + + +=head2 STATISTICS GENERATION + +=over + +=item B<separate_rlists> [bool] + +Also build separate rlists with data from only DSA pings, only RSA pings and +only unencrypted pings. + + Default: 'separate_realists' => 0, + Example: 'separate_rlists' => 1, + +=item B<combined_list> [bool] + +Build a combined list of all different stats too. While there is no +standard format it is nice to read for the human eye. + + Default: 'combined_list' => 0, + Example: 'combined_list' => 1, + +=item B<thesaurus> [bool] + +Collect Thesaurus data and build Thesaurus Index. + + Default: 'thesaurus' => 1, + Example: 'thesaurus' => 0, + +=item B<fromlines> [bool] + +Build a summary of default From: header lines and list +remailers which allow overriding them. + + Default: 'fromlines' => 1, + Example: 'fromlines' => 0, + +=item B<stats_sort_by_latency> + +In the statistics output remailers are sorted by reliability as the primary key. +The secondary key is usually nickname. If you prefer to sort by latency rather +than nick set this to 1 (-1 if you want to reverse the order). + + Default: 'stats_sort_by_latency' => 0, + Example: 'stats_sort_by_latency' => 1, + + +=back + + + +=head2 TIMERS AND COUNTERS + +=over + +=item B<processmail> [seconds] + +How often to process incoming email. + + Default: 'processmail' => 60, # every minute + Example: 'processmail' => 5*60, # every 5 minutes + +=item B<buildstats> [seconds] + +How often to build mlist etc. + + Default: 'buildstats' => 5*60, # every 5 minutes + Example: 'buildstats' => 60*60, # hourly + +=item B<chainping_update> [seconds] + +When building stats and we have chain pinging enabled +(see B<do_chainpings>), how often to rebuild chain stats. +This can be a CPU intensive task therefore it's not updated +every time stats are built. + + Default: 'chainping_update' => 4*60*60, # chain stats should never + # be older than 4 hours + +=item B<buildkeys> [seconds] + +How often to build keyrings. + + Default: 'buildkeys' => 8*60*60, # every 8 hours + Example: 'buildkeys' => 24*60*60, # daily + +=item B<buildthesaurus> [seconds] + +How often to update thesaurus index page. + + Default: 'buildthesaurus' => 60*60, # hourly + Example: 'buildthesaurus' => 24*60*60, # daily + +=item B<commitprospectives> [seconds] + +How often to check for prospective new remailer addresses and +commit them to the list of remailers. + + Default: 'commitprospectives' => 8*60*60, # every 8 hours + Example: 'commitprospectives' => 24*60*60, # daily + +=item B<expire> [seconds] + +How often to expire old keys, pings and remailers + + Default: 'expire' => 24*60*60, # daily + Example: 'expire' => 8*60*60, # every 8 hours + +=item B<getkeyconf_interval> [seconds] + +=item B<getkeyconf_every_nth_time> [integer] + +How often to query remailers for new keys and configuration data +(remailer-xxx). Some requests are sent every B<getkeyconf_interval> +seconds. The same request to the same remailer is sent only every +B<getkeyconf_every_nth_time> time. + + Default: '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 + Example: 'getkeyconf_interval' => 10*60, + 'getkeyconf_every_nth_time' => 2*24*60/10, # new request every + # other day + +=item B<check_resurrection> [seconds] + +How often to check assumed dead remailers for resurrection. + + Default: 'check_resurrection' => 7*24*60*60, # weekly + Example: 'check_resurrection' => 14*24*60*60, # every other week + +=item B<pinger_interval> [seconds] + +=item B<ping_every_nth_time> [integer] + +How often to send pings. Pings are sent every B<pinger_interval> seconds. The +same remailer is pinged every B<ping_every_nth_time> time pings are sent (This +means the same remailer is pinged every B<pinger_interval> * +B<ping_every_nth_time> seconds). It is done this way in order to avoid +spikes. + + Default: '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 + Example: 'pinger_interval' => 60, # send out pings every minute + 'ping_every_nth_time' => 60, # send out pings to the same remailer every 60 calls, i.e. every hour + +=item B<chainpinger_interval> [seconds] + +=item B<chainping_every_nth_time> [integer] + +=item B<chainping_ic_every_nth_time> [integer] + +How often to send chain pings. Chain-Pings are sent every +B<chainpinger_interval> seconds. The same chain is pinged every +B<chainping_every_nth_time> time chain-pings are sent. Chains in +I<Intensive Care> (ic), that are chains that are either known or +believed to be bad or are not tested enough yet (see +B<chainping_minsample>), should be tested more often: They are checked +every B<chainping_ic_every_nth_time> time chain-pings are sent. + + Default: '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. daily + +=item B<addresses_default_ttl> [integer] + +How many times to request remailer-xxx from a remailer (done every +B<getkeyconf> seconds, daily per default) without a reply before it is assumed +dead. + + Default: 'addresses_default_ttl' => 5, # getkeyconf seconds (days if getkeyconf is 24*60*60, the default) + Example: 'addresses_default_ttl' => 7, + +=item B<check_resurrection_ttl> [integer] + +How many times to request remailer-xxx from an assumed dead remailer (done every +B<check_resurrection> seconds, weekly per default) without a reply before it is +really considered dead. + + Default: 'check_resurrection_ttl' => 8, # check_resurrection seconds (weeks if check_resurrection is 7*24*60*60, the default) + Example: 'check_resurrection_ttl' => 4, + +=item B<prospective_addresses_ttl> [seconds] + +How long to keep information about a prospective address in the database. +Addresses that are not committed to the list of remailer addresses are +expired after this time. + + Default: 'prospective_addresses_ttl' => 5*24*60*60, # 5 days + Example: 'prospective_addresses_ttl' =>14*24*60*60, # 2 weeks + +=item B<reliable_auto_add_min> [integer] + +How many different remailers need to list an address in a remailer-conf +reply to get it committed to the list of remailer addresses. + + Default: 'reliable_auto_add_min' => 6, + Example: 'reliable_auto_add_min' => 3, + +=item B<expire_keys> [seconds] + +After how long to expire received keys if they were not updated by remailer-key replies. + + Default: 'expire_keys' => 5*24*60*60, # 5 days + Example: 'expire_keys' => 7*24*60*60, # 1 week + +=item B<expire_confs> [seconds] + +After how long to expire received remailer-conf replies. + + Default: 'expire_confs' => 5*24*60*60, # 5 days + Example: 'expire_confs' => 7*24*60*60, # 1 week + +=item B<expire_pings> [seconds] + +After how long to expire pings. 12 is the value of choice +because that is the time frame the statistics show. You should +not make this smaller than 12 days. + + Default: 'expire_pings' => 12*24*60*60, # 12 days + +=item B<expire_chainpings> [seconds] + +After how long to expire chain pings. This should probably +be set to the same as B<chainping_period>. + + Default: 'expire_chainpings' => 12*24*60*60, # 12 days + +=item B<expire_thesaurus> [seconds] + +After how long to expire files in the thesaurus directory. + + Default: 'expire_thesaurus' => 21*24*60*60, # 2 weeks + Example: 'expire_thesaurus' => 7*24*60*60, # 1 week + +=item B<expire_fromlines> [seconds] + +After how long to expire header From: lines. + + Default: 'expire_fromlines' => 5*24*60*60, # 5 days + Example: 'expire_fromlines' => 7*24*60*60, # 1 week + +=item B<cleanup_tmpdir> [seconds] + +How often to clean old files from the temp directory. + Default: 'cleanup_tmpdir' => 24*60*60, # daily + +=item B<metadata_backup> [seconds] + +How often to make backups of metadata and rotate them. If gzip is set, backups +are compressed. + + Default: 'metadata_backup' => 8*60*60, # 8 hours + Example: 'metadata_backup' => 24*60*60, # daily + +=item B<metadata_backup_count> [integer] + +How many backups of metadata to keep. + + Default: 'metadata_backup_count' => 32, # keep the last 32 backups + Example: 'metadata_backup_count' => 4, # keep 4 rotations + +=item B<summary> [seconds] + +How often to print a status summary to the log. + + Default: 'summary' => 24*60*60, # daily + Default: 'summary' => 12*60*60, # twice a day + +=back + + +=head2 DIRECTORIES AND FILES AND RELATED OPTIONS + +=over + +=item B<homedir> + +The base directory of the Echolot installation. All other filenames and +directory names are local to this directory. B<pingd> changes into this +directory upon startup. + + Default: The directory in which pingd is. + Example: 'homedir' => '/home/pinger/echolot', + +=item B<mailin> + +The Maildir directory or Mbox which is searched for new messages. + + Default: 'mailin' => 'mail', + Example: 'mailin' => '/var/mail/echolot', + +=item B<mailerrordir> + +The Maildir directory where messages are put that could not be parsed. + + Default: 'mailerrordir' => 'mail-errors', + +=item B<save_errormails> [bool] + +Whether to keep error messages at all + + Default: 'save_errormails' => 0, + Example: 'save_errormails' => 1, + +=item B<resultdir> + +The directory where statistics and keyrings are put. + + Default: 'resultdir' => 'results', + +=item B<thesaurusdir> + +The directory where Thesaurus data is put. + + Default: 'thesaurusdir' => 'results/thesaurus', + +=item B<thesaurusindexfile> + +The Thesaurus index file. + + Default: 'thesaurusindexfile' => 'results/thesaurus/index', + +=item B<fromlinesindexfile> + +The From Lines index file. + + Default: 'fromlinesindexfile' => 'results/from', + +=item B<private_resultdir> + +The directory where private stats and keyrings are put (Remailers that have +show set to false are shown here too). + + Default: 'private_resultdir' => 'results.private', + +=item B<indexfilebasename> + +The file to write the index.html to (relative to the result directory). + + Default: 'indexfilebasename' => 'echolot', + Example: 'indexfilebasename' => 'index', + +=item B<gnupghome> + +The directory which is used as temporary GnuPG home for all keyring and +encryption/decryption actions. + + Default: 'gnupghome' => 'gnupghome', + +=item B<gnupg> + +Name of the GnuPG executable. If it is not in your PATH make sure to +include path information. + +If B<gnupg> is an empty string, the C<GnuPG::Interface> default (usually B<gpg>) +is used. + + Default: 'gnupg' => '', + Example: 'gnupg' => '/home/pinger/bin/myGnuPG', + +=item B<gzip> + +Name of the gzip executable. If it is not in your PATH make sure to +include path information. + + Default: 'gzip' => 'gzip', + +=item B<mixhome> + +The directory which is used as temporary Mixmaster home for all keyring and +encryption/decryption actions. + + Default: 'mixhome' => 'mixhome', + Example: 'mixhome' => '/home/pinger/Mix', + +=item B<mixmaster> + +Name of the mixmaster executable. If it is not in your PATH make sure to +include path information. + + Default: 'mixmaster' => 'mix', + Example: 'mixmaster' => '/home/pinger/Mix/mix', + +=item B<tmpdir> + +General purpose temp directory. Make sure it is not shared with other +applications. + + Default: 'tmpdir' => 'tmp', + +=item B<commands_file> + +A file where commands to the daemon process are stored. The client +puts commands (like add a new remailer) in it and then sends a HUP +to the daemon process which reads and empties the file. + + Default: 'commands_file' => 'commands.txt', + +=item B<pidfile> + +The daemon's PID file. The daemon's Process ID is stored in this file. +As long as it exists pingd refuses to start up in daemon mode. + + Default: 'pidfile' => 'pingd.pid', + +=item B<broken1> + +File listing broken type I remailer chains. If it does not exist, the part is +skipped in generated stats. Otherwise its content is copied in verbatim. + + Default: 'broken1' => 'broken1.txt', + Example content: + (havenco cmeclax) + (frog3 nycrem) + +=item B<broken2> + +File listing broken type II remailer chains. If it does not exist, the part is +skipped in generated stats. Otherwise its content is copied in verbatim. + + Default: 'broken2' => 'broken2.txt', + Example content: + (freedom lcs) + (* xganon) + +=item B<sameop> + +File listing remailers that have the same operator or share a machine or other +important infrastructure. If it does not exist, the part is skipped in +generated stats. Otherwise its content is copied in verbatim. + + Default: 'sameop' => 'sameop.txt', + Example content: + (xganon2 xganon) + (cracker redneck) + +=back + + +=head2 LOGGING + +=over + +=item B<logfile> + +File to write logs to. This file is reopened on SIGHUP. + + Default: 'logfile' => 'pingd.log', + Example: 'logfile' => '/var/log/echolot/pingd.log', + +=item B<loglevel> + +Minimum severity of messages to include in log file. Possible values are +B<trace>, B<debug>, B<info>, B<notice>, B<warning>, B<error>, B<critical>, B<alert>, and +B<emergency>. + + Default: 'loglevel' => 'info', + Example: 'loglevel' => 'debug', + +=back + + +=head2 MISCELLANEOUS + +=over + +=item B<write_meta_files> [bool] + +Whether to write meta files for each created file. These files include +meta information for http servers and http clients like the date when +a specific page expires. + + Default: 'write_meta_files' => 1, + +=item B<meta_extension> + +The extension that such metafiles (see above) should have. + + Default: 'meta_extension' => '.meta', + +=item B<random_garbage> [integer] + +Pings usually are quite short. Some 100 bytes are sufficient to relay +all the information that is required. To make them not stand out that +obviously, pings are padded using random garbage of random length. + +B<random_garbage> is the top limit for the amount of bytes to add. The +actual number is randomly generated and uniformly distributed over +[0, B<random_garbage>] + + Default: 'random_garbage' => '8192', + +=back + +=head2 CHAIN PINGING + +=over + +=item B<do_chainpings> [bool] + +Whether or not to do chain pings. Chain pings test all chains +of two remailers and come up with a list of broken chains. +This produces a non-trivial amount of traffic. + + Default: 'do_chainpings' => 1, + +=item B<show_chainpings> [bool] + +Show the results of our chainpinging in public stats. + + Default: 'show_chainpings' => 1, + +=item B<chainping_fudge> + +What proportion of the expected replies derived from one-hop stats +must return before a chain is not declared broken. + + Default: 'chainping_fudge' => 0.3, # if less than 0.3 * rel1 * rel2 make it, the chain is really broken + +=item B<chainping_grace> + +The factor of time in addition to the guessed latency +derived from one-hop stats before a chain ping is considered lost + + Default: 'chainping_grace' => 1.5, # don't count pings sent no longer than 1.5 * (lat1 + lat2) ago + +=item B<chainping_period> [seconds] + +What time frame is taken into account when calculating chain stats. +This should probably be smaller than B<expire_chainpings>. + + Default: 'chainping_period' => 12*24*60*60, # 12 days + +=item B<chainping_minsample> [seconds] + +Have at least as many sent (and not within grace) chain pings before +declaring a chain broken. + + Default: 'chainping_minsample' => 3, # have at least sent 3 pings before judging any chain + +=item B<chainping_allbad_factor> + +How many chains C<(A x)> must be bad before C<(A *)> is listed. +The value is given as a proportion of all available remailers. + + Default: chainping_allbad_factor => 0.5, # at least 50% of possible chains (A x) need to fail for (A *) to be listed in broken chains + +=back + + +=head2 PINGING TYPES + +=over + +=item B<do_pings> + +B<do_pings> determines which ping types are sent. +It is a hash that has the following keys: + +=over + +=item B<cpunk-dsa> + +Send out CPunk pings to CPunk remailers with their DSA key. + +=item B<cpunk-rsa> + +Send out CPunk pings to CPunk remailers with their RSA key. + +=item B<cpunk-clear> + +Send out unencrypted pings to CPunk remailers that don't have pgponly +in their capsstring. + +=item B<mix> + +Pings mixmaster remailers. + +=back + + Default: 'do_pings' => { + 'cpunk-dsa' => 1, + 'cpunk-rsa' => 1, + 'cpunk-clear' => 1, + 'mix' => 1 + }, + +=item B<which_chainpings> + +B<which_chainpings> controls some aspects of chain pinging. +It's a hash over chaintypes - currently B<mix> and B<cpunk>. +Each entry is a reference to an array which specifies the +preference for key types in that chaintype. + + Default: which_chainpings => { + 'cpunk' => [ qw{cpunk-dsa cpunk-rsa cpunk-clear} ], + 'mix' => [ qw{mix} ] + }, + +This means that in the case of cpunk chain pings we prefer +using cpunk-dsa over cpunk-rsa which in turn we prefer +to cpunk-clear. For mix there's only mix. + +=item B<pings_weight> + +Not all pings have the same influence on the average reliability +calcluated. Very new pings don't count fully since there is some +margin of error. Similarly very old pings are not that interesting +either. + +By default days 1 to 4 count fully (with weight 1), the older they +are the less they count. + + Default: 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 } ], + +=back + +=head2 TEMPLATES + +=over + +=item B<templates> + +The template files are used to generate the HTML version of all Echolot output. +It is a hash of hashes which each have following keys: +B<thesaurusindexfile>, +B<mlist>, +B<mlist2>, +B<rlist>, +B<rlist-rsa>, +B<rlist-dsa>, +B<rlist-clear>, +B<rlist2>, +B<rlist2-rsa>, +B<rlist2-dsa>, +B<rlist2-clear>, and +B<clist>. + +The outer hash keys are for language selection. + + Default: 'templates' => { + 'default' => { + 'thesaurusindexfile' => 'templates/thesaurusindex.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', + }, + 'de' => { + 'thesaurusindexfile' => 'templates/thesaurusindex.de.html', + .... + }, + 'pl' => { + 'thesaurusindexfile' => 'templates/thesaurusindex.pl.html', + .... + } + }; + +=item B<echolot_css> + +Location of the CSS file. This is copied to resultdir/echolot.css. + + Default: 'echolot_css' => 'templates/echolot.css', + +=back + + + +=head2 STRINGS + +=over + +=item B<remailerxxxtext> + +The text to send along with remailer-xxx queries. +The template variables address and operator_address are substituted for their +real values. + + Default: '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", + +=back + +=head1 AUTHOR + +Peter Palfrader E<lt>peter@palfrader.orgE<gt> + +=head1 BUGS + +Please report them at E<lt>URL:http://alioth.debian.org/projects/echolot/<gt> + +=cut |