Viewing file: tap.py (4.77 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details.
from twisted.news import news, database from twisted.application import strports from twisted.python import usage, log
class DBOptions(usage.Options): optParameters = [ ['module', None, 'pyPgSQL.PgSQL', "DB-API 2.0 module to use"], ['dbhost', None, 'localhost', "Host where database manager is listening"], ['dbuser', None, 'news', "Username with which to connect to database"], ['database', None, 'news', "Database name to use"], ['schema', None, 'schema.sql', "File to which to write SQL schema initialisation"],
# XXX - Hrm. ["groups", "g", "groups.list", "File containing group list"], ["servers", "s", "servers.list", "File containing server list"] ] def postOptions(self): # XXX - Hmmm. self['groups'] = [g.strip() for g in open(self['groups']).readlines() if not g.startswith('#')] self['servers'] = [s.strip() for s in open(self['servers']).readlines() if not s.startswith('#')]
try: __import__(self['module']) except ImportError: log.msg("Warning: Cannot import %s" % (self['module'],)) f = open(self['schema'], 'w') f.write( database.NewsStorageAugmentation.schema + '\n' + database.makeGroupSQL(self['groups']) + '\n' + database.makeOverviewSQL() ) f.close() info = { 'host': self['dbhost'], 'user': self['dbuser'], 'database': self['database'], 'dbapiName': self['module'] } self.db = database.NewsStorageAugmentation(info)
class PickleOptions(usage.Options): optParameters = [ ['file', None, 'news.pickle', "File to which to save pickle"],
# XXX - Hrm. ["groups", "g", "groups.list", "File containing group list"], ["servers", "s", "servers.list", "File containing server list"], ["moderators", "m", "moderators.list", "File containing moderators list"], ] subCommands = None
def postOptions(self): # XXX - Hmmm. filename = self['file'] self['groups'] = [g.strip() for g in open(self['groups']).readlines() if not g.startswith('#')] self['servers'] = [s.strip() for s in open(self['servers']).readlines() if not s.startswith('#')] self['moderators'] = [s.split() for s in open(self['moderators']).readlines() if not s.startswith('#')] self.db = database.PickleStorage(filename, self['groups'], self['moderators'])
class Options(usage.Options): synopsis = "[options]" groups = None servers = None subscriptions = None
optParameters = [ ["port", "p", "119", "Listen port"], ["interface", "i", "", "Interface to which to bind"], ["datadir", "d", "news.db", "Root data storage path"], ["mailhost", "m", "localhost", "Host of SMTP server to use"] ] compData = usage.Completions( optActions={"datadir" : usage.CompleteDirs(), "mailhost" : usage.CompleteHostnames(), "interface" : usage.CompleteNetInterfaces()} )
def __init__(self): usage.Options.__init__(self) self.groups = [] self.servers = [] self.subscriptions = []
def opt_group(self, group): """The name of a newsgroup to carry.""" self.groups.append([group, None])
def opt_moderator(self, moderator): """The email of the moderator for the most recently passed group.""" self.groups[-1][1] = moderator
def opt_subscription(self, group): """A newsgroup to list as a recommended subscription.""" self.subscriptions.append(group)
def opt_server(self, server): """The address of a Usenet server to pass messages to and receive messages from.""" self.servers.append(server)
def makeService(config): if not len(config.groups): raise usage.UsageError("No newsgroups specified") db = database.NewsShelf(config['mailhost'], config['datadir']) for (g, m) in config.groups: if m: db.addGroup(g, 'm') db.addModerator(g, m) else: db.addGroup(g, 'y') for s in config.subscriptions: print s db.addSubscription(s) s = config['port'] if config['interface']: # Add a warning here s += ':interface='+config['interface'] return strports.service(s, news.UsenetServerFactory(db, config.servers))
|