# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from twisted.enterprise import adbapi
from twisted.news import news,database
from twisted.python import usage,log
import sys, getpass
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'],))
open(self['schema'], 'w').write(
database.NewsStorageAugmentation.schema + '\n' +
database.makeGroupSQL(self['groups']) + '\n' +
database.makeOverviewSQL()
)
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 = "Usage: mktap news [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"]
]
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 updateApplication(app, 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)
app.listenTCP(
int(config['port']),
news.UsenetServerFactory(db, config.servers),
interface = config['interface']
)
|