| OLD | NEW |
| (Empty) |
| 1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
| 2 # See LICENSE for details. | |
| 3 | |
| 4 | |
| 5 from twisted.news import news, database | |
| 6 from twisted.application import strports | |
| 7 from twisted.python import usage, log | |
| 8 | |
| 9 class DBOptions(usage.Options): | |
| 10 optParameters = [ | |
| 11 ['module', None, 'pyPgSQL.PgSQL', "DB-API 2.0 module to use"], | |
| 12 ['dbhost', None, 'localhost', "Host where database manager is list
ening"], | |
| 13 ['dbuser', None, 'news', "Username with which to connect to d
atabase"], | |
| 14 ['database', None, 'news', "Database name to use"], | |
| 15 ['schema', None, 'schema.sql', "File to which to write SQL schema i
nitialisation"], | |
| 16 | |
| 17 # XXX - Hrm. | |
| 18 ["groups", "g", "groups.list", "File containing group list"], | |
| 19 ["servers", "s", "servers.list", "File containing server list"] | |
| 20 ] | |
| 21 | |
| 22 def postOptions(self): | |
| 23 # XXX - Hmmm. | |
| 24 self['groups'] = [g.strip() for g in open(self['groups']).readlines() if
not g.startswith('#')] | |
| 25 self['servers'] = [s.strip() for s in open(self['servers']).readlines()
if not s.startswith('#')] | |
| 26 | |
| 27 try: | |
| 28 __import__(self['module']) | |
| 29 except ImportError: | |
| 30 log.msg("Warning: Cannot import %s" % (self['module'],)) | |
| 31 | |
| 32 open(self['schema'], 'w').write( | |
| 33 database.NewsStorageAugmentation.schema + '\n' + | |
| 34 database.makeGroupSQL(self['groups']) + '\n' + | |
| 35 database.makeOverviewSQL() | |
| 36 ) | |
| 37 | |
| 38 info = { | |
| 39 'host': self['dbhost'], 'user': self['dbuser'], | |
| 40 'database': self['database'], 'dbapiName': self['module'] | |
| 41 } | |
| 42 self.db = database.NewsStorageAugmentation(info) | |
| 43 | |
| 44 | |
| 45 class PickleOptions(usage.Options): | |
| 46 optParameters = [ | |
| 47 ['file', None, 'news.pickle', "File to which to save pickle"], | |
| 48 | |
| 49 # XXX - Hrm. | |
| 50 ["groups", "g", "groups.list", "File containing group list"], | |
| 51 ["servers", "s", "servers.list", "File containing server list"], | |
| 52 ["moderators", "m", "moderators.list", | |
| 53 "File containing moderators list"], | |
| 54 ] | |
| 55 | |
| 56 subCommands = None | |
| 57 | |
| 58 def postOptions(self): | |
| 59 # XXX - Hmmm. | |
| 60 filename = self['file'] | |
| 61 self['groups'] = [g.strip() for g in open(self['groups']).readlines() | |
| 62 if not g.startswith('#')] | |
| 63 self['servers'] = [s.strip() for s in open(self['servers']).readlines() | |
| 64 if not s.startswith('#')] | |
| 65 self['moderators'] = [s.split() | |
| 66 for s in open(self['moderators']).readlines() | |
| 67 if not s.startswith('#')] | |
| 68 self.db = database.PickleStorage(filename, self['groups'], | |
| 69 self['moderators']) | |
| 70 | |
| 71 | |
| 72 class Options(usage.Options): | |
| 73 synopsis = "Usage: mktap news [options]" | |
| 74 | |
| 75 groups = None | |
| 76 servers = None | |
| 77 subscriptions = None | |
| 78 | |
| 79 optParameters = [ | |
| 80 ["port", "p", "119", "Listen port"], | |
| 81 ["interface", "i", "", "Interface to which to bind"], | |
| 82 ["datadir", "d", "news.db", "Root data storage path"], | |
| 83 ["mailhost", "m", "localhost", "Host of SMTP server to use"] | |
| 84 ] | |
| 85 zsh_actions = {"datadir" : "_dirs", "mailhost" : "_hosts"} | |
| 86 | |
| 87 def __init__(self): | |
| 88 usage.Options.__init__(self) | |
| 89 self.groups = [] | |
| 90 self.servers = [] | |
| 91 self.subscriptions = [] | |
| 92 | |
| 93 | |
| 94 def opt_group(self, group): | |
| 95 """The name of a newsgroup to carry.""" | |
| 96 self.groups.append([group, None]) | |
| 97 | |
| 98 | |
| 99 def opt_moderator(self, moderator): | |
| 100 """The email of the moderator for the most recently passed group.""" | |
| 101 self.groups[-1][1] = moderator | |
| 102 | |
| 103 | |
| 104 def opt_subscription(self, group): | |
| 105 """A newsgroup to list as a recommended subscription.""" | |
| 106 self.subscriptions.append(group) | |
| 107 | |
| 108 | |
| 109 def opt_server(self, server): | |
| 110 """The address of a Usenet server to pass messages to and receive messag
es from.""" | |
| 111 self.servers.append(server) | |
| 112 | |
| 113 | |
| 114 def makeService(config): | |
| 115 if not len(config.groups): | |
| 116 raise usage.UsageError("No newsgroups specified") | |
| 117 | |
| 118 db = database.NewsShelf(config['mailhost'], config['datadir']) | |
| 119 for (g, m) in config.groups: | |
| 120 if m: | |
| 121 db.addGroup(g, 'm') | |
| 122 db.addModerator(g, m) | |
| 123 else: | |
| 124 db.addGroup(g, 'y') | |
| 125 for s in config.subscriptions: | |
| 126 print s | |
| 127 db.addSubscription(s) | |
| 128 s = config['port'] | |
| 129 if config['interface']: | |
| 130 # Add a warning here | |
| 131 s += ':interface='+config['interface'] | |
| 132 return strports.service(s, news.UsenetServerFactory(db, config.servers)) | |
| OLD | NEW |