Gentoo Archives: gentoo-commits

From: "Alin Nastac (mrness)" <mrness@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in mail-filter/dspam/files: pgsql_createdb.py dspam.cron-r1 pgsql_purge.py digest-dspam-3.8.0-r7
Date: Sun, 30 Sep 2007 11:39:43
Message-Id: E1Ibx0a-00013q-Py@stork.gentoo.org
1 mrness 07/09/30 11:30:48
2
3 Added: pgsql_createdb.py dspam.cron-r1 pgsql_purge.py
4 digest-dspam-3.8.0-r7
5 Log:
6 Major dspam.cron and pkg_config redesign (#193081). Drop sqlite-2 support. Install prefs.h needed by dovecot-dspam.
7 (Portage version: 2.1.3.9)
8
9 Revision Changes Path
10 1.1 mail-filter/dspam/files/pgsql_createdb.py
11
12 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/pgsql_createdb.py?rev=1.1&view=markup
13 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/pgsql_createdb.py?rev=1.1&content-type=text/plain
14
15 Index: pgsql_createdb.py
16 ===================================================================
17 #!/bin/env python
18
19 import sys, os
20 import psycopg2
21 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
22
23 adminuser = ''
24 adminpass = ''
25
26 def inputStuff(title, default = None, empty = True):
27 if default is not None:
28 uinput = raw_input("%s [DEFAULT %s]: " %(title, default))
29 else:
30 uinput = raw_input("%s: " %(title))
31 if default:
32 if uinput == '':
33 return default
34 if uinput == '' and not empty:
35 print "Error: Zero length input not allowed!"
36 return inputStuff(title, default, empty)
37 return uinput
38
39 def main():
40 global adminuser
41 if len(sys.argv) == 7:
42 thiscript, serverhost, serverport, adminuser, dspamuser, dspamdb, createscript = sys.argv
43 elif len(sys.argv) == 8:
44 thiscript, serverhost, serverport, adminuser, dspamuser, dspamdb, createscript, vuserscript = sys.argv
45 else:
46 print "Usage: %s server_host server_port admin_user dspam_user dspam_dbname setup_DB_script [setup_virtual_user_script]" %(sys.argv[0])
47 sys.exit(1)
48 env = os.environ
49 dspampass = env['DSPAM_PgSQLPass']
50 con = connectasadmin(serverhost, serverport, 'template1')
51 con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # CREATE DATABASE needs this
52 cur = con.cursor()
53 createDbAndUser(cur, dspamuser, dspampass, dspamdb)
54 con.close()
55 con = connectasadmin(serverhost, serverport, dspamdb)
56 con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # CREATE LANGUAGE probably needs this
57 cur = con.cursor()
58 createLanguage(cur)
59 con.close()
60 executeScript(serverhost, serverport, dspamuser, dspampass, dspamdb, createscript)
61 if len(sys.argv) == 8:
62 executeScript(serverhost, serverport, dspamuser, dspampass, dspamdb, vuserscript)
63
64 def createDbAndUser(cur, dspamuser, dspampass, dspamdb):
65 try:
66 cur.execute("""CREATE USER %s WITH PASSWORD '%s' NOCREATEDB NOCREATEUSER;""" %(dspamuser, dspampass))
67 cur.execute("""CREATE DATABASE %s;""" %(dspamdb))
68 cur.execute("""GRANT ALL PRIVILEGES ON DATABASE %s TO %s;""" %(dspamdb, dspamuser))
69 cur.execute("""GRANT ALL PRIVILEGES ON SCHEMA public TO %s;""" %(dspamuser))
70 cur.execute("""UPDATE pg_database SET datdba=(SELECT usesysid FROM pg_shadow WHERE usename='%s') WHERE datname='%s';""" %(dspamuser, dspamdb))
71 except Exception, e:
72 print "ERROR:", e
73 sys.exit(2)
74
75 def createLanguage(cur):
76 try:
77 cur.execute("CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE c;")
78 cur.execute("CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '$libdir/plpgsql', 'plpgsql_validator' LANGUAGE c;")
79 cur.execute("CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator;")
80 except Exception, e:
81 print "ERROR:", e
82 sys.exit(2)
83
84 def executeScript(serverhost, serverport, dspamuser, dspampass, dspamdb, script):
85 try:
86 if len(serverport) > 0:
87 con = psycopg2.connect(host=serverhost, port=int(serverport), database=dspamdb, user=dspamuser, password=dspampass)
88 else:
89 con = psycopg2.connect(host=serverhost, database=dspamdb, user=dspamuser, password=dspampass)
90 con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # Needed for plpgsql
91 cur = con.cursor()
92 except Exception, e:
93 print "ERROR: ",e
94 sys.exit(3)
95 try:
96 f = open(script, 'r')
97 script = f.read()
98 f.close()
99 except Exception, e:
100 print "ERROR: ",e
101 sys.exit(4)
102 try:
103 cur.execute(script)
104 except Exception, e:
105 print "ERROR: ",e
106 sys.exit(5)
107 con.close()
108
109 def connectasadmin(serverhost, serverport, db):
110 global adminuser, adminpass
111 notconnected = 1
112 while(notconnected):
113 try:
114 if len(serverport) > 0:
115 con = psycopg2.connect(host=serverhost, port=int(serverport), database=db, user=adminuser, password=adminpass)
116 else:
117 con = psycopg2.connect(host=serverhost, database=db, user=adminuser, password=adminpass)
118 notconnected = 0
119 except psycopg2.OperationalError, e:
120 if 'no password' in e[0]:
121 adminpass = inputStuff('Password')
122 else:
123 print e
124 sys.exit(2)
125 except Exception, e:
126 print e
127 sys.exit(2)
128 return con
129
130 if __name__ == '__main__':
131 main()
132
133
134
135 1.1 mail-filter/dspam/files/dspam.cron-r1
136
137 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/dspam.cron-r1?rev=1.1&view=markup
138 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/dspam.cron-r1?rev=1.1&content-type=text/plain
139
140 Index: dspam.cron-r1
141 ===================================================================
142 #!/bin/sh
143 # Copyright 1999-2007 Gentoo Foundation
144 # Distributed under the terms of the GNU General Public License v2
145 #
146 # Remove old signatures and unimportant tokens from the DSPAM database.
147 # Purge old log entries in user logs.
148 #
149
150 #
151 # Parse optional command line parameters
152 #
153 for foo in $@
154 do
155 case "${foo}" in
156 --logdays=*) LOGROTATE_AGE="${foo#--logdays=}";;
157 --sigdays=*) SIGNATURE_AGE="${foo#--sigdays=}";;
158 --without-sql-purge) USE_SQL_PURGE=false;;
159 *)
160 echo "usage: $0 [--logdays=no_of_days] [--sigdays=no_of_days] [--without-sql-purge]"
161 exit 1
162 ;;
163 esac
164 done
165
166 #
167 # Parameters
168 #
169 [ -z "${LOGROTATE_AGE}" ] && LOGROTATE_AGE=30 # Delete log entries older than $LOGROTATE_AGE days
170 [ -z "${SIGNATURE_AGE}" ] && SIGNATURE_AGE=30 # Delete signatures older than $SIGNATURE_AGE days
171 [ -z "${USE_SQL_PURGE}" ] && USE_SQL_PURGE=true # Run sql purge scripts
172
173 #
174 # Function to run dspam_clean
175 #
176 run_dspam_clean() {
177 if [ ! -e "/usr/bin/dspam_clean" ]
178 then
179 echo "Can not run DSPAM clean application:"
180 echo " /usr/bin/dspam_clean does not exist"
181 return 1
182 else
183 /usr/bin/dspam_clean -s${SIGNATURE_AGE} -p${SIGNATURE_AGE} -u${SIGNATURE_AGE},${SIGNATURE_AGE},${SIGNATURE_AGE},${SIGNATURE_AGE} >/dev/null 2>&1
184 return $?
185 fi
186 }
187
188
189 #
190 # Function to check if we have all needed tools
191 #
192 check_for_tools() {
193 local myrc=0
194 for foo in awk cut sed getent
195 do
196 if ! which ${foo} >/dev/null 2>&1
197 then
198 echo "Command ${foo} not found!"
199 myrc=1
200 fi
201 done
202 return ${myrc}
203 }
204
205
206 #
207 # Function to read dspam.conf parameters
208 #
209 read_dspam_params() {
210 local PARAMETER VALUE
211 for PARAMETER in $@ ; do
212 VALUE=$(awk "BEGIN { IGNORECASE=1; } \$1==\"${PARAMETER}\" { print \$2; exit; }" "${DSPAM_CONFIGDIR}/dspam.conf")
213 [[ $? == 0 ]] || return 1
214 eval ${PARAMETER}=\"${VALUE}\"
215 done
216 return 0
217 }
218
219
220 #
221 # Function to clean DSPAM MySQL data
222 #
223 clean_mysql_drv() {
224 #
225 # MySQL
226 #
227 if ${USE_SQL_PURGE} && \
228 read_dspam_params MySQLServer MySQLPort MySQLUser MySQLPass MySQLDb MySQLCompress && \
229 [ -n "${MySQLServer}" -a -n "${MySQLUser}" -a -n "${MySQLDb}" ]
230 then
231 if [ ! -e "/usr/bin/mysql_config" ]
232 then
233 echo "Can not run MySQL purge script:"
234 echo " /usr/bin/mysql_config does not exist"
235 return 1
236 fi
237 DSPAM_MySQL_PURGE_SQL=
238 DSPAM_MySQL_VER=$(/usr/bin/mysql_config --version | sed "s:[^0-9.]*::g")
239 DSPAM_MySQL_MAJOR=$(echo "${DSPAM_MySQL_VER}" | cut -d. -f1)
240 DSPAM_MySQL_MINOR=$(echo "${DSPAM_MySQL_VER}" | cut -d. -f2)
241 DSPAM_MySQL_MICRO=$(echo "${DSPAM_MySQL_VER}" | cut -d. -f3)
242 DSPAM_MySQL_INT=$(($DSPAM_MySQL_MAJOR * 65536 + $DSPAM_MySQL_MINOR * 256 + $DSPAM_MySQL_MICRO))
243
244 # For MySQL >= 4.1 use the new purge script
245 if [ "${DSPAM_MySQL_INT}" -ge "262400" ]
246 then
247 if [ -f "${DSPAM_CONFIGDIR}/config/mysql_purge-4.1-optimized.sql" -o -f "${DSPAM_CONFIGDIR}/mysql_purge-4.1-optimized.sql" ]
248 then
249 # See: http://securitydot.net/txt/id/32/type/articles/
250 [ -f "${DSPAM_CONFIGDIR}/config/mysql_purge-4.1-optimized.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/config/mysql_purge-4.1-optimized.sql"
251 [ -f "${DSPAM_CONFIGDIR}/mysql_purge-4.1-optimized.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/mysql_purge-4.1-optimized.sql"
252 else
253 [ -f "${DSPAM_CONFIGDIR}/config/mysql_purge-4.1.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/config/mysql_purge-4.1.sql"
254 [ -f "${DSPAM_CONFIGDIR}/mysql_purge-4.1.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/mysql_purge-4.1.sql"
255 fi
256 else
257 [ -f "${DSPAM_CONFIGDIR}/config/mysql_purge.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/config/mysql_purge.sql"
258 [ -f "${DSPAM_CONFIGDIR}/mysql_purge.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_CONFIGDIR}/mysql_purge.sql"
259 fi
260
261 if [ -z "${DSPAM_MySQL_PURGE_SQL}" ]
262 then
263 echo "Can not run MySQL purge script:"
264 echo " No mysql_purge SQL script found"
265 return 1
266 fi
267
268 if [ ! -e "/usr/bin/mysql" ]
269 then
270 echo "Can not run MySQL purge script:"
271 echo " /usr/bin/mysql does not exist"
272 return 1
273 fi
274
275 # Construct mysql command line
276 DSPAM_MySQL_CMD="/usr/bin/mysql --silent --user=${MySQLUser}"
277 [ -S "${MySQLServer}" ] &&
278 DSPAM_MySQL_CMD="${DSPAM_MySQL_CMD} --socket=${MySQLServer}" ||
279 DSPAM_MySQL_CMD="${DSPAM_MySQL_CMD} --host=${MySQLServer}"
280 [ -n "${MySQLPort}" ] &&
281 DSPAM_MySQL_CMD="${DSPAM_MySQL_CMD} --port=${MySQLPort}"
282 [ "${MySQLCompress}" == "true" ] &&
283 DSPAM_MySQL_CMD="${DSPAM_MySQL_CMD} --compress"
284
285 # Run the MySQL purge script
286 MYSQL_PWD="${MySQLPass}" ${DSPAM_MySQL_CMD} ${MySQLDb} < ${DSPAM_MySQL_PURGE_SQL} >/dev/null
287 _RC=$?
288 if [ ${_RC} != 0 ]
289 then
290 echo "MySQL purge script returned error code ${_RC}"
291 fi
292
293 return 0
294 fi
295 }
296
297
298 #
299 # Function to clean DSPAM PostgreSQL data
300 #
301 clean_pgsql_drv() {
302 #
303 # PostgreSQL
304 #
305 if ${USE_SQL_PURGE} && \
306 read_dspam_params PgSQLServer PgSQLPort PgSQLUser PgSQLPass PgSQLDb && \
307 [ -n "${PgSQLServer}" -a -n "${PgSQLUser}" -a -n "${PgSQLDb}" ]
308 then
309 DSPAM_PgSQL_PURGE_SQL=""
310 [ -f "${DSPAM_CONFIGDIR}/config/pgsql_purge.sql" ] && DSPAM_PgSQL_PURGE_SQL="${DSPAM_CONFIGDIR}/config/pgsql_purge.sql"
311 [ -f "${DSPAM_CONFIGDIR}/pgsql_purge.sql" ] && DSPAM_PgSQL_PURGE_SQL="${DSPAM_CONFIGDIR}/pgsql_purge.sql"
312
313 if [ -z "${DSPAM_PgSQL_PURGE_SQL}" ]
314 then
315 echo "Can not run PostgreSQL purge script:"
316 echo " No pgsql_purge SQL script found"
317 return 1
318 fi
319
320 if [ -e "/usr/bin/psql" ]
321 then
322 # Construct psql command line
323 DSPAM_PgSQL_CMD="/usr/bin/psql -q -U ${PgSQLUser} -h ${PgSQLServer} -d ${PgSQLDb}"
324 [ -n "${PgSQLPort}" ] &&
325 DSPAM_PgSQL_CMD="${DSPAM_PgSQL_CMD} -p ${PgSQLPort}"
326
327 # Run the PostgreSQL purge script
328 PGUSER="${PgSQLUser}" PGPASSWORD="${PgSQLPass}" ${DSPAM_PgSQL_CMD} -f "${DSPAM_PgSQL_PURGE_SQL}" >/dev/null
329 else
330 # Run the pgsql_purge.py script
331 PGUSER="${PgSQLUser}" PGPASSWORD="${PgSQLPass}" "${DSPAM_CONFIGDIR}/pgsql_purge.py" "${PgSQLServer}" "${PgSQLPort}" "${PgSQLDb}" "${DSPAM_PgSQL_PURGE_SQL}"
332 fi
333
334 _RC=$?
335 if [ ${_RC} != 0 ]
336 then
337 echo "PostgreSQL purge script returned error code ${_RC}"
338 fi
339
340 return 0
341 fi
342 }
343
344
345 #
346 # Function to clean DSPAM Hash data
347 #
348 clean_hash_drv() {
349 #
350 # Hash
351 #
352 if [ -d "${DSPAM_HOMEDIR}/data" ]
353 then
354 find ${DSPAM_HOMEDIR}/data/ -maxdepth 4 -mindepth 1 -type f -name "*.css" | while read name
355 do
356 /usr/bin/csscompress "${name}" 1>/dev/null 2>&1
357 /usr/bin/cssclean "${name}" 1>/dev/null 2>&1
358 # chown dspam:dspam "${name}"
359 done
360 find ${DSPAM_HOMEDIR}/data/ -maxdepth 4 -mindepth 1 -type d -name "*.sig" | while read name
361 do
362 find "${name}" -maxdepth 1 -mindepth 1 -type f -mtime +${SIGNATURE_AGE} -name "*.sig" -exec /bin/rm "{}" ";"
363 done
364 return 0
365 else
366 return 1
367 fi
368 }
369
370
371 #
372 # Function to clean DSPAM SQLite3 data
373 #
374 clean_sqlite3_drv() {
375 #
376 # SQLite3
377 #
378 if ${USE_SQL_PURGE}
379 then
380 DSPAM_SQLite3_PURGE_SQL=""
381 [ -f "${DSPAM_CONFIGDIR}/config/sqlite3_purge.sql" ] && DSPAM_SQLite3_PURGE_SQL="${DSPAM_CONFIGDIR}/config/sqlite3_purge.sql"
382 [ -f "${DSPAM_CONFIGDIR}/sqlite3_purge.sql" ] && DSPAM_SQLite3_PURGE_SQL="${DSPAM_CONFIGDIR}/sqlite3_purge.sql"
383
384 if [ -z "${DSPAM_SQLite3_PURGE_SQL}" ]
385 then
386 echo "Can not run SQLite3 purge script:"
387 echo " No sqlite_purge SQL script found"
388 return 1
389 fi
390
391 if [ ! -e "/usr/bin/sqlite3" ]
392 then
393 echo "Can not run SQLite3 purge script:"
394 echo " /usr/bin/sqlite3 does not exist"
395 return 1
396 fi
397
398 # Run the SQLite3 purge script
399 find "${DSPAM_HOMEDIR}" -name "*.sdb" -print | while read name
400 do
401 /usr/bin/sqlite3 "$name" < "${DSPAM_SQLite3_PURGE_SQL}" >/dev/null
402 done 1>/dev/null 2>&1
403
404 return 0
405 fi
406
407 }
408
409
410 #
411 # Acquire lock file and start processing
412 #
413 DSPAM_CRON_LOCKFILE="/var/run/$(basename $0 .sh).pid"
414 if ( set -o noclobber; echo "$$" > "${DSPAM_CRON_LOCKFILE}") 2> /dev/null; then
415
416 trap 'rm -f "${DSPAM_CRON_LOCKFILE}"; exit $?' INT TERM EXIT
417
418 #
419 # Check for needed tools
420 #
421 if ! check_for_tools
422 then
423 # We have not all needed tools installed. Run just the dspam_clean part.
424 run_dspam_clean
425 exit $?
426 fi
427
428 #
429 # Try to get DSPAM config directory
430 #
431 DSPAM_CONFIGDIR=$(getent passwd dspam | awk -F : '{print $6}')
432 if [ ! -f "${DSPAM_CONFIGDIR}/dspam.conf" ]
433 then
434 # Something is wrong in passwd! Check if /etc/mail/dspam exists instead.
435 if [ -f /etc/mail/dspam/dspam.conf ]
436 then
437 DSPAM_CONFIGDIR="/etc/mail/dspam"
438 fi
439 fi
440 if [ ! -d "${DSPAM_CONFIGDIR}" ]
441 then
442 echo "Configuration directory not found!"
443 exit 2
444 fi
445
446 #
447 # Try to get DSPAM data home directory
448 #
449 if read_dspam_params Home && [ -d "${Home}" ]
450 then
451 DSPAM_HOMEDIR=${Home}
452 else
453 # Something is wrong in dspam.conf! Check if /var/spool/dspam exists instead.
454 if [ -d /var/spool/dspam ]
455 then
456 DSPAM_HOMEDIR="/var/spool/dspam"
457 fi
458 fi
459 if [ ! -d "${DSPAM_HOMEDIR}" ]
460 then
461 echo "Home directory not found! Please fix your dspam.conf."
462 exit 2
463 fi
464
465 #
466 # User log purging
467 #
468 if [ -d "${DSPAM_CONFIGDIR}/data" ]
469 then
470 dspam_logrotate -a ${LOGROTATE_AGE} -d "${DSPAM_CONFIGDIR}/data" >/dev/null # 2>&1
471 fi
472
473 if [ ! -e "/usr/bin/dspam" ]
474 then
475 echo "Can not run DSPAM application:"
476 echo " /usr/bin/dspam does not exist"
477 return 1
478 fi
479
480 #
481 # Process all available storage drivers
482 #
483 for foo in $(/usr/bin/dspam --version 2>&1 | sed -n "s:,: :g;s:^.*\-\-with\-storage\-driver=\([^\'\]*\).*:\1:gIp")
484 do
485 case "${foo}" in
486 hash_drv)
487 clean_hash_drv
488 ;;
489 mysql_drv)
490 clean_mysql_drv
491 ;;
492 pgsql_drv)
493 clean_pgsql_drv
494 ;;
495 sqlite3_drv)
496 clean_sqlite3_drv
497 ;;
498 *)
499 echo "Unknown storage ${foo} driver"
500 ;;
501 esac
502 done
503
504 #
505 # Run the dspam_clean command
506 #
507 run_dspam_clean
508
509
510 #
511 # Release lock
512 #
513 /bin/rm -f "${DSPAM_CRON_LOCKFILE}"
514 trap - INT TERM EXIT
515 fi
516
517
518
519 1.1 mail-filter/dspam/files/pgsql_purge.py
520
521 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/pgsql_purge.py?rev=1.1&view=markup
522 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/pgsql_purge.py?rev=1.1&content-type=text/plain
523
524 Index: pgsql_purge.py
525 ===================================================================
526 #!/bin/env python
527
528 import sys, os
529 import psycopg2
530 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
531
532 def main():
533 if len(sys.argv) == 5:
534 thiscript, serverhost, serverport, dspamdb, purgescript = sys.argv
535 else:
536 print "Usage: %s server_host server_port dspam_dbname purge_script" %(sys.argv[0])
537 sys.exit(1)
538 try:
539 env = os.environ
540 dspamuser = env['PGUSER']
541 dspampass = env['PGPASSWORD']
542 if len(serverport) > 0:
543 con = psycopg2.connect(host=serverhost, port=int(serverport), database=dspamdb, user=dspamuser, password=dspampass)
544 else:
545 con = psycopg2.connect(host=serverhost, database=dspamdb, user=dspamuser, password=dspampass)
546 con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # Needed for plpgsql
547 cur = con.cursor()
548 except Exception, e:
549 print "ERROR: ",e
550 sys.exit(2)
551 try:
552 f = open(purgescript, 'r')
553 script = f.read()
554 f.close()
555 except Exception, e:
556 print "ERROR: ",e
557 sys.exit(3)
558 try:
559 cur.execute(script)
560 except Exception, e:
561 print "ERROR: ",e
562 sys.exit(4)
563 con.close()
564
565 if __name__ == '__main__':
566 main()
567
568
569
570 1.1 mail-filter/dspam/files/digest-dspam-3.8.0-r7
571
572 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/digest-dspam-3.8.0-r7?rev=1.1&view=markup
573 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/mail-filter/dspam/files/digest-dspam-3.8.0-r7?rev=1.1&content-type=text/plain
574
575 Index: digest-dspam-3.8.0-r7
576 ===================================================================
577 MD5 1b44857a1cafe810fb321d5d6d326fe9 dspam-3.8.0-patches-20070930.tar.gz 8356
578 RMD160 3ea07fac355ecfbbd0569cdcb08b57ce252365e0 dspam-3.8.0-patches-20070930.tar.gz 8356
579 SHA256 ee22f7625445d37111aa4d8fa2f7c3cb159b96a86df29a97a01c9086c4e84e0d dspam-3.8.0-patches-20070930.tar.gz 8356
580 MD5 056b8c8b3ad9415a52c01b22ff1e64cf dspam-3.8.0.tar.gz 726160
581 RMD160 e7831e2415e30e819dd9cbc0ba3f269e113e2fb9 dspam-3.8.0.tar.gz 726160
582 SHA256 84a227934a7aee73516bdb82c33ee7b359e955c8cd95a1544a9a13069f79bfc7 dspam-3.8.0.tar.gz 726160
583 MD5 8ffe9d41e6104a4c6d19067528193145 dspam_sa_trainer.tar.gz 1230
584 RMD160 c3d0fca7169d23ecf9d44c850ee255b42d97d818 dspam_sa_trainer.tar.gz 1230
585 SHA256 8fb6b1ebe592acf00a028737ef8e174544af166768b987d29048b2319bc5a215 dspam_sa_trainer.tar.gz 1230
586
587
588
589 --
590 gentoo-commits@g.o mailing list