From c3a80da98846c21a5d3f32a91669d78774a0aa6a Mon Sep 17 00:00:00 2001 From: Graham Wilson Date: Mon, 30 Aug 2004 01:34:48 +0000 Subject: Move a handful of scripts (used for releases, testing, etc.) to dist-tools, so that they are not released in the tarball. svn path=/trunk/; revision=3934 --- dist-tools/getstats.py | 18 + dist-tools/growthplot | 114 +++++ dist-tools/indexgen.sh | 386 +++++++++++++++ dist-tools/listsize | 36 ++ dist-tools/makerelease | 176 +++++++ dist-tools/test/test-request | 20 + dist-tools/test/testmail | 10 + dist-tools/test/testmda | 10 + dist-tools/test/testrc | 14 + dist-tools/test/testservers-gen.sh | 57 +++ dist-tools/test/testservers.html | 64 +++ dist-tools/test/torturetest.glade | 976 +++++++++++++++++++++++++++++++++++++ dist-tools/test/torturetest.gladep | 7 + dist-tools/test/torturetest.py | 326 +++++++++++++ dist-tools/timeplot | 40 ++ dist-tools/timeseries | 101 ++++ dist-tools/upload | 26 + dist-tools/uploadfaq | 24 + getstats.py | 18 - growthplot | 114 ----- indexgen.sh | 386 --------------- listsize | 36 -- makerelease | 176 ------- test-request | 20 - testmail | 10 - testmda | 10 - testrc | 14 - testservers-gen.sh | 57 --- testservers.html | 64 --- timeplot | 40 -- timeseries | 101 ---- torturetest.glade | 976 ------------------------------------- torturetest.gladep | 7 - torturetest.py | 326 ------------- upload | 26 - uploadfaq | 24 - 36 files changed, 2405 insertions(+), 2405 deletions(-) create mode 100755 dist-tools/getstats.py create mode 100755 dist-tools/growthplot create mode 100755 dist-tools/indexgen.sh create mode 100755 dist-tools/listsize create mode 100755 dist-tools/makerelease create mode 100644 dist-tools/test/test-request create mode 100755 dist-tools/test/testmail create mode 100755 dist-tools/test/testmda create mode 100644 dist-tools/test/testrc create mode 100755 dist-tools/test/testservers-gen.sh create mode 100644 dist-tools/test/testservers.html create mode 100644 dist-tools/test/torturetest.glade create mode 100644 dist-tools/test/torturetest.gladep create mode 100755 dist-tools/test/torturetest.py create mode 100755 dist-tools/timeplot create mode 100755 dist-tools/timeseries create mode 100755 dist-tools/upload create mode 100755 dist-tools/uploadfaq delete mode 100755 getstats.py delete mode 100755 growthplot delete mode 100755 indexgen.sh delete mode 100755 listsize delete mode 100755 makerelease delete mode 100644 test-request delete mode 100755 testmail delete mode 100755 testmda delete mode 100644 testrc delete mode 100755 testservers-gen.sh delete mode 100644 testservers.html delete mode 100755 timeplot delete mode 100755 timeseries delete mode 100644 torturetest.glade delete mode 100644 torturetest.gladep delete mode 100755 torturetest.py delete mode 100755 upload delete mode 100755 uploadfaq diff --git a/dist-tools/getstats.py b/dist-tools/getstats.py new file mode 100755 index 00000000..f957c7d3 --- /dev/null +++ b/dist-tools/getstats.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# +# Collect statistics on current release. + +import commands, string, ftplib + +# Get version and date +date = commands.getoutput("date") +ln = commands.getoutput("co -p RCS/*.[chly],v 2>/dev/null | wc -l") +vers = commands.getoutput("sed -n -e '/VERSION/s/VERSION *= *\\(.*\\)/\\1/p' $tmp/growthplot$$ +grep "^[0-9]" $tmp/growthplot$$ >$tmp/growthnumbers$$ +grep "^[0-9.]*.[05].0 " $tmp/growthplot$$ >$tmp/growthmajors$$ +sed '/^4.2.9/,$d' <$tmp/growthnumbers$$ >$tmp/growthannounce$$ + +# gnuplot line styles. These occasionally change (like beteween 3.5 and 3.7); +# use "echo 'set terminal png; test' | gnuplot | display -" to check. +blue_boxes=3 +green_crosses=2 +cyan_diamonds=37 # Once purple triangles, but we can't do that anymore +brown_triangles=23 + +cat >$tmp/growthimage$$ <lasttotal)) + then + # Label over curve hanging right, arrow down + arrowhead=$((lasttotal+50)) + echo "set label '$legend' at $lastday-10, $endy+15" + else + # Label under curve hanging left, arrow up + arrowhead=$((lasttotal-5)) + strlen=`python -c "print len('$legend')"` + lablen=$((strlen*22)) + echo "set label '$legend' at $lastday-$lablen+10, $endy-15" + fi + echo set arrow \ + from $lastday, $endy \ + to $lastday, $arrowhead \ + head + else + set -- $legend + size=$1 + friends=$2 + announce=$3 + total=$4 + days=$5 + date=$6 + lastday=$days + lasttotal=$total + fi + done +) <$tmp/growthplot$$ >>$tmp/growthimage$$ + +# OK, now write the major-release labels +( + while read version size friends announce total days date + do + echo "set arrow from $days, $total - 55 to $days, $total - 15 head" + echo "set label '$version' at $days - 5, $total - 65" + done +) <$tmp/growthmajors$$ >>$tmp/growthimage$$ + +cat >>$tmp/growthimage$$ <growth.png + +rm -f $tmp/growth* +rmdir $tmp + +# growthplot ends here + + + + + + + diff --git a/dist-tools/indexgen.sh b/dist-tools/indexgen.sh new file mode 100755 index 00000000..0fac4259 --- /dev/null +++ b/dist-tools/indexgen.sh @@ -0,0 +1,386 @@ +#!/bin/sh +# +# indexgen.sh -- generate current version of fetchmail home page. +# +goldvers="6.2.0" +goldname="6.2.0" +version=`sed -n >checksums +done + +if [ $version != $goldvers ] +then + for file in fetchmail-$goldvers.tar.gz fetchmail-$goldvers-1.*.rpm + do + md5sum $file | sed -e "s: .*/: :" >>checksums + done +fi + +# Cryptographically sign checksums +gpg --clearsign checksums +mv checksums.asc checksums + +cat >index.html < + + + + + + + + +The fetchmail home page + + + + + + + +
+ +

The fetchmail Home Page

+ + +

Note: if you are a stranded fetchmail.com user, we're sorry but +we have nothing to do with that site and cannot help you. It's just an +unfortunate coincidence of names.

+ +

What fetchmail does:

+ +

Fetchmail is a full-featured, robust, well-documented +remote-mail retrieval and forwarding utility intended to be used over +on-demand TCP/IP links (such as SLIP or PPP connections). It supports +every remote-mail protocol now in use on the Internet: POP2, POP3, +RPOP, APOP, KPOP, all flavors of IMAP, ETRN, and ODMR. It can even +support IPv6 and IPSEC.

+ +

Fetchmail retrieves mail from remote mail servers and forwards it via +SMTP, so it can then be read by normal mail user agents such as mutt, elm(1) or BSD Mail. +It allows all your system MTA's filtering, forwarding, and aliasing +facilities to work just as they would on normal mail.

+ +

Fetchmail offers better security than any other Unix remote-mail +client. It supports APOP, KPOP, OTP, Compuserve RPA, Microsoft NTLM, +and IMAP RFC1731 encrypted authentication methods including CRAM-MD5 +to avoid sending passwords en clair. It can be configured to support +end-to-end encryption via tunneling with ssh, the Secure Shell.

+ +

Fetchmail can be used as a POP/IMAP-to-SMTP gateway for an entire DNS +domain, collecting mail from a single drop box on an ISP and +SMTP-forwarding it based on header addresses. (We don't really +recommend this, though, as it may lose important envelope-header +information. ETRN or a UUCP connection is better.)

+ +

Fetchmail can be started automatically and silently as a system daemon +at boot time. When running in this mode with a short poll interval, +it is pretty hard for anyone to tell that the incoming mail link is +not a full-time "push" connection.

+ +

Fetchmail is easy to configure. You can edit its dotfile directly, or +use the interactive GUI configurator (fetchmailconf) supplied with the +fetchmail distribution. It is also directly supported in linuxconf +versions 1.16r8 and later.

+ +

Fetchmail is fast and lightweight. It packs all its standard +features (POP3, IMAP, and ETRN support) in ${fetchmailsize}K of core on a +Pentium under Linux.

+ +

Fetchmail is open-source +software. The openness of the sources is your strongest possible +assurance of quality and reliability.

+ +

Where to find out more about fetchmail:

+ +

See the Fetchmail Feature List for more +about what fetchmail does.

+ +

See the on-line manual page for +basics.

+ +

See the HTML Fetchmail FAQ for +troubleshooting help.

+ +

See the Fetchmail Design Notes +for discussion of some of the design choices in fetchmail.

+ +

See the project's To-Do list for indications +of known problems and requested features.

+ +

How to get fetchmail:

+ +

You can get any of the following leading-edge resources here:

+ + +

MD5 checksums are available for these files; the +checksum file is cryptographically signed and can be verified with the +command:

+ +
+gpg --verify checksums
+
+ +EOF + +if [ $version != $goldvers ] +then + cat >>index.html <Or you can get the last \`gold' version, $goldname:

+ + +

The detached GPG +signature for the binary tarball can be used to check it for +correctness, with the command

+ +
+gpg --verify fetchmail-$goldvers.tar.gz.asc fetchmail-$goldvers.tar.gz
+
+ +

For differences between the leading-edge $version and gold $goldname versions, +see the distribution NEWS file.

+EOF +fi + +cat >>index.html <(Note that the binary RPMs don't have the POP2, OTP, IPv6, Kerberos, +GSSAPI, Compuserve RPA, Microsoft NTLM, or GNU gettext +internationalization support compiled in. To get any of these you +will have to build from sources.)

+ +

The latest version of fetchmail is also carried in the + +Metalab remote mail tools directory.

+ +

Getting help with fetchmail:

+ +

There is a fetchmail-friends list for people who want to discuss +fixes and improvements in fetchmail and help co-develop it. It's a +MailMan list, which you can sign up for at +fetchmail-friends@ccil.org. There is also an announcements-only +list, +fetchmail-announce@lists.ccil.org.

+ +

Note: before submitting a question to the list, please read +the FAQ (especially item G3 on how to report bugs). We +tend to get the same three newbie questions over and over again. The +FAQ covers them like a blanket.

+ +

Fetchmail was written and is maintained by Eric S. Raymond. There are some designated +backup maintainers (Rob Funk, David DeSimone aka Fuzzy Fox, +Dave Bodenstab and Sunil Shetye). Other backup +maintainers may be added in the future, in order to ensure continued +support should Eric S. Raymond drop permanently off the net for any +reason.

+ +

You can help improve fetchmail:

+ +

I welcome your code contributions. But even if you don't write code, +you can help fetchmail improve.

+ +

If you administer a site that runs a post-office server, you may be +able help improve fetchmail by lending me a test account on your site. +Note that I do not need a shell account for this purpose, just a +maildrop. Nor am I interested in collecting maildrops per se -- +what I'm collecting is different kinds of servers.

+ +

Before each release, I run a test harness that sends date-stamped +test mail to each site on my regression-test list, then tries to +retrieve it. Please take a look at my +list of test servers. If you can lend me an account on a kind +of server that is not already on this list, please do.

+ +

Who uses fetchmail:

+ +

Fetchmail entered full production status with the 2.0.0 version in +November 1996 after about five months of evolution from the ancestral +popclient utility. It has since come into extremely wide use +in the Internet/Unix/Linux community. The Red Hat, Debian and +Suse Linux distributions and their derivatives all include it. A +customized version is used at Whole Earth 'Lectronic Link. Several +large ISPs are known to recommend it to Unix-using SLIP and PPP +customers.

+ +

Somewhere around a thousand people have participated on the fetchmail +beta lists (at time of current release there were $subscribers on the +friends and announce lists). While it's hard to count the users of +open-source software, we can estimate based on (a) population figures +at the WELL and other known fetchmail sites, (b) the size of the +Linux-using ISP customer base, and (c) the volume of fetchmail-related +talk on USENET. These estimates suggest that daily fetchmail users +number well into the hundreds of thousands, and possibly over a million.

+ +

The sociology of fetchmail:

+ +

The fetchmail development project was a sociological experiment as well +as a technical effort. I ran it as a test of some theories about why the +Linux development model works.

+ +

I wrote a paper, The +Cathedral And The Bazaar, about these theories and the project. +I developed the line of analysis it suggested in two later essays. +These papers became quite popular and (to my continuing astonishment) may +have actually helped change the world. Chase the title link, above, +for links to all three papers.

+ +

I have done some analysis on the information in the project NEWS file. +You can view a statistical history showing +levels of participation and release frequency over time.

+ +

Recent releases and where fetchmail is going:

+ +

Fetchmail is now sufficiently stable and effective that I'm getting +very little pressure to fix things or add features. Development has +slowed way down, release frequency has dropped off, and we're +basically in maintainance mode.

+ +

Major changes or additions therefore seem unlikely until there are +significant changes in or additions to the related protocol RFCs.

+ +

Where you can use fetchmail:

+ +

The fetchmail code was developed under Linux, but has also been +extensively tested under 4.4BSD, SunOS, Solaris, AIX, and NEXTSTEP. It +should be readily portable to other Unix variants (it requires only +POSIX plus BSD sockets, and uses GNU autoconf).

+ +

Fetchmail is supported only for Unix by its official maintainers. +However, it is reported to build and run correctly under BeOS, +AmigaOS, Rhapsody, and QNX as well. There is a CygWin port.

+ +

Related resources:

+ +

Jochen Hayek is developing a set of + +IMAP tools in Python that read your .fetchmailrc file and are +designed to work with fetchmail. Jochen's tools can report selected +header lines, or move incoming messages to named mailboxes based on +the contents of headers.

+ +

Donncha O Caoihm has written a Perl script called +install-sendmail +that assists you in installing sendmail and fetchmail together.

+ +

Peter Hawkins has written a script called gotmail that +can retrieve Hotmail. Another script, yosucker, can retrieve +Yahoo webmail.

+ +

There's a program called +mailfilter which can be used +to do span filtering, that works particularly well called from fetchmail's +preconnect directive,

+ +

A hacker identifying himself simply as \`Steines' has written a +filter which rewrites the to-line with a line which only includes +receipients for a given domain and renames the old to-line. It also +rewrites the domain-part of addresses if the offical domain is +different from the local domain. You can find it here.

+ +

Fetchmail's funniest fan letter:

+ +This letter still cracks me up whenever I reread it. + +

The fetchmail button:

+ +

If you use fetchmail and like it, here's a nifty fetchmail button you +can put on your web page:

+ +
fetchmail logo
+ +

Thanks to Steve +Matuszek for the graphic design. The hand in the button (and the +larger top-of-page graphic) was actually derived from a color scan of +the fetchmail author's hand.

+ +

Fetchmail mirror sites:

+ +

There is a FTP mirror of the current sources and RPMs in Japan at + +ftp://ftp.win.ne.jp/pub/network/mail/fetchmail. + +

Reviews and Awards

+ +

Fetchmail was DaveCentral's Best Of Linux winner for +June 30 1999.

+ +

Fetchmail was a five-star Editor's Pick at Softlandindia.

+ +
+ + + +EOF + +# The following sets edit modes for GNU EMACS +# Local Variables: +# mode:html +# truncate-lines:t +# End: diff --git a/dist-tools/listsize b/dist-tools/listsize new file mode 100755 index 00000000..73e25887 --- /dev/null +++ b/dist-tools/listsize @@ -0,0 +1,36 @@ +#!/bin/sh +# +# Mine list sizes from MailMan web interfaces +# +# * Must set environment variable FETCHMAIL_LIST_PASS to list admin password + +project="fetchmail" +admin="http://lists.berlios.de/mailman/admin" +adminpw=$FETCHMAIL_LIST_PASS + +list="$1" +if [ ! "$list" ]; then + echo "Usage: $0 list" 1>&2 + exit 1 +fi +case "$list" in +$project-*) + # already gave us the full name, e.g. fetchmail-announce + ;; +*) + # only gave us the last part of the name, e.g. announce + list="$project-$list" + ;; +esac + +hexpw=`echo "$adminpw" | od -t x1 -w64 | sed -e 's/^[0-9]*//' -e '/^ *$/d' -e 's/ /%/g'` +umask 077 +tmp="/tmp/$project-$list.listsize.$$" +# First get the login cookie... +curl -s -D "$tmp" "$admin/${list}?adminpw=$hexpw" >/dev/null +# Second gets the actual stat +curl -s -b "$tmp" "$admin/${list}/members" \ + | sed -n '/.*>(\([0-9][0-9]*\) members total.*/s//\1/p' +rm -f "$tmp" +# end + diff --git a/dist-tools/makerelease b/dist-tools/makerelease new file mode 100755 index 00000000..41ddf038 --- /dev/null +++ b/dist-tools/makerelease @@ -0,0 +1,176 @@ +#!/usr/bin/env perl +# +# Make a fetchmail release. Must be run as root, to make RPMs. +# Dumps a release notice and diffs as a MIME multipart message +# in RELEASE_NOTES +# +use POSIX qw(strftime); +$timezone = strftime('%z', localtime) || "-0500"; +$tmp = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || "/tmp"; + +$project = "fetchmail"; +$svnrepos = "svn://svn.berlios.de/$project"; +$website = "http://developer.berlios.de/projects/$project"; +$mailfrom = "<$project-devel-owner\@lists.berlios.de> (Fetchmail Development Team)"; + +# parse options +$diffs = 0; +$verbose = 0; +$null = ">/dev/null"; +$errnull = "2>/dev/null"; +while ($i = shift @ARGV) +{ + if ($i =~ /^(--diffs|-d)$/i) + { + $diffs = 1; + next; + } + + if ($i =~ /^(--verbose|-v)$/i) + { + $verbose = 1; + $null = ""; + next; + } + + die "Error: Unknown option: $i\n"; +} + +# extract version from source +$version=`grep 'AC_INIT' configure.in`; +$version =~ /AC_INIT\([^,]*,\[?([0-9.]+)\]?\)/; +$version = $1; +die "cannot determine version" unless defined $1; +$tag = "RELEASE_$version"; +$tag =~ tr/./-/; + +# extract existing tags +open(ID, "svn ls $svnrepos/tags|"); +while () { + if (m{^(RELEASE_.*)/}) { + unshift(@versions, $1); + } +} +close(ID); + +if ($versions[0] eq $tag) { + $tag = $versions[0]; + $oldtag = $versions[1]; +} else { + $tag = ''; + $oldtag = $versions[0]; +} + +$ENV{PATH} .= ":./dist-tools:./dist-tools/shipper:."; + +print "Building $version release, tag $tag, previous tag $oldtag\n"; + +if (-d autom4te.cache) { + system("rm -rf autom4te.cache") + and die "Failure in removing autom4te.cache"; +} + +if (system("autoreconf -isv")) { + die("Failure in regenerating autoconf files\n"); +} + +if (system("./configure && make clean && make -C po update-po && make clean")) { + die("Failure in translation-file rebuild\n"); +} + +print "### Test-building the software...\n"; +if (system("./configure && make clean && make all check")) { + die("Compilation failure\n"); +} + +print "### Building the distribution...\n"; +if (system("make dist $null")) { + die("Distribution-build failure\n"); +} + +print "### Building the RPMs...\n"; +if (system("buildrpms $project-${version}.tar.gz $null")) { + die("RPM-build failure\n"); +} + +open(REPORT, ">$tmp/$project.PREAMBLE.$$"); + +print REPORT <. + +The source archive is available at: + + +Here are the release notes: + +EOF + +# Extract the current notes +open(NEWS, "NEWS"); +while () { + if (/^$project/) { + print REPORT $_; + last; + } +} +while () { + if (/^$project/) { + last; + } + print REPORT $_; +} + +$oldver = $oldtag; +$oldver =~ tr/-/./; +$oldver =~ s/^RELEASE_//; + +if ($diffs) { + print REPORT "Diffs from the previous ($oldver) release follow as a MIME attachment." +} else { + print REPORT "By popular demand, diffs from the previous release have been omitted." +} + +close(NEWS); + +close(REPORT); + +if ($tag eq '') { + system("svn diff -r$oldtag $errnull >$tmp/$project.DIFFS.$$"); +} else { + system("svn diff -r$oldtag -r$tag $errnull >$tmp/$project.DIFFS.$$"); +} +print "Diff size:"; +system("wc <$tmp/$project.DIFFS.$$"); + +if ($diffs) { + system "metasend -b" + ." -D '$project-$tag announcement' -m 'text/plain' -e 7bit -f $tmp/$project.PREAMBLE.$$" + ." -n -D 'diff between $oldver and $version' -m 'text/plain' -e 7bit -f $tmp/$project.DIFFS.$$" + ." -o ANNOUNCE.EMAIL"; +} else { + rename("$tmp/$project.PREAMBLE.$$", "ANNOUNCE.EMAIL"); +} +#system("chown esr ANNOUNCE.EMAIL"); +#chmod(0700, "ANNOUNCE.EMAIL"); + +#unlink("$tmp/$project.PREAMBLE.$$"); +unlink("$tmp/$project.DIFFS.$$"); + +print "Building index page...\n"; +system("rm -f index.html; indexgen.sh"); + +if (-r "testsites") { + print "Building test server list...\n"; + system("rm -f testservers.html; testservers-gen.sh >testservers.html"); +} + +print "Making activity graph..."; +system "growthplot"; + +print "Done\n"; + +# makerelease ends here diff --git a/dist-tools/test/test-request b/dist-tools/test/test-request new file mode 100644 index 00000000..160c1885 --- /dev/null +++ b/dist-tools/test/test-request @@ -0,0 +1,20 @@ +I maintain an open-source POP and IMAP client called fetchmail. It is +widely used in the Linux and open-source community, and is probably +the single most popular remote-mail client in that world. You can +find out more about this project at +. + +In order to be able to do thorough regression testing before each release, +I collect test accounts on as many different kinds of POP3, IMAP, and +ODMR servers as possible. Because fetchmail is strictly conformant to the +remote-mail RFCs, many server developers have found fetchmail a useful +standards-conformance test. + +I'm writing to request test accounts on your server. I support all flavors +of POP2, POP3, IMAP and ODMR with either plain-password, CRAM-MD5, NTLM, +GSSAPI, or Kerberos authentication. I also support SSL/TLS. + +It would be very helpful if I could have a separate test account for +each protocol you support (that is, separate POP3, IMAP, and ODMR +accounts) so I can do automated regression testing without worrying +about mailbox race conditions. diff --git a/dist-tools/test/testmail b/dist-tools/test/testmail new file mode 100755 index 00000000..7941892e --- /dev/null +++ b/dist-tools/test/testmail @@ -0,0 +1,10 @@ +#!/bin/sh +size=${1:-0} + +( +echo "This mail was generated on "`date`"." + +) | mail -s "${size}k test mail from process $$" esr@ccil.org + + </tmp/testmda$$ +echo "[text is "`wc -c + + + + + + +Fetchmail's Test List + + + +
Back to Eric's Home Page +Up to Site Map +${date} +
+
+

Fetchmail's Test List

+ +

Here are the server types on my regression-test list:

+ + + + + + +EOF +torturetest.py -t +cat <
Protocol & Version:Special Options:
+ +

If you control a post-office server that is not one of the types listed +here, please consider lending me a test account. Note that I do not +need shell access, just the permissions to send mail to a mailbox the server +looks at and to fetch mail off of it.

+ +

I'd like to have weird things like a POP2 server on here. Also more +closed-source servers because they tend to be broken in odd +ways. These are the real robustness tests.

+ +
+ +
Back to Eric's Home Page +Up to Site Map +${date} +
+ +
+
Eric S. Raymond <esr@thyrsus.com>
+ + +EOF + diff --git a/dist-tools/test/testservers.html b/dist-tools/test/testservers.html new file mode 100644 index 00000000..62dc9e7b --- /dev/null +++ b/dist-tools/test/testservers.html @@ -0,0 +1,64 @@ + + + + + + + +Fetchmail's Test List + + + +
Back to Eric's Home Page +Up to Site Map +Mon Jan 12 15:52:14 EST 2004 +
+
+

Fetchmail's Test List

+ +

Here are the server types on my regression-test list:

+ + + + + + + + + + + + + + + + + + + + + + +
Protocol & Version:Special Options:
IMAP: CommuniGate IMAP serverIMAPrev1 STARTTLS AUTH=CRAM-MD5 AUTH=DIGEST-MD5
POP3: CommuniGate POP3 serverCAPA LAST APOP CRAM-MD5
POP3: IntraStore POP3 mail server!CAPA LAST
APOP: IntraStore POP3 mail server!CAPA LAST APOP
IMAP: IntraStore IMAP mail serverIMAPrev1 IDLE AUTH=CRAM-MD5 AUTH=SKEY AUTH=ANONYMOUS
POP3: Eudora EIMSCAPA LAST APOP SASL CRAM-MD5 NTLM
POP3: gmx.de pop server!CAPA UIDL
IMAP: IMail IMAP serverIMAP4rev1 AUTH=CRAM-MD5
IMAP: Microsoft ExchangeIDLE AUTH=NTLM
POP3: qpopper 3.1.2 (Eudora) patched with mysqlCAPA UIDL
IMAP: Courier IMAPIMAP4rev1
POP3: Courier POP3CAPA UIDL
APOP: Qpopper using APOP!CAPA
IMAP: UW IMAPIMAPrev1
IMAP: Courier IMAPIMAP4rev1
POP3: Qpopper 4.0.5CAPA UIDL
+ +

If you control a post-office server that is not one of the types listed +here, please consider lending me a test account. Note that I do not +need shell access, just the permissions to send mail to a mailbox the server +looks at and to fetch mail off of it.

+ +

I'd like to have weird things like a POP2 server on here. Also more +closed-source servers because they tend to be broken in odd +ways. These are the real robustness tests.

+ +
+ +
Back to Eric's Home Page +Up to Site Map +Mon Jan 12 15:52:14 EST 2004 +
+ +
+
Eric S. Raymond <esr@thyrsus.com>
+ + diff --git a/dist-tools/test/torturetest.glade b/dist-tools/test/torturetest.glade new file mode 100644 index 00000000..d2cf07ee --- /dev/null +++ b/dist-tools/test/torturetest.glade @@ -0,0 +1,976 @@ + + + + + + + True + torturetest + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + + + + + True + False + 0 + + + + True + False + 0 + + + + True + Site select: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + + True + GTK_SELECTION_BROWSE + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + + + 0 + True + True + + + + + + True + 9 + 2 + False + 0 + 0 + + + + True + Sitename: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Mail Address: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Username: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + Password: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 1 + 2 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 3 + 4 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 8 + 9 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 7 + 8 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 6 + 7 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 5 + 6 + + + + + + + True + Comment: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 8 + 9 + fill + + + + + + + True + Recognition: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 7 + 8 + fill + + + + + + + True + Capabilities: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 6 + 7 + fill + + + + + + + True + Options: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + Protocol: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 0 + 1 + + + + + + + True + False + 0 + + + + True + True + 0 + + + + True + True + POP3 + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + + True + True + APOP + True + GTK_RELIEF_NORMAL + False + False + True + POP3_radiobutton + + + 0 + False + False + + + + + + True + True + IMAP + True + GTK_RELIEF_NORMAL + False + False + True + POP3_radiobutton + + + 0 + False + False + + + + + 0 + True + True + + + + + + True + + + 0 + True + True + + + + + + True + True + SSL + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + True + True + + + + + 1 + 2 + 4 + 5 + fill + fill + + + + + 0 + False + False + + + + + + True + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_DEFAULT_STYLE + 0 + + + + True + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-apply + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Update + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + + True + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-new + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + New + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + + True + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-execute + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Test + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + + True + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-quit + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Quit + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + + True + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-print + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Dump + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + False + + + + + + + diff --git a/dist-tools/test/torturetest.gladep b/dist-tools/test/torturetest.gladep new file mode 100644 index 00000000..d44797c3 --- /dev/null +++ b/dist-tools/test/torturetest.gladep @@ -0,0 +1,7 @@ + + + + + torturetest + torturetest + diff --git a/dist-tools/test/torturetest.py b/dist-tools/test/torturetest.py new file mode 100755 index 00000000..f8a3535c --- /dev/null +++ b/dist-tools/test/torturetest.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python2 + +import sys, getopt, os, smtplib, commands, time, gtk, gtk.glade + +protocols = ('POP3', 'APOP', 'IMAP',) + +class TestSite: + temp = "/usr/tmp/torturestest-%d" % os.getpid() + + def __init__(self, line=None): + "Initialize site data from the external representation." + self.host = "" + self.mailaddr = "" + self.username = "" + self.password = "" + self.protocol = "" + self.ssl = "" + self.options = "" + self.capabilities = "" + self.recognition = "" + self.comment = "" + if line: + (self.host, self.mailaddr, self.username, self.password, \ + self.protocol, self.ssl, self.options, self.capabilities, \ + self.recognition, self.comment) = \ + line.strip().split(":") + if not self.mailaddr: + self.mailaddr = self.username + # Test results + self.status = None + self.output = None + + def allattrs(self): + "Return a tuple consisting of all this site's attributes." + return (self.host, self.mailaddr, self.username, self.password, \ + self.protocol, self.ssl, self.options, self.capabilities, \ + self.recognition, self.comment) + + def __repr__(self): + "Return the external representation of this site's data." + return ":".join(self.allattrs()) + + def prettyprint(self): + "Prettyprint a site entry in human-readable form." + return "Host: %s\n" \ + "Mail To: %s\n" \ + "Username: %s\n" \ + "Password: %s\n" \ + "Protocol: %s\n" \ + "SSL: %s\n" \ + "Options: %s\n" \ + "Capabilities: %s\n" \ + "Recognition: %s\n" \ + "Comment: %s\n" \ + % self.allattrs() + + def entryprint(self): + "Print a .fetchmailrc entry corresponding to a site entry." + rep = "poll %s-%s via %s with proto %s %s\n" \ + " user %s there with password '%s' is esr here" \ + % (self.host,self.protocol,self.host,self.protocol,self.options,self.username,self.password) + if self.ssl and self.ssl != 'False': + rep += " options ssl" + rep += "\n\n" + return rep + + def tableprint(self): + "Print an HTML server-type table entry." + return "%s: %s%s\n" \ + % (self.protocol, self.comment, self.capabilities) + + def id(self): + "Identify this site." + rep = "%s %s at %s" % (self.protocol, self.recognition, self.host) + if self.capabilities: + rep += " (" + self.capabilities + ")" + if self.options: + rep += " using " + self.options + return rep + + def testmail(self, n=None): + "Send test mail to the site." + server = smtplib.SMTP("localhost") + fromaddr = "esr@thyrsus.com" + if self.mailaddr.find("@") > -1: + toaddr = self.mailaddr + else: + toaddr = "%s@%s" % (self.mailaddr, self.host) + msg = ("From: %s\r\nTo: %s\r\n\r\n" % (fromaddr, toaddr)) + if n != None: + msg += `n` + ": " + msg += "Test mail collected from %s.\n" % (self.id(),) + server.sendmail(fromaddr, toaddr, msg) + server.quit() + + def fetch(self, logfile=False): + "Run a mail fetch on this site." + try: + ofp = open(TestSite.temp, "w") + if logfile: + mda = "(echo; echo \'From torturetest\' `date`;cat) >>TEST.LOG" + else: + mda = 'cat' + ofp.write('defaults mda "%s"\n' % mda) + ofp.write(self.entryprint()) + ofp.close() + (self.status, self.output) = commands.getstatusoutput("fetchmail -d0 -v -f - <%s"%TestSite.temp) + if self.status: + os.system("cat " + TestSite.temp) + finally: + os.remove(TestSite.temp) + + def failed(self): + "Did we have a test failure here?" + return os.WIFEXITED(self.status) and os.WEXITSTATUS(self.status) > 1 + + def explain(self): + "Explain the status of the last test." + if not os.WIFEXITED(self.status): + return self.id() + ": abnormal termination\n" + elif os.WEXITSTATUS(self.status) > 1: + return self.id() + ": %d\n" % os.WEXITSTATUS(self.status) + self.output + else: + return self.id() + ": succeeded\n" + +class TortureGUI: + "Torturetest editing GUI," + + # All site parameters except protocol + field_map = ('host', 'mailaddr', 'username', 'password', \ + 'options', 'capabilities', 'recognition', 'comment') + + def __init__(self): + # Build the widget tree from the glade XML file. + self.wtree = gtk.glade.XML("torturetest.glade") + # File in initial values + self.combo = self.wtree.get_widget("combo1") + self.combo.set_popdown_strings(map(lambda x: x.comment, sitelist)) + self.sslcheck = self.wtree.get_widget("ssl_checkbox") + self.site = sitelist[0] + self.display(self.site) + + # Provide handlers for the widget tree's events + mydict = {} + for key in ('on_torturetest_destroy', + 'on_updatebutton_clicked', + 'on_newbutton_clicked', + 'on_testbutton_clicked', + 'on_quitbutton_clicked', + 'on_dumpbutton_clicked', + 'on_combo_entry1_activate'): + mydict[key] = getattr(self, key) + self.wtree.signal_autoconnect(mydict) + + gtk.mainloop() + print `self.site` + + def get_widget(self, widget): + "Get the value of a widget's contents." + if type(widget) == type(""): + widget = self.wtree.get_widget(widget) + if type(widget) == gtk.Entry: + return widget.get_text() + #elif type(widget) == gtk.SpinButton: + # return widget.get_value() + #elif type(widget) == gtk.TextView: + # return widget.get_buffer().get_text() + + def set_widget(self, name, exp): + "Set the value of a widget by name." + widget = self.wtree.get_widget(name) + if type(widget) == gtk.Entry: + widget.set_text(exp) + elif type(widget) == gtk.SpinButton: + widget.set_value(exp) + elif type(widget) == gtk.TextView: + if not widget.get_buffer(): + widget.set_buffer(gtk.TextBuffer()) + widget.get_buffer().set_text(exp) + + def display(self, site): + for member in TortureGUI.field_map: + self.set_widget(member + "_entry", getattr(site, member)) + for proto in protocols: + self.wtree.get_widget(proto + "_radiobutton").set_active(site.protocol == proto) + self.sslcheck.set_active(int(site.ssl != '' and site.ssl != 'False')) + self.combo.entry.set_text(site.comment) + + def update(self, site): + for member in TortureGUI.field_map: + setattr(site, member, self.get_widget(member + "_entry")) + for proto in protocols: + if self.wtree.get_widget(proto + "_radiobutton").get_active(): + site.protocol = proto + if self.wtree.get_widget("ssl_checkbox").get_active(): + site.ssl = "True" + else: + site.ssl = "False" + + # Housekeeping + def on_torturetest_destroy(self, obj): + gtk.mainquit() + def on_updatebutton_clicked(self, obj): + self.update(self.site) + print self.site + if self.site.comment: + self.combo.entry.set_text(self.site.comment) + else: + self.combo.entry.set_text(self.site.host) + def on_newbutton_clicked(self, obj): + global sitelist + sitelist = [TestSite()] + sitelist + self.site = sitelist[0] + self.display(self.site) + self.combo.entry.set_text("") + def on_testbutton_clicked(self, obj): + self.site.fetch(False) + print self.site.output + def on_quitbutton_clicked(self, obj): + gtk.mainquit() + def on_dumpbutton_clicked(self, obj): + print `self.site` + + def on_combo_entry1_activate(self, obj): + key = self.combo.entry.get_text() + for site in sitelist: + if site.comment.find(key) > -1: + self.site = site + self.display(self.site) + break + +if __name__ == "__main__": + # Start by reading in the sitelist + ifp = open("testsites") + sitelist = [] + linect = 0 + while 1: + linect += 1 + line = ifp.readline() + if not line: + break + elif line[0] in ("#", "\n"): + continue + else: + try: + sitelist.append(TestSite(line)) + except: + print "Error on line %d" % linect + sys.exit(0) + + (options, arguments) = getopt.getopt(sys.argv[1:], "dfp:tigvse") + verbose = 0 + for (switch, value) in options: + if switch == "-d": + # Prettprint the sitelist + map(lambda x: sys.stdout.write(x.prettyprint() + "%%\n"), sitelist) + sys.exit(0) + elif switch == "-f": + # Dump the sitelist as a .fetchmailrc file + map(lambda x: sys.stdout.write(x.entryprint()), sitelist) + sys.exit(0) + elif switch == "-p": + # Probe a single site + selected = [] + for site in sitelist: + if `site`.find(value) > -1: + selected.append(site) + sitelist = selected + # Fall through + elif switch == "-t": + # Dump the sitelist in HTML table form + map(lambda x: sys.stdout.write(x.tableprint()), sitelist) + sys.exit(0) + elif switch == "-i": + # Dump the ids of the sitelist + map(lambda x: sys.stdout.write(x.id() + "\n"), sitelist) + sys.exit(0) + elif switch == "-g": + i = 1 + for site in sitelist: + print "Sending test mail to " + site.id() + site.testmail(i) + i+= 1 + # Send test mail to each site + sys.stdout.write("Delaying to give the test mail time to land...") + time.sleep(5) + sys.stdout.write("here we go:\n") + # Fall through + elif switch == "-v": + # Display the test output + verbose = 1 + elif switch == "-s": + # Dump recognition strings of all tested servers as a Python tuple + print "(" + ",\n".join(map(lambda x: repr(x.recognition), filter(lambda x: x.recognition, sitelist))) + ")" + sys.exit(0) + elif switch == "-e": + TortureGUI() + sys.exit(0) + + # If no options, run the torture test + try: + failures = successes = 0 + os.system("fetchmail -q") + for site in sitelist: + print "Testing " + site.id() + site.fetch(True) + if verbose: + print site.output + if site.failed(): + failures += 1 + else: + successes += 1 + + # OK, summarize results + print "\n%d successes and %d failures out of %d tests" \ + % (successes, failures, len(sitelist)) + + if failures: + print "Bad status was returned on the following sites:" + for site in sitelist: + if site.failed(): + sys.stdout.write(site.explain() + "\n") + except KeyboardInterrupt: + print "Interrupted." + +# end diff --git a/dist-tools/timeplot b/dist-tools/timeplot new file mode 100755 index 00000000..c8240d05 --- /dev/null +++ b/dist-tools/timeplot @@ -0,0 +1,40 @@ +#!/bin/sh +# +# timeplot -- plot data on fetchmail release intervals +# +# + +# Get data from the NEWS file +timeseries | awk >/tmp/timeplot$$ ' +START {maxdiff = 0;} +/^[#%]/ {next;} + {days[count++] = $6;} +END { + for (i = 0; i < count-1; i++) + { + diffs[i] = days[i] - days[i + 1]; + if (maxdiff < diffs[i]) + maxdiff = diffs[i]; + } + for (i = 0; i <= maxdiff; i++) + freq[i] = 0; + for (i = 0; i < count - 1; i++) + { + freq[diffs[i]]++; + } + for (i = 0; i <= maxdiff; i++) + printf("%d %d\n", i, freq[i]); + } +' + +gnuplot >time.png - <) +{ + my($sum); + + if (/^%/) { + print $_; + } + elsif (/^fetchmail-([^ ]*) \(([^)]+)\)(, [0-9]* lines)?:/) { + $release = $1; + $date = $2; + $jdate = &day_offset($date); + if ($3) { + $lines = substr($3, 2, length($3) - 8); + } else { + $lines = 'na' + } + } + elsif (/There are ([0-9]*) people on fetchmail-friends and ([0-9]*) on fetchmail-announce/) { + $sum = $1 + $2; + print "${release}\t${lines}\t$1\t$2\t${sum}\t${jdate}\t${date}\n"; + $release = "unknown"; + $date = "unknown"; + } + elsif (/There are ([0-9]*) people on the fetchmail-friends list./) { + print "$release\t${lines}\t$1\t0\t$1\t$jdate\t$date\n"; + $release = "unknown"; + $date = "unknown"; + } +} + +# end + + + + diff --git a/dist-tools/upload b/dist-tools/upload new file mode 100755 index 00000000..3a76ee49 --- /dev/null +++ b/dist-tools/upload @@ -0,0 +1,26 @@ +#!/bin/sh + +version=`sed -n '/VERSION *= *\(.*\)/s//\1/p' /dev/null | wc -l") -vers = commands.getoutput("sed -n -e '/VERSION/s/VERSION *= *\\(.*\\)/\\1/p' $tmp/growthplot$$ -grep "^[0-9]" $tmp/growthplot$$ >$tmp/growthnumbers$$ -grep "^[0-9.]*.[05].0 " $tmp/growthplot$$ >$tmp/growthmajors$$ -sed '/^4.2.9/,$d' <$tmp/growthnumbers$$ >$tmp/growthannounce$$ - -# gnuplot line styles. These occasionally change (like beteween 3.5 and 3.7); -# use "echo 'set terminal png; test' | gnuplot | display -" to check. -blue_boxes=3 -green_crosses=2 -cyan_diamonds=37 # Once purple triangles, but we can't do that anymore -brown_triangles=23 - -cat >$tmp/growthimage$$ <lasttotal)) - then - # Label over curve hanging right, arrow down - arrowhead=$((lasttotal+50)) - echo "set label '$legend' at $lastday-10, $endy+15" - else - # Label under curve hanging left, arrow up - arrowhead=$((lasttotal-5)) - strlen=`python -c "print len('$legend')"` - lablen=$((strlen*22)) - echo "set label '$legend' at $lastday-$lablen+10, $endy-15" - fi - echo set arrow \ - from $lastday, $endy \ - to $lastday, $arrowhead \ - head - else - set -- $legend - size=$1 - friends=$2 - announce=$3 - total=$4 - days=$5 - date=$6 - lastday=$days - lasttotal=$total - fi - done -) <$tmp/growthplot$$ >>$tmp/growthimage$$ - -# OK, now write the major-release labels -( - while read version size friends announce total days date - do - echo "set arrow from $days, $total - 55 to $days, $total - 15 head" - echo "set label '$version' at $days - 5, $total - 65" - done -) <$tmp/growthmajors$$ >>$tmp/growthimage$$ - -cat >>$tmp/growthimage$$ <growth.png - -rm -f $tmp/growth* -rmdir $tmp - -# growthplot ends here - - - - - - - diff --git a/indexgen.sh b/indexgen.sh deleted file mode 100755 index 0fac4259..00000000 --- a/indexgen.sh +++ /dev/null @@ -1,386 +0,0 @@ -#!/bin/sh -# -# indexgen.sh -- generate current version of fetchmail home page. -# -goldvers="6.2.0" -goldname="6.2.0" -version=`sed -n >checksums -done - -if [ $version != $goldvers ] -then - for file in fetchmail-$goldvers.tar.gz fetchmail-$goldvers-1.*.rpm - do - md5sum $file | sed -e "s: .*/: :" >>checksums - done -fi - -# Cryptographically sign checksums -gpg --clearsign checksums -mv checksums.asc checksums - -cat >index.html < - - - - - - - - -The fetchmail home page - - - - - - - -
- -

The fetchmail Home Page

- - -

Note: if you are a stranded fetchmail.com user, we're sorry but -we have nothing to do with that site and cannot help you. It's just an -unfortunate coincidence of names.

- -

What fetchmail does:

- -

Fetchmail is a full-featured, robust, well-documented -remote-mail retrieval and forwarding utility intended to be used over -on-demand TCP/IP links (such as SLIP or PPP connections). It supports -every remote-mail protocol now in use on the Internet: POP2, POP3, -RPOP, APOP, KPOP, all flavors of IMAP, ETRN, and ODMR. It can even -support IPv6 and IPSEC.

- -

Fetchmail retrieves mail from remote mail servers and forwards it via -SMTP, so it can then be read by normal mail user agents such as mutt, elm(1) or BSD Mail. -It allows all your system MTA's filtering, forwarding, and aliasing -facilities to work just as they would on normal mail.

- -

Fetchmail offers better security than any other Unix remote-mail -client. It supports APOP, KPOP, OTP, Compuserve RPA, Microsoft NTLM, -and IMAP RFC1731 encrypted authentication methods including CRAM-MD5 -to avoid sending passwords en clair. It can be configured to support -end-to-end encryption via tunneling with ssh, the Secure Shell.

- -

Fetchmail can be used as a POP/IMAP-to-SMTP gateway for an entire DNS -domain, collecting mail from a single drop box on an ISP and -SMTP-forwarding it based on header addresses. (We don't really -recommend this, though, as it may lose important envelope-header -information. ETRN or a UUCP connection is better.)

- -

Fetchmail can be started automatically and silently as a system daemon -at boot time. When running in this mode with a short poll interval, -it is pretty hard for anyone to tell that the incoming mail link is -not a full-time "push" connection.

- -

Fetchmail is easy to configure. You can edit its dotfile directly, or -use the interactive GUI configurator (fetchmailconf) supplied with the -fetchmail distribution. It is also directly supported in linuxconf -versions 1.16r8 and later.

- -

Fetchmail is fast and lightweight. It packs all its standard -features (POP3, IMAP, and ETRN support) in ${fetchmailsize}K of core on a -Pentium under Linux.

- -

Fetchmail is open-source -software. The openness of the sources is your strongest possible -assurance of quality and reliability.

- -

Where to find out more about fetchmail:

- -

See the Fetchmail Feature List for more -about what fetchmail does.

- -

See the on-line manual page for -basics.

- -

See the HTML Fetchmail FAQ for -troubleshooting help.

- -

See the Fetchmail Design Notes -for discussion of some of the design choices in fetchmail.

- -

See the project's To-Do list for indications -of known problems and requested features.

- -

How to get fetchmail:

- -

You can get any of the following leading-edge resources here:

- - -

MD5 checksums are available for these files; the -checksum file is cryptographically signed and can be verified with the -command:

- -
-gpg --verify checksums
-
- -EOF - -if [ $version != $goldvers ] -then - cat >>index.html <Or you can get the last \`gold' version, $goldname:

- - -

The detached GPG -signature for the binary tarball can be used to check it for -correctness, with the command

- -
-gpg --verify fetchmail-$goldvers.tar.gz.asc fetchmail-$goldvers.tar.gz
-
- -

For differences between the leading-edge $version and gold $goldname versions, -see the distribution NEWS file.

-EOF -fi - -cat >>index.html <(Note that the binary RPMs don't have the POP2, OTP, IPv6, Kerberos, -GSSAPI, Compuserve RPA, Microsoft NTLM, or GNU gettext -internationalization support compiled in. To get any of these you -will have to build from sources.)

- -

The latest version of fetchmail is also carried in the - -Metalab remote mail tools directory.

- -

Getting help with fetchmail:

- -

There is a fetchmail-friends list for people who want to discuss -fixes and improvements in fetchmail and help co-develop it. It's a -MailMan list, which you can sign up for at -fetchmail-friends@ccil.org. There is also an announcements-only -list, -fetchmail-announce@lists.ccil.org.

- -

Note: before submitting a question to the list, please read -the FAQ (especially item G3 on how to report bugs). We -tend to get the same three newbie questions over and over again. The -FAQ covers them like a blanket.

- -

Fetchmail was written and is maintained by Eric S. Raymond. There are some designated -backup maintainers (Rob Funk, David DeSimone aka Fuzzy Fox, -Dave Bodenstab and Sunil Shetye). Other backup -maintainers may be added in the future, in order to ensure continued -support should Eric S. Raymond drop permanently off the net for any -reason.

- -

You can help improve fetchmail:

- -

I welcome your code contributions. But even if you don't write code, -you can help fetchmail improve.

- -

If you administer a site that runs a post-office server, you may be -able help improve fetchmail by lending me a test account on your site. -Note that I do not need a shell account for this purpose, just a -maildrop. Nor am I interested in collecting maildrops per se -- -what I'm collecting is different kinds of servers.

- -

Before each release, I run a test harness that sends date-stamped -test mail to each site on my regression-test list, then tries to -retrieve it. Please take a look at my -list of test servers. If you can lend me an account on a kind -of server that is not already on this list, please do.

- -

Who uses fetchmail:

- -

Fetchmail entered full production status with the 2.0.0 version in -November 1996 after about five months of evolution from the ancestral -popclient utility. It has since come into extremely wide use -in the Internet/Unix/Linux community. The Red Hat, Debian and -Suse Linux distributions and their derivatives all include it. A -customized version is used at Whole Earth 'Lectronic Link. Several -large ISPs are known to recommend it to Unix-using SLIP and PPP -customers.

- -

Somewhere around a thousand people have participated on the fetchmail -beta lists (at time of current release there were $subscribers on the -friends and announce lists). While it's hard to count the users of -open-source software, we can estimate based on (a) population figures -at the WELL and other known fetchmail sites, (b) the size of the -Linux-using ISP customer base, and (c) the volume of fetchmail-related -talk on USENET. These estimates suggest that daily fetchmail users -number well into the hundreds of thousands, and possibly over a million.

- -

The sociology of fetchmail:

- -

The fetchmail development project was a sociological experiment as well -as a technical effort. I ran it as a test of some theories about why the -Linux development model works.

- -

I wrote a paper, The -Cathedral And The Bazaar, about these theories and the project. -I developed the line of analysis it suggested in two later essays. -These papers became quite popular and (to my continuing astonishment) may -have actually helped change the world. Chase the title link, above, -for links to all three papers.

- -

I have done some analysis on the information in the project NEWS file. -You can view a statistical history showing -levels of participation and release frequency over time.

- -

Recent releases and where fetchmail is going:

- -

Fetchmail is now sufficiently stable and effective that I'm getting -very little pressure to fix things or add features. Development has -slowed way down, release frequency has dropped off, and we're -basically in maintainance mode.

- -

Major changes or additions therefore seem unlikely until there are -significant changes in or additions to the related protocol RFCs.

- -

Where you can use fetchmail:

- -

The fetchmail code was developed under Linux, but has also been -extensively tested under 4.4BSD, SunOS, Solaris, AIX, and NEXTSTEP. It -should be readily portable to other Unix variants (it requires only -POSIX plus BSD sockets, and uses GNU autoconf).

- -

Fetchmail is supported only for Unix by its official maintainers. -However, it is reported to build and run correctly under BeOS, -AmigaOS, Rhapsody, and QNX as well. There is a CygWin port.

- -

Related resources:

- -

Jochen Hayek is developing a set of - -IMAP tools in Python that read your .fetchmailrc file and are -designed to work with fetchmail. Jochen's tools can report selected -header lines, or move incoming messages to named mailboxes based on -the contents of headers.

- -

Donncha O Caoihm has written a Perl script called -install-sendmail -that assists you in installing sendmail and fetchmail together.

- -

Peter Hawkins has written a script called gotmail that -can retrieve Hotmail. Another script, yosucker, can retrieve -Yahoo webmail.

- -

There's a program called -mailfilter which can be used -to do span filtering, that works particularly well called from fetchmail's -preconnect directive,

- -

A hacker identifying himself simply as \`Steines' has written a -filter which rewrites the to-line with a line which only includes -receipients for a given domain and renames the old to-line. It also -rewrites the domain-part of addresses if the offical domain is -different from the local domain. You can find it here.

- -

Fetchmail's funniest fan letter:

- -This letter still cracks me up whenever I reread it. - -

The fetchmail button:

- -

If you use fetchmail and like it, here's a nifty fetchmail button you -can put on your web page:

- -
fetchmail logo
- -

Thanks to Steve -Matuszek for the graphic design. The hand in the button (and the -larger top-of-page graphic) was actually derived from a color scan of -the fetchmail author's hand.

- -

Fetchmail mirror sites:

- -

There is a FTP mirror of the current sources and RPMs in Japan at - -ftp://ftp.win.ne.jp/pub/network/mail/fetchmail. - -

Reviews and Awards

- -

Fetchmail was DaveCentral's Best Of Linux winner for -June 30 1999.

- -

Fetchmail was a five-star Editor's Pick at Softlandindia.

- -
- - - -EOF - -# The following sets edit modes for GNU EMACS -# Local Variables: -# mode:html -# truncate-lines:t -# End: diff --git a/listsize b/listsize deleted file mode 100755 index 73e25887..00000000 --- a/listsize +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# -# Mine list sizes from MailMan web interfaces -# -# * Must set environment variable FETCHMAIL_LIST_PASS to list admin password - -project="fetchmail" -admin="http://lists.berlios.de/mailman/admin" -adminpw=$FETCHMAIL_LIST_PASS - -list="$1" -if [ ! "$list" ]; then - echo "Usage: $0 list" 1>&2 - exit 1 -fi -case "$list" in -$project-*) - # already gave us the full name, e.g. fetchmail-announce - ;; -*) - # only gave us the last part of the name, e.g. announce - list="$project-$list" - ;; -esac - -hexpw=`echo "$adminpw" | od -t x1 -w64 | sed -e 's/^[0-9]*//' -e '/^ *$/d' -e 's/ /%/g'` -umask 077 -tmp="/tmp/$project-$list.listsize.$$" -# First get the login cookie... -curl -s -D "$tmp" "$admin/${list}?adminpw=$hexpw" >/dev/null -# Second gets the actual stat -curl -s -b "$tmp" "$admin/${list}/members" \ - | sed -n '/.*>(\([0-9][0-9]*\) members total.*/s//\1/p' -rm -f "$tmp" -# end - diff --git a/makerelease b/makerelease deleted file mode 100755 index 41ddf038..00000000 --- a/makerelease +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env perl -# -# Make a fetchmail release. Must be run as root, to make RPMs. -# Dumps a release notice and diffs as a MIME multipart message -# in RELEASE_NOTES -# -use POSIX qw(strftime); -$timezone = strftime('%z', localtime) || "-0500"; -$tmp = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || "/tmp"; - -$project = "fetchmail"; -$svnrepos = "svn://svn.berlios.de/$project"; -$website = "http://developer.berlios.de/projects/$project"; -$mailfrom = "<$project-devel-owner\@lists.berlios.de> (Fetchmail Development Team)"; - -# parse options -$diffs = 0; -$verbose = 0; -$null = ">/dev/null"; -$errnull = "2>/dev/null"; -while ($i = shift @ARGV) -{ - if ($i =~ /^(--diffs|-d)$/i) - { - $diffs = 1; - next; - } - - if ($i =~ /^(--verbose|-v)$/i) - { - $verbose = 1; - $null = ""; - next; - } - - die "Error: Unknown option: $i\n"; -} - -# extract version from source -$version=`grep 'AC_INIT' configure.in`; -$version =~ /AC_INIT\([^,]*,\[?([0-9.]+)\]?\)/; -$version = $1; -die "cannot determine version" unless defined $1; -$tag = "RELEASE_$version"; -$tag =~ tr/./-/; - -# extract existing tags -open(ID, "svn ls $svnrepos/tags|"); -while () { - if (m{^(RELEASE_.*)/}) { - unshift(@versions, $1); - } -} -close(ID); - -if ($versions[0] eq $tag) { - $tag = $versions[0]; - $oldtag = $versions[1]; -} else { - $tag = ''; - $oldtag = $versions[0]; -} - -$ENV{PATH} .= ":./dist-tools:./dist-tools/shipper:."; - -print "Building $version release, tag $tag, previous tag $oldtag\n"; - -if (-d autom4te.cache) { - system("rm -rf autom4te.cache") - and die "Failure in removing autom4te.cache"; -} - -if (system("autoreconf -isv")) { - die("Failure in regenerating autoconf files\n"); -} - -if (system("./configure && make clean && make -C po update-po && make clean")) { - die("Failure in translation-file rebuild\n"); -} - -print "### Test-building the software...\n"; -if (system("./configure && make clean && make all check")) { - die("Compilation failure\n"); -} - -print "### Building the distribution...\n"; -if (system("make dist $null")) { - die("Distribution-build failure\n"); -} - -print "### Building the RPMs...\n"; -if (system("buildrpms $project-${version}.tar.gz $null")) { - die("RPM-build failure\n"); -} - -open(REPORT, ">$tmp/$project.PREAMBLE.$$"); - -print REPORT <. - -The source archive is available at: - - -Here are the release notes: - -EOF - -# Extract the current notes -open(NEWS, "NEWS"); -while () { - if (/^$project/) { - print REPORT $_; - last; - } -} -while () { - if (/^$project/) { - last; - } - print REPORT $_; -} - -$oldver = $oldtag; -$oldver =~ tr/-/./; -$oldver =~ s/^RELEASE_//; - -if ($diffs) { - print REPORT "Diffs from the previous ($oldver) release follow as a MIME attachment." -} else { - print REPORT "By popular demand, diffs from the previous release have been omitted." -} - -close(NEWS); - -close(REPORT); - -if ($tag eq '') { - system("svn diff -r$oldtag $errnull >$tmp/$project.DIFFS.$$"); -} else { - system("svn diff -r$oldtag -r$tag $errnull >$tmp/$project.DIFFS.$$"); -} -print "Diff size:"; -system("wc <$tmp/$project.DIFFS.$$"); - -if ($diffs) { - system "metasend -b" - ." -D '$project-$tag announcement' -m 'text/plain' -e 7bit -f $tmp/$project.PREAMBLE.$$" - ." -n -D 'diff between $oldver and $version' -m 'text/plain' -e 7bit -f $tmp/$project.DIFFS.$$" - ." -o ANNOUNCE.EMAIL"; -} else { - rename("$tmp/$project.PREAMBLE.$$", "ANNOUNCE.EMAIL"); -} -#system("chown esr ANNOUNCE.EMAIL"); -#chmod(0700, "ANNOUNCE.EMAIL"); - -#unlink("$tmp/$project.PREAMBLE.$$"); -unlink("$tmp/$project.DIFFS.$$"); - -print "Building index page...\n"; -system("rm -f index.html; indexgen.sh"); - -if (-r "testsites") { - print "Building test server list...\n"; - system("rm -f testservers.html; testservers-gen.sh >testservers.html"); -} - -print "Making activity graph..."; -system "growthplot"; - -print "Done\n"; - -# makerelease ends here diff --git a/test-request b/test-request deleted file mode 100644 index 160c1885..00000000 --- a/test-request +++ /dev/null @@ -1,20 +0,0 @@ -I maintain an open-source POP and IMAP client called fetchmail. It is -widely used in the Linux and open-source community, and is probably -the single most popular remote-mail client in that world. You can -find out more about this project at -. - -In order to be able to do thorough regression testing before each release, -I collect test accounts on as many different kinds of POP3, IMAP, and -ODMR servers as possible. Because fetchmail is strictly conformant to the -remote-mail RFCs, many server developers have found fetchmail a useful -standards-conformance test. - -I'm writing to request test accounts on your server. I support all flavors -of POP2, POP3, IMAP and ODMR with either plain-password, CRAM-MD5, NTLM, -GSSAPI, or Kerberos authentication. I also support SSL/TLS. - -It would be very helpful if I could have a separate test account for -each protocol you support (that is, separate POP3, IMAP, and ODMR -accounts) so I can do automated regression testing without worrying -about mailbox race conditions. diff --git a/testmail b/testmail deleted file mode 100755 index 7941892e..00000000 --- a/testmail +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -size=${1:-0} - -( -echo "This mail was generated on "`date`"." - -) | mail -s "${size}k test mail from process $$" esr@ccil.org - - </tmp/testmda$$ -echo "[text is "`wc -c - - - - - - -Fetchmail's Test List - - - -
Back to Eric's Home Page -Up to Site Map -${date} -
-
-

Fetchmail's Test List

- -

Here are the server types on my regression-test list:

- - - - - - -EOF -torturetest.py -t -cat <
Protocol & Version:Special Options:
- -

If you control a post-office server that is not one of the types listed -here, please consider lending me a test account. Note that I do not -need shell access, just the permissions to send mail to a mailbox the server -looks at and to fetch mail off of it.

- -

I'd like to have weird things like a POP2 server on here. Also more -closed-source servers because they tend to be broken in odd -ways. These are the real robustness tests.

- -
- -
Back to Eric's Home Page -Up to Site Map -${date} -
- -
-
Eric S. Raymond <esr@thyrsus.com>
- - -EOF - diff --git a/testservers.html b/testservers.html deleted file mode 100644 index 62dc9e7b..00000000 --- a/testservers.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - -Fetchmail's Test List - - - -
Back to Eric's Home Page -Up to Site Map -Mon Jan 12 15:52:14 EST 2004 -
-
-

Fetchmail's Test List

- -

Here are the server types on my regression-test list:

- - - - - - - - - - - - - - - - - - - - - - -
Protocol & Version:Special Options:
IMAP: CommuniGate IMAP serverIMAPrev1 STARTTLS AUTH=CRAM-MD5 AUTH=DIGEST-MD5
POP3: CommuniGate POP3 serverCAPA LAST APOP CRAM-MD5
POP3: IntraStore POP3 mail server!CAPA LAST
APOP: IntraStore POP3 mail server!CAPA LAST APOP
IMAP: IntraStore IMAP mail serverIMAPrev1 IDLE AUTH=CRAM-MD5 AUTH=SKEY AUTH=ANONYMOUS
POP3: Eudora EIMSCAPA LAST APOP SASL CRAM-MD5 NTLM
POP3: gmx.de pop server!CAPA UIDL
IMAP: IMail IMAP serverIMAP4rev1 AUTH=CRAM-MD5
IMAP: Microsoft ExchangeIDLE AUTH=NTLM
POP3: qpopper 3.1.2 (Eudora) patched with mysqlCAPA UIDL
IMAP: Courier IMAPIMAP4rev1
POP3: Courier POP3CAPA UIDL
APOP: Qpopper using APOP!CAPA
IMAP: UW IMAPIMAPrev1
IMAP: Courier IMAPIMAP4rev1
POP3: Qpopper 4.0.5CAPA UIDL
- -

If you control a post-office server that is not one of the types listed -here, please consider lending me a test account. Note that I do not -need shell access, just the permissions to send mail to a mailbox the server -looks at and to fetch mail off of it.

- -

I'd like to have weird things like a POP2 server on here. Also more -closed-source servers because they tend to be broken in odd -ways. These are the real robustness tests.

- -
- -
Back to Eric's Home Page -Up to Site Map -Mon Jan 12 15:52:14 EST 2004 -
- -
-
Eric S. Raymond <esr@thyrsus.com>
- - diff --git a/timeplot b/timeplot deleted file mode 100755 index c8240d05..00000000 --- a/timeplot +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh -# -# timeplot -- plot data on fetchmail release intervals -# -# - -# Get data from the NEWS file -timeseries | awk >/tmp/timeplot$$ ' -START {maxdiff = 0;} -/^[#%]/ {next;} - {days[count++] = $6;} -END { - for (i = 0; i < count-1; i++) - { - diffs[i] = days[i] - days[i + 1]; - if (maxdiff < diffs[i]) - maxdiff = diffs[i]; - } - for (i = 0; i <= maxdiff; i++) - freq[i] = 0; - for (i = 0; i < count - 1; i++) - { - freq[diffs[i]]++; - } - for (i = 0; i <= maxdiff; i++) - printf("%d %d\n", i, freq[i]); - } -' - -gnuplot >time.png - <) -{ - my($sum); - - if (/^%/) { - print $_; - } - elsif (/^fetchmail-([^ ]*) \(([^)]+)\)(, [0-9]* lines)?:/) { - $release = $1; - $date = $2; - $jdate = &day_offset($date); - if ($3) { - $lines = substr($3, 2, length($3) - 8); - } else { - $lines = 'na' - } - } - elsif (/There are ([0-9]*) people on fetchmail-friends and ([0-9]*) on fetchmail-announce/) { - $sum = $1 + $2; - print "${release}\t${lines}\t$1\t$2\t${sum}\t${jdate}\t${date}\n"; - $release = "unknown"; - $date = "unknown"; - } - elsif (/There are ([0-9]*) people on the fetchmail-friends list./) { - print "$release\t${lines}\t$1\t0\t$1\t$jdate\t$date\n"; - $release = "unknown"; - $date = "unknown"; - } -} - -# end - - - - diff --git a/torturetest.glade b/torturetest.glade deleted file mode 100644 index d2cf07ee..00000000 --- a/torturetest.glade +++ /dev/null @@ -1,976 +0,0 @@ - - - - - - - True - torturetest - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - - - - - True - False - 0 - - - - True - False - 0 - - - - True - Site select: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - False - True - False - True - False - - - - True - True - True - True - 0 - - True - * - False - - - - - - - True - GTK_SELECTION_BROWSE - - - - - 0 - True - True - - - - - 0 - False - False - - - - - - True - - - 0 - True - True - - - - - - True - 9 - 2 - False - 0 - 0 - - - - True - Sitename: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Mail Address: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Username: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Password: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 3 - 4 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 8 - 9 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 7 - 8 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 6 - 7 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 5 - 6 - - - - - - - True - Comment: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 8 - 9 - fill - - - - - - - True - Recognition: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 7 - 8 - fill - - - - - - - True - Capabilities: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 6 - 7 - fill - - - - - - - True - Options: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 5 - 6 - fill - - - - - - - True - Protocol: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - False - 0 - - - - True - True - 0 - - - - True - True - POP3 - True - GTK_RELIEF_NORMAL - False - False - True - - - 0 - False - False - - - - - - True - True - APOP - True - GTK_RELIEF_NORMAL - False - False - True - POP3_radiobutton - - - 0 - False - False - - - - - - True - True - IMAP - True - GTK_RELIEF_NORMAL - False - False - True - POP3_radiobutton - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - - - 0 - True - True - - - - - - True - True - SSL - True - GTK_RELIEF_NORMAL - False - False - True - - - 0 - True - True - - - - - 1 - 2 - 4 - 5 - fill - fill - - - - - 0 - False - False - - - - - - True - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_DEFAULT_STYLE - 0 - - - - True - True - True - GTK_RELIEF_NORMAL - - - - - True - 0.5 - 0.5 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-apply - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Update - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - GTK_RELIEF_NORMAL - - - - - True - 0.5 - 0.5 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-new - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - New - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - GTK_RELIEF_NORMAL - - - - - True - 0.5 - 0.5 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-execute - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Test - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - GTK_RELIEF_NORMAL - - - - - True - 0.5 - 0.5 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-quit - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Quit - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - GTK_RELIEF_NORMAL - - - - - True - 0.5 - 0.5 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-print - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Dump - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - - - 0 - False - False - - - - - - - diff --git a/torturetest.gladep b/torturetest.gladep deleted file mode 100644 index d44797c3..00000000 --- a/torturetest.gladep +++ /dev/null @@ -1,7 +0,0 @@ - - - - - torturetest - torturetest - diff --git a/torturetest.py b/torturetest.py deleted file mode 100755 index f8a3535c..00000000 --- a/torturetest.py +++ /dev/null @@ -1,326 +0,0 @@ -#!/usr/bin/env python2 - -import sys, getopt, os, smtplib, commands, time, gtk, gtk.glade - -protocols = ('POP3', 'APOP', 'IMAP',) - -class TestSite: - temp = "/usr/tmp/torturestest-%d" % os.getpid() - - def __init__(self, line=None): - "Initialize site data from the external representation." - self.host = "" - self.mailaddr = "" - self.username = "" - self.password = "" - self.protocol = "" - self.ssl = "" - self.options = "" - self.capabilities = "" - self.recognition = "" - self.comment = "" - if line: - (self.host, self.mailaddr, self.username, self.password, \ - self.protocol, self.ssl, self.options, self.capabilities, \ - self.recognition, self.comment) = \ - line.strip().split(":") - if not self.mailaddr: - self.mailaddr = self.username - # Test results - self.status = None - self.output = None - - def allattrs(self): - "Return a tuple consisting of all this site's attributes." - return (self.host, self.mailaddr, self.username, self.password, \ - self.protocol, self.ssl, self.options, self.capabilities, \ - self.recognition, self.comment) - - def __repr__(self): - "Return the external representation of this site's data." - return ":".join(self.allattrs()) - - def prettyprint(self): - "Prettyprint a site entry in human-readable form." - return "Host: %s\n" \ - "Mail To: %s\n" \ - "Username: %s\n" \ - "Password: %s\n" \ - "Protocol: %s\n" \ - "SSL: %s\n" \ - "Options: %s\n" \ - "Capabilities: %s\n" \ - "Recognition: %s\n" \ - "Comment: %s\n" \ - % self.allattrs() - - def entryprint(self): - "Print a .fetchmailrc entry corresponding to a site entry." - rep = "poll %s-%s via %s with proto %s %s\n" \ - " user %s there with password '%s' is esr here" \ - % (self.host,self.protocol,self.host,self.protocol,self.options,self.username,self.password) - if self.ssl and self.ssl != 'False': - rep += " options ssl" - rep += "\n\n" - return rep - - def tableprint(self): - "Print an HTML server-type table entry." - return "%s: %s%s\n" \ - % (self.protocol, self.comment, self.capabilities) - - def id(self): - "Identify this site." - rep = "%s %s at %s" % (self.protocol, self.recognition, self.host) - if self.capabilities: - rep += " (" + self.capabilities + ")" - if self.options: - rep += " using " + self.options - return rep - - def testmail(self, n=None): - "Send test mail to the site." - server = smtplib.SMTP("localhost") - fromaddr = "esr@thyrsus.com" - if self.mailaddr.find("@") > -1: - toaddr = self.mailaddr - else: - toaddr = "%s@%s" % (self.mailaddr, self.host) - msg = ("From: %s\r\nTo: %s\r\n\r\n" % (fromaddr, toaddr)) - if n != None: - msg += `n` + ": " - msg += "Test mail collected from %s.\n" % (self.id(),) - server.sendmail(fromaddr, toaddr, msg) - server.quit() - - def fetch(self, logfile=False): - "Run a mail fetch on this site." - try: - ofp = open(TestSite.temp, "w") - if logfile: - mda = "(echo; echo \'From torturetest\' `date`;cat) >>TEST.LOG" - else: - mda = 'cat' - ofp.write('defaults mda "%s"\n' % mda) - ofp.write(self.entryprint()) - ofp.close() - (self.status, self.output) = commands.getstatusoutput("fetchmail -d0 -v -f - <%s"%TestSite.temp) - if self.status: - os.system("cat " + TestSite.temp) - finally: - os.remove(TestSite.temp) - - def failed(self): - "Did we have a test failure here?" - return os.WIFEXITED(self.status) and os.WEXITSTATUS(self.status) > 1 - - def explain(self): - "Explain the status of the last test." - if not os.WIFEXITED(self.status): - return self.id() + ": abnormal termination\n" - elif os.WEXITSTATUS(self.status) > 1: - return self.id() + ": %d\n" % os.WEXITSTATUS(self.status) + self.output - else: - return self.id() + ": succeeded\n" - -class TortureGUI: - "Torturetest editing GUI," - - # All site parameters except protocol - field_map = ('host', 'mailaddr', 'username', 'password', \ - 'options', 'capabilities', 'recognition', 'comment') - - def __init__(self): - # Build the widget tree from the glade XML file. - self.wtree = gtk.glade.XML("torturetest.glade") - # File in initial values - self.combo = self.wtree.get_widget("combo1") - self.combo.set_popdown_strings(map(lambda x: x.comment, sitelist)) - self.sslcheck = self.wtree.get_widget("ssl_checkbox") - self.site = sitelist[0] - self.display(self.site) - - # Provide handlers for the widget tree's events - mydict = {} - for key in ('on_torturetest_destroy', - 'on_updatebutton_clicked', - 'on_newbutton_clicked', - 'on_testbutton_clicked', - 'on_quitbutton_clicked', - 'on_dumpbutton_clicked', - 'on_combo_entry1_activate'): - mydict[key] = getattr(self, key) - self.wtree.signal_autoconnect(mydict) - - gtk.mainloop() - print `self.site` - - def get_widget(self, widget): - "Get the value of a widget's contents." - if type(widget) == type(""): - widget = self.wtree.get_widget(widget) - if type(widget) == gtk.Entry: - return widget.get_text() - #elif type(widget) == gtk.SpinButton: - # return widget.get_value() - #elif type(widget) == gtk.TextView: - # return widget.get_buffer().get_text() - - def set_widget(self, name, exp): - "Set the value of a widget by name." - widget = self.wtree.get_widget(name) - if type(widget) == gtk.Entry: - widget.set_text(exp) - elif type(widget) == gtk.SpinButton: - widget.set_value(exp) - elif type(widget) == gtk.TextView: - if not widget.get_buffer(): - widget.set_buffer(gtk.TextBuffer()) - widget.get_buffer().set_text(exp) - - def display(self, site): - for member in TortureGUI.field_map: - self.set_widget(member + "_entry", getattr(site, member)) - for proto in protocols: - self.wtree.get_widget(proto + "_radiobutton").set_active(site.protocol == proto) - self.sslcheck.set_active(int(site.ssl != '' and site.ssl != 'False')) - self.combo.entry.set_text(site.comment) - - def update(self, site): - for member in TortureGUI.field_map: - setattr(site, member, self.get_widget(member + "_entry")) - for proto in protocols: - if self.wtree.get_widget(proto + "_radiobutton").get_active(): - site.protocol = proto - if self.wtree.get_widget("ssl_checkbox").get_active(): - site.ssl = "True" - else: - site.ssl = "False" - - # Housekeeping - def on_torturetest_destroy(self, obj): - gtk.mainquit() - def on_updatebutton_clicked(self, obj): - self.update(self.site) - print self.site - if self.site.comment: - self.combo.entry.set_text(self.site.comment) - else: - self.combo.entry.set_text(self.site.host) - def on_newbutton_clicked(self, obj): - global sitelist - sitelist = [TestSite()] + sitelist - self.site = sitelist[0] - self.display(self.site) - self.combo.entry.set_text("") - def on_testbutton_clicked(self, obj): - self.site.fetch(False) - print self.site.output - def on_quitbutton_clicked(self, obj): - gtk.mainquit() - def on_dumpbutton_clicked(self, obj): - print `self.site` - - def on_combo_entry1_activate(self, obj): - key = self.combo.entry.get_text() - for site in sitelist: - if site.comment.find(key) > -1: - self.site = site - self.display(self.site) - break - -if __name__ == "__main__": - # Start by reading in the sitelist - ifp = open("testsites") - sitelist = [] - linect = 0 - while 1: - linect += 1 - line = ifp.readline() - if not line: - break - elif line[0] in ("#", "\n"): - continue - else: - try: - sitelist.append(TestSite(line)) - except: - print "Error on line %d" % linect - sys.exit(0) - - (options, arguments) = getopt.getopt(sys.argv[1:], "dfp:tigvse") - verbose = 0 - for (switch, value) in options: - if switch == "-d": - # Prettprint the sitelist - map(lambda x: sys.stdout.write(x.prettyprint() + "%%\n"), sitelist) - sys.exit(0) - elif switch == "-f": - # Dump the sitelist as a .fetchmailrc file - map(lambda x: sys.stdout.write(x.entryprint()), sitelist) - sys.exit(0) - elif switch == "-p": - # Probe a single site - selected = [] - for site in sitelist: - if `site`.find(value) > -1: - selected.append(site) - sitelist = selected - # Fall through - elif switch == "-t": - # Dump the sitelist in HTML table form - map(lambda x: sys.stdout.write(x.tableprint()), sitelist) - sys.exit(0) - elif switch == "-i": - # Dump the ids of the sitelist - map(lambda x: sys.stdout.write(x.id() + "\n"), sitelist) - sys.exit(0) - elif switch == "-g": - i = 1 - for site in sitelist: - print "Sending test mail to " + site.id() - site.testmail(i) - i+= 1 - # Send test mail to each site - sys.stdout.write("Delaying to give the test mail time to land...") - time.sleep(5) - sys.stdout.write("here we go:\n") - # Fall through - elif switch == "-v": - # Display the test output - verbose = 1 - elif switch == "-s": - # Dump recognition strings of all tested servers as a Python tuple - print "(" + ",\n".join(map(lambda x: repr(x.recognition), filter(lambda x: x.recognition, sitelist))) + ")" - sys.exit(0) - elif switch == "-e": - TortureGUI() - sys.exit(0) - - # If no options, run the torture test - try: - failures = successes = 0 - os.system("fetchmail -q") - for site in sitelist: - print "Testing " + site.id() - site.fetch(True) - if verbose: - print site.output - if site.failed(): - failures += 1 - else: - successes += 1 - - # OK, summarize results - print "\n%d successes and %d failures out of %d tests" \ - % (successes, failures, len(sitelist)) - - if failures: - print "Bad status was returned on the following sites:" - for site in sitelist: - if site.failed(): - sys.stdout.write(site.explain() + "\n") - except KeyboardInterrupt: - print "Interrupted." - -# end diff --git a/upload b/upload deleted file mode 100755 index 3a76ee49..00000000 --- a/upload +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -version=`sed -n '/VERSION *= *\(.*\)/s//\1/p'