diff options
author | Rob Funk <rfunk@funknet.net> | 2004-06-08 03:59:01 +0000 |
---|---|---|
committer | Rob Funk <rfunk@funknet.net> | 2004-06-08 03:59:01 +0000 |
commit | d78b61e3efaea197a6e5b2b72bf2981a9ed69461 (patch) | |
tree | 1704e13ce5d767d59868a2d5e834cb2e988ed90f /contrib | |
parent | d9e84e176fe538e110d9612f9832d69846e8d3e7 (diff) | |
download | fetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.tar.gz fetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.tar.bz2 fetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.zip |
Add files from ESR's dev directory that weren't under version control
svn path=/trunk/; revision=3881
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/README | 179 | ||||
-rw-r--r-- | contrib/README.getmail | 64 | ||||
-rwxr-xr-x | contrib/debian_rc | 40 | ||||
-rw-r--r-- | contrib/domino | 84 | ||||
-rw-r--r-- | contrib/fetchmail-mode.el | 142 | ||||
-rw-r--r-- | contrib/fetchmaildistrib | 29 | ||||
-rwxr-xr-x | contrib/fetchmailnochda.pl | 131 | ||||
-rw-r--r-- | contrib/fetchspool | 58 | ||||
-rw-r--r-- | contrib/getfetchmail | 31 | ||||
-rw-r--r-- | contrib/getfetchmail.pl | 61 | ||||
-rwxr-xr-x | contrib/getmail | 73 | ||||
-rwxr-xr-x | contrib/gotmail | 69 | ||||
-rw-r--r-- | contrib/gotmail.awk | 62 | ||||
-rw-r--r-- | contrib/gotmail.conf | 25 | ||||
-rw-r--r-- | contrib/gotmail.html.awk | 99 | ||||
-rw-r--r-- | contrib/ip-up | 70 | ||||
-rwxr-xr-x | contrib/login | 16 | ||||
-rwxr-xr-x | contrib/logout | 30 | ||||
-rwxr-xr-x | contrib/maildaemon | 75 | ||||
-rw-r--r-- | contrib/mailqueue.pl | 420 | ||||
-rw-r--r-- | contrib/mold_remover.py | 92 | ||||
-rw-r--r-- | contrib/multidrop | 236 | ||||
-rw-r--r-- | contrib/novell | 57 | ||||
-rw-r--r-- | contrib/poptest | 84 | ||||
-rwxr-xr-x | contrib/preauth-harness | 53 | ||||
-rw-r--r-- | contrib/redhat_rc | 60 | ||||
-rw-r--r-- | contrib/runfetchmail | 182 | ||||
-rw-r--r-- | contrib/sm-hybrid | 539 | ||||
-rw-r--r-- | contrib/start_dynamic_ppp | 16 | ||||
-rw-r--r-- | contrib/toprocmail | 46 | ||||
-rw-r--r-- | contrib/zsh-completion | 20 |
31 files changed, 3143 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README new file mode 100644 index 00000000..d81ebbf2 --- /dev/null +++ b/contrib/README @@ -0,0 +1,179 @@ +These are scripts to help you running fetchmail in special situations. +Note: you're on your own using these -- I don't really understand them, +I'm just passing them along. + --esr + +maildaemon: + +Larry Fahnoe wrote this for driving fetchmail from cron. It may be useful if +you want to force a PPP link up and then poll for mail at specified times. +I have rearranged it slightly to make it easier to configure. + +novell: + +Some mail from Dan Newcombe describing how to write a procmail rule that +will domainify Novell server names. + +login & logout: + +These are intended to help if you typically have multiple logins active. +Here's the script composer's original README: + + Please find attached 2 files, ~/.bash_login & ~/.bash_logout + What these do is try to keep track of WHO is the process/tty + that ran fetchmail in daemon mode. I tried to use the bash + Variable PPID, but when using xterm the PPID is set to the + xterm's pid not the bash shell's pid so.... + + They have been lightly tested. + + Any comments... + + Hth, JimL <babydr@nwrain.net> + +Doug Carter <dougc@canus.com> suggests this instead: + +Add the following to your login script. (.ie .bash_profile, .profile, etc) + +LOGINS=`who | grep $USER | wc -l` +if [ $LOGINS = 1 ]; then + /usr/bin/fetchmail > /dev/null 2>&1 +fi + +Then add the following to your logout script. (.ie .bash_logout, etc) + +LOGINS=`who | grep $USER | wc -l` +if [ $LOGINS = 1 ]; then + /usr/bin/fetchmail -q > /dev/null 2>&1 +fi + +ip-up: + +A note from James Stevens about using fetchmail in an ip-up script without +disabling timeouts. + +runfetchmail: + +A shellscript front end for fetchmail that mails you various statistics on +the downloaded mail and the state of your folders. A good example of what +you can do with your own front end. + +fetchspool: + +If you find that the speed of forwarding to port 25 is limited by the +SMTP listener's speed, it may make sense to locally spool all the mail +first and feed it to sendmail after you hang up the network link. +This shellscript aims to do exactly that. It would be smarter to +figure out why sendmail is slow, however. + +fetchsetup: + +This is a shell script for creating a $HOME/.fetchmailrc file, it will ask +you some questions and based on your answers it will create a .fetchmailrc +file, fetchsetup is linux specific so it may not work on another operating +system. + +mailqueue.pl: + +This script will connect to your isp (if not already connected), +send any outgoing mail and retrieve any incoming mail. If this +program made the connection, it will also break the connection +when it is done. By Bill Adams, <bill@evil.inetarena.com>. The +latest version is carried at <http://evil.inetarena.com/>. + +redhat_rc: + +A fetchmail boot-time init file compatible with RedHat 5.1. It leaves +fetchmail in background to get messages when you connect to your ISP. +The invoked fetchmail expects to find its configuration in +/etc/fetchmailrc, and must include the proper "interface" directive. + +debian_rc: + +A fetchmail boot-time init file compatible with Debian. It leaves +fetchmail in background to get messages when you connect to your ISP. +The invoked fetchmail expects to find its configuration in +/root/.fetchmailrc, and must include the proper "interface" directive. + +start_dynamic_ppp: + +An admittedly scratchy ip-up script that Ryan Murray wrote to cope with +dynamic PPP addressing. Will need some customizing. + + http://www.inetarena.com/~badams/linux/programs/mailqueue.pl + +getfetchmail: + +Here's a script that gets Eric's most recent fetchmail source rpm, +downloads it and (if the rpm's not broken) rebuilds it. + +With fairly simple changes it can be used to download the latest i386 rpm +or tar.gz. + +Those who are addicted to having the latest of everything could filter mail +from fetchmail announce through it and get new versions as they're +announced. However, if we all did that, Eric's ftp server might feel a +little stressed. + +The script as written works on bash 2. By John Summerfield +<summer@os2.ami.com.au>. + +zsh-completion: + +These commands set up command completion for fetchmail under zsh. +Jay Kominek <jay.kominek@colorado.edu>. + +getmail/gotmail: + +These scripts are front ends for fetchmail in daemon mode that can gather +log statistics and generate text or HTML reports. See README.getmail for +details. Scripts by Thomas Nesges <ThomaNesges@TNT-Computer.de>. + +fetchmaildistrib: + +This script resolves the issue where the sysadmin polls for mail with fetchmail +only at set intervals, but where a user wishes to see his email right +away. The duplication in /etc/fetchmailrc and ~/.fetchmailrc files is +automated with this script; whenever /etc/fetchmailrc is changed, this +script is run to distribute the stuff into all user's ~/.fetchmailrc +files. + +multidrop: + +Martijn Lievaart's sendmail hacks to make multidrop reliable. + +domino: + +Gustavo Chaves <gustavo@cpqd.com.br> wrote this script to deal with +the boundary-mismatch bug in Domino (see FAQ item X5). If you use +this with --mda, the broken boundaries will be fixed and the result +passed to procmail. + +toprocmail: + +John Lim Eng Hooi <jleh@mail.com> wrote this script, yet another +mda plugin, to be used with fetchmail in foreground mode. It displays +some header lines to stdout in color, passing them (and the rest of the +message content) to procmail. + +preauth-harness: + +Emmanuel Dreyfus's Perl test script for exercising IMAP PREAUTH +connections. You'll have to patch in your username and password. + +sm-hybrid: + +Peter 'Rattacresh' Backes sent this patch to improve the behavior of +sendmail 8.11.0 with multidrop. + +fetchmailnochda.pl + +Watchdog script to check whether fetchmail is working in daemon mode. + +mold-remover.py + +A short python script to remove old read mail from a pop3 mailserver. +Dovetails with fetchmail with keep option. +Run it as a cron job... + + diff --git a/contrib/README.getmail b/contrib/README.getmail new file mode 100644 index 00000000..237889cd --- /dev/null +++ b/contrib/README.getmail @@ -0,0 +1,64 @@ +------------------------------------------------------------------------------- + + - GetMail - GotMail - + + 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de> + +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +Installation: +------------------------------------------------------------------------------- +The Installation is as simple as it could be. Just create the directory +/usr/local/gotmail and copy all files to it. Ready. + +If you decide to choose an other directory to copy the files to, don't forget +to change the path in the scripts. + +------------------------------------------------------------------------------- +Usage: +------------------------------------------------------------------------------- +GetMail starts with: getmail <option> + +options: + clear - stops fetchmail and kills the logfile + fetch - starts fetchmail + got - starts gotmail + goth - starts gotmail html + send - sends all mail from the mailqueue + status - tails the logfile + start - starts fetchmail and tails the logfile + stop - stops fetchmail + -v - prints GetMails version number + +GotMail can be startet without any parameters. It then prints a statistic +on the console. The only parameters so far are: + + html - prints the output to an html file specified in gotmail.conf + -v - prints GotMails version number + +------------------------------------------------------------------------------- +Configuration +------------------------------------------------------------------------------- +GotMail is configured by a file named gotmail.conf either in the user's home +dir, in /etc or in /usr/local/gotmail. gotmail.conf itself is a shell script. +It just exports some variables to the environment. So it's syntax is like this: + + export <OPTION>=<VALUE> + +Remember not to put spaces between <OPTION>=<VALUE> !! +You have the folllowing options: + + GOTM_ERR yes|no print error messages? + GOTM_MSG yes|no print mail stats? + GOTM_TIM yes|no print start/stop stats? + GOTM_HED yes|no print a header? + + Special HTML options: + GOTM_BGCOL hex color backgroundcolor + GOTM_TXCOL hex color textcolor + GOTM_ERRCOL hex color color of error messages + GOTM_TIMCOL hex color color of start/stop stats + GOTM_MSGCOL hex color color of mail stats + GOTM_HTMLFILE filename filename for html output +------------------------------------------------------------------------------- diff --git a/contrib/debian_rc b/contrib/debian_rc new file mode 100755 index 00000000..7bbdbdc8 --- /dev/null +++ b/contrib/debian_rc @@ -0,0 +1,40 @@ +#!/bin/sh +# +# To start fetchmail as a system service, copy this file to +# /etc/init.d/fetchmail and run "update-rc.d fetchmail +# defaults". A fetchmailrc file containg hosts and +# passwords for all local users should be placed in /root +# and should contain a line of the form "set daemon <nnn>". +# +# To remove the service, delete /etc/init.d/fetchmail and run +# "update-rc.d fetchmail remove". + +DAEMON=/usr/bin/fetchmail + +set -e +test -f $DAEMON || exit 0 + +case "$1" in + start) + echo -n "Starting mail retrieval agent: " + if start-stop-daemon --start --quiet --exec $DAEMON; then echo "fetchmail." + else echo "fetchmail already running."; fi + ;; + stop) + echo -n "Stopping mail retrieval agent: " + start-stop-daemon --stop --quiet --exec $DAEMON + echo "fetchmail." + ;; + force-reload|restart) + echo -n "Restarting mail retrieval agent: " + start-stop-daemon --stop --quiet --exec $DAEMON + start-stop-daemon --start --quiet --exec $DAEMON + echo "fetchmail." + ;; + *) + echo "Usage: /etc/init.d/fetchmail {start|stop|restart}" + exit 1 + ;; +esac + +exit 0 diff --git a/contrib/domino b/contrib/domino new file mode 100644 index 00000000..a5802718 --- /dev/null +++ b/contrib/domino @@ -0,0 +1,84 @@ +#!/usr/bin/perl -w +# correct-domino-mime-conversion - does it! +# $Id: domino,v 1.1 2004/06/08 03:59:00 rfunk Exp $ + +use strict; + +# Any arguments are expected to be an mda invocation. +if (@ARGV) { + my $mda = join(' ', @ARGV); + open(MDA, "| $mda") or die "Can't exec $mda: $!\n"; + select(MDA); +} + +# Look for a Boundary declaration in the message header +my $decltag; +while (<STDIN>) { + print; + if (/boundary=\"(.*)\"$/i) { + $decltag = $1; + } elsif (/^$/) { + # An empty line marks the end of the headers. + last; + } +} + +# If we didn't find a Boundary declaration just pipe the rest of the +# message unchanged. +if (!defined $decltag) { + while (<STDIN>) { + print; + } + exit 0; +} + +# Substitute $decltag for every ocurrence of an outer-level boundary +# string found in the body of the message. +my $usedtag; +while (<STDIN>) { + if (/^--(.*)$/) { + $usedtag = $1 unless defined $usedtag; + if ($1 eq $usedtag) { + $_ = "--$decltag\n"; + } elsif ($1 eq "$usedtag--") { + $_ = "--$decltag--\n"; + } + } + print; +} + +=pod + +This script can be used to bypass a bug in the Domino-5.0.2b IMAP +service that manifests itself when you use fetchmail as the IMAP +client. The problem is that fetchmail (differently from other IMAP +clients) fetches messages in two parts, first the headers and then the +body. It seems that Domino converts the messages from its internal +format into MIME twice. In doing so, it declared a boundary string in +the messages Content-type header and uses another one to separate the +parts in the body. + +This script should be used as a mda option for fetchmail. As +arguments to it, pass the former mda you used. I, for example, use the following entry in my .fetchmailrc: + + poll server ... mda "/usr/bin/procmail -d %T"; + +To use this filter, I changed the above into the following: + + poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion /usr/bin/procmail -d %T"; + +If you do not use a mda normally, you can try the following to call sendmail directly: + + poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion //wherever/is/your/sendmail -oem -f %F %T"; + +Without argumets this script is a filter that reads from its stdin and +outputs the result into its stdout. + +I should mention that this bug seems to be solved in Domino 5.0.3 +(http://www.notes.net/46dom.nsf/434e319a66960d8385256857005cd97b/4499e0db6e43732b852568b2006ef7e9?OpenDocument) +but I have not checked it. + +Gustavo. +<gustavo@cpqd.com.br> + +=cut diff --git a/contrib/fetchmail-mode.el b/contrib/fetchmail-mode.el new file mode 100644 index 00000000..d22ebcaf --- /dev/null +++ b/contrib/fetchmail-mode.el @@ -0,0 +1,142 @@ +;; fetchmail-mode.el -*- Emacs-Lisp -*- +;; +;; Mode for editing .fetchmailrc files +;; +;; Created: <Mon Oct 30 20:13:15 EST 2000> +;; Time-stamp: <17.02.2001 17:59:43> +;; Version: 0.1 +;; Keywords: fetchmail,config +;; Author: Alex Shinn <foof@debian.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., 59 Temple Place, Suite 330, Boston, +;; MA 02111-1307 USA + +;; Commentary: +;; +;; This file provides a major mode for editing .fetchmailrc files. +;; It offers syntax highlighting and indentation. +;; +;; To use it, put the following in your .emacs: +;; +;; (autoload 'fetchmail-mode "fetchmail-mode.el" "Mode for editing .fetchmailrc files" t) +;; +;; You may also want something like: +;; +;; (setq auto-mode-alist +;; (append '(("\..fetchmailrc$" . fetchmail-mode)) +;; auto-mode-alist)) + +;; Create mode-specific tables. +(defvar fetchmail-mode-syntax-table nil + "Syntax table used while in fetchmail-mode" ) +(if fetchmail-mode-syntax-table + () ; Do not change the table if it is already set up. + (setq fetchmail-mode-syntax-table (make-syntax-table)) + (modify-syntax-entry ?\\ "\\ " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\, "." fetchmail-mode-syntax-table) + (modify-syntax-entry ?\: "." fetchmail-mode-syntax-table) + (modify-syntax-entry ?\; "." fetchmail-mode-syntax-table) + (modify-syntax-entry ?\" "\"" fetchmail-mode-syntax-table) + (modify-syntax-entry ?\' "\"" fetchmail-mode-syntax-table) + (modify-syntax-entry ?\n "> " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\# "< " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\( "() " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\) ")( " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\[ "(] " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\] ")[ " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\{ "(} " fetchmail-mode-syntax-table) + (modify-syntax-entry ?\} "){ " fetchmail-mode-syntax-table) + ) + +(defvar fetchmail-mode-map nil + "Keymap used in fetchmail-mode" ) + +(if fetchmail-mode-map nil + (setq fetchmail-mode-map (make-sparse-keymap)) + (define-key fetchmail-mode-map "\t" 'fetchmail-complete) + (define-key fetchmail-mode-map "\C-c\C-c" 'comment-region) ) +(defvar fetchmail-mode-hook nil + "Hooks to run in fetchmail-mode" ) + +(defvar fetchmail-keywords nil + "Keywords used for fetchmail-mode" ) + +(unless fetchmail-keywords + (setq fetchmail-keywords + '("poll" "skip" "via" "in" "proto" "protocol" "uidl" "no" "port" "auth" "authenticate" "timeout" "envelope" "qvirtual" "envelope" "aka" "localdomains" "interface" "monitor" "dns" "user" "username" "is" "folder" "pass" "password" "smtp" "smtphost" "smtpaddress" "antispam" "mda" "pre" "preconnect" "post" "postconnect" "keep" "flush" "fetchall" "rewrite" "forcecr" "stripcr" "pass8bits" "dropstatus" "limit" "fetchlimit" "batchlimit" "expunge" "pop2" "POP2" "pop3" "POP3" "imap" "IMAP" "imap-k4" "IMAP-K4" "apop" "APOP" "rpop" "RPOP" "kpop" "KPOP" "etrn" "ETRN" "login" "kerberos" "kerberos_v5" "logfile" "daemon" "syslog" "invisible" "and" "with" "has" "wants" "options" "here" "there" "aka" "set"))) + +(defvar fetchmail-keyword-table nil + "Completion table for fetchmail-mode" ) +(unless fetchmail-keyword-table + (setq fetchmail-keyword-table (make-vector 8 0)) + (mapcar (lambda (x) (intern x fetchmail-keyword-table)) + fetchmail-keywords)) + +(defvar fetchmail-font-lock-keywords nil + "Default expressions to highlight in fetchmail-mode" ) + +(unless fetchmail-font-lock-keywords + (setq fetchmail-font-lock-keywords + (list (list (concat "\\b" (regexp-opt + fetchmail-keywords t) "\\b") + 0 'font-lock-keyword-face )))) + +(defun fetchmail-complete () + "Tab completion for fetchmail-mode" + (interactive) + (let* ((end (point)) + (beg (save-excursion + (skip-syntax-backward "w") + (point))) + (pattern (buffer-substring beg end)) + (table fetchmail-keyword-table) + (completion (try-completion pattern table))) + (cond ((eq completion t)) + ((null completion) + (error "Can't find completion for \"%s\"" pattern)) + ((not (string-equal pattern completion)) + (delete-region beg end) + (insert completion)) + (t + (message "Making completion list...") + (let ((list (all-completions pattern table))) + (if (fboundp 'prettify) + (setq list (funcall 'prettify list))) + (with-output-to-temp-buffer "*Help*" + (display-completion-list list))) + (message "Making completion list...%s" "done"))))) + + +(defun fetchmail-mode () + "Mode for editing .fetchmailrc files" + (interactive) + (kill-all-local-variables) + (use-local-map fetchmail-mode-map) ; This provides the local keymap. + (setq mode-name "Fetchmail") ; This name goes into the modeline. + (setq major-mode 'fetchmail-mode) ; Used by `describe-mode' + (run-hooks 'fetchmail-mode-hook) ; Run each time mode is called + (set-syntax-table fetchmail-mode-syntax-table) + + ;; -cc- + ;; Font lock support + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(fetchmail-font-lock-keywords nil t)) + + (setq comment-start "#") + ) + + + +(provide 'fetchmail-mode) diff --git a/contrib/fetchmaildistrib b/contrib/fetchmaildistrib new file mode 100644 index 00000000..00cc1910 --- /dev/null +++ b/contrib/fetchmaildistrib @@ -0,0 +1,29 @@ +#/bin/bash +# +# fetchmaildistrib --- Distribute central fetchmail knowledge. +# +# The central fetchmail database, /etc/fetchmail, contains all accounts that +# are to be fetched by the root's daemon. Often, a user desires quicker +# access (e.g., when testing some email path). In such cases, the destination +# user (marked as is USER here in the poll lines) should set up a ~/.fetchmailrc +# for himself. This scripts generates such lines from the central file. +# +# By Rick van Rein. + +# From stdin, select poll lines for user $1 +function selectuser () { + grep ^poll | grep "is $1 here" +} + + +for i in `cut -d: -f1 </etc/passwd` +do homedir=`grep ^$i: /etc/passwd | cut -d: -f6` + fetchfile=`selectuser $i </etc/fetchmailrc` + if [ -z "$fetchfile" ] + then rm -f $homedir/.fetchmailrc + else cp /dev/null $homedir/.fetchmailrc + chmod go-rwx $homedir/.fetchmailrc + grep ^defaults /etc/fetchmailrc >>$homedir/.fetchmailrc + selectuser $i </etc/fetchmailrc >>$homedir/.fetchmailrc + fi +done diff --git a/contrib/fetchmailnochda.pl b/contrib/fetchmailnochda.pl new file mode 100755 index 00000000..b0a89609 --- /dev/null +++ b/contrib/fetchmailnochda.pl @@ -0,0 +1,131 @@ +#!/usr/bin/perl + +# User contribution to fetchmail by Torsten Mueller torsten@archesoft.de +# v1.1 22/may/2001 + +# the reason for this script is to check, if fetchmail (in daemon mode) works +# you should have perl and the perlmodule File::Compare installed +# File::Compare you can find at http://www.cpan.org/ + +# installation: +# edit the config part of this script +# create a cronjob , the time it should run should be higher than the pollintervall !! + +# possible problems: +# you have set the cron intervall to short +# the script doesn't have permissions to write to directories or to execute fetchmail +# you didn't start fetchmail in daemon mode but use cron to fetch mail +# you can't read my english + +# how does it work +# really simple, the script checks, if there was a change to the logfile of fetchmail +# to find this out, the script makes a backup of the original logfile and compares +# the size of the original and the backup logfile +# i know it's a dirty way, but hey, it works ... + +use File::Compare; + +# config +# where lives fetchmail on your system +$fetchmail = '/usr/bin/fetchmail'; +# where should be the logfile for fetchmail +$fetchmaillog = '/var/log/fetchmail.log'; +# where could the script write the backup of the logfile +$fetchmailwatch = '/var/log/fetchmailwatch'; +# after how many seconds fetchmail should get mail, the poll intervall +$fetchmailtime = '3600'; +# which config file should fetchmail use for retrieval +$fetchmailconf = '/root/.fetchmailrc'; +# where lives your cp program +$copycp = 'cp'; +#end config + +if (!(-e "$fetchmaillog")) { +# es existiert keine logdatei von fetchmail +# there isn't a logfile of fetchmail +print "There seems to be a problem with the fetchmail daemon\n +I couldn't find a logfile of fetchmail.\n +I try to stop and to start fetchmail in daemon mode.\n +If you get this mail more then once, then check your system !\n +------------------------------------------------------------\n +Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n +Es existiert keine Logdatei. Ich versuche jetzt fetchmail zu stoppen und neu zu \n +starten. Sollte das Problem nochmal auftreten, dann genaue Systeminspektion !\n +------------------------------------------------------------\n +Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n"; + +system "$fetchmail -q"; +sleep 3 ; +system "$fetchmail -f $fetchmailconf -d $fetchmailtime -L $fetchmaillog"; +sleep 2 ; + +} + +if (!(-e "$fetchmailwatch")) { +# die kopie der logdatei existiert nicht +# the copy of the original logfile doesn't exists +print "There seems to be a problem with the fetchmail daemon\n +I couldn't find the copy of the original logfile of fetchmail.\n +If this is this the first run of this script, then this is no problem!\n +If you get this mail more then once, then check your system !\n +------------------------------------------------------------\n +Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n +Es existiert keine Kopie der Logdatei. Wenn das Script das erste Mal aufgerufen wurde,\n +dann ist dies kein Problem. Sollte dieses Problem nochmal auftreten, dann genaue Systeminspektion !\n +------------------------------------------------------------\n +Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n"; +©log; +exit; } + + +$vergleich = compare("$fetchmaillog","$fetchmailwatch"); + +if ($vergleich == -1) { +# irgendein fehler ist aufgetreten +# unknown error +print "There seems to be a problem with the fetchmail daemon or this script\n +I don't know, why this error happens. +Please check the script and your system +------------------------------------------------------------\n +Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n +Bitte die notwendigen Schritte unternehmen, z.B. Festplattenspeicherplatz pruefen\n +noch eine kommt.\n +------------------------------------------------------------\n +Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n"; +} + + +if ($vergleich == 0) { +# dateien sind gleich also also eine aktion starten +# the copy and the original logfile have the same size +print "There seems to be a problem with the fetchmail daemon\n +The logfile seems the be the same as the last logfile i have seen. +That could mean, that fetchmail hangs, or permissionproblems or disk full. +I try to stop and to start fetchmail in daemon mode.\n +If you get this mail more then once, then check your system !\n +------------------------------------------------------------\n +Scheinbar gab es ein Problem mit dem Programm fetchmail\n +Die Logdatei war identisch mit der Logdatei beim letzten Lauf diese Scriptes\n +Daraus schlussfolgere ich, dass nichts mehr geloggt wurde -> fetchmail hat ein Problem\n +Ich habe fetchmail versucht zu stoppen, und wieder neu zu starten.\n +Sollte diese Mail heute noch mehrfach erscheinen, dann ist eine genauere Inspektion\n +der Umstaende notwendig. Ist dies die erste Mail, dann einfach mal abwarten, ob\n +noch eine kommt.\n +------------------------------------------------------------\n +Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n"; + +system "$fetchmail -q"; +sleep 3 ; +system "$fetchmail -f $fetchmailconf -d $fetchmailtime -L $fetchmaillog"; +sleep 2 ; + +} + + +©log; + +sub copylog { +system "$copycp $fetchmaillog $fetchmailwatch"; +} + + diff --git a/contrib/fetchspool b/contrib/fetchspool new file mode 100644 index 00000000..cd6c2c81 --- /dev/null +++ b/contrib/fetchspool @@ -0,0 +1,58 @@ +#!/bin/sh - +# +# Quick hack for fetchmail to locally spool messages. +# +# To spool: +# fetchmail --mda "fetchspool -t %T %F" +# To de-spool +# fetchspool -f +# +# Robert de Bath <robert@mayday.cix.co.uk> +# updated by william boughton <bill@xencat.demon.co.uk> +# 4th/10/1998 and tested +# +# William Boughton comments: +# Still has some potential problems, with using inline from address. +# The use of _ is bad because fetchmails uses this if it notices +# shell escapes. +# 10th/11/1998 +# Changed to using 3 _@@s to delimit the message, i hope this is ok. +# Whilst i have tested and used this script, with my demon account and +# SDPS, it may still have serious problems, that i've not noticed etc. + +MAILSPOOL=/tmp/spool + +if [ "$1" != "-f" ] +then + if [ "$1" = "-t" ] + then + ADDR="$2" + FROM="$3" + else + ADDR="$1" + FROM="$2" + fi + + cat - > $MAILSPOOL/tmp.$$ || exit 1 + mv $MAILSPOOL/tmp.$$ "$MAILSPOOL/msg.`date +%j%H%M%S`$$.to.${ADDR}_@@${FROM}" || exit 1 + + exit 0 +else + for i in $MAILSPOOL/msg.*.to.* + do + [ -f "$i" ] || continue + # TO="`echo \"$i\" | sed 's/^msg.[^.]*.to.//'`" + TO=$(basename $i | sed -e 's/^msg.[^.]*.to.//' -e 's/_@@.*$//') + FROM=$(basename $i | sed 's/^msg.[^.]*.to.*_@@//') +# need the \<\> so for bounces to have a proper from addr +echo the to was \<$TO\> and the from \<$FROM\> + /usr/lib/sendmail -f \<${FROM}\> -oem "$TO" < "$i" || + { + echo "Sendmail failed on `basename \"$i\"`" + continue + } + rm -f "$i" + done + exit 0 +fi + diff --git a/contrib/getfetchmail b/contrib/getfetchmail new file mode 100644 index 00000000..bcac9d3e --- /dev/null +++ b/contrib/getfetchmail @@ -0,0 +1,31 @@ +#!/bin/bash +RH=ftp.ccil.org +p=`\ +echo dir /pub/esr/fetchmail/f\*src.rpm \ + | ftp $RH \ + | grep /pub/esr/fetchmail/fetchmail-[45] \ + | tail -1` +#p='-rw-r--r-- 1 23 wheel 478424 Dec 18 03:54 /pub/esr/fetchmail/fetchmail-4.7.1-1.src.rpm' +#echo $p | sed -e "s=^.^/pub=pub=" +p1=`echo $p | sed -e "s=^.*/pub=pub="` +#echo $p1 +#basename $p1 +#dirname $p1 +d=`dirname $p1` +f=`basename $p1` +cd /work/incoming +email=$LOGNAME\@`hostname` +ftp -n <<ZZ +open $RH +user anonymous $email +cd /$d +get $f +bye +ZZ +rpm -K $f >/dev/null 2>&1 \ + || { + rpm -K $f 2>&1 | mail $email -s "error getting $f" + exit + } +rpm --rebuild $f 2>&1 |\ + mail $email -s "Rebuilding $f" diff --git a/contrib/getfetchmail.pl b/contrib/getfetchmail.pl new file mode 100644 index 00000000..45bd3c65 --- /dev/null +++ b/contrib/getfetchmail.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl -w +# Copyright 2001 John Summerfield, summer@summer.ami.com.au +# GPL 2 applies. +# +($flags, $links, $owner, $gowner, $size, $month, $day, $timeOrDate, $name, $junk, $junk2, $junk1) =''; +$RemoteHost="ftp.ccil.org"; +$LocalDir="/home/u03/incoming/"; +$FilePattern="/pub/esr/fetchmail/fetchmail\*src.rpm"; +$GrepArgs="fetchmail-[5-9]"; +$no=0; +$TempFile=`mktemp /var/tmp/getfetchmail.XXXXXX`; +@files=`echo dir $FilePattern | ftp $RemoteHost | egrep $GrepArgs`; +chomp @files; +open(FTP, "| ftp -d -v $RemoteHost | egrep '^213|MDTM' >$TempFile"); +foreach $L (@files) +{ + ++$no; + $L =~ s/ */,/g; + ($flags, $links, $owner, $gowner, $size, $month, $day, $timeOrDate, $name, $junk) = split /,/,$L; + next unless substr($timeOrDate,2,1) eq ':'; + print FTP "modtime $name\n"; +# last if $no > 4; +} +close FTP; + +$SavedTime=0; +$time=1; +$SavedName=''; +open (FILES,$TempFile); +while ($rec = <FILES>) +{ + chomp $rec; + ($junk1, $junk2, $filename) = split / /,$rec if substr($rec,0,4) eq '--->'; + $time = substr($rec,4) if substr($rec,0,3) eq '213'; + if (($time > $SavedTime) && (substr($rec,0,3) eq '213')) + { + $SavedTime=$time; + $SavedName=$filename; + } +} +close FILES; +$LocalName = $SavedName; $LocalName =~ s=.*/==; +$LocalName = $LocalDir . $LocalName; +$Y=substr($SavedTime,0,4); +$M=substr($SavedTime,4,2); +$D=substr($SavedTime,6,2); +$h=substr($SavedTime,8,2); +$m=substr($SavedTime,10,2); +$s=substr($SavedTime,12,2); +print "I should get $SavedName and store it in $LocalName\n"; +open(SH,"|/bin/bash"); +print SH <<zz +set -x +echo get $SavedName $LocalName \| ftp $RemoteHost +rpm -K $LocalName \|\| exit $? +touch -t $Y$M$D$h$m.$s $LocalName +rpm --rebuild $LocalName +zz +; +close SH; + diff --git a/contrib/getmail b/contrib/getmail new file mode 100755 index 00000000..eec5c6fb --- /dev/null +++ b/contrib/getmail @@ -0,0 +1,73 @@ +#------------------------------------------------------------------------------ +# +# GetMail - Fetchmail Daemon Controlling Script +# +# 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de> +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# GetMail starts/stops fetchmail in daemon mode and logs all actions to +# /var/log/fetchmail.log. Output is done by tailing the logfile. +# +# Sendmail/Fetchmail has to be installed, and your fetchmailrc has to be +# correctly configured. The option 'got' and 'goth' require a correctly +# installed GotMail. If you didn't install it in /usr/local/gotmail you +# must change the path given. +# +# If you have any changes/corrections in the script, please send me email. +#------------------------------------------------------------------------------ + +#!/bin/sh + +case "$1" in + start) + sendmail -q + date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log + fetchmail -d 1 -L /var/log/fetchmail.log & + tail -f /var/log/fetchmail.log + ;; + stop) + fetchmail -q + date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ stoped >> /var/log/fetchmail.log + ;; + fetch) + date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log + fetchmail -d 1 -L /var/log/fetchmail.log & + tail -f /var/log/fetchmail.log + ;; + status) + tail -f /var/log/fetchmail.log + ;; + got) + /usr/local/gotmail/gotmail + ;; + goth) + /usr/local/gotmail/gotmail html + ;; + send) + /sendmail -q + ;; + clear) + fetchmail -q + rm /var/log/fetchmail.log + ;; + -v) + echo 'getmail version: 0.0.1' + ;; + *) + echo + echo 'Usage: getmail option' + echo + echo 'options:' + echo ' clear - stops fetchmail and kills the logfile' + echo ' fetch - starts fetchmail' + echo ' got - starts gotmail' + echo ' goth - starts gotmail html' + echo ' send - sends all mail from the mailqueue' + echo ' status - tails the logfile' + echo ' start - starts fetchmail and tails the logfile' + echo ' stop - stops fetchmail' + echo ' -v - print the version number' + echo +esac diff --git a/contrib/gotmail b/contrib/gotmail new file mode 100755 index 00000000..8580da6d --- /dev/null +++ b/contrib/gotmail @@ -0,0 +1,69 @@ +#------------------------------------------------------------------------------ +# +# GotMail - Statistics Printing Script for GetMail +# +# 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de> +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# GotMail reads a GetMail logfile (/var/log/fetchmail.log) and prints +# statistics from all sessions logged in it, either as normal text on the +# Console, or as an html-file. The parsing is done with the awk-scripts +# gotmail.awk and gotmail.html.awk. +# You can configure its output with a file gotmail.conf either in your home, +# /etc, or in /usr/local/gotmail. +# +# GetMail has to be properly installed. For HTML output the htmllib has to be +# installed in /usr/local/htmllib. +# +# If you have any changes/corrections in the script, please send me email. +#------------------------------------------------------------------------------ + + +#!/bin/sh + +# Gotmail +# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de> + +# read the configuration +# the configuration can either be +# ~/.gotmail.conf +# /etc/gotmail.conf +# /usr/local/gotmail/gotmail.conf +if { test -e ~/.gotmail.conf; }; + then { source ~/.gotmail.conf; }; + else { if { test -e /etc/gotmail.conf; }; + then { source /etc/gotmail.conf; }; + else { if { test -e /usr/local/gotmail/gotmail.conf; }; + then { source /usr/local/gotmail/gotmail.conf; }; + else { echo 'Error: gotmail.conf could not be read'; + echo 'gotmail exits now..'; + exit; }; + fi; }; + fi; }; +fi; + + +# grep the fetchmail.log for relevant messages and save them in +# gotmails tempfile +cat /var/log/fetchmail.log | grep 'message' >> /tmp/gotmail.log.tmp +cat /var/log/fetchmail.log | grep 'Authorization' >> /tmp/gotmail.log.tmp +cat /var/log/fetchmail.log | grep 'fetchmail st' >> /tmp/gotmail.log.tmp + + +# parse the gotmail tempfile and prints a statistiks-screen +case "$1" in + html) + awk -f /usr/local/htmllib/htmllib.awk -f /usr/local/gotmail/gotmail.html.awk /tmp/gotmail.log.tmp > /dev/null + ;; + -v) + echo 'gotmail version: 0.0.1' + ;; + *) + awk -f /usr/local/gotmail/gotmail.awk /tmp/gotmail.log.tmp + ;; +esac + +# remove the gotmail tempfile +rm /tmp/gotmail.log.tmp diff --git a/contrib/gotmail.awk b/contrib/gotmail.awk new file mode 100644 index 00000000..9c967ade --- /dev/null +++ b/contrib/gotmail.awk @@ -0,0 +1,62 @@ +#----------------------------------------------------------------------------- +# +# Gotmail - gotmail.awk +# +# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de> +# +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# This script is part of GotMail. It gives back normal text to the console +#----------------------------------------------------------------------------- + +{ + if($2!="reading") + { + if(($3=="message") || ($3=="messages")) + { + Mails = Mails sprintf(" %- 40s ",substr($5,1,40)) + Mails = Mails sprintf(" %- 5s ",substr($2,1,5)) + Mails = Mails sprintf(" %- 30s\n",substr($7,1,30)) + } + else if($3=="fetchmail") + { + Started = Started " " $0 "\n" + } + else + { + Errors = Errors $0 "\n" + } + } +} + +END { + Separator = "-------------------------------------------------------------------------------" + if(ENVIRON["GOTM_HED"]=="yes") + { + print "\n\t\t---------------------------------------" + print "\t\t| ** GotMail - Stats for fetchmail ** |" + print "\t\t---------------------------------------" + } + if(ENVIRON["GOTM_MSG"]=="yes") + { + print Separator + print "| Fetched Mails:" + print Separator + print Mails + } + if(ENVIRON["GOTM_ERR"]=="yes") + { + print Separator + print "| Error Messages:" + print Separator + print Errors + } + if(ENVIRON["GOTM_TIM"]=="yes") + { + print Separator + print "| Fetchmail started/stoped:" + print Separator + print Started + } + } diff --git a/contrib/gotmail.conf b/contrib/gotmail.conf new file mode 100644 index 00000000..08087936 --- /dev/null +++ b/contrib/gotmail.conf @@ -0,0 +1,25 @@ +#!/bin/sh + +# Print Statistiks for Error-Messages + export GOTM_ERR="yes" +# Print Statistiks for fetched Messages + export GOTM_MSG="yes" +# Print Statistiks for Start/Stop-Messages + export GOTM_TIM="yes" +# Print Statistiks with Header + export GOTM_HED="yes" + +# Special HTML Options + +# Background Color + export GOTM_BGCOL="#FFFFFF" +# Text Color + export GOTM_TXCOL="#000000" +# Error-Messages Color + export GOTM_ERRCOL="#DD3030" +# Start/Stop-Messages Color + export GOTM_TIMCOL="#30FF30" +# Normal Messages Color + export GOTM_MSGCOL="#FDFCCC" +# Ouput File + export GOTM_HTMLFILE="/usr/local/gotmail/gotmail.html" diff --git a/contrib/gotmail.html.awk b/contrib/gotmail.html.awk new file mode 100644 index 00000000..ba111a64 --- /dev/null +++ b/contrib/gotmail.html.awk @@ -0,0 +1,99 @@ +#----------------------------------------------------------------------------- +# +# Gotmail - gotmail.awk +# +# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de> +# +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# This script is part of GotMail. It emits html to a specified File +# The AWK-Library htmllib has to be properly installed. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +function init_environ() +{ + TextColor = ENVIRON["GOTM_TXCOL"] + BackColor = ENVIRON["GOTM_BGCOL"] + MsgColor = ENVIRON["GOTM_MSGCOL"] + ErrColor = ENVIRON["GOTM_ERRCOL"] + TimColor = ENVIRON["GOTM_TIMCOL"] + OutFile = ENVIRON["GOTM_HTMLFILE"] + PrintMsg = toupper(ENVIRON["GOTM_MSG"]) + PrintErr = toupper(ENVIRON["GOTM_ERR"]) + PrintTim = toupper(ENVIRON["GOTM_TIM"]) + PrintHed = toupper(ENVIRON["GOTM_HED"]) + +} +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +{ + init_environ() + if($2!="reading") + { + if($3=="messages") + { + Mails = Mails TableRow("start", MsgColor) + Mails = Mails TableItem($5) TableItem($7) + Mails = Mails TableItem(Align($2,0)) + Mails = Mails TableRow("stop") + } + else if($3=="fetchmail") + { + Times = Times TableRow("start", TimColor) + Times = Times TableItem($0) + Times = Times TableRow("stop") + } + else + { + Errors = Errors TableRow("start", ErrColor) + Errors = Errors TableItem($0) + Errors = Errors TableRow("stop") + } + } +} +#----------------------------------------------------------------------------- +END { + Stats = StartPage(Title("Gotmail Stats") Body(BackColor, TextColor)) + if(PrintHed == "YES") + { + Stats = Stats Align(Headline("Gotmail Stats",1),0) + Stats = Stats Divider Newline + } + if(PrintMsg == "YES") + { + Stats = Stats TableStart(1) + Stats = Stats TableRow("start", MsgColor) + Stats = Stats TableItem(Bold("Account")) + Stats = Stats TableItem(Bold("Server")) + Stats = Stats TableItem(Bold("Mails fetched")) + Stats = Stats TableRow("stop") + Stats = Stats Mails TableEnd Newline Divider Newline + } + + if(PrintErr == "YES") + { + Stats = Stats TableStart(1) + Stats = Stats TableRow("start", ErrColor) + Stats = Stats TableItem(Bold("Error Messages")) + Stats = Stats TableRow("stop") + Stats = Stats Errors TableEnd Newline Divider + } + + if(PrintTim == "YES") + { + Stats = Stats TableStart(1) + Stats = Stats TableRow("start", TimColor) + Stats = Stats TableItem(Bold("Start/Stop Times")) + Stats = Stats TableRow("stop") + Stats = Stats Times TableEnd Newline Divider + } + + Stats = Stats Center("start") "GotMail - 1999 by Thomas Nesges " + Stats = Stats "<ThomasNesges@TNT-Computer.de>" Center("stop") EndPage + + print Stats > OutFile + } +#----------------------------------------------------------------------------- diff --git a/contrib/ip-up b/contrib/ip-up new file mode 100644 index 00000000..542448d9 --- /dev/null +++ b/contrib/ip-up @@ -0,0 +1,70 @@ +From James.Stevens@jrcs.co.uk Mon Aug 25 18:11:36 1997 +Return-Path: <James.Stevens@jrcs.co.uk> +Received: from locke.ccil.org (snark [10.0.2.15]) + by snark.thyrsus.com (8.8.5/8.8.5) with ESMTP id SAA10394 + for <esr@snark.thyrsus.com>; Mon, 25 Aug 1997 18:11:34 -0400 +Received: (from slist@localhost) + by locke.ccil.org (8.8.5/8.8.5) id GAA17071 + for esr; Mon, 18 Aug 1997 06:17:07 -0500 (EST) +Resent-Date: Mon, 18 Aug 1997 06:17:07 -0500 (EST) +X-Authentication-Warning: locke.ccil.org: slist set sender to fetchmail-friends-request@ccil.org using -f +X-NiNLog: [James.Stevens@jrcs.co.uk] [<fetchmail-friends@locke.ccil.org>] [199708180955.KAA04988] +Message-ID: <33F81C2D.AB822BBB@jrcs.co.uk> +Date: Mon, 18 Aug 1997 10:55:57 +0100 +From: James Stevens <James.Stevens@jrcs.co.uk> +Reply-To: James.Stevens@jrcs.co.uk +Organization: JRCS Ltd +X-Mailer: Mozilla 4.01 [en] (Win95; I) +MIME-Version: 1.0 +To: "fetchmail-friends@locke.ccil.org" <fetchmail-friends@locke.ccil.org> +Subject: A Little Tip... +X-Priority: 3 (Normal) +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit +Resent-Message-ID: <"lhVgRB.A.FFE.bxC-z"@locke.ccil.org> +Resent-From: fetchmail-friends@ccil.org +X-Mailing-List: <fetchmail-friends@ccil.org> archive/latest/725 +X-Loop: fetchmail-friends@ccil.org +Precedence: list +Resent-Sender: fetchmail-friends-request@ccil.org +Status: RO + +Seeing Eric tip us that we could run a "fetchmail -quit" in the +"ip-down" script, I thougt it would be neat to run a fetchmail +collection in the "ip-up" script. That way mail is collected +automatically every time I am connecting to Internet for whatever reason +(I use "diald" to automatically manage my connection). + +However, it did not work. It hung right after the POP3 login. I tracked +this down to the fact that the "pppd" masks a wide range of signals and +this means a time-out does not kick in. As I run the "ip-up" script in +"bash" this masking is inheritied by "fetchmail". + +So, I wrote a silly little "C" program that unmasks all signals and then +runs a command of you choice (in this case fetchmail). This is the code +for that program :- + +#include <stdio.h> +#include <signal.h> + +main(int argc,char * argv[]) +{ +sigset_t set; + + if (argc>1) + { + sigfillset(&set); + sigprocmask(SIG_UNBLOCK,&set,NULL); + system(argv[1]); + } +} + +I call it "allsigs". So, now in my "ip-up" I have the line :- + +allsigs "fetchmail -f /etc/fetahmail" + +Note the quotes as "allsigs" only looks at argv[1]. I guess this +unmasking of all signals could be added into "fetchmail" ? + +James + diff --git a/contrib/login b/contrib/login new file mode 100755 index 00000000..952594af --- /dev/null +++ b/contrib/login @@ -0,0 +1,16 @@ +# ~/.bash_login +# + +# Start Fetchmail up when I Login. +# +# TDEV=my PRESENT terminal device IE: ttyp2, tty5, .... +# +export TDEV=`tty | sed -n -e "s#/dev/##p"` +# +if [ ! -s ~/.fetchmail ]; then + /usr/local/bin/fetchmail -d 300 + echo "owner" >.fetchmail.$TDEV +else + echo "notowner" >.fetchmail.$TDEV +fi +# END of Fetchmail startup diff --git a/contrib/logout b/contrib/logout new file mode 100755 index 00000000..96c9111d --- /dev/null +++ b/contrib/logout @@ -0,0 +1,30 @@ +# ~/.bash_logout +# Clean things up when I Exit. + +# Below is for Fetchmail clean up +# +# TDEV=my PRESENT terminal device IE: ttyp0, tty5, ..... +# +export TDEV=`tty | sed -n -e "s#/dev/##p"` +# +if [ -s ~/.fetchmail ]; then +# + if [ -s ~/.fetchmail.$TDEV ]; then + TEST=`/usr/bin/grep 'notowner' ~/.fetchmail.$TDEV` +# + if [ ! -z $TEST ]; then + /bin/rm -rf ~/.fetchmail.$TDEV + elif [ -z $TEST ]; then + /bin/rm -rf ~/.fetchmail.$TDEV + /usr/local/bin/fetchmail -q >/dev/null 2>&1 + fi +# + else + echo "WARNING: A process either did not record a ~/.fetchmail.$TDEV" >> ~/.fetchmail.warning.$TDEV + echo "WARNING: Or removed the file manually ." >> ~/.fetchmail.warning.$TDEV + fi +# +else + echo "WARNING: parent process has exit'ed & removed primary ~/.fetchmail.$TDEV " >> ~/.fetchmail.warning.$TDEV +fi +# END of Fetchmail clean up diff --git a/contrib/maildaemon b/contrib/maildaemon new file mode 100755 index 00000000..3728c333 --- /dev/null +++ b/contrib/maildaemon @@ -0,0 +1,75 @@ +#!/bin/sh +# +# maildaemon, fetchmail driver intended to be invoked hourly by cron. +# +# Script by Larry Fahnoe <fahnoe@kegworks.mn.org>, who writes: +# +# This is intended to support a standalone system (NeXTSTEP in this case) +# which makes manual, on-demand PPP connections to the outside world. The +# script is run as the target user from cron on an hourly basis. If it +# finds a PPP link is up (it sees routes on a PPP interface), fetchmail is +# invoked. If the link is not up, and the hour is in the list of hours that +# connections should be made, the link is brought up and fetchmail is +# invoked. The program or script used to bring up the link should return an +# exit status which reflects whether the link actually came up. +# +# I wrote this because I wanted to be able to have control over the amount +# of time spent connected to an ISP and yet still be able to poll for mail +# at intervals that made sense to me. One limitation of this script is that +# it does not take into account that an existing PPP link might be going to +# a different ISP or network. +# + +# You'll have to configure these +USER=fahnoe # your name +HOME=/Users/fahnoe # home directory (for the logfile) +FORCEHOURS="05 09 13 17" # when to bring the link up if it's not already +SERVER=mailserver.isp.com # mailserver host name + +# Link initialization and wrapup scripts (you may have to configure these) +PPPUP="/usr/local/bin/pppup $SERVER" +PPPDOWN=/usr/local/bin/pppdown + +PATH=/usr/local/bin:/bin:/usr/ucb:/usr/bin:/usr/etc +export PATH USER HOME + +LOG=$HOME/log/maildaemon.log + +# get the mail, depends on $HOME/.fetchmailrc and $USER +FETCHMAIL( ) { + ( echo "`date` $SERVER" + fetchmail $SERVER + if [ $? -gt 1 ] + then + echo "`date` $SERVER (evil things happened in fetchmail)" + fi + ) >> $LOG 2>&1 +} + +# if the link is already up, check for mail. +# if the hour is in FORCEHOURS, force the link up and check for mail. +(netstat -rn | awk '{ print $6 }' | grep ppp[0-9] > /dev/null) +if [ $? -eq 0 ] +then + FETCHMAIL +else + hour=`date | sed -e 's/:/ /g' | awk '{ print $4 }'` + for x in $FORCEHOURS + do + if [ $hour = $x ] + then + $PPPUP + if [ $? -eq 0 ] + then + FETCHMAIL + $PPPDOWN + else + echo "`date` $SERVER (link establishment failure)" >> $LOG + exit 1 + fi + fi + done +fi + +exit + diff --git a/contrib/mailqueue.pl b/contrib/mailqueue.pl new file mode 100644 index 00000000..50acb831 --- /dev/null +++ b/contrib/mailqueue.pl @@ -0,0 +1,420 @@ +#!/usr/bin/perl +# This is script will connect to your isp (if not already connected), +# send any outgoing mail and retrieve any incoming mail. If this +# program made the connection, it will also break the connection +# when it is done. +# +# Bill Adams +# bill@evil.inetarena.com +# +# Revision History +# 1.0.1 05 Sep 1998 baa Massive updates to work with fetchmail. +# +# Get the latest version from my home-page: +# http://www.inetarena.com/~badams/computerstuff.html +# following the 'Stuff I Have Written' link. +# +# License: GNU, but tell me of any improvements or changes. +# +use strict; + +my $suck; +my $rdate; +my ($my_syslog, $debug, $verbose); + +my $start_time = time; +my $mailhost = 'mail'; +my $sendmail_queue_dir = '/var/spool/mqueue/'; #Need trailing slash! +my $interface = 'ppp0'; #Watch this interface +my $max_tries = 1; #How many times to try and re-dial +my $retry_delay = 300; #How long to wait to retry (in seconds) +my $connect_timeout = 45; #How long to wait for connection + +#For the log file, be sure to put the >, >>, or | depending on +# what you want it to do. I have also written a little program +# called simple_syslog that you can pipe the data to. +my $log_file = '>/dev/null'; #Where to put the data. +$log_file = '>>/var/log/mailqueue.pl'; +#$log_file = '>/dev/console'; + +my $this_hour = +[localtime()]->[2]; + +#Define this to get mail between midnight and 5 am +#$suck = '/var/spool/suck/get.news.inn'; + +#Define this to set the time to a remote server +#$rdate = '/usr/bin/rdate -s clock1.unc.edu'; + +#Where are the programs are located. You can specify the full path if needed. +my $pppd = 'pppd'; +my $fetchmail = 'fetchmail'; #'etrn.pl'; +my $sendmail = 'sendmail'; + +#Where is the etrn/fetchmail pid +my $fetchmail_pid = '/var/run/fetchmail.pid'; + + +#Set the path to where we think everything will live. +$ENV{'PATH'} = ":/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:"; +my $lockfile = "/var/run/mailqueue.lock"; #lockfile for this program +my $space = ' '; #Never know when you might need space +my $program_name = $0; +$program_name = substr ($program_name, (rindex ($program_name, '/') + 1)); +open SYSLOG, $log_file or die "Could not open $log_file\n\t"; + +sys_log ("Started by UID $<"); +#$< = 0; #suid root + +#Other global vars +my $pppd_pid; + +#Make sure we are root. This has to be the case for everything +# to work properly. +if ($< != 0) { + sys_log ("Not root...exit"); + print STDERR "You are not root...sorry cannot run.\n"; + exit (1); +} + +sub sys_log { + #Writes a message to the log file. + my ($message) = @_; + print SYSLOG join(' ', + $program_name, + ''.localtime(), #The '' puts it in a scaler context. + $message)."\n"; + print STDERR $message, "\n" if $debug; +} + +#Get the command line args. +$verbose = 1; +for (my $i = 0; $i <= $#ARGV; $i++) { + if ($ARGV[$i] eq '-v' || $ARGV[$i] eq '-verbose') { + $verbose++; + print "Running in verbose mode level ($verbose).\n"; + } elsif ($ARGV[$i] eq '-d' || $ARGV[$i] eq '-debug') { + $debug++; + $verbose = 10; #Some high value so everything gets printed + print STDERR "Running in debug mode.\n"; + } elsif ($ARGV[$i] eq '-q' || $ARGV[$i] eq '-quiet') { + $debug = 0; + $verbose = 0; + } elsif ($ARGV[$i] eq '-max_tries') { + if (not defined $ARGV[$i + 1]) { + printf STDERR "$0: Error: option -max_tries requires a value.\n"; + &usage; + } else { + $max_tries = $ARGV[$i + 1]; + } + } elsif ($ARGV[$i] eq '-retry_delay') { + if (not defined $ARGV[$i + 1]) { + printf STDERR "$0: Error: option -retry_delay requires a value.\n"; + &usage; + } else { + $max_tries = $ARGV[$i + 1]; + } + } elsif ($ARGV[$i] eq '-interface') { + if (not defined $ARGV[$i + 1]) { + printf STDERR "$0: Error: option -interface requires a value.\n"; + &usage; + } else { + $max_tries = $ARGV[$i + 1]; + } + } elsif ($ARGV[$i] eq '-mailhost') { + if (not defined $ARGV[$i + 1]) { + printf STDERR "$0: Error: option -mailhost requires a value.\n"; + &usage; + } else { + $mailhost = $ARGV[$i + 1]; + } + } else { + print STDERR "Unknown command line option: [". $ARGV[$i]."]\n"; + &usage; + } +} + + +$| = 1 if $verbose; #Output un-buffered if we are verbose + + +#Do some checking for programs +&check_program ($my_syslog) || die "$0 -> Error: $my_syslog is required\n"; +($fetchmail = &check_program ($fetchmail)) + || die "$0 -> Error: Could not find fetchmail/etrn\n"; +($pppd = &check_program ($pppd)) + || die "$0 -> Error: Could not find pppd\n"; +(-d $sendmail_queue_dir) || die "$0 -> Error: The sendmail queue directory\n\t[$sendmail_queue_dir] does not exist or is not a directory.\n"; +($sendmail = &check_program ($sendmail)) + || die "$0 -> Error: Could not find $sendmail\n"; + + +#Do some process locking. This kills any already running processes. +if (-s $lockfile) { + my $pid = `cat $lockfile`; chop $pid; + if (not &process_is_dead ($pid)) { + print STDERR "$0 -> Process locked by pid $pid killing it.\n" + if $verbose; + kill 15, $pid; + waitpid ($pid, 0); #This has no effect. + } + sys_log ("Removing stale lock for pid $pid") if $verbose; + unlink ($lockfile) || die $!; +} +open (LOCK, '>'.$lockfile) || die "$0: Could not create lockfile $lockfile\n"; +print LOCK $$, "\n"; +close LOCK; + +#print out some info if needed. +if ($debug) { + print STDERR " Max tries: $max_tries\n"; + print STDERR " Dial Retry Delay: $retry_delay seconds.\n"; + print STDERR "Interface set to watch: $interface\n"; + print STDERR " Mailhost set to watch: $mailhost\n"; + print STDERR " Connection timeout: $connect_timeout\n"; + print STDERR " Sendmail: $sendmail\n"; + print STDERR " pppd: $pppd\n"; + print STDERR " fetchmail/etrn.pl: $fetchmail\n"; + print STDERR "\n\n"; +} +((-x $pppd) && (-x $sendmail) && (-x $fetchmail)) + || die "Still some problem with programs.\n\tRun with -d to see if the path is specified for sendmail,\n\tpppd and fetchmail/etrn.pl"; + +while ($max_tries--) { + my $child_pid; + unless ($child_pid = fork) { + #This is the child process that waits for a connection to be made + # and then sends the local mail queue and then sends a request to + # get the remote mail queue + my $count = $connect_timeout; + while (&interface_is_down ($interface) && $count--) {sleep (1)} + if ($count < 1) {exit (1)} + + #Send any queued mail. I had another routine that would + # fork and watch sendmail with a timeout, but that is kinda + # flaky depending on how big your queue size is. So + # now just call it and wait for it to return. If you have bad + # messages in your queue, this can hang. + sys_log ("Have connection->sending any local mail.") if $verbose; + system("$sendmail -q"); + + sys_log ("Checking remote queue on ($mailhost)"); + + my $result; + my $daemon = 0; + my $pid; + #In case we have a pid, read it and find out if it is + # still valid or not. + if (defined $fetchmail_pid and -f $fetchmail_pid) { + if (not open PID, $fetchmail_pid) { + sys_log("Could not open $fetchmail_pid"); + die} + $pid = <PID>; + if ($pid =~ m|([0-9]+)\s+([0-9]*)|) { + $pid = $1; + $daemon = $2; + } + close PID; + sys_log("Have PID file ($fetchmail_pid) with PID $pid $daemon"); + #In the case of fetchmail, we need to see if it is + # still running in case there is a stale lock file. + if (&process_is_dead($pid)) { + sys_log(" It is no longer running"); + $daemon = 0; $pid = 0} + } + if (not $pid or ($pid and $daemon)) { + #Either it is not running or it is running and a daemon. + sys_log("Running $fetchmail [$daemon]"); + my $result = (system ($fetchmail))/256; + sys_log($fetchmail.' exited with status '.$result) if $debug; + } else { + sys_log("$fetchmail already running..."); + } + + #Watch the directory for n seconds of inactivity. + sys_log("Fetchmail done...watching $sendmail_queue_dir"); + &watch_dir ($sendmail_queue_dir, 10); + sys_log ("Done polling for mail"); + + if (-f $fetchmail_pid and not $daemon) { + #In case something went wrong and the fetchmail is still + # running (and not a daemon).... + my $result = `$fetchmail -q`; chop $result; + sys_log($result); + } + exit (0); + } + #If a connection is needed, make it. + if (&interface_is_down ($interface) && $pppd_pid == 0) { + sys_log ("Try to connect with pppd") if $debug; + # Fork pppd with a pid we can track. + unless ($pppd_pid = fork) { + exec ($pppd.' -detach'); + } + } + #Wait for the child to exit and check for errors + waitpid ($child_pid, 0); + my $child_status = ($? / 256); + my $child_kill = $? % 256; + if ($child_status == 0) { + if ($this_hour <= 4 and defined $suck) { + sys_log ("Calling suck..."); + print `$suck`; + } + if (defined $rdate) { + sys_log ("Calling rtime..."); + print `$rdate`; + } + if ($pppd_pid) { #If we ran pppd, kill it + sys_log ("Killing pppd (pid $pppd_pid)"); + kill 15, $pppd_pid; + waitpid ($pppd_pid, 0); #Wait for clean exit of child + } + sys_log ("Finished with cycle."); + unlink ($lockfile); + sys_log ("Total time: ".(time-$start_time)." seconds") if $debug; + exit (0); + } + # Reset to pppp_pid to zero if pppd is not running. + if ($pppd_pid && &process_is_dead ($pppd_pid)) {$pppd_pid = 0} + sys_log (join ('', "Warn: Did not connect -> Try ", + $max_tries, " more times...after ", + $retry_delay, " seconds")); + if (not $max_tries) { + sys_log ("Giving up..."); + exit (1); + } + sleep ($retry_delay); + sys_log ("ok...trying again."); +} + +sub check_program { + #See if a program is in the path + my ($program) = @_; + my $exists = 0; + my $path_specified = 0; + my $path; + + #catch the case where there is already a slash in the argument. + + if ($program =~ /\//) { + $path_specified = 1; + if (-x $program) {$exists = $program} + } + + my $exists; + foreach $path (split(/:/, $ENV{'PATH'})) { + next if length ($path) < 3; #skip bogus path entries + #be sure the there is a trailing slash + if (substr ($path, -1, 1) ne '/') {$path .= '/'} + #Check to see if it exists and is executable + if (-x $path.$program) {$exists = $path.$program; last} + } + if (not $exists) { + if ($path_specified) { + print STDERR "$0 -> Warn: ". $program. + " is not executable or does not exist.\n"; + } else { + print STDERR "$0 -> Warn: [$program] was not found in path\n\t". + $ENV{'PATH'}."\n"; + } + } + return ($exists); +} + + +sub process_is_dead { + #This is a cheap way to check for running processes. I could use + # the /proc file-system in Linux but that would not be very + # friendly to other OS's. + # + #return 1 if pid is not in process list + # This expects ps to return a header line and then another line if + # the process is running. Also check for zombies + my ($pid) = @_; + my @results = split (/\n/, `ps $pid 2>/dev/null`); + if (not defined $results[1]) {return 1} + if ($results[1] =~ /zombie/i) {return 1} + return 0; +} + + +sub interface_is_down { + # return 1 (true) if the ip is down + my ($interface) = @_; + if (`ifconfig $interface` =~ /UP/) { + return 0; + } else { + return 1; + } +} + +sub watch_dir { + #Watch the mailqueue directory for incoming files. + # The 'xf' files are the transfer (xfer) files on my system. + # If you find this is not the case, please email me. To be safe, + # I check the latest mod time as long as xf files exist. If no + # data has made it over in n seconds, we will assume that an + # error has occured and give up. + + my $files_like = '^(xf.*)'; #Regexp + my $dir_to_watch = shift; + my $delay = shift; + my $timeout = 120; #Give it 120 seconds to get data. + my $loop_delay = 1; #How long between each loop. Do not make 0! + + #Make sure there is a trailing slash. + if ($dir_to_watch !~ m|/$|) {$dir_to_watch .= '/'} + + #How long to wait for transfer of data. This gets reset + # each time the mod time falls below a certain time. + my $flag = $delay; + my $last_total = 0; + + while (($flag -= $loop_delay) > 0) { + sleep $loop_delay; + opendir (DIR, $dir_to_watch); + my $file_count = 0; + my $last_data_dl = 500000; #Big Number + foreach my $file (readdir (DIR)) { + next if not -f $dir_to_watch.$file; #Only files. + my @stats = stat($dir_to_watch.$file); + my $m_time = time - $stats[9]; + #Here, if we have a recent file, reset the timeout. + if ($m_time < $last_data_dl) {$last_data_dl = $m_time} + + #If we have an xfer file, up the delay. + if ($file =~ m|$files_like|) { + sys_log("$file is like $files_like"); + $flag = $delay; + } + } + closedir (DIR); + sys_log ("Watch_dir: $flag ($last_data_dl)") if $debug; + + #In the case of now data downloaded... + if ($last_data_dl > $timeout and $flag == $delay) { + sys_log("Watch_dir: Timed out after $timeout seconds."); + $flag = 0; + } + } + sys_log ("Watch_dir: Done."); +} + +sub usage { + #print the usage + print join ("\n", + 'mailqueue.pl -- A program to send and receive mail form a sendmail spooler.', + ' Requires that you ISP is running sendmail, at lease version 8.6.?.', + ' Also requires that you have fetchmail or etrn.pl installed on this system.', + '', 'Command line args (Default in parrens):', + ' -v -verbose Run in verbose mode. Can use this arg multiple times.', + ' -d -debug Run in debug mode. Sets verbose level to 10', + ' -max_tries N Sets the maximum number of connect retries to N. ('.$max_tries.')', + ' -retry_delay N Sets the delay between retrying to N seconds. ('. $retry_delay.')', + " -connect_timeout N Sets the connection timeout to N seconds. (". $connect_timeout. ')', + ' -interface STR Sets the default interface to STR. ('. $interface. ')', + ' -mailhost STR Sets the mailhost to STR. ('. $mailhost.')', + ''); + exit (1); +} + diff --git a/contrib/mold_remover.py b/contrib/mold_remover.py new file mode 100644 index 00000000..1ccba7c3 --- /dev/null +++ b/contrib/mold_remover.py @@ -0,0 +1,92 @@ +# Mold Remover +# A short python script to remove old read mail from a pop3 mailserver. +# Dovetails with fetchmail with keep option. +# Run it as a cron job... +# Version 0.1 by James Stone (stone1@btinternet.com) +# please submit bug reports and code optimisations as you see fit! + +import string +import poplib +import time + +#user editable section +mailserver=["mail.server1","mail.server2"] #list of mailservers +login=["login1","login2"] #list of logins for corresponding mailserver +password=["pass1","pass2"] #list of passwords (note: chmod 700 for this script) +days=2 #number of days to keep on server. +localuidlcache="/var/mail/.fetchmail-UIDL-cache" #fetchmail's UIDL cache +localuidldate="/var/mail/.UIDLDate" #mold remover's UIDL datefile +#end of user editable section + +readfile=open(localuidlcache, 'r') +datefile=open(localuidldate, 'a+') +tempfile=open("/tmp/uidltmp", 'w+') +popuidllist=[] #list of undeleted uidls on all servers +totnum=0 #number of undeleted messages on all servers +connectedto=-1 + +#connect to each mailserver get all the new message UIDLs and delete any +#expired messages. + +for a in range(len(mailserver)): + connect=poplib.POP3(mailserver[a]) + connect.user(login[a]) + connect.pass_(password[a]) + connectedto=a + number,size=connect.stat() + totnum+=number + for mesnum in range(number): + messagedeleted=0 + datefile.seek(0) + for uidldate in datefile: + uidldatesplit=uidldate.split(' ') + if(connectedto==int(uidldatesplit[2])): + if (time.time()-float(uidldatesplit[1]))>(86400*days): + try: + recheckuidl=connect.uidl(mesnum+1) + recheckuidlsplit=recheckuidl.split(' ') + if (recheckuidlsplit[2]==uidldatesplit[0]): + print('deleting'+recheckuidlsplit[1]) + print(connect.dele(recheckuidlsplit[1])) + messagedeleted=1 + totnum-=1 + except poplib.error_proto: + pass #skip over messages that have already been deleted. + if not(messagedeleted): + popuidllist.append(connect.uidl(mesnum+1)+' '+str(a)) + connect.quit() + + +#get rid of lines in uidldate file corresponding to the messages that have been +#expired (and hopefully been deleted) + +datefile.seek(0) +for uidldate in datefile: + uidldatesplit=uidldate.split(' ') + if not(time.time()-float(uidldatesplit[1]))>(86400*days): + tempfile.write(uidldate) +datefile.close() +datefile=open(localuidldate,'w+') +tempfile.seek(0) +for line in tempfile: + datefile.write(line) +datefile.close() +datefile=open(localuidldate,'a+') + +#add date to uidl for any messages still on the server which have been read +#(check in readfile) and store in local datefile. + +for mesnum in range(totnum): + popuidl=popuidllist[mesnum] + popuidlsplit=popuidl.split(' ') + readfile.seek(0) + for localuidl in readfile: + if(localuidl.find(popuidlsplit[2])<>-1): + foundindatefile=0 + datefile.seek(0) + for stored in datefile: + if (stored.find(popuidlsplit[2])<>-1): + foundindatefile=1 + if not(foundindatefile): + datefile.write(popuidlsplit[2]+' '+str(time.time())+' ' + +popuidlsplit[3]+'\n') diff --git a/contrib/multidrop b/contrib/multidrop new file mode 100644 index 00000000..37f87b4c --- /dev/null +++ b/contrib/multidrop @@ -0,0 +1,236 @@ +From mlievaart@orion.nl Mon Jan 10 10:46:33 2000 +From: Martijn Lievaart <mlievaart@orion.nl> +To: Eric S. Raymond <esr@thyrsus.com> +Date: zondag 9 januari 2000 0:38 +Subject: Re: Thanks for fetchmail and a solution to the multidrop problem (I +Status: O +Content-Length: 8086 +Lines: 226 + +think) + +Hello Eric, + +Let me first state that I'm no sendmail nor unix guru, so although this +seems to work, I certainly would not say this is the "best" solution. In +fact I would welcome all comments to make this better. In particular, it +seems that that the mailertable feature was made just for this, but I'm +still studying that. + +Also, This mail will have lines wrapped. I will put up this on a website +asap, so people can download the relevant portions. In the meantime, I'm +using (stuck on) Outlook, so I won't even attempt to format this mail. +Accept my apoligies and try to mentally reconnect the lines. + +Finally, this mail is a bit lengthy, but I guess it is better to get all +information in, so please bear with me. + +After some very frustrating attempts to get multidrop to work reliably, it +suddenly hit me. When sendmail has translated the recipient to the mailbox, +the recipient is gone (in the cases we're talking about). So the solution is +not to let sendmail do this translation (completely). + +The trick is to let a custom MDA be called with both the mailbox and the +full recipient name. This MDA then just stuffs it in the correct mailbox +after adding the appropriate headers. Luckily I hit on the formail utility. +It reformats a mailmessage and does just what I wanted. Specifically my +script uses it to: +- add a custom header (default: "Delivered-To:") with the recipient +- rewrite the message-ID, so fetchmail will download the same message +multiple times. +- add another header, just for fun. + +The rewriting of the message-ID is needed because fetchmail will suppress +multiple messages with the same ID, normally a good idea, but now it gets in +the way. A switch on fetchmail to suppress this behaviour would be great. + +At first I hardcoded the domains in the sendmail.cf, but I quickly set out +to do one better and came up with the following solution. In sendmail.cf, +add the following line somewhere at the top. + +Kmultidroptable hash -o /etc/mail/multidroptable + +this defines a table for all domains we want to use multidrop for. The +format of this file is multiple lines of the format: +<domain> <mailbox> + +e.g: +mailtest.orion.nl mailtest +mailtest2.orion.nl mailtest +mailtest3.orion.nl mailtest +bvh-communicatie.nl b.bvh +krakatau.nl b.bvh +personeelzaak.nl b.bvh +maslowassociates.nl b.bvh +rtij.nl rtij + +Of course, create a .db file with makemap. Also, the domains must be added +to class w, so they should be added to your sendmail.cw or RelayTo file, or +whatever you use. + +Now add to sendmail.cf: + +R$+ < @ $* . > $: <MULTIDROP> $(multidroptable $2 +$: <NO> $) <?> $1 < @ $2 . > +R<MULTIDROP> <NO> <?> $* $: $1 +R<MULTIDROP> $+ <?> $+ < @ $* . > $#drop $@ $2 @ $3 $: $1 + +These lines should be above the existing lines that read: + +# short circuit local delivery so forwarded email works +R$=L < @ $=w . > $#local $: @ $1 special local names +R$+ < @ $=w . > $#local $: $1 regular local name + +This works as follows (in fact these comments are above my modification in +our sendmail.cf). +# +# MLI. Any drop host gets passed to the drop script +# +# The first rule looks up the domain in the multidrop table. +# The input at this point is always: +# user@<dom.ain.> +# If found, the resulting line looks like this: +# <MULTIDROP> mailbox <?> user@<dom.ain.> +# if not found, the resulting line will be: +# <MULTIDROP> <NO> <?> user@<dom.ain.> +# The second line restores the "not found" case back to user@<dom.ain.> +# So if this domain was found in the multidroptable, we still have a line +starting with <MULTIDROP> +# as shown above. The third line hands this to the drop script. +# +# Note that the user ($:) is the mailbox this message should be stuffed in, +the host ($@) is the full +# user@<dom.ain>. This is how the dropscript expects it. +# + +I guess sendmail guru's are now laughing their pants off, and I hope someone +will show me a better way to achieve this. For now, it works. + +Next, we need to define mailer drop (somewhere in the sendmail.cf) + +# +# multidrop pop3 support. +# + +Mdrop, P=/usr/local/bin/dropmail, F=lFS, + T=X-Unix, + A=dropmail $u $h + +The S flag here is crucial, otherwise the dropmail script won't run as root, +and under linux (==bash) suid scripts are not permited. I gather most unices +now disalow suid scripts, so this would be necessary on most unices. There +probably are other flags that would make this better, but this works, so I +decided to divert my attention to other tasks at hand (busy, busy, busy.... +;^>). + +Now we only need the dropmail script, /usr/local/bin/dropmail, mode 700. It +looks big, but effectively one pipeline does the real work. The rest is +configuration, error checking and locking the mailbox. + +#!/bin/bash + +# +# Script to force a mail message in a format that fetchmail will recognise. +# use as a MDA from sendmail. Must be executed with F=S. +# + +# +# Configuration: +# +maildir=/var/spool/mail +envelope=Delivered-To: + +# +# set PATH to a known value to avoid some security issues +# +export PATH=/bin:/usr/bin + +# +# +# +to=$2 +user=$1 +mbox=$maildir/$user + +# +# If the mailbox does not exist, create it. Note that we act pretty +paranoid, this is hopefully +# resistant to symlink attacks +# +if [ ! -f $mbox ] +then + oldumask=`umask` + umask 077 + touch $mbox + chmod 660 $mbox || exit 1 + chown $user $mbox || exit 1 + chgrp mail $mbox || exit 1 + umask $oldumask +fi + +# First lock the mailbox, if this doesn't succeed in 64 seconds, give up and +send +# mail to postmaster. +# If this period is to short, increase the retries (-r flag to lockfile) +# +# Then run the message through formail to get it into the right mailbox +format with the +# right headers added. +# +# Delivered-To will make fetchmail propagate this mail to the correct user +when +# run with '-E "Delivered-To"'. Set this in the advanced settings of the +TeamInternet f.i. +# (if you changed the envelope at the start of this script, adapt this +accordingly) +# +# We also muck up the messageid, so fetchmail will never skip a message on +the basis of +# duplicate messageIDs. The -i "Message-ID" will rename the old message ID, +the -a will +# add a new one. +# +# Lastly, we add a header indicating which host did the rewriting. +# + +if lockfile -r 8 $mbox.lock >/dev/null 2>&1 +then + cat - | formail -i "$envelope <$to>" -i "Message-ID:" -a +"Message-ID:" -i "X-Multidrop-Processing: <`hostname`>" >>$mbox + rm -f $mbox.lock +else + (echo "Subject: Cannot lock mailbox for $user" & cat -) | +/usr/lib/sendmail postmaster +fi + +# +# EOF +# + +This obviously is very Linux (even RedHat?) dependant, locking mailboxes, +creating mailboxes with the right permissions, probably even bash dependent. +I would say that it should be fairly easy to port to other systems, but +alas, my unix knowledge is lacking for that. I'll also rewrite it someday, +a.o. that umask handling can be done much better and the location of the +sendmail binairy should not be fixed. + +Now the only thing left to do is to retrieve the mail with fetchmail, using +'envelope "Delivered-To:"' in the poll line. The above script has added this +line, so this is all that fetchmail needs. + +All parts of this solution need carefull examination. In particular I think +the new rule lines may not catch all cases, although they worked for +everything I threw at them and work satisfactorily in production. I'm also +wondering if there is a more standard way to drop something in a mailbox. I +yet have to investigate procmail, but all other MDA's mucked with the +message and effectively undid my carefully added header. I'll experiment +some more and rethink it all as I learn more. + +I'm still wondering, if I can get formail to include another received +line.... "Received from localhost by dropmail for <user>...." to make it +work without the envelope flag. Well I'll have to experiment. Do you know if +there is a header I can add so fetchmail works out-of-the-box? + +Regards, +Martijn Lievaart + diff --git a/contrib/novell b/contrib/novell new file mode 100644 index 00000000..1e549aed --- /dev/null +++ b/contrib/novell @@ -0,0 +1,57 @@ +From newcombe@mordor.clayton.edu Thu Jun 12 15:56:44 1997 +Return-Path: <newcombe@mordor.clayton.edu> +Received: from imap.ccil.org (snark [10.0.2.15]) + by snark.thyrsus.com (8.8.5/8.8.5) with ESMTP id PAA11433 + for <esr>; Thu, 12 Jun 1997 15:56:43 -0400 +Received: from thrush.clayton.edu (thrush.clayton.edu [168.28.242.117]) + by locke.ccil.org (8.8.5/8.8.5) with ESMTP id LAA17702 + for <esr@snark.thyrsus.com>; Thu, 12 Jun 1997 11:29:02 -0400 (EDT) +Received: from mordor.clayton.edu (root@mordor.clayton.edu [168.28.241.16]) by thrush.clayton.edu (8.8.5/8.7.6) with SMTP id LAA22880 for <esr@snark.thyrsus.com>; Thu, 12 Jun 1997 11:11:51 -0400 (EDT) +Date: Thu, 12 Jun 1997 11:28:05 -0400 (EDT) +From: Dan Newcombe <newcombe@mordor.clayton.edu> +X-Sender: root@mordor.clayton.edu +Reply-To: newcombe@mordor.clayton.edu +To: esr@snark.thyrsus.com +Subject: Novell Procmail recipie/problem +Message-ID: <Pine.LNX.3.96.970612112225.14988A-100000@mordor.clayton.edu> +MIME-Version: 1.0 +Content-Type: TEXT/PLAIN; charset=US-ASCII +Status: RO + +Eric, + + As per your request, here is my recipie for dealing with e-mail popped +off of a Novell server and told to be domanified. +And example of the problem I used to have when I popped mail off of +aa.clayton.edu From: User <AA/USER@aa.clayton.edu> +Sendmail did not like that. Now it converts the above to +From: User <USER@AA.clayton.edu> + +However, the To: and CC: lines still can get messed up +To: aa/user2,@aa.clayton.edu aa/newcombe + +I'm not going to worry about that!!! + +I fixed it with this recipie in my .procmailrc +:0 +* ^From:.*<.*/.*@ +{ +:0 fhw +|sed -e 's/^From:\(.*\)<\(.*\)\/\(.*\)@.*/From:\1<\3@\2.clayton.edu>/' +} + +It may not be the best, prettiest, or most efficient, but it works. + +Also, you'd asked me to send you the sometimes error message I get +from fetchmail. I don't see one in my Mail/From file, so it must not +have happened for a while. It looked something like +Subject: Cron <root@mordor> /usr/local/bin/fetchmail: 29483 + +Hope your flight back was good. + -Dan + +-- +Dan Newcombe newcombe@mordor.clayton.edu +"The fool who escaped from paradise will look over his shoulders and cry...So +I'll hold my peace forever when you wear your bridal gown." -Marillion + diff --git a/contrib/poptest b/contrib/poptest new file mode 100644 index 00000000..3f74cffa --- /dev/null +++ b/contrib/poptest @@ -0,0 +1,84 @@ +#!/usr/bin/perl +# Copyright 2000 john Summerfield ,summer@os2.ami.com.au> +# Your choice of licence: GPL 2 or later, or same licence as Perl. +# +# Warranty? None +# If it breaks? The pieces are yours +# If it breaks something? You drove it. +# Bugs? At least one. + +# now we've cleared the air; +# This supposed to allow one to talk pop-3 to a mail server. If you're lucky (and know how) +# you might also be able to talk a few other Internet protocols with it. +# Typically, it's run thus: +# pop2test.1 <mailserver> [<mailport>] +# mailport's optional; default is 110 (pop-3). +# +# Having started, you type away much as you would with telnet. +# +# +# +# It has this great advantage over telnet: it reads its input from stdin and writes to stdout; +# you can prepare the entire sequence in a file, then run it this: +# pop2test.1 <thefileyoujustcreated >theresultsyouwanttoperuse host port +# +# +# uses: +# 1 Debugging POP3 (and maybe imap does anyone know?) mail problems +# 2 Deleting the occasional piece of mail that's too big or stuffs fetchmail. +# 3 Talking to sendmail +# +use Socket; +sub hx; +sub getreply; +$timeout=1; +$RemoteHost = $ARGV[0];shift; +$RemotePort = $ARGV[0] || 110;shift; +($PRname,$PRaliases,$PRport,$PRproto) = getservbyname($RemotePort,'tcp'); +$PRport=$RemotePort unless $PRport; +$proto=getprotobyname($PRproto); +$RemoteIP = inet_aton $RemoteHost or die "Can't resolve $RemoteHost"; +$that = pack 'Sna4x8',AF_INET, $PRport, $RemoteIP; +socket(REMOTESITE,AF_INET,SOCK_STREAM,$proto) + or die "Can't create socket to $RemoteHost: $!\n";; +connect(REMOTESITE, $that) or die "Can't connect: $!\n"; +select(REMOTESITE);$|=1;select STDOUT; +$rin = $win = $ein = ''; +vec($rin,fileno(REMOTESITE),1) = 1; +#vec($win,fileno(REMOTESITE),1) = 1; +$ein = $rin | $win; +getreply; +while ($L=<STDIN>) +{ + chomp $L; + print REMOTESITE $L . "\r\n"; + print "send: " . $L . "\n"; + getreply; +} +print REMOTESITE "Quit\r\n"; +getreply; +#print <REMOTESITE>; +close REMOTESITE; +exit; +# P +sub hx +{ + $N=$_[0];shift; + $S=$_[0];shift; + return "$N(" . unpack("h", $S) . ") "; +} +sub getreply +{ + while ('x') + { + ($nfound,$timeleft) = select($rout=$rin, undef, $eout=$ein, $timeout); + last if $nfound == 0; +# print "nf($nfound) tl($timeleft) " . hx("rin",$rin) . hx("rout", $rout) . hx("ein",$ein) . hx("eout",$eout) . "\n"; + $Reply= <REMOTESITE>; + print "recv: " . $Reply; + last if $Reply eq ''; + $Reply =~ s/[\r\n]*//; + last if $Reply eq '.'; + } +} + diff --git a/contrib/preauth-harness b/contrib/preauth-harness new file mode 100755 index 00000000..0bd0d842 --- /dev/null +++ b/contrib/preauth-harness @@ -0,0 +1,53 @@ +#!/usr/bin/perl + +BEGIN { $SIG{'__WARN__'} = sub {};}; + +$hostname = "criens.u-psud.fr"; +$username = "p99dreyf"; +$passwd = "xxxxxxxx"; +$command = "exec ~/bin/imapd"; + +use Net::Telnet (); +$host = new Net::Telnet (Timeout => 10, + Port => 23, + Prompt => '/p99dreyf>\s?$/', + Cmd_remove_mode => 1); + +$host->option_accept(Dont => &Net::Telnet::TELOPT_ECHO, + Wont => &Net::Telnet::TELOPT_ECHO); + open (FILE,">log"); +$host->dump_log("log2"); +$host->input_log("log3"); +## Issue some commands. +$host->open($hostname); +#$host->login($username, $passwd); +$host->waitfor('/login:\s?$/'); +$host->print("$username"); +$host->waitfor('/Password:\s?$/'); +$host->print("$passwd"); +$host->waitfor('/p99dreyf>\s?$/'); + +$host->print("$command"); +$strip=1; +while ($strip) { + $greeting=$host->getline(); + if ($greeting=~/^\* PREAUTH.*$/) { print "$greeting"; $strip=0;}; +} + do { + do { + $cmd=<STDIN>; + chop $cmd; + } while ($cmd !~/[A-Za-z0-9]/); + $host->print("$cmd"); + print FILE ">>$cmd<<\n"; + do { + $line=$host->getline(); + chop($line); + print "$line\n"; + print FILE "<<$line<<\n"; + } while (($line!~/^[A-Za-z0-9]+ (OK|BAD|Expunge).*$/) && + ($line!~/^\* BAD.*$/)); + print FILE "--next cmd\n"; + } while ($line!~/^[A-Za-z0-9]+ OK LOGOUT.*$/); + +exit; diff --git a/contrib/redhat_rc b/contrib/redhat_rc new file mode 100644 index 00000000..d94f95c8 --- /dev/null +++ b/contrib/redhat_rc @@ -0,0 +1,60 @@ +#!/bin/sh +# +# fetchmail This shell script takes care of starting and stopping +# fetchmail. +# +# chkconfig: 2345 81 45 +# description: The Fetchmail daemons allows to retrieve mail using various +# mail protocols and route them to the local MTA just as if +# the mail was sent directly to the local MTA. This is +# specially useful on intermittent dial-up connections. +# processname: fetchmail +# config: /etc/fetchmailrc +# author[s]: +# Andrea Sterbini <a.sterbini@itelcad.it> +# ObiTuarY <obituary@freshmeat.net> + +. /etc/rc.d/init.d/functions + +# Source networking configuration. +. /etc/sysconfig/network + +# Check that networking is up. +if [ ${NETWORKING} = "no" ] +then + exit 0 +fi + +# See how we were called. +case "$1" in + start) + if [ -s /etc/fetchmailrc ]; then + echo -n "Loading fetchmail: " + daemon /usr/bin/fetchmail -f /etc/fetchmailrc + echo + touch /var/lock/subsys/fetchmail + else + exit 1 + fi + ;; + stop) + echo -n "Shutting down fetchmail: " + /usr/bin/fetchmail -q >/dev/null 2>&1 && echo fetchmail +# killproc fetchmail + rm -f /var/lock/subsys/fetchmail + ;; + status) + status fetchmail + ;; + restart|reload) + $0 stop + $0 start + ;; + *) + echo "Usage: fetchmail {start|stop|status|restart|reload}" + exit 1 +esac + +exit 0 + +# === End of File === diff --git a/contrib/runfetchmail b/contrib/runfetchmail new file mode 100644 index 00000000..2b40f511 --- /dev/null +++ b/contrib/runfetchmail @@ -0,0 +1,182 @@ +#!/bin/sh +# Runfetchmail 1.1 +# +# Copyright (c) 1997 Doug Muth, Wescosville, Pennsylvania USA +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Please send bug reports, suggestions, and flames to: dmuth@ot.com +# +# This shell script is used as a "frontend" for running fetchmail. It will +# start up fetchmail and save the session to disk, generate statistics +# of the e-mail that you downloaded, and tell you how many messages +# you have in various folders. A copy of these results are also +# e-mailed to you. +# +# An rc file is also supported. If the file $HOME/.runfetchmailrc +# exists, it will be sourced. This way, you can place runfetchmail +# into /usr/local/bin, and individual users can have their own settings. +# +# Pre-requisites: You must have procmail, or at least `mailstat', a +# utility that comes with procmail, running on your system. You must +# also have `timer', a shell script written by me, if you would like the +# total time that the transfer took to be displayed. +# +# Syntax: runfetchmail [-every] +# -every Downloads all messages from the mailserver, regardless of +# their size and whether they have been previously downloaded. +# +# Changes in version 1.1: The argument "-every" is supported. I removed the +# $EXIT_CODE variable since I had problems assigning the exit code from +# fetchmail to it. + +# Command line to run fetchmail +FETCHMAIL="/usr/local/bin/fetchmail" + +# Your procmail logfile +LOG=$HOME/procmail/log + +# Do we want to use timer? Set to 0 to disable. +TIMER=1 + +# Our path to sendmail with parameters +SENDMAIL="/usr/bin/sendmail -oi -t" + +# Who am I? +SELF="dmuth@ot.com" + +# The folders that I should check for the number of messages +FOLDERS="$MAIL $HOME/mail/lists" + +# Number of seconds to "sleep" for while procmail finishes up, increase +# this if you have a really slow system +LATENT=10 + +# Do we want to use mailstat? Set to 0 to disable +MAILSTAT=1 + +# Do we want to e-mail the output to myself? Set to 0 to disable. +# I strongly suggest doing this so that if you lose your connection to +# the net part of the way through a download, you can see how much +# progess was made +E_MAIL=1 + +### +# End of user defined variables +### + +# The temp file, and ensure my privacy! +TMP=/tmp/fetchmail.sh.$$ + +# The version of this program +VERSION="Runfetchmail 1.1" + +# Trap errors +trap "rm -f $TMP; echo ""Exiting at user request"" ; \ +test $TIMER -eq 1 && timer -stop -id $$ >/dev/null; exit 1" \ +2 3 4 15 + +# Source the user's rc file if it exists +test -e $HOME/.runfetchmailrc && . $HOME/.runfetchmailrc + +num_mail() +{ # This procedure tells me how many messages there are in each folder +for D in $* +do + if test -f $D + then + echo "There are `frm $D |wc -l` messages in $D" + fi +done +} + +getmail() +{ # Fetch the mail! + +test $TIMER -eq 1 && timer -start -id $$ -quiet + +$FETCHMAIL $@ + +# pause for a short while +echo "Now sleeping for $LATENT seconds..." +echo -n "Zzz...Zzz...Zzz..." +sleep $LATENT +echo "wakeup time! <yawn>" +} + +stats() +{ # Prepare the statistics + +# Ensure we have a log file +test ! -e $LOG && touch $LOG + +echo -e "\n\t\t\t $VERSION Statistics" +test $MAILSTAT -eq 1 && mailstat -k <$LOG +echo "" +num_mail $FOLDERS +test $TIMER -eq 1 && echo -e "\n`timer -stop -id $$ -quiet` have elapsed." +} + +prepmail() +{ # Let's prepare our e-mail +cat <<EOF >$TMP +From: $LOGNAME ($VERSION) +To: $LOGNAME +X-Loop: $SELF +Subject: Mail stats from `date "+%D %X"` + +EOF +} + +### Main Program + +# Let's have some initial cleanup +rm -f $LOG +clear + +# Create and secure the temporary file +test $E_MAIL -eq 1 && { cat /dev/null >$TMP; chmod 600 $TMP } + +# Prepare the e-mail before the logs are added to it +test $E_MAIL -eq 1 && prepmail + +# See if we are downloading every message or not +if test "$1" = "-every" +then + FETCHMAIL="$FETCHMAIL -a -l 0" + shift +fi + +# Fetch the mail and have the output written to stdout and (optionally) $TMP +test $E_MAIL -eq 1 && getmail $@ 2>&1 |tee -a $TMP || getmail $@ + +clear + +# Do the same thing with the statistics +test $E_MAIL -eq 1 && stats $@ 2>&1 |tee -a $TMP || stats $@ + +# Now send $TMP to myself and clean up the mess +test $E_MAIL -eq 1 && { cat $TMP |$SENDMAIL; rm -f $TMP } + +# cleanup the log file for next time +rm -f $LOG + +# The End + diff --git a/contrib/sm-hybrid b/contrib/sm-hybrid new file mode 100644 index 00000000..ceecfeee --- /dev/null +++ b/contrib/sm-hybrid @@ -0,0 +1,539 @@ +From: Peter 'Rattacresh' Backes <rtc@helen.PLASMA.Xg8.DE> +Subject: Sendmail-8.11.0+hybrid + +Hello, + +This is the hybrid patch against sendmail-8.11.0. To make the binary +RPMs, type: + +cd /usr/src +tar xzvf /path/to/sendmail+hybrid.tgz +cd redhat/SOURCES +wget ftp://your.favourite.mirror/path/to/sendmail.8.11.0.tar.gz +cd ../SPECS +rpm -bb sendmail.spec + +This patch includes MySQL support so you need the libraries to +compile. If you don't have them you need to change two lines in +sendmail.spec before running rpm: + + Change +Patch8: sendmail-8.11.0-mysqlmap.patch + to +#Patch8: sendmail-8.11.0-mysqlmap.patch + and +%patch8 -p1 -b .mysqlmap + to +#%patch8 -p1 -b .mysqlmap + +---------------------------------------------------------------- +begin 644 sendmail+hybrid.tgz +M'XL(`$&=TCD``^Q<2W,;5W9NVR,[Z'%2D\K#=L6+:Q()`1MLXD&`,J*A"0(M +M$1%(8/"0K,@JJH%N$#UL=,/]($3/3%:I2K+/(E5)JF:732K99)-=%EDF55G, +M#YA]*KLLLL@BW[FW&VB0!"6-1/H1=GF&W?=QSKGGG'M>]T*NH8\T?T.ZRB>; +MW<QN%8OXRY^S?\7[5K:XE=\JY0MY*9O+EK8V)5:\4JK")_!\S65,<AW'OVR< +M=^I=!SG7_;A"_KN]>J-V55KP8O+/E3:+N>(FEW^N6,C>R/\ZGE#^[=9^Y\J, +MP`O*?[-8+.7RI2S)'ZIP(__K>.+R-PNW2U>A!"^S_XNY3<@_G]N\L?_7\L3E +M;SN:.QB]?@UX0?D7"WGL_WR!Y`]MN)'_=3P+^[_T=>[_>/R7S]W8_^MY0OEW +MFKUV5;VB$.`E['\I7^3RS^:*-_*_CN>,_#7+U#SC-:\4^5RV!(>^1/ZY0@%] +MI=)6,8?_2CF)6DJ0?_;UDG'Q\_]<_JOR:F(GM9H.!9^XK>19:M=PCPW+.$VS +MPD9QX]--&:,8JX@AS+29/S(]-C0M@TU-RV('S2[K&\QX-M%LW=#%"(.-#$TW +M7#9TG3'-W]=,*\/Z@<\>UAL-FG!B>F8?0)P3#+,-?^JXQQYSQ!2VT3?MC3$F +M*80_L3U[$ET`G[C.D:N-V8IM3$/B5]@8TB3`;F`S;>@;+I]']*D,\^9DXV\P +MT34?Q`Z!3[-/V6"DV4=8GN\L(O-&SA3+<9W@:(1.YAFV'E&%9>UJGCE@T`[? +M&+.0$+:^3@SP#+;?ZW#63%Q\V;XB[U?J#;6]7JNH^\V#<F+B>/Y8\XC2^6LY +M0<I(P.\9MN%J%L,N-5UCX)N.[7&")YX1Z`[3!@,GL'U/D<&K<D+,TS5C[,R^ +MCK2QX44?IGWDSK]LI^_HI]&76$+TY3N.&[T'P6`2O8.HAX9EK1_;SM2.UJO( +M8\W6CF:4Z\%X8LRF.WC7?">V+-_5)DPW!HYN$$<'FC\8@:^#P#7]4Z;YOC8X +M]F0Q((:X9;B>8[/I"$(8.8&ELR/#9]2[YC$2B;Q*'Y@Q1B`KRU_WWOHV/&?L +M_V!D#(X56,37B>-2^Y\KBO=%^U_*YF[L_W4\;;52VU<5+O>KPL$8@_@9_<T7 +MLO07@N9_Z4&JCP^,R.9+6:0`>1J>0TC`KHJ>FV?^=&<N<>#8OF;"OWC&"7<Z +M*WN5ZOT5X6\BI\=N*[?)9+O&C^&.F+%.C9[,_;4WT<9CF&AX4YW&P.>=P.?Q +M4$#K!_"&SI"=.H$+6ST8F39:,588;M>PM%-%EBLV11$6O`GY.G@&F[SG$$Y. +MAU\HRW=Z[4:9C7Q_4M[8F$ZGBFF#O#%&'RN!;:X?FX:EZ,;&[V^I`VW#(-BA +M31OY8XMMRS+%#K0PH':-LLP[#[D_'V\F4D2EAE!DBH`$7/!`1#HV)H]!L<_" +M_-,=3'P.07?L-9\1'!YM4&0Q=ESCHW1L8.%YN&C0YB+P8NR3,VOQDY-"$M"= +ML1>]DS3H'9@.S4GT9E-$$'WPR;Y#GS+)#4PAXG62S="Q+&?JE>6<EF;S53.B +MW&.0$N(\4AVA(F/RX@@PTF69^)N*"$C//XFVM+SK^`BDM&.LWF;.A`0-;=/< +MHV!,ZI(B?>$:"1T"IK3"9:8;0RVP?-[#5\!)M4R/8KB^`4*A/AS3G-*T+.?Z +M<=+S(>V(_+0^C]0NHCPVGB`,XA`*(00HV]`$Y@@2`F&L*BZ0YX`N`'1^QE<N +M\'",D%9Z_L&7&_L.999>6"^'0##[<9@LY2!,"K4KP]4R/OR5,:;%AAJ:+@)O +MQS8H#CME(^V$5'NB(4`W$-"2)"$_VO(D7().MB`F:+DOU`XRS`_B"RB^,HG% +M*Z!1+J3CLLXL")ZPD4(@F0$ZZY29W.S-,5*TF_(,LHK(?!A,6IJ2'IA6I02! +MN5!G'Q1!\>-+(=AIV7'/-9(FR1T'])*AB=M/;%W:NW)=$##5R!H[,2T8\Y0, +MB01?)M_N4-8R:P6^_)Q=?'ZKP1IPZZZ,!YQE"H%AFJXCY:`M`VY.YZG#S%ND +MA!.9#\S(P$">*!TEDMH$V=[$-9&OA0;G<6@.GI1GAB[Q>,/P!SQAW.B(MB>) +MR"02N+,#:J(9@\A*7,ZD_.5<6K`8C[E/'9%SLSSG0B.7X:`BDX;11R9<96C& +MGEP7*V>V*\;-'P?V<>*QWD?Z/6,6M1&7^"[BWA8DBZ&*@,_^J'=P/Y+$3H@^ +MZNNT*OO[:ENNN@9AY2N/,*>0.&(['L-33V8T#D8.XHT0%79;JU-FCR`:B@8T +M),$G$1@*,%Q`J;>8Y3C'P42$'B-#/D%FJE,RR243;>2[[>9^Q!S6/Y7%?D\] +M/:RW#AO-YOU>ZW`MDTOKMC7OJAUT'E0:]=JL!Y,GE(J?&!9%+"VB+NYAB(2X +MOPBW_4H?2:V.K'J%M`N)NS%!SDV[=BY6\B$.!,VG0\6(Z+'"N#Z%H5"T?IT/ +M+L_IK%2K:JM[V&GNJX=K:;D6N4N8DP6.0W*,Q+ONQ"0<DJ/:OFN2?:0R"J?; +M#T5>IF!A)ME$\WZH6/3&7:3,B:2`AYUH4"]L(C!]80--1X8K(+;W.I%(('>9 +MBC$4<E!Q!:PUAZ>T:0S7!>V\1I":CDS83(SC]I0/%KHB^\8S/\UY/IM"3<KE +MV[GPHMNY\)W9SNO:#FW2\]LZ%;HG'H[:B,W@"V>@PNW.2V2BB^C/\"W+O`#R +MQ%0YDAI1))@S0_=1^E*[L:*2R-:K)&7QVH7T5I:9DF7#?V73HC[3QA.+\H#3 +MON&"EV-'&2"762ENY5C'<5WX=O(5F*!GF.V$&8\H4'*9PMD.#&5%'B&R.-WQ +MIH;A8PO-@>Q1>X;&KKED!\*59=@1=&F*.'[E&V[@\I<%$!1@7;27:E`(R`A; +MGBL-*0DF1W.%)(AN,D^6,\!>"G-"(IN6:P=C"(1%<1]I(-;#H[)8^*>P`\@_ +M0[7$,^@$K6+'$E6,ATH4Q47I[0PA5`,L,[G:^K02J`@'(:PB94*"Q-3`TL#7 +M*0*SFC%!1DPFV@GWMF=8HD";81-L;F[99_$C19[^R#6BU-.T0<B"2<@(&V9! +M([P9CX".1ZS*R\;`%<NZ^@PKRCC(EIVU15#/(#HJ"&.V<IB&)N)Q6(,86V_! +M#,W6<Z[[@%K#$>$*XV/:U-1U>!CWZ:=;Z]G">JY4CJ<Y?%_!M`JK%18B!#&< +MZ_.D6*[[4!2^I;T8A`(YK]`#>3Z=>&@G0*W1V87)9>R28Y4U.I5`XUAD@SR/ +M,*91^D5Y`Y*;>$Z_Q&%RJC/0(0X"]MYW`U'\ET7*`%;##PI_ZC@@>Z["&6;Z +MPENQIU'(L5:F1KX//+$12'-I<\AD*G528L)DV-CSSL00YBVR(RGAS2!+.KS@ +M-J:<YJSBF3!5<"8LQ:&G2:-HN##%PED)S8Y\F"PX22E8(/:9RTM`V$`N'0-Q +MRL-RT(+C8)Y)IGHA$`G]0H(CET,7%36&K958CD?FYEQZ&(569V(02%,WAT/P +M&**A)?JGX$QHKX2Q&&EVW/.798YQYF\KC4;SH5J+QUG4_^3J7&Z$D;QNX5*[ +M+=+6YP=!8=IY94$0S9F9^Z61D/SZLY>:\KGR2/EC()>K]$HON\KG]*="_Y<: +M!E8\]&+"^%<S;#=#PJG0@26,[Z\<>A0NRSE%8O_"`KK*,/6J)/3-"4@C51#1 +M)<\?5D*E6&@B]5AHJ"Q^7KG*1#D6]7D4"LVF:V$*108NGN:`WP@A9MYH%N=` +MBG.9`G+5L0=60%ZJ+,O[<5ZRP-8QQB<C/AV!8]1&1\_XIE??X+$-]XS!<"CW +MC:$3S:1TDP(8QAVC+GQ8%'A])->9*)8?!3#0MF\8T5F\3R73CZ+=(1)H^Q0D +M'1T!&_E!\-89DT[CS;!AAP>&^)+A(H@AE@&C;3#24EJ>I04>JW@>N&PG[@RT +MG8O/#;;E!H5<XFI`F8EXXO9Z;DO^KN9_(X0(&PN'(*__C.GR\S^VF=_,B_._ +MS5)I:[.`IJW-7.'F_.\Z'AV:ZOJI]5R:7_*I.I-3USP:(4D8I$G_2VQA[[#+ +M]@X!0"3JC1S7+_.M2Y$5;`79#<JZYLXNM$BF)RX$"3O0M\BFC6$9"%)WK]YA +MG>;=[L-*6V5X;[6;#^HU1#>[C]"ILDJON]=LL\I!C56;!]UV?;?7;;8[[.G3 +M2@?CU]:H"X`J!X^8^GFKK78Z#./K^ZU&'5``METYZ-;53H;5#ZJ-7JU^<`^F +MNM?E]YD:]?UZ%\.ZS0QAHZ6=F\B:=]F^VJ[NX;.R6V_4NX\X.7?KW0/"=I?( +M8ZU*NUNO]AJ5-FOUVJUFAX#1FFKU3K51J>^K-86!!*!EZ@/UH,LZ>PCDXFO$ +M?PM+W%5!7V6W09`X$BRQ5F^KU2ZM9?Y6!;]`6B/#.BVU6J<7]7,5ZZBT'V5" +MJ!WU1ST,0B>`U2K[E7M86.HY'($LJKVVND_4@@F=WFZG6^_VNBJ[UVS6.H`$ +MX!VU_:!>53M_R!K-#F=6KZ-F@*-;X<@!!)Q"-]YW>YTZYUG]H*NVV[U6M]X\ +M@$ZR/02T#U106L'D&F=O\X`O&/QIMA\16.(%YWZ&/=Q3T=XF=G*.58@1'7"N +MV@6PV$#@!"N[L96R`_5>HWY//:BJU-LD.`_K'34-8=4[-*`N$#^L/*(%]OC2 +M24J@3+S&-#;#9<GJ=UFE]J!.I(>#H0"=>J@LS;L`U.E5]T+&TYVR<$=FTS*6 +MW0$7ZK744[JBMWA4G5-R++6P-],LRG^SGZXAR@D!Y=-RHUFM-`[;O8;:4;L= +MN3.'-"L#59O[),PUI(]#M*6>'H9E^\XAVI[2_U;7TKP^M$IU,'[NSQ;/_5,\ +M-8.+4N"C$.8(D$_7VG>2/_Q)>"3SL^U$<E74:9,[K*AL81G),ELI%G/LH1$: +M@K#P0@Z*(U)66"(LERV!JKP^L#&H5P%3>46@%(XMBHP+I9W\.)$`H.1V@25S +M"?[`^CHV9;+MY#HZ=YAS+#H2HIZ%Z-)_C@+4FOM+%("D'F7X\95^?&<G^7&X +MWO"$#=(!=4N7S:/:L,"+MSY4V="7\/$BZ*\&?`D_5Z-36\/F99Y9.<X-*-V8 +M.3?3"[OYX82!#<S9.CO*T9@2Q6IW?[1WP#Z3Q2+6SU&=4VX3U42T:?/RKH#$ +M:Y[)?")AT[4;B(T:@"8L"".,GQ5JHG(Q<H@)K_!$5:K/R))RQ(^3GSSAJ*$J +M.7:'[;#D8_88\-D3EGS"MEFR(.1;.^A@[;Y[^IE8'+&1+LBZ3N!]%$&#+/ZD +M=68EF]%*-K&2P`9ECG7"F11?3K(0'IJ+R'C@V$/S*'!Y845)Q(R@+/TF;0?/ +M6_>"\5AS3Y6))4F_E*3?_3=)NO5WTH?2KWM?!J:^;CE''O4I$_2A_^UMZ;>E +M[PV0C$CH0]O_2-*;OY#>E[[O!79^;(X-#DEZ[P<86Z'V6#!#[4E)^MX[@/%. +MY=ZN,M&'U'9;DM[*$MS]P/<ET;:'^;\E_4!Z<S25?'SK^/Y;T/4N!>1#2@'\ +M9V@GNM[[*?K^`KA^S1]8.:5O]B7>]][/0=L74E+ZG6B.;FITO5F9>,K15Y+T +M!L;\$\;\%W"_/<K[1/H4;?^!MCYP_0;2@`&9"G>P/CF:2`KZP(-;^T27EI,& +M^/Y??'>)7P;&F/9ZX/J&>2;^SU]%`O"<^+^4AZ+,XO]BB>+_8O8F_K^6Y[GQ +M?X:"BILDX"8)N$D"OGE)0)Y^K7-A$G![/5M$$M#J=?9J=<#HIDII.8KLJ!!T +M6%/O@MFUP[;:J#Q:RV1`1/P>,,4/O)YYM@A%U:IYR+]8<$R7`>4YUX!6J13* +M0]OH?.@,D(7;=!SBN9M&',8\\C$68,SGQ6K\,&U1E7^5A75^;$#Z<Y\38PX- +MRS-2AY7VO<,PWCU_CD"M?`18.SM`7^`F'9'10;H\Y_;"S9R,?#^,[A>ABT8( +MK-D2\KHD?UN-'9['&+D1247N4.L\1(S"7WM6(@R#T$^V1=:0S.$CQ4$A,DMO +M\QC0>&9ZOO<98DX_<&TQ@Y8JYNS0'/&9GV.*(M$70Y7;0=B)IDM1AFH3PSIK +M(<3C$PJ[F1?TYZM$5LIKLNXITX[0%H7<"OWW213]YN_L(-K=#DE!?T%);FXG +MBP"*G,#!`L;:44C^=GP-F)C,*<G"=G)37LBE5T,7)J3#?P`F(TO]>"?YP^GV +M+/_BGG$0^)1BZ(8F<N@.N4;LD<$HL/RO,&N;9W-WDC9%Z"G=^#)P?(.MK+#D +M'_QD8)F(S/F1]<]8,LVVEZG::I1)\ML(GA],D%2(,KV@ZQ.05;Y#@DB%(^<2 +M$4.:]T/*T^=3S%E^&:&O[JG5^X="6P7Z\(R&BM2.IUD7+Y9GITA&GKO2[4PL +ME4V+/.5JLJU+DI-E&>/R1#I^^>9L)OV26=QB*OPXU&GZ[^*L3N%:K22+L_2N +MQ):GO`-$?^&](X].,L+[*X+&2/Y`D/PIT'#VT[V:L3,[[_=I$._FR:$RIXG: +M:./P7;,ZOR2Y<`JV.'MQ<KA1!8S%@9%5>KDB0$9XNH$OA"Q*(IH^-NUX>6`! +M4<P6+<5%][CHWLS+(%DEAOMT;.8@^#;I:(E?H&$I_B-6)C8:III?B9L'_5-> +MA_`,GQ72<QK%]LR]O(;&[H"=5=#SR3];*$2<*\Z\GH(`EA9,E%@<=)/_7T?^ +M7_@:\O^M[#S_W\IF\_S\KW3S^[]K>6[R_YO\_R;__[;F_P6E\*W)_Y?=W7_% +M>L#E<%^\1K`<3/PFV$7]\VMA%_56EO9=6G>X^+K.ZZP_A(C/]C_-X7]+?B"$ +MGK._,[KVBL5%]8HEI0.DKSPUB`H'R;SX?K%ZQ675BI='&*9)"[6*Y26*,,\^ +M4YOX9E<;1+KP^@H.!"RZKLBI?J2YK&L>C\S3Y<`6A'2V@+%8IJ![[#.RD5@< +M1]H0);I4]J$L-[IP>0J[^`R`PE^`W]GF62R2(>2]3//#&_0ZLO0VIG(*D0TI +M,R+SE+B&J,2O"/@/!\KB9VN*HO!Y'/>R2H5E&4=(O&;W\+'@S%RY0`-=?O2C +M9%R`Y'2`"D'#]DT=YSM3Q_DV%6Q6Q3^%4`[M97A#-OX;3W?$0PNZ_[P(=N>R +M^@ZO&W][JR>KXA\":-^MLEPN7\AXT3_R553H;(>X3F^YVV=5YG476I8M>A:' +MCI6A]J5T+$GO[TC2K;^F&@:YH;XS[DN^8:+]"TEZ^_>H[A&U*WV-_DTA!7T3 +M]+U'=1->N:`YTOM_*DG?M]%V2]&UT5CB;7\I26_\.:]9Y*41OO\>N'J$2[F[ +MGR]]FBM)'.;[_XKV_T1[['>;G+9?2M);;U$]9/:OM-FFYUF<AO\&[#^C^@DV +MIG-L2)8D??`NX/P#X"3$KE"\D61Z:/\0]/X-Z'C#EP!9^B`K26^VJ!;DC7.B +MG"-]0'6?GQ-M@&=.:*J8"S[<^F?"HSD6M:+]`ZS_UC]2FS^8F!.3MV']"8UX +M0C_3DD3;7TG2NUO4IMO>8=@&'L@?$I\\7S=MB;?]BR2]\^^"GX27M_T"\+Z@ +M-NW_V+OVKK:1+)]_K3.?8,_9/163;AZVC"1;-G%")@9#0C>O!;(S<R8S(&P9 +MU)$EKR1#Z)G,)]X/L??>*CTLRP](8IIIJ3O85KVK[N-WZW'+N_+%N_^#M/^% +M_30P/;M"KB>>0=A_0+#TGS27%,__"!<VWWZ.8<;\3U57JO'\CUJC^1_T__[M +M:Y(_Z2??_YU/_>13/T]HZB=T-*96E*RIG[JLJK)6Q?W?,S>`8U8`?TJ%U,[A +MQ+[A,"S"\PCN5CEZ3^PH#EPZC$Q8ZH<02O$3]T80F/T!QYD`9]<XJETCLV@L +M2HF';MY6WF1E'P(NZ&\^;75VA#,6\/]2N`M:Y(![A,7!<-H;SK,:]03`S:\I +MN`Z+V1L'^PD@-M8](^8.6@)H[B12*'&W)2(A0E1&_>S)E_[H_G%Q4OY+A6^$ +M"+N&##%JQ[UA*S;OL'6P,[[!>^X6A@9=,L4H9<3U2^+7L#UTM/_+O=HS0@/; +MQV=1Y0$&#SS+"58N\'0L*\8T7H0A_]^AY9E^>.H?>CHZ]+^\NBQLXLF+NK=H +M*P%R#Y@_'`Q`O46GZ(N2]*3Y/X7_'F/_+P"_Q/J?IN3[?Q?XS,)_^=)?CO]R +M_/<;PW\:W_N;J0#X`4!UG@.`A/^^!VQ8XBZ/FN2?G4.%L<U"\P$+,7,9IPNG +MZB+(X+C)$IJ,.\I'KYL.SO)T$[4";!+-](G4W#V>*_RWXM0SK7FV#T]Q\GP4 +MLMR.)8ZPRAS`-(E(4QEQ;SN(3<VNN$G@8<,R#:QFC4FXX'%O1#LV+,K8N#P0 +MWD:3L>.=O%!`R.?*A7,U6OOPK:Z9GBQ&DTF+%V#X]KZ!X07HD.0.+Z(P!^CK +MHVO?B14,-&TH-5E;.'T]#^V(4X^Q13.:Q9)83\)5-_*=P6RS%X2+)FOC:TH" +MVXY"6X*T4C[_^WN>_WV,_7_56DU/X'_R_Z%K^?SO0IX<_^?X/\?_3PS_5Z>? +M_9O7`0CA_^\"G]*X++07I(F6P3T-@C$[8*89D('^IX/_L6G*46":!=HSS80( +MP+(5].1I&EW<YA#GNRIE=TN\&^E>F#R&XG//,T_#WS'\CEQ_?%M8G`U_9X+> +MFE2>B*A%3:=AXM*],/&_,?Y/X;_:8\S_:FIB_;]*YS_TW/_;8IX<_^7X+\=_ +M3PS_U3C^JTT\^Z%MC.*_Z*Q`#,8(#(*2`21UL?Q/_$-HZF)Y?CQUL2PG$T=I +M9^$JB`W_$"AE)8X`1Q1Q%(1%:4:3C$*QY<?'O#09^R20W02D[IB?,X$ZSZ<T +M-UK7I#392:O?SA(8S_N^.'4"`LU`=2%X%/@+<^!QSGD<?N:C@LXL,M.CE^=1 +M5+BZ.!`[J9VGR2;$M198<T:]IP'TT99E===H8W/[[Q&D1`K_ZX^`__5&58OQ +M?TW,_^HY_E_$D^/_'/_G^/^)X7]]N@-H@?]'SWXOT4U.J'HRK^41%QPAPZ)N +MX%?R!->>.[RZQJ/40T_LF^7W'=WAS0.FX8W>"B3]S'?83C[3/.%*G.2YYLSS +MQ+D!,W*&.HP;WZITRB\[NM\):CY:,TXTBR%[$Y]I#M_<]QRU*&Z^@]13BWW0 +M:>JP^+'CU&03+HU>(<-O'0&I[M-8E@E(;^VW#G_VG\?HZ1;!><?M\[NPR="X +MM7P3J22W,7\/-F;`K;OP1*4X4?&TC,Q1!XWL-57OC3"AL>?H[*\X$S)VS62X +M=3X^]UM-]VH/3P@L$9^@9S1+P#]0-44AR(I"7DT]C1PR</I$L?LI=5XX%!0A +M'5)3!B;>C+<<W2X7GSH1#0XI]]_%G)Y/_R?M/[IT[Q'V_^AT_T^UIFGUAMZ@ +M]9^ZJN;VWR*>W/[+[;_<_GM*]I^0TE/V_^NR-J?O+^XM*G?]_4U<?PM':NJ\ +M3K'(YQ75)78>DS2@EO@@Q&W%8[>1GQB.7H6'J$KH(48@+7[O)%XW.2L-^5#) +M3K\U,_V4Q*WIB3-21M88P:O0VH7^P4.]W!I(.9>!G@%D+8+WCK./;SHNX_?' +M).YLWSLN1@6@:Y30)D@4P[W7H*?O-R$VF^IF.%4,^7W!K(O2;]O^2^._[[$! +M?!;^JS<(_^D-//:I-Q#_-93<_^M"GAS_Y?@OQW]/$?]5)^*_.C__^=O!?[GK +MUT6X?LWQYV/B3^&G,-M)H?8`N#G=[:$F?4/\AVP+/.5_%^]O,_&?IBD-O`6P +M5E=TM<[]_ZNU'/\MY,G]O^7X+\=_3P+_):3T;.]/";Z.X4+B1F=U?'](&@*& +MF`Q`WZUIV_(GQ[UU(OPG[8Y<PIP%9F(`DXB9O=4CQW^/A/\B_8]C^ECZ7]5) +M_^OU:DVI<?VOY^>_%O+D^C_7_[G^?S+Z7TCIK]#_0*]SZO^)4T"3T0!\G0,) +M0*QL%)#K_\?1_WRUZ3MI_SGT/Y[YX/9_M5:K8_2ZFI__6,B3Z_]<_^?Z_TGH +M_TA*/U#[1Q/&:NH\A=B>,`<D`)WJ#/N7N/Q#5_5TKB&7Y-D1J&-\5@1`0;@Q +M?#HH$+$FG`+)]?\B]#_M,?D^$&"F_M>U6/_K=/]+56GD^G\13Z[_<_V?Z_\G +MH_]#*?T5$"`\??5P%$"5N`\`$"<?9V,`BC@!!N3Z_[OJ?^J6P'V$\S^:VE#" +M^?]J@^O_>B/W_[N0)]?_N?[/]?^3T?^QE/X*!!"?5IU;V=^:T;5IH-2C>RRF +M:G01*UN=Y_K_MZ'_'UO_Y$_^Y,_C/;G^?U+Z/[?_<_V?V__Y\\V>W/[/[?]< +M_S\9_9_;_[G^_Z;ZWS.[()S73X\^G`"GKH>>_>2-BJI4%-FP+0/ZK^V>BLL# +M'_(HJJ(``'BF\"?]J:I:]9G24.IJHUZOJ_!=;50;C6=,^<:Z+O,9^H'A,?;, +M<]U@6CS_SE]$=1;]2&?79NS/<:/RLE)E--)-29)E.0J**`,ITJET_N4"3"B< +M&@'["70\>\E4O5E5FVH59=!+J50J34Q:^)/998?N#:!`B-Q4:DT`AY3J[5LF +MO]RHE>NLA!_J!GO[5F*%PM#W3,];*1Z;7M_R?<L%5&$ZEMDMKK["<.`&RU_9 +M;>VC>MGY,P@YD*44]$4J%:P>6SD:'"`/;FZR@_;YWN$>Z,0]0`D__@CAB$%/ +M3,/^8'79\TVF9+X]\X!0S"[^BH*?W[I>UW+HP/$*Q?5-#T58F2T'RZNK$.T? +M\(\JL.]>[0,$LMD;IF)`H>#WSX&F;/=J9?_HW7EK'YBU#'KVO_?:90J'(HH@ +M\CWV0S?T50C]%K@@B"^'EMTE3XS$GV"'#8I1(E%I:'YI5M>5IO1="3L/>A`K +M?V">N>XJ]O26;3B?=AQHB#LP*^9YSS:N?/;/3;:S>WZP<W9T]$J2'IND\^<> +MSPSYCSYQ@;H`77RM_*]/E/^*KFBA_->UAH;ROU97<_F_B"<IX\6@KXM!#S\K +M&Q7QS2GL>A;[:6@S,.,5K4DR?US@3\RG<'8]9`?8W:`OJDVUWM0WF`840)*_ +MII15C97@HTYR?V!X($L#TP/K2&)GZ'2\#PCTTI18Y>Q8D@$K27)[ZX!Q:Q2E +MH(]1Y3-TOA6YTD(Q*<D.Q%ZIKL(WV[KT#.^N(LF8"[L,/!-RW)+/X#.=%1O/ +MRC%OV9;I?3)MJ$][BSUQ<3>#__V^YU_+P/K7_L,%P'3^5S4*$_A/K^G(__5: +M->?_13Q9_$^#OGZRTVH?[%3H1^%L:++6P&-:@VE:4ZLW564RWR?3IUA>4S%E +MQ/+U<H.5\`_RN^4$D!%ZM4<GS?YP,+#-/OHR`<R#G+<-"`E,NAO+=[T[MMV2 +M7Z((J40WO=\,;<?TC$O+MH*[LD3^C452W^T%MP:Z<:>Z53IE=NM9`*H<=GD' +MEIG582W;1BTG@8202FL,X*+5`YB$X2?P\1ZDPJG(A8.PGFUV`@:Q>J:'M>1, +MPM8D+JQX22L;JVS@N5<@R=!]^F@3/7-@&QW>1K1/UR\M9]V_1B<\4&DI2HBM +M`QQ(5I\5((1#/TRBV5`"2"J24[S'N07?-?V.9UV:/A>M];*J@VBE#^QK^D]N +M@6P#LB\SO)C(P'NFL,Y8_CK@QG60E.9GLP/9?_!Q*@![<HN@)^8]")I2:48. +M/K1H2G*H1`$=X@B#?HE!4AY#9(>5W(6>@9$9&G;XUL`^:(X7B04D*RZ5'I`6 +MJRR)VR*`SLI\JK*/UH.NJD0?HW7NWXA<1HI.1>I<0PZ8P4@LSBD`W*=D2/4I +M3<W-)[JAK/C`XI`WB+<:(7.A<\I!8%S2Y$X?^J3K5S@1_`7G9/$>`_3%#W^X +MD='QT#4Y=4O4%[PTH]N'PBI0)G'8P!T,H5=-J72?C'!J@S=R)(_(-SQ&%^2/ +M:A>8CQQW^A9DU3--&]C',_DU&-2FY*T$$A:+W3L,3"`^SAMQV?##_#RPK8Z% +MMX'X`[/#&5T0@0_E=*`F'1QQRA:K"8(#FG)M.%><DD=R[(,.`5B"?8PN[M&Z +MHE;0.&SH90U0#?_@K!=U%-TQ`95%7_#`1?B5+J&`>O@FTAS4K$,42X,EMWJ` +MAGB/A@R5'I($X9H677S7<0=W(_T)7)N13SPB\V01"M9$7.@JTT<*LR`/VW(^ +M^6&D>)BB(44GJ9*<JCP,UC9V,:<6$F.#R&SU:0B(%'CWQ,V)Z_[`'&B=`EW[ +M7X:]S@6_XSHR#0S:X0@(]WJTA(&+G-3",OWTK]VAW968Z=#M(6$)#(`%>N2* +M&HTDBZ7P(K!#B`7/7-Y#O(>)%3QV8_"!7U%C!0(UBL;,H`J$JB+=D\EQB6O8 +M3';5I"AC\JW331/9F#CJ)L@G+=)MA\D^SV'8N5P/VQ4U4(BLB+J%+)B#OL,% +M)KKIT75ZUA7T?DC<Z6PFMGL\AW@Z#.@7AQHS`/@?`$S`*1C_VK1M((93XEX( +MZPP]0@`1$NGT)$%\GH57";E\R.^P-A8H2]+^`V_8)=P`U3&&V!45(;I554?9 +MS3^XR-@#G>]U3<HKJNE8186HPF:13.*E4AT/D(BD)(8(Y5U<::IS&<F,(Y.H +M\P0N$;)2C)M,@GI<G56D4AP2JR8B]1;>.@'BU^@#MFN&S=6J9;4&[>6?V&"J +M;;EPO"F*+H,8W]VT_?;N@3D\AE^GFZI29B>;&OQM;4+=Y`Y[,<0B^%8$3LW( +MSR2T214U)3G.=ZS:\Q91<C;N#<=8R?OX\]U$DP;C"X5R:@60"FP.>F,'R; +M4<\DNT84FNX(5*Q9W?`JZH8)_9"57RF5)-GL">5#0X@38]*/Z'`N,K1ZP"2@ +M)WXU'4XF-96X@CX(TD`BPX/!=GL\"V!0Y\I'B>D.@\$PB`)"-H%*D^6?9B@. +M40RR[7F)$9,1K5-E`)K$<P$@*%-B,NS)]<3E2+^F)66B[Y*QH#Z'(((\4T9C +M-!BM-'08^A4'@=.*6`=;=HT:P\7E=8(C*$D-%MP-++P+AE\B!O@%%8O?E":; +M>9PY-Q)VWD]#AX&9H"A-76FJ+V?9>2*#<4.OEC#TJALX=O07AV[+L\!^0B.M +MLL>$VK"MOA7X"=1'N$B01R2TQU1=.:G4T.K#%H?4)KH!8N,L=P"CR<5QY]IU +MA6#W3:*3#'R<,B%1ZC.<>0>E$L5A%Q?(.LNX.@??K`"_82KX!84L+P.Q[050 +M*1]-QE^@#2@![^+T$=H%!O4,T"\>M]ATO0R&<HE_$+4[@#`N+D*UN;Q,385Z +M!V#=`)`%J`JV*597DB\N4IVT'B<#\7QQ$??82`BK'!]+[#2CT_RD*`$H97HW +MD`KTGW&)U^/%VG8<U"7'1\+5"=]UJ)^-;I=$``$CI(23"!0P8.(R?X7D3WQ` +MKVC28*.L0=?`A\H1]8H_!"E@^"*!Z5'D52E"1R%L258DHJ@*,E\0P39$]J[I +MBYN>N-*G`:*=;3U!!T!&5`ZW9'U)#L58"J6PE6%D^UY<+#U?7@::=`+C,ZZP +MA&9G!C:9E@XED6^!&+B#^#[1NR_L'3$W8'B75H"3G!$WX6SGZ7NV?71PO+?? +MPKT5DKP-QHK%#>+$Z$*#;RR0(/"R#Z)+L!!F@&8+ZJ'0LL,.^2BWCUMG[S<_ +MFL6/O3V<`OG8.X8?D@P1C.XOB$*(?\V>,;2#4&)C1$E>$6^)UX$HH>>:1#W1 +M%T",R\NKD@S$OPY=#J5M'[2W]@Y%>=!=B>(Z,?(/BPN1<T)\I`L=I58H#=D` +MNFIW#R]Z&P/6'^7$(*%YF`"&61;)?`FHQ-.='=;:/SV2DG,[,R5WATMNC43W +M$="J5L<INMK+ICYE:GXDA[3HWFA6&['H3DTD2&Q]+6E-.P)Q&?PF1"[5"'U" +M0RVPH=?6);9D]1SH=P:CU]X[D>0EC@!,\:)0**;ZN2B5,N)$O5J$+*%%H)6A +M,L]%#"J)JA?+THA#$@8^,7!1[A2!3ZZ&-/L&*<E6KV%3Z6_<U''*'6D2DG^B +M0?@3JYI)R\E6949,M0OCB%:%Q9V?'W_3%8<I\_]J12G1S7+77>\K5O]F[_]H +MJ/"]H=;J]:K64!HX_P\H+Y__7\2#\]=,'GJ'+#7TZYW>>K\&?Z]-HUOIU]+A +M$6FD(XY)K(S,:`L(KB."!E<WFK5JLU;G$B<MK*:51+FTAE=,A<35IJ(W:VHL +MM]!0J"?M!5`D+-PY%6^%.J_2OJMPD]1XI.VCP]V]=XE(=8Q4&HWT?J?5WCDY +M3<12%;RM)YD=7K:P<\*W:^VA"DY&;V24?+ASEBP]W/25V,:%EPJIJV&)(UE\ +M^+!]?'IP1DYU3EC[:']E;96]9F_1@WT%`]D;\;:`'ZH(U,1KZHE9Q`'ZB_8B +MSAJQ,-X4T@BCQ)3Q$L>T!D9(8V[*&,DD01@-H+#$HI-"A($?G#"6V/L_VG\\ +M,3LF=&17;H,QV&0O+B5X?0"OH=!`/@`3S+@RY;UND[U^$51>6&]?_/*&1YD0 +M5AHZ([3`1DB%A/H?X-\W>1ZL$V;(_W[7<P=?)?R?S93_2EW74?[KFH[^?W#_ +M1[W6T'/YOXAG,HM'N_9P*J32&>,](HUTK$P.3\7ANP:1Q77<_U>M-?4IPC^S +MF,(!F"?(X-H&K4?K33W!X*I:)<D/'YS!"_]@1=S2C(QLF\Y5<%TL%PKOSUO; +M[W>V?X:OAQ_V]PM?RCRF/[Q$0QVC0)R=P^VC-FZU3T?[+!M#P)-.("9$93"_ +M<<<TI'M_OGL$[)1(4<(47=-&>0`B)G!Y!=+1&&6-O[#P@H)_>9C$OKSZ'EM- +M9O"_AS\:7RD`9O"_IFF$__1&35<;&O&_7LWW_R[DF<S_-/3\;P;W<\(8C93) +M_",QQ/PBL/X&XC[@6Z4ZF?6SRJ`<3LT!(<=&4P?PV$ABOI>TT8$^^5)"P;=^ +M-<\#UAL`Y[--II3A:Q!]AR^X3]CM]<YQ'K#GFP'^1NN?K?4&KR2Y@-8D6\.S +M!`-(0\S)UOB,+GP9P+\@CH8+F^=H));%=Z";\"NN(KX"43`EP_BWR+>4SC>. +M$6:?>D-[AODK;(DHS+OR_PIL^#<\;]7[JZ;4-N"K'7W'F'[@#3M@Z`8@GOU+ +M?&-^!AO:83P+=X#KF8G7%AC.\-)RNJ](<'7-2Y#(T*O8&U%SBH@UBZ\*!;!H +MV\*6+O+08H6,V\+M-:Z5K:QTL'%79@"9KD!1G3(:Z#=E5FPWSXJKJ[@-&P^S +M@(C$K<C^K05"B4&J53[V]09)_7J]'.X;+UQZIO&)UZ[`6,?P3;;<7F[25FG< +MV"QJ^9QW%_OQ1Q9W*G_']VH7$GW-T]"^\[B5<><D"J5:-72J52-1JR&BQ16^ +M=?U+8I-ZF%NBY'MT(V2$G<;DS7A4\,T-*\5OJ$H;&BVD;.ABHR453FE?,^K? +M1`UA*).DE^B'+&+#^:T5SD5$".P5B\8+*OX.7N/DN#.TY0#7Y9UP:P@N<E$S +M'EL>_MZ>Z?I?-H,..8"7#XQ/)J[+/:2,6?B_5L7]GP#Z=:6NJ8U\__<"'TDR +M;+O);BPO0%ZF%;!*]U)<9HS?N)")`OAFQ#@>/R"&7S]*A>0.""D.:H;1I()C +MWH;?I1\HZ`>I(#:(LVO#O\9K[EZS%Z\QN-.#X$J_`S%NF-S#H!=O*Z[=A1<U +MB,/>X"M)&@ZZ:+.'T:):]#L5;]#W<9]&XIU4\/H8;0T#H3Z2U+%-PVG&[Z$Q +M:__Z?1QDF<'_UW>7GM7]OO@?#'\MY/^&WE`0_]=!).3\OX`G"[)WS9O`=6U_ +M_=0*S'7<<UGAVR$J_5J%4P0M&2$,!P-<T9J*VJQI$X'\U`Q'<E*;.ECS+V-` +MKY050"IBH3>:<\7$!ZWC]LXNSF[*[<.]T^24+`;O'/Z/"'ZQ<G)\<'YT?':^ +MN]]Z=[K*Y/:?VSM;']YM*NE$^WM;-"<KVXYOCP6V(0\>[*?##EJ'1W\ZQ#`D +MHXS0=R?'4T(/CMH[&`Q,DA&JGIYL8ZB:$::+,#TC;$.$;:3#3K?VP@KA*&4% +M1S5JZ)CUU%F=KF'V7:?2"4DC/",$!IA2;ZJU9G5C,FF,Y9*F!Z6IZS$]:/H& +M[0(2GWR5#J$E;K3T3!]A,=D4:%G]:*%]H_P-[1''-GO_S]ZS=K=M([M?I;,_ +M`G'<6(KU]#.5FS2R1,=J9$G5HXEOVD/+$FVSEDB%CSANT_WM=QX`7Z*4M-MD +M[[D;MB<6@<%@,``&`W!F@#HI[@;M*X$YHBBJN,&*9^4P*\]YX=;$A'Q0ZZ<Y +MV,S!SHR*P([DF:@$^NT"]6SSLQS2?,;G(_)_?N^^G:'OUN?[_K>SL[M_*.5_ +MM5K=/T#];P>6A*_R_PL\:V<V=ORD1)[>D4E=?0)3LE9=_5DF@2`S\"V>T7OX +M-:9Z6-L]B'C][>Z2PS?]W:NPL1.==T:_A;>;]1Y(?)S;V__,;C^DV\S%V?G@ +MQS8D8X(UF?E30WQ'([9,_Y9NGF6WH7!V6SP69_<`BXY]XLJW\+QVC&Y"9)$Q +M"-W?D7P"[]D.VR9A'!PD5K2NYS!0>N,9M.[2<*[%=R:F//]U:LZ-J3DN6;-G +M5)3^:4V-L?!LCVRS''.Q,*:T8Q8_0,W>S=@2YV-G:ECBNU_OZ<?SRYEO7#MC +M4+HMPXM@0A^6(.(.VO=8W)8"*.VPE(H;SUO4RN6[N[L2MWIBS[$@%2;?!YJ[ +M!7&)=L:N08:,EH=U>88T0,--.0#BM=]3K`"WY,9[TR6++L3#ALQWMG.+]D6* +M804LA.9@YA2/M=%R>*X<&L9XWNV8;"9&.+#TAI"GZ\JL+N#]S)P8%ML\&<X< +MS1W#6EK6I(3F&Y;M$280]`NH-?#\(*LM=-@H!0W'D"SUH3@'N29@:1;]UN`E +MX.QT5?@>"AR#T5Q>MCK-:'BADNBUM?I`(S3H4D516UJ=P;`_:M!G6PJY$XWY +MTJL/&Z?B6(-TC<+.U`&P\X+B!B&6,(K/0.LT\3LP!>=A>@:C7@\#T43)>=5J +MMS'(CZ*)L!R?)XLC'2$!LO$X1<)AC]$`T,W%)+-1O@#<O87QR#>\61,V/`]* +M\EF?H)&D(Z!.9=P<9RQ`5_@=H(7`!=;UG,F-DUL4MC:V*&2`0$/9W"(O&`;! +MMK>/@M_I1<)2`3">B-$/Q_!\QQ(+2/X#FV62HYWC&CI3"(//@M$DJ1-X(LL_ +M'Y//1D$$!Z@PAF%NW4U#`+3,+43RIY<8ZX8;B/7PEZ(C?IG8(#6BOW?DBXG6 +M<7SJJ9CGS1?J!3&^>8(J"+^_&\,LCR9,KJ[Q[.O-SOX^I@$YR*'%?4YFH&== +MGC.@2T],F*C%"8G!#%03,C0`WRH27S&7N$F'>X_I#4\6MT!WQ=[!`!:(H/A4 +M8$OP]3$CW/JYLG4$W,\0PS/,!:X(?JN*)$UTX$?\X/,^_OF=XAV_;V]SE42* +M:C#E_$(D/94D`0`RD\FF4U$F@>F2!=?72PB2U7)_R3["!*G5F:Z[&$\,XDZ> +M#WH5UV)0XYGESR64(E0R5='/I\3RY)=*9ZCKN6IH)G'W*%9'1E$6:7"R%'=& +MAE'"`!C`C,0*>03$6_;GJ$]I?)Q^'JI_N@')8M0"FL[4@`;&8,+Y3G"X?O!% +MDMP>`.C8PL!(21RM":14J22&W6970B#I..3GBYQ%D58H1LI&'CNBHMKW6!Y+ +M2[&0AV5_-K,G.:GA8VH>YJD<T41)7FR+:IX;)6?@8Y8@G,T-%!BP22S3P*(E +M206G`AU_K7HEKSZ%`)1ER>HQ[2]73L+QDZIFL9FLG%/_<O5</(T`Q@_:.(6U +M&5D\?%B[PZ\<H+U\X_YL;11D44'P<AVI2DPPS@@9C2EZ18%";]EM"5M1:\ZE +M;<_D@@CJHT[+#WY/RY%"BBJE6E/P>Y7+"XAC7(/ZA+Z3O&X")S#S:"GG?30) +M%Y2I+85<6:IOY(F*7JN@MCI&J$[FO'D^PZM]Y@H4-,N[@JX!I0L&[49`J8[5 +M"O(K`:Y(L0VYQ6<(,@\"^)R=Z,/^>86^@WV0;U7^KB/%[=%1$-$H%"[NQ#1A +MJ.;QVUD@4I1`46)"35Q@PX.GM$)1MA(W#*"^YSW>WEY0/O<T?[3KR(]V*RC' +M&'Z*UA2@1T_%OR+M.TJ1=EQ-=U4U(8;J>@SV>D*[%->PO@;!U7H$G>Y)M]UL +M@'ZZ&L5\/8HS5!:[G?;Y:@SU]1CJO1XHHJN+OUU?_*6F]7X<=8?:8#4*[V-L +M:&HG6G]U^?%2^?$")R$,KM6%ADN%O-6ERKS1&)#'EO0T8S&D_"114_5*8H2; +M*K(\1XG(,LI%'U!,ZX&<?0'[&<(%-5(PL0([H^!G$5=Z8<#>B'96<R/4U0.Z +M)TMTWQKW$WMFS6.T8TN6%?M%?C5#W*V:B#X@DER#XEZ@E8"A;.?C=8/@_<MU +M@W#.4"TL#);E,Y&'LB36KP\BG\P3'6X9=["HQ,"E$(QA\5:B\=+Q>"L0!9Q7 +MR,3OY$8P]L:XO19RQR*]%27WTOHM6:'*8I9A\87D8CI(=+U4RR4H5SQ$$U0@ +M=[^A.'+PAT/)!4AI1,J?O"B'4Y(V3$2/7#0ICMQ1H+G'.!.,BSAG5@RHM.&4 +M9(G*6L.2&,A:EBS1\5F8DOF$Q=JPIL%2+5$,^R--Z2-2\'07AB7&DOCD\$(U +M*/0@BR1RAX?G)'W"[U(%J-R1]Y1"=@="RH9J\%#(X69(3]C)C7UK3$LLAQ(* +M$I:(ZD:HU&#\%%:,Z,Q.G3"$>V:IK,K%52;&K$M48J!5QY.GEV$2UNB@VA1L +MG'O(W=2Y1W!0-.U486EB%<0CWA0\4LKY(U:4'TTO\[!/R\@QST@?A`JQ&FT4 +M!);J0@*X[Y07DBMJ4G45*R9]^B0CF@/QBG[5.9I>$>'$$,&TBU+4&%OHZHC% +MHJ-=K![JGS[]RW*41L8?\1QI>L#D@MR/\!N3"GPP(\]O%)^GEP4TUV-#MTH^ +MO1$X\L)&R`GP\P8P=6-MBQ*3]]/Y+^+:]/2RBKO.>O^X-^SKPWPPR$.0A3EE +M(S?XD<O+C?&58Q@Y;"\ET!OR('QC+H3O.-JB>Y44\="8H8?S&OD@)^\[&R@* +M)^\$BX6SE^=LNL0*P&.["S4%XBT.FRQ[3DXTJBTG94(^RLC\QP1F6'TH+Z,, +M(*2@[/;T=K?[<M03Q:*8V?:M\!?`%F"(/\<SY3$#8F,#H5CG<*L<CV>!(2M, +M:V+/<33!@)!'%WQP+OG[UC?0DSA^[&XX>&K/>AX!+$<;"HZ_^7LX1PU!5^]M +M%G]<F"N4.N:5Z:!SI7U'I_8P.OVYI;1)I!:[FDN4N#'HKDQA?!QT%`X+<4`: +M\]JRG4"4)PZ`D<?(,W^1LMGEJ:).3\?O6-(_IA5TD2[LN4_ZVH`/\?V9A_MS +MF=I]A12&$MTEGJEWET[&SNJO\?X2/#$(CE`!$7[G363)$USYR_+GV/JC],TR +MQNP-A*\2:E')&AF7P9+2F!E0.=1\A7ZF)-?FQMPUO)S+G,&3KX+ZJDQI>1K4 +M$HK)3H!Q8CX\\>V^@U&$P8'H.(RK8>-E>802(1>G'>8]$Y(7I,@RM$R1$Q3* +M6GC.(BGE?P$P@NC!I>DAF;$]9U12TG8L+W7E6P-];!W9S(#Z.I[]H(TG#W]F +M5DHCEM4UZ$:9%Z#,\("`4N_Y3$D2'+"=LA5#52:64_TM`99J*PA922:^9.I4 +M0"U+7#P?7=:AB;RBL\Z:6(Z8W(0`#M8E7&67%0Q9272Y40<.?XB,XNN/A/D. +MM=3N2ZG'L/%#L,OR8%;KG,@-B/8MIZ<W(FP]G</*POG$P=MRJ_C4MI;0'D+- +M*04G;_X2S4P_Z(N(6;FBDW:*;!Z+@=;6&D/.W0@Z:@7V<%F10B'@&;SKF)"3 +M[`D9IB#1/IH)2_8-8P16HJ$LRV"T%^$/S+XZ:D2IK6J[,F"'B_5%JF/E$8%2 +M=35F`H.CB34>"L(Z=;^1/EX"\N5,`L1O*K_$#FKCF&%EFDT!!!'_9CBV_(RS +M$GTF*DN4/.-:"B)>J9J+4G!:N`J'#6'IR6P!_4:-VPACUFD!O$+%MDW4[%"" +M!4=>*P28;!HF.P9&!C5RM-*Q8(Q*6E9!B20<I>L**X;$&5&`E3)05?"_T,A! +MF3.0!=,_08W!=57T3DDWP<1/<*YC:XV(Q46E4ML]#!RCUUIK*/>\>.%O,090 +M:*ZQ3[YU^$=&7X$59HH1PE4_%-"\GU4'$D+H19!JR"%2[#@R;-:7VZ#!L!$H +M_!S=/NT4OI#8>1:2RNQ2T95DRJZ`3A&2L-XI*I#01D76XB9*$UI]W23)D2E, +MBWR1A/QI8TOJS)4&DO^6J>4.7;P0]9>O%';%-OS+9G5KC`G%>F/"I>R$,2&, +M>3Y`1HXJN\MF"[WG+XKM((X6=1B")X"5X>=%L:G&30H4FW)>%&>$9C(S8:T$ +ML/^TN=7_N6>U_=^3TF&1G>[^3??OC_M_'^S_`_XYW*_"_P=5\O_>.?AJ__<E +MGH1(@DZ/^UN6Z"_Y6Y\8EQ0A:*^V6Y$7O3Q)RJ"E\LLE]W:X))GS[I(K&OY1 +MKFALS$">:^X;<WL;;0AT#(2C*^.G(U0B9"!I6?.6&\;RF9FN)QT+HS@VBK9A +M2`<Z96,`TIHB5.&.U7>I4#%9:/I6%@*=&PT6O(*\K<YS[BG^'CMUI]=HRK(M +MVF2+K=(66M>-.:;CY;U`!65V%?COT6FXQW:"*G2=16&B/!NT:-0CIW^SD]RJ +M^2\=/^:3OZ&.]?._"BO0?N#_L4O^'_M[E:_Q'[[($[DD#D.4T,&5J0Z3)HX= +M.YBB\0=CGD*3*M=-CLH5<?Q"/`A>4N&2PS"T)N.Y3P;`=HPH2L*01$MA:7W+ +M"N)OQ\CS;AS;O^9(BO,]0K!P#!DZTW9JF$*I\IGO)2J83\2SU*90J4AH<^;` +MC8K]&TP8H'`QGMR.KPT57!XM?I5QJF<3'C2!+66EK7+NXOES%&S/GW-4(]#0 +MMF*7_L5BH@(FCG9CNZC(-.O:6;<C[0D&N0O+M@Q([@Z&YSTM=P$"QG^_Q7UZ +MHM6'HSXD4N@T4(H2$5P!+`")^0$"*'GD%>W(771QB$C1B&-@:L%H?H(PWY\L +MV,TPM:3OR\RP-A!;%((N3,';$2=W.HZO,)&]&/7I99AT.8->PC4"-FL3<X%Z +MH1OF$HMU%7,R3)^/Z5!A/#5T-L/1F:1X50M/]RW8]MFS=]A,">.F`+WUQS,Z +M"-:QDPTG2@+&086,L,I(^=G=^-[5Q]/I4OT64`Z#`"9:-$V7X>OTN3MFII_5 +M!S^.M'Z]J>GU02Z?U5[CC:1-O!BRGT,AJ.X)C"3X5C2JE+QH,)I\C!>>#H., +MZ`8`-')"I;>:T+D7._NUG?VM!$Q]-.Q"X>-1JPU`5VAB'P<XJ[_63[NPR8#R +MB;+#_KF.&S+][+7>;@V&6P7/\1/%F]W.4._UN\>:3M>+GM1AK4L#;,"4`H9H +MG4'K)RT5D];&:Q7/==[37%S"8+H&T6--$V3A?:%M31^>H@6YKHJE-J[;;NHP +M;0$ZB"*61EGO7-?Z_6Y_H`^[4#,:CL`0\0PG67/]1-.ABT>I#>CU6S_5&^?L +M"P=H,(:-#%SC)A`1#AUX->SV`?*`5NMD[S)G1QU-[W='0^1J6O<!([K=U"R* +MP*/3;7PK"N/M>&WM)ZT--'R;J!YO,XTP):WJ1DMO8)P??=#Z'^RQG:U5`,/6 +MF09M`)C]>0+HI-M_5>\W20^%_,W?RB49;[>T>5>+O":1`TH,\G-6'THZT_ID +M@#?%ZC"'8'3VD("4=FBM%Z=#@CFM=YIM&%U`!WX6?)*<2\A*_56]A0VI5I(M +M.6MU]).^ING',,M?#@@FV:DXV\ZT`5X$J+AF6A2PVTA.OBX&J.MHC2$Y*"8K +M@VP*=5=OIS$5<D^U=G=%%FKZJ2U`4='H4>MNEK/P<F&L<P56S*:6KRE^TNH0 +MP6GY_8&V"O6/(ZIU)ZTMK4%C15:C>W8&';JB.KJ^&?)V*\G)"9D8HZ8+LHKF +M9DH^S=^^!BL!@NPGQV8<0N_@*&U_`N"H_X*)VODHQDX`>[@*%J959QTNS`]I +M6P\6U/8DA951;"%=NRD(3T&)&@QA!1T0YY.=QF*Q7<=Z$EE][00E$N55EP0- +MS"JIM35.8:'K4\]5#Q)@K[K]E[`6-EJ]%I`8BM_=%.D[T'KU?GVHX=K62!4; +MA*W1K@\&(:;JDR5$!#8D8:6@ODVICYL^Z/:'>K</*Q4N0^@89GKW*6*&H4&( +M8)U)+J):T#BM]W6>4#[;<1>?7)I>$A+$!RZ@>+?QQ=(X[[`TT.ODF@404A&. +MKYUM5)5?@C#2Z\UF/TT&8^\PP;"8*:F7NMJ!?@`35F_@Y]1T<<Y+/\AH8&>_ +M>R:7]=3^J;?;W5?Z<??%:""%80H058M"37\!BVPO?9D<=6CA)PC]5;^U:BUN +M=D?'0-UQ=]1I:,0.D/3K]`GD#+)XH/=`BY/KPNHE886NM:I9QVU@8W"T`VC= +M\=72*K.DXJ6U'S53#K&*:Q%N*8J6<2>W&C0[H6-A:41E%$]AKD"+OX-MFDL` +MQ=A#2:?`$>D?>>7#W@\O%*?]A#P`XKW@S=@K$;@B9G!6A_F!0@1:(X_$,?_2 +M]]BL%V^<N31@"VE-[V,ED4@LI[/TT9LMD`,P&W'@EW#?A^=4$=Y@>%?9Y$"? +MVXXRC_3QM1"LZ@]@Z+5#`#^J9J%H00P*C52!5,CJLMHK18JP"H++$P(&VS@9 +M]R4"&.DS^/-ZJZ!V%--TF'J?"/3]]Z(HBHXH_B:*X\UK4;QNB,V;!PY?J-$4 +MF[_BOQ3D-K?I8R1;1L#;N^#-G:.=BGP)]WPR`4>0V@NIF*VGW__P?3.(XCBT +M:WC7278YL"\/J;IH2WLC>7\`6?X%QN+R=GIE"L17.:LOZHSACFX2Y*(<5)U/ +M'L18H(F/.15TZ1CZON&0#@Y&;H!UC&$?#V$L6P7@(9.?*]ROA&<3D@ZVM0O. +M7^!1!*K#%<>?&7@^N4]EQ<)V71-=<`$Y!H3#"]QD2=H#TW4$3$5-^GTIE`9% +MWW<-0YJ<XN4VU\"'C9H\&ZEM<,&R+/B1<C1)D2D7Y2TN^&&YQC5%Q^+B@RSX +M/.BTL*3L(>H&U4$\Z;??"OK[/1][;?O\YP=1GTY%=*0(C%EM.-DSBF<:7!\4 +MG4'!33IO![VK&\O_]H>"&#S5K'<GCCW'N5X^G3KJ-UXL!%E#6V7PKT(VDQD^ +M;78&Y?Y)X\G.3OEU<629[S&Y_C2X2J-X#O,&AJXH3F'>_'<$.OKZI#XKSO]+ +MN+3_775\Y/O?;N60XC_M'>Y7#@X.,/X;?@GX>O[_)9Z'#^0]8MF'V8?AI5/T +MT,<`OBZ#[[D1'GDD37`1P:MPT.R7+B/$J\8\FX(*`);X$PPIJF%R<\M']C6Q +ML[NW+YY4Q&XE^U#>5[O@VUD#JUA<G<09_AHZ8\M=V+!ZUJ\-RRO(6T?DIPIU +MS\O/R=K9C\I^AWY4B(8^K=ETH1HMDK@FC"TRCP7ZU%U;:.E3"^\3?2@4R:$R +M$_U*`.7,*1X\`\"[L5-V_/!^KQ)D90%B0->*!A$71'`+>8F1.I/2M(R3#OXH +M(#=2T#(\_'B`W(Y=318@@/')&64)&BGLQJV,?;I$$LO"4O@&0]XE,`3POX@C +MY*^5S2S5$G"'S*`RO+-]>H\Q_F@?];1ZD[TRD0A>B*DG(JV`GO,7I>P;L?E[ +M1QOB!A2V37_@9U/+WH"*'SW"""2>J&2S3.+RU6F_B`\?`J"^-ORIWGY:H6;# +M*H_7H]T9\#^,U0E]C2EER:EM8[.Z(?".7QZ_^6SFH73BXQ!4;BF;S>#E7:(( +M"LE`C7%5:TUL9#/!VAV&,\3/1U/C71FMBL3.LT?5+'G-FJ@\Q+Z9A)N((*YB +M-*@B<'QJ9S,R*D;8.S3J-LU(E\3#)L:`OHN],C;HC`SZ%L._U,XTCF[FW@!_ +MN"\WH"^@.V57$#\NIWF88N*C#Z)!YFW22-B(HGC+:<!UV6&;WS.WLQD8"IPF +MBL9;4>%2GHUW>]&T`N7]MNSZES`&P]&7.3JBGK07LB/M1=B/D6Z\\3WJQBEZ +MB\?Z\M:<S7#>A_/]$TGC:)$?(PVO>^)AMEDA.N4/2(M5)(%G]A@V/\M$B6)U +M&9SM%@"<?Z2W@"`?YR4S-D88VC<4;N)W(N4#4O9!TOJ!T?T!S*'95<T:[GB2 +MS=*+9,17I?'_Q[-*_PL$_=]0!^E_!ZOMORH[>PG[K_W]O<I7_>]+/)%U.UBV +M_],T?7V^W*/F?T]K#,J?J8Y*9:]RB'?\K)K_E8J*_WBP4]F%^5_=W]O]A]C_ +M3/3$GO_R^1_K_U#Z+XR_P_!//NOE_^[!;MC_E<-#[/^]K_$_O]`S\.=SV(?6 +M1%W<F5.,+D1&?FE[;I$[&];SI6PGOCO^R7!<VK7+Z)E]8V;`AJ@F#K,->W'O +MF-<W7DT<#YK9%X[M+VKJ?F'-@FV1;:'-;KG)&GNVY]CO@`H7T,^]!>OQ6=[$ +M5FKBB@)=PK^EB5NZ-)Q;J.F^9$Q]O%LS=&,)1O$WO[]CVOXH01^7KG^3J*HA +M]73.)9-W:M%8FD'(S=N2;YG%6].8E:9&^9M#;3(N&VSBC.?A97+,Q`HDFMTP +MVCTG[$6J"]0JF;=?2WIP+%^Y($$/(J"!=6ZVA[;YE64LT<#M#%3]W_:NK;MM +M&PD_A[\"C>,3.RLQEGQ-ZV:;B],F;>RLXU[VG.QI*1&654ND2DJU7<?_=G_( +MSC<#D.!%MI3N0QZ(GL8VB.M@,#<,!L5"&XCN*PKD.(C<@MUJ0?83;.,-D-0M +MN?EER??;O3`@1;:JC1GHO(S?NP6KD"@]/BK%=JK%G#?JI,QNM8S[CI44VJO" +MK!CLV&,7<Y`%8]:9CB>/5Z]A&[II(YNP52?Z#_K*2G1FV?*\5<>:Y9VXU[RM +MH8H-6W_R)<X%=QW]*PK>W8:L@OU,;DC*!1C/=&^M9_##G:7&`S<(\7>B-&-? +ML9'`ZVGJ)6Q3^^VTKR.=/=1NG_^U[Y"+L<UI25%&XAG+3ZKXU$FKUQ&.C#3? +ML;\X@Y&&G8(#CJC)/L:Q[WG&@5A3"YGK;:(S*Y83(I:*/<1SZ'AHO>RDZ[F. +MM!4G75]9/V6N%\9]OD>0!=O-^O!0IL_!`+AJT?^7ZMFV:>"KMAO*]C(:^[+0 +MMCR=7H@"4(L`!M"^I9^%5HK(QMV=S!D6K']3^*.6YE@=AS<?$56&0G)2!YM* +M(A0?J*8Y=A61+#NC5\_^Q>;A0)WJ"QK)!)?E<4ERJFW/MJRO^+33E,&;\!-A +M!QPM`?X)[WF>:R=OU[G-:1*?LF<TD6E8[5[?L2XPJ,U99QY)-FIW`?NG^?J= +M</B%$5Z'IR;FHZ._`*LKKAOU8D(U6^SD8]#4AN_)#;YF`-D&?AA:?/<*;OD% +MYW$XW8=#A+WIS?#P.!]ZNJ5RU/VW;"3CW##'P?WV;>EA<1+=XRLZ3`G*@Z&E +M1EAK?1D@+''+?;/=JPS<$+&L>3FZQNF^;-TT'NLPN,J65H#!I%(&PN^ZJHP6 +M<=56$7;U>YI6Q4X9Y$2/)MQ)_9+7HU\5:G5T#$"J3)RQ,-$3;S75T]E$M?\` +M5H+=J_:DH]H]95Y<,-F=+#OGZ^93-_O$G-SD;F:YS!Y-[E:6:\48R=]&OOE] +M)^\*S-?D[A;;VS79>WEAPV"]%5S!0HYE\;RD7%JM;+<D7LG%,!54/G[W5FY? +M&`*FJ#[RX7Q-<.$-03@4Q\KW?=C_?_GE%W5\\-/!,:)P>RL0\"]/U0.\`R*& +M+KC6Y(*;:K_`!ESIG\$X#-;NXQ_*>WQ&7>!!^=/'\.-^>^!S)<_SP*[;B)#W +MT5[B^/C!_^!_?*CVU>JU]+)SHYZB*MK)!#9OE?>%MZ(OF;86'B?Y^OZ#PM^J +M_1(.A3\='+X\.O[UQ2OVOOFZ<]_S^OGE-R\]D^MPR`0`^B(CP(J;UGU,YM=B +MO*G[-$DL-M1\%*2J^<"3]\9;*IL_0<3\CB>B5LVV\V!+3\P2\36`7X^/CDZ\ +M\7DXI.695#Z@\;F%2^=I^=])_WJCU6EU6YNMK=9V:^?&?,RE\JP-<\"CS&UD +M_DG["?]?=ZCNWHVRQR=*3@`&_),8)E_4DSO,+B6A$;<][^CY&\*]K^/>[_Z# +MM1G'R&VGZ_GO"7X/$CQJZ&$YU,N#]R>H49JMPL7JHY\/O_YM2.U&L]_4C^4, +M<S/;9`RD1"%#GJW):\A#-?GW#UY&%VF+/)"QYP<<G^GX<MS_3`>8[Z7/88!$ +M>?NZ73/,Y/->9"%5HXCVSRG1&U'"[)%H::#9>:VM]IG.2@@I<3#[C:34%#<? +MX2PZEQKR[*ADOC/[)"T$"0O?/[Q^<7#X_D!]C_$\_Y%XBG`R^L'/7/QZB$"\ +MZ&BA9GF$AAG>6<$R39D6U<[XZ,)5P256"M*9D8Y2X2]VJH]J6ZRGP7/A:,_, +MB;]GBS-6.UM;12[>KS"J>K^0&AFA;E15F>'NUDF0D./<%;D5VH9[<!LL)%5M +MJSVH@#5B<4^`@,6RN#480.GV[]_66[EEK[S;<K^!.V"?@Y,@,M[=WJ[4R'CG +MX_$?N&B/50^#"$\^#%1Z-::?YZF'29Q"&[3>T"SH_*$<-XS)+!G@&'OJ*3A2 +MP!UAF5&CP(/KTQNN'>G;<<5LUSZ-8W__X.C5;<`4KP_''4:K"M*W<XMECO^B +M!&'F@>LE12W9@("L`,M?I"N)?K6&<#0D37,]>PM6'%FIK-R276&%=L%1L'*: +M.R^[^C4<H*SZ"!\OHE=&F8,'#F*U7<!&$%QQJ&$8KK*;S!#8\S_X-_&+N7>/ +MG=?SC_=L3J>[ZV_0?YTLQR/0,VJ`\B_I;I-CB7B:S%V_!]?4^@V7[)^-XU#! +MI7&AXL7736^O@*=']__/@Z`V+3;G5`WU+,W9O+D%;1U)Y>Y).*_![CO->^6. +MY4/]R&M<S/+:(!VF=J>VMNM'E]4O4W,[LNU;)IY9WSV!].P?%[4$@TG*=29S +MMC+A[N:.BJ@G(I;'D:N7:[UE)W=S2VVGBU5^XW:>GD6:.FTQWKPOX@@1(50\ +M"BUEF<*D>D%?JPYIH8ZN<I<TQDNJ4/K^$4\#!Q?GZN'S@V]?'UXK#N0&WG40 +MT=C!G-B:W4OCD89YJEC__@WJWU/J6NK!?^_XX,W!BY/[-P_5TZ>J0F1Y')/R +M,(I_XO%?A->"DR)H!\U7K$V1T*I?A6X-)^87<$#SZU>69-0XZ-EF<C>](D"R +M`@P4ALI]AHJR8/FP"%QL,Q_NJZ\8/.QW9YMXT/D`$!%MI)\W]VMA=*\`H&Q8 +MU:P,4,IX$3(E85PYBB=B[TVM7136_[",*;E,=#$'5]P2#!GQ(\QQ1BV(-$Y# +M!C*.6V(.'E5&G(JHXZ*0.[IRAHM&`,FQ,7L2K4S56J0O\2QI#]8DMF!9JRC. +M*8@!>]>JQI64.O_;W*P&-9D9%!=`J;)F5'$FE5K[E2Q3/QUI/5$=S^"&X3,W +M56]8KW1*IMKM('2,6&SKG$6".0\01WM#_2<?:K5VJ$=Y;?$T3C3A7S""C-*/ +MQY-@.NP-^95'D1Y7"6\&`YV`ULTBY42^HOF9T^L[1RFZQRH$G.DT66NW8"IL +M29R,G&3G-H@\+U?[,Z!;,3;/R<77$@6OJ+!N9^6<;+QUV.6T1+*S6XO%V:KP +M+EG&^K5G(GOM/2IE9].K?LJ@4?>)QU[]D.VQTI?M3,C8+G[H.'/T.^5O/%=D +M>XXVA<.?=#KLI\9FW`]PKS,D=A<G>C(*^J(EX<R2VLZQ14(!T9ZVP;^(O3*Z +MX"F3>EUPE;$%XIJ#,,I6J]?PS->U;#3K;NL5DG5[\<R87QH(/M)`!BQCUTER +MM@:)7H4:I!?=JZIMR%:.<I3_;>40V5<U@M8<$`V,]#\G!)$SPGK@NO"8TX:W +M>-]"?S^Q4\-Z%^_-(?.?V*73PA+].BSE$_MUF=*GU,=AFXC?!8RI40Z*!>KE +M?Z':,!?=0KC+QB);"QKN+=4*%C(:S%D0#?0H'G@>W@'(`J[R&\+O-%YY>T[* +M,K6[GTS[WPS&EWZHGWIM$KQQ%CJ%,T@0QA.(-"`Z$N<JQN,!TV36G^)\M8WK +MI=H\VP"F+0XK;75(%8SN;A7UBCM17IA$67YB@.A@%`9)J'XY/#A1X[X2P-/P +M9YJ'W^G>/7P9D5S!!A^>:GG3!<><`UH/#$EZIH81%/+9;+`07,Q49Z/I$&>- +M*IU-^.!,3@O9(H1(V@+^1^H]R91HV@0MOK7I5\-+=BX83K,+;K&Q5U"?0T2N +M#\V=#-QLH]9_I@QN?>?NU@,>N`PS:Y>IMKD,+!?_A^:JEX`;C6\L`!6[RD9L +M,1-_0V*->9A[T=H;?I=K4\VWP17>]UZN=H<RPB&_Q1RR^"^;)EOJG]FO*5&= +M;6GX.7CG8<RW<<Z"L=J/Y/=OQ!,5KU>CC]DD9$^&6'K9H"R6[G0FV;%@EPMJ +M(N*9/8>`HQ8.+Q+P^"!2WP:G4QKU_H!_EOKC!\AXPYQA)Z`U(X2+6,S/9N#> +M'+^?'<!]"U9)*K6VLM?M;J[7=?U<)Q$W=QP3A3A/_AO]14#=[^DD+G5/F,BH +M,34[UR&?:NTYX<3*SL;F]KI=9PZHNAQ`3PG7Q0H<Q1'[KRE615),H+.[MVX7 +MB]LV&_[5B'0;`MT/`4VA3\#9-SG^#P%GE#H1XH>73\8I?*?FW2MDU0T2!188 +M?`';A?<'5I=OW4.%BMJ38*"S57VI^VJ#H\<^67!5(;MG&Y#:_1-^3%CDE_%[ +MN)U%5B'C6ZQ&0C)P`.%3'>GMC3X]56_BLRA%5[_W?B_U8^U+-&3%0VZQ>#A@ +M!Z5X-IW,I@3FS=VMG74?R$WZ,N($H,S#E8?0\L9;F#H'L.6"3[@@QI^'(!PB +MS`+CQ+I]/CW34JPOC5B+X6.2BCEX;65KQ[3&W?:Z(KGV.KY+<S87G"E&E%E@ +M,8JR=,.DCA\5XN!57XHU!6YC-.XQ)@=DJ^U[04PN*X$$/58=!>9&N:-^GNQU +MUUUF0S1[F6Y`F0U7&,^B@6$`KY(A4=G1DGAXRHQF>C6):=,-,&*[V":TA+67 +M^X;[TOB[>QUG_),$'&V9+N-+"2MR<6Z86Q;'`B"RCA>$.!%3F47B6+J6?7X; +MZ5RK43#!I48)4I(2]9Q,KGS+47C8>\L,F]O$($TVP:.'9ZQ2/0G8MRTU%ZG! +M97PBAN"??QFAAOWEB#S"F=;C>!]BU"=IT-FD><M$QBM18--8VICH&-L)_IXZ +M2(?LV8HPMFCW3`^+/FT%#[W4=U=M8WMY1"F:?*R\QJ!AK4K>L2*Q/G95+=,I +MF&WWR6*[V;#47-V%C&OB3^LP,M/S+0'FII>:C_'@I`4<(P!V&D2Z2C$L2CFA +MA@VULMR7'?1HH8E$_Q6(6(MW3[)@+(;>\FIGDA<A#1Z?;G'D)=8G9J,ZO=.% +M6W<QN/7C)-&7_6GUB-)G`H43/FO"X^VL+_'`<]1G^S(;V_U<ZJ)^.PL#56%^ +M,_8?%%.BV=30%21#Y]ZF:LWZYHJ``NK%PMB"^#$<8P$)EGO^$W\S6R#@Q]LA +M8>/;_G<Z(M5D?SRF24??C(=1Y$=Z^M22=^YL9QF,R85+ZM$V`\XO.+VWJ#S' +MH,`:[+#P.#.^A*3DX94^XA&GI[*,_>GHRN(`ZVH=Z>?MD*098B_?^PZ$Y)=Q +MJ;-G++H(2O(M2BS*7-F'/>#Q;MW%&6RU[/..]9SE%]-1W]S2Q\N9[*\+5VD3 +MG\*\ZTF5V>B"\-FS49",KGQ7Z20I=-F)S-6Q!76,RL:MWDU:(,H!]]G,UN?+ +M`=@BA$V]810D\C32MM]]G!)I[^<8<V5HYIYZE\2XB4;:K_6DWB?VF99ZFL)/ +M?22D5XCTT/@(A[I%R-JB$E9PYM:[RR"2)@F>]FWHR`-IOI6HM<XRK5G*)'IR +M04DZ(G(B.+Y+XFD4#36I7PEN6NR'O_?*[22#LR^446#A`&W5?2`WG(5&@B,T +MY;.`W8U[VG0.P!#-ZM&.(N7-S(0[WUJT<V['ZN$,:.H5V^?=L^,7%@71I&S] +MA9O,)3O3..A!D`QCQ#8@1!!:RB>9LTF:Z1LA!.T9<XG#+,"(=;17:TRNS%_K +MOB*BFQ!>D!9'.PY:"FTC4HEL;!+,C'$M%<9!FQ278X"]CUBL?L075(C:_=-= +MN8V]!6<Z)LV_?!09]@@EV`J7\>109-I<GA&7<6;7MLX:5Y'EMJ)/%%^LP[9S +M='+P)2G1@X1-%T*RZQS^62C<\O=:^,?OM.3!"8GL!EEGRW^BUB`U'=,0OJ,. +M>GI*8A/]>Z$U:G:YQK:_L4[D=$8TMQ^`UAIYGT0T!,_WX`5QE;F^AS$$`L/; +M+:GD4<E5$<>=AS81J<S91'`T)E,!`;5SH$Y^+$X5XX)'.:*3JO2,!]:#U!CI +M3#KC93,(>I`,S]5)$M/^W=<7T[HU<WP;[&(Y)K+NYH+K+Q(>+ZX52'/;DRRE +MVQ7><>:IR8TKTJR+W*JSO5R_."ZP_1K%E$T;9B-5#/H8%>GI!;[26:K+.MNJ +MXJN$+OPV%J5\8A@*Q3*TY^_F]`A4D%C)&%1B*J(XBVKC'B)*RO=QP0BJTZPV +M>ZX?PRIB28]C!MC87`Q+F'HX>J,5"J%HC(?,M^-S;/%99'`\1W$V+@%_:USA +M!/9LW.LN,A((/[2N`RAM4R'V+34+K3F3!4*"7WM'K:7GP\D$?HK;7ZQG.CG4 +MELXB'8EMMDWL%X@*^O)L-#D+B.9F3(8-+Z($'+Y^GP7`2M=]5_!>#,+2782H +M9+)(?A.KXF\F>___^-W;SR'^0W>WT^'X#[O=)OY#DYK4I"8UJ4E-:E*3FM2D +M)C6I24UJ4I.:U*0F-:E)36I2DYK4I"8UJ4E-:E*3FM2D)C6I2?/2_P"5Y0%= +$`.`!```` +` +end diff --git a/contrib/start_dynamic_ppp b/contrib/start_dynamic_ppp new file mode 100644 index 00000000..7ceeddb3 --- /dev/null +++ b/contrib/start_dynamic_ppp @@ -0,0 +1,16 @@ +#!/bin/sh +# setup hostname in /etc/hosts. use IP if no name available. +echo cyberhq > /tmp/local_name +echo $4 > /tmp/ip +host $4 | fgrep Name | cut -c7- > /tmp/ip_name +if [ ! -s /tmp/ip_name ]; then + echo $4 > /tmp/ip_name +fi +cat /tmp/ip_name > /etc/sendmail.cw +paste /tmp/ip /tmp/ip_name /tmp/local_name > /tmp/host_bottom +cat /etc/hosts.top /tmp/host_bottom > /etc/hosts +rm /tmp/ip /tmp/ip_name /tmp/host_bottom /tmp/local_name +# Restart sendmail with new name. +kill -HUP `head -1 /var/run/sendmail.pid` +# Start fetchmail as root to fetch our mail. +fetchmail diff --git a/contrib/toprocmail b/contrib/toprocmail new file mode 100644 index 00000000..159c0b38 --- /dev/null +++ b/contrib/toprocmail @@ -0,0 +1,46 @@ +#!/usr/bin/perl + +# fetchmail -> procmail pretti-fier proxy thingamajig +# ver. 2000-04-01 +# +# John Lim Eng Hooi <jleh@mail.com> +# + +# Where's procmail located? +$proc_path = '/usr/bin/procmail'; + +# Define your ANSI color codes here, I've only bothered to define +# those I use :) +$ANSI_green = "\e[0;32m"; +$ANSI_b_white = "\e[1;37m"; +$ANSI_normal = "\e[0;39m"; + +# Open up procmail +open (PROCPIPE, "|$proc_path") || die "Can't open procmail pipe!"; + +# Analyze the message line by line +while (<STDIN>) { + + # Suck up the lines we want, in this case I just want From: and Subject: + if (/^From:/) { + $from = $_; + } + + if (/^Subject:/) { + $subj = $_; + } + + # Stuff it out to the pipe too + print PROCPIPE; +} + +# Print it out +print "\n"; +print $ANSI_green, " ", $from; +print $ANSI_b_white, " ", $subj, $ANSI_normal; + +# fetchmail's status is appended after this +print " -->"; + +# We're done +close (PROCPIPE); diff --git a/contrib/zsh-completion b/contrib/zsh-completion new file mode 100644 index 00000000..c5e653f4 --- /dev/null +++ b/contrib/zsh-completion @@ -0,0 +1,20 @@ +# Set up command completion for zsh +# +fetchmailauthtypes=(password kerberos kerberos_v5) +fetchmailprotocols=(auto pop2 pop3 apop rpop kpop sdps imap imap-k4 imap-gss etrn) +function fetchmailformattedinterfaces () +{ reply=(`ifconfig|perl -e '$/="";while(<>){s/[\r\n]//g;if(/^(\w+\d*).*inet addr:([\d\.]+)/){print "$1/$2\n";}}'`) } +function fetchmailcompctl () +{ reply=(`awk '{ print $2 }' < ~/.fetchmailrc` `fetchmail --help 2>&1| cut -c 7-19 | sed "s/,//g"`) } +compctl -K fetchmailcompctl \ + -x "C[-1,-L|--logfile]" -f \ + - "C[-1,-f|--fetchmailrc]" -f \ + - "C[-1,-i|--idfile]" -f \ + - "C[-1,-I|--interface]" -K fetchmailformattedinterfaces \ + - "C[-1,-M|--monitor]" -K fetchmailformattedinterfaces \ + - "C[-1,-p|--protocol]" -k fetchmailprotocols \ + - "C[-1,-A|--auth]" -k fetchmailauthtypes \ + - "c[-1,--plugin]" -m \ + - "c[-1,--plugout]" -m \ + -- fetchmail + |