summaryrefslogtreecommitdiff
path: root/modules/mm_archive.py
blob: eab5fc223d8eb6ab3b1774c164d0a2401e691816 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import sys, os, string
import mm_utils, mm_mbox, mm_cfg, mm_message

## ARCHIVE_PENDING = "to-archive.mail"
## # ARCHIVE_RETAIN will be ignored, below, in our hook up with andrew's new
## # pipermail.
## ARCHIVE_RETAIN = "retained.mail"

class Archiver:
    def InitVars(self):
	# Configurable
	self.archive = 1
	# 0=public, 1=private:
	self.archive_private = mm_cfg.DEFAULT_ARCHIVE_PRIVATE
	self.public_archive_file_dir = mm_cfg.PUBLIC_ARCHIVE_FILE_DIR
	self.private_archive_file_dir = mm_cfg.PRIVATE_ARCHIVE_FILE_DIR
	self.archive_directory = os.path.join(mm_cfg.HTML_DIR, "archives/%s" % 
					      self._internal_name)
## 	self.archive_update_frequency = \
## 		 mm_cfg.DEFAULT_ARCHIVE_UPDATE_FREQUENCY
## 	self.archive_volume_frequency = \
## 		mm_cfg.DEFAULT_ARCHIVE_VOLUME_FREQUENCY
## 	self.archive_retain_text_copy = \
## 		mm_cfg.DEFAULT_ARCHIVE_RETAIN_TEXT_COPY

	# Not configurable
	self._base_archive_url = os.path.join(mm_cfg.ARCHIVE_URL, 
					      self._internal_name)
	self.clobber_date = 0

    def GetConfigInfo(self):
	return [
	    ('archive', mm_cfg.Toggle, ('No', 'Yes'), 0, 
	     'Archive messages?'),

	    ('archive_private', mm_cfg.Radio, ('public', 'private'), 0,
             'Is archive file source for public or private archival?'),

	    ('clobber_date', mm_cfg.Radio, ('When sent', 'When resent'), 0,
	     'Set date in archive to when the mail is claimed to have been '
             'sent, or to the time we resend it?'),

## 	    ('archive_update_frequency', mm_cfg.Number, 3, 0,
## 	     "How often should new messages be incorporated?  "
## 	     "0 for no archival, 1 for daily, 2 for hourly"),

## 	    ('archive_volume_frequency', mm_cfg.Radio, ('Yearly', 'Monthly'),
## 	     0,
## 	     'How often should a new archive volume be started?'),

## 	    ('archive_retain_text_copy', mm_cfg.Toggle, ('No', 'Yes'),
## 	     0,
## 	     'Retain plain text copy of archive?'),
	    ]

    def UpdateArchive(self):
	if not self.archive:
	    return
	archive_file_name = os.path.join(self._full_path, ARCHIVE_PENDING)
	archive_dir = os.path.join(self.archive_directory, 'volume_%d' 
				   % self.volume)

	# Test to make sure there are posts to archive
	archive_file = open(archive_file_name, 'r')
	text = string.strip(archive_file.read())
	archive_file.close()
	if not text:
	    return
	mm_utils.MakeDirTree(archive_dir, 0755)
	# Pipermail 0.0.2 always looks at sys.argv, and I wasn't into hacking
	# it more than I had to, so here's a small hack to get around that,
	# calling pipermail w/ the correct options.
	real_argv = sys.argv
	sys.argv = ['pipermail', '-d%s' % archive_dir, '-l%s' % 
		    self._internal_name, '-m%s' % archive_file_name, 
		    '-s%s' % os.path.join(archive_dir, "INDEX")]

	import pipermail
	sys.argv = real_argv
	f = open(archive_file_name, 'w+')
	f.truncate(0)
	f.close()

# Internal function, don't call this.
    def ArchiveMail(self, post):
	"""Retain a text copy of the message in an mbox file."""
	if self.clobber_date:
	    import time
	    olddate = post.getheader('date')
	    post.SetHeader('Date', time.ctime(time.time()))
	try:
	    afn = self.ArchiveFileName()
	    mbox = self.ArchiveFile(afn)
	    mbox.AppendMessage(post)
	    mbox.fp.close()
	except IOError, msg:
	    self.LogMsg("system", ("Archive file access failure:\n"
				   "\t%s %s"
				   % (afn, `msg[1]`)))
	if self.clobber_date:
	    # Resurrect original date setting.
	    post.SetHeader('Date', olddate)
	self.Save ()

    def ArchiveFileName(self):
	if self.archive_private:
	    return os.path.join(mm_cfg.PRIVATE_ARCHIVE_FILE_DIR,
				self._internal_name)
	else:
	    return os.path.join(mm_cfg.PUBLIC_ARCHIVE_FILE_DIR,
				self._internal_name)
    def ArchiveFile(self, afn):
	ou = os.umask(002)
	try:
	    try:
		return mm_mbox.Mailbox(open(afn, "a+"))
	    except IOError, msg:
		raise IOError, msg
	finally:
	    os.umask(ou)