summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* ParseMailCommands(): Quickie patch to allow quotes around the commandbwarsaw1999-09-081-0/+10
| | | | | | | part of the email command. This means "help" [sic] works and you don't have to say: Send the word "help" (sans quotes) to ...
* Bump VERSION to 1.0.2bwarsaw1999-09-071-1/+1
|
* Add an entry to run the nightly gzip at 3:27ambwarsaw1999-09-041-0/+5
|
* Add TODO item about Usenet crosspostingbwarsaw1999-09-041-0/+4
|
* Add Paul Hebblebwarsaw1999-09-041-0/+1
|
* ArchiveMail(): When public archiving is turned on andbwarsaw1999-09-041-7/+22
| | | | | | | | | PUBLIC_EXTERNAL_ARCHIVER is true, the variable contains a shell command string for os.popen() to invoke the external archiver. Similar for PRIVATE_EXTERNAL_ARCHIVER and private archiving. Patch submitted by Paul Hebble <hebble@ncsa.uiuc.edu>, modified by myself (I couldn't resist!)
* PUBLIC_EXTERNAL_ARCHIVER, PRIVATE_EXTERNAL_ARCHIVER: new variablesbwarsaw1999-09-041-2/+16
| | | | | | which control use of an external archiver for both public and private archiving. When both variables are false, the internal archiver is used.
* Remove some extraneous parens.bwarsaw1999-09-041-11/+9
| | | | ExtractApproval(): Use `is' test to compare against None, not ==
* SafeDict.__init__(): UserDict optional initial dict arg is a Pythonbwarsaw1999-09-031-1/+4
| | | | 1.5.2-ism. Here's a more portable implementation.
* SafeDict(): New classbwarsaw1999-09-021-2/+23
| | | | | | | maketext(): Use SafeDict class to make sure that key interpolation in the template can't raise an exception, even if someone's edited the template and included missing keys. Patch inspired by Sean Reifschneider <jafo@tummy.com>
* miscellaneous formattingbwarsaw1999-09-021-4/+33
|
* Simple script to print the current Mailman versionbwarsaw1999-09-022-1/+26
|
* PR#107 reports that Pegasus (presumably an MUA) usesbwarsaw1999-09-021-0/+1
| | | | | X-Confirm-Reading-To: to get automated receipts, so we need to remove this header too.
* "group sticky bit" -> setgid bit. PR#99bwarsaw1999-09-021-2/+2
|
* Two changes:bwarsaw1999-09-021-1/+16
| | | | | | | | - be sure to use the member's case-preserved subscribed address - watch out for any addresses that are in the password dictionary but are (for some unknown reason) not subscribed. Zap any such addresses found.
* InitTempVars(): Use <site> for lock file name when no list name isbwarsaw1999-09-021-1/+1
| | | | given (as is the case with calling bin/mmsitepass)
* Use the GNU boilerplate.html filebwarsaw1999-08-311-17/+88
|
* Do the more sensible thing, which is only gzip those .txt files thatbwarsaw1999-08-311-31/+18
| | | | are newer than their .txt.gz files.
* Watch out for os.errors from os.listdir()bwarsaw1999-08-311-1/+5
|
* Added nightly_gzip to list of scriptsbwarsaw1999-08-301-1/+1
|
* Script which nightly gzips .txt flat archive files.bwarsaw1999-08-301-0/+154
|
* Removed unused import of fcntlbwarsaw1999-08-251-1/+0
|
* Load(): Ignore AlreadyLockedErrors.bwarsaw1999-08-231-1/+4
|
* map_maillists(): formattingbwarsaw1999-08-231-5/+8
|
* ArchiveMail(): it's still possible that the archiver takes a long timebwarsaw1999-08-221-3/+7
| | | | | | to run (thus breaking the lock). Two changes: crank the lock lifetime up to 5 minutes, and catch any possible NotLockedErrors that might occur.
* small cut and paste typobwarsaw1999-08-211-1/+1
|
* Robustness changes. Specifically:bwarsaw1999-08-211-22/+84
| | | | | | | | | | | | | | | When processing the archive, lay claim to the archiver lock so that any posts that come in while the archiver is running will get blocked. This isn't optimal because we don't really know how long the archiver will run (I give it 3 hours max by default). HyperArchive.processUnixMailbox() should actually refresh() the lock while it's working. Also, the MailList object is locked too, although the lifetime is shorter. I wonder if this is still necessary? Use getopt module to process options. Added a docstring which becomes the usage message.
* Bump rev number to 1.0.1bwarsaw1999-08-211-1/+1
|
* Add Jeremy Hyltonbwarsaw1999-08-211-0/+1
|
* Make sure we use cPickle if it exists. This change may or may notbwarsaw1999-08-211-3/+8
| | | | have any effect.
* Extensive changes based on Jeremy Hylton's investigations. Thesebwarsaw1999-08-211-41/+49
| | | | | | | | | | | | | | | | | | | | | | | should considerably help the performance of the archiver. Specifically: class DumbBTree: Don't sort the self.sorted list unless some client is actually traversing the data structure. This saves a lot of work when items are added. See also Jeremy's XXX comment for further optimization ideas. class HyperDatabase: Jeremy also has questions about the usefulness of the cache used here. Because the items are traversed in linear order, there isn't much locality of reference, so cache eviction doesn't buy you much (it's actually more expensive than just keeping everything in the cache, so that's what we do). That's a space for time trade-off that might need a re-evaluation. Clearly, more work could be done to improve the performance of the archiver, but this should improve matters significantly. Caveat: this has been only minimally tested in a production environment. I call this the Hylton Band-aid.
* Extensive changes based on Jeremy Hylton's investigations. Thesebwarsaw1999-08-211-15/+14
| | | | | | | | | | | | | | | | | should considerably help the performance of the archiver. Specifically: update_dirty_archives(): Archived articles are appended to the .txt file, and a gzip'd copy used to be written automatically. However this turns out to be a huge performance hit (it's not very efficient to do the entire gzip in Python, and we can't use gzip's append feature because apparently Netscape doesn't know how to grok gzip append files). The gzip file only now gets created if 1) gzip can be imported, and 2) mm_cfg.GZIP_ARCHIVE_TXT_FILES is true. XXX: note that we should add a cronjob to gzip the file nightly. consolidate imports
* Extensive changes based on Jeremy Hylton's investigations. Thesebwarsaw1999-08-211-6/+16
| | | | | | | | | | | | | | should considerably help the performance of the archiver. Specifically: ArchiveMail(): Create a lock file (and lock it), just after the fork. Jeremy observes that there is a race condition when many posts show up in a short amount of time. By creating a lock file we make sure that the separate archiver processes won't clobber each other. Use the new LockFile module. Move the (c)StringIO import to the top of the file.
* GZIP_ARCHIVE_TXT_FILES: A new flag which controls whether thebwarsaw1999-08-211-0/+7
| | | | | | archivers .txt file is gzip'd on the fly. This turns out to be a major performance hit, so it's disabled by default. This means that to update the txt.gz file, you will need to run a cronjob.
* Ditch the posix lockfile stuff in favor of the now "standard" LockFilebwarsaw1999-08-211-29/+21
| | | | | | | | | | | | | | | | | | module. Specifically: __del__(): Be sure to unlock the list when it gets GC'd InitTempVars(): _tmp_lock => __createlock_p _lock_file => __lock __lock is now a LockFile object and all locking goes through this object. Load(): _tmp_lock => __createlock_p Locked(), Lock(), Unlock(): Use the new LockFile object as the basis for locking. Also, Unlock() should catch AlreadyLockedError for backwards compatable semantics.
* This module has been "renamed" to LockFile.pybwarsaw1999-08-211-198/+0
|
* flock => LockFilebwarsaw1999-08-202-7/+7
| | | | hung_timeout => lifetime
* __assert_lock(): LockFile.AlreadyCalledLockedError =>bwarsaw1999-08-201-1/+1
| | | | LockFile.AlreadyLockedError
* flock => LockFile everywherebwarsaw1999-08-201-4/+4
|
* Several changes to make this a more generally useful module.bwarsaw1999-08-201-64/+148
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Most important: a semantic change. When a lock is acquired, an additional float value is written to the lock file. This is the lock's expected lifetime, as an instant some point in the future (i.e. time.time() + lifetime). This allows processes to give a clue to other claimants as to how long the lock holder intends to keep the lock. This is necessary because the same resource may need to be locked by short lived and long lived processes (e.g. the archiver). Without this, the short lived process has no idea when the lock owner should have given up the lock and could steal it out from under it. It is possible that a process could continually refresh a lock (see below) in an infloop, thus causing all other claimants to back off forever. This is (I believe) much less likely than that a process crashes, leaving a lock turd around. Rename this file to LockFile.py (retain flock.py for CVS archival purposes, but soon all references to this module will be changed to use LockFile instead of flock). The main class in this module is also named LockFile. All the exceptions have been changed to class-based. LockError is the base exception class. AlreadyCalledLockError is changed to AlreadyLockedError but NotLockedError and TimeOutError are not changed. New public methods set_lifetime() and refresh(). The former sets the lifetime interval so that the same lock object can be reused with a different lock lifetime. The latter refreshes the lock lifetime for an already held lock. A process can use this if it suddenly realizes it needs more time to complete its work. "hung_timeout" is renamed to lifetime, because of the changed semantics All private attributes have been __renamed Docstrings everywhere!
* checkall(): Must also check PREFIX.bwarsaw1999-08-131-0/+12
|
* find_member: new script to search all lists (or a specified subset)bwarsaw1999-08-092-1/+145
| | | | | | | for an address matching a regular expression. Very handy when you have a bouncing address subscribed to many lists! Makefile.in: install find_member
* Dragon's big logo as a jpeg (no gifs allowed on gnu.org)bwarsaw1999-08-061-0/+0
|
* Web page for www.gnu.orgbwarsaw1999-08-061-0/+75
|
* Oops! Forgot to update this filebwarsaw1999-07-301-0/+16
|
* Bump release date of 1.0 final (I think tonight's the night)bwarsaw1999-07-301-1/+1
|
* consistent body background colorbwarsaw1999-07-291-1/+1
|
* removed small typobwarsaw1999-07-291-1/+0
|
* Bumping version number to 1.0 ... get ready!bwarsaw1999-07-242-2/+2
|
* Add link to docs tarballbwarsaw1999-07-241-2/+7
|