Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / news / tap.py
1 # Copyright (c) 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 listening"],
13         ['dbuser',   None, 'news',          "Username with which to connect to database"],
14         ['database', None, 'news',          "Database name to use"],
15         ['schema',   None, 'schema.sql',    "File to which to write SQL schema initialisation"],
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         f = open(self['schema'], 'w')
33         f.write(
34             database.NewsStorageAugmentation.schema + '\n' +
35             database.makeGroupSQL(self['groups']) + '\n' +
36             database.makeOverviewSQL()
37         )
38         f.close()
39         
40         info = {
41             'host': self['dbhost'], 'user': self['dbuser'],
42             'database': self['database'], 'dbapiName': self['module']
43         }
44         self.db = database.NewsStorageAugmentation(info)
45
46
47 class PickleOptions(usage.Options):
48     optParameters = [
49         ['file', None, 'news.pickle', "File to which to save pickle"],
50
51         # XXX - Hrm.
52         ["groups",     "g", "groups.list",   "File containing group list"],
53         ["servers",    "s", "servers.list",  "File containing server list"],
54         ["moderators", "m", "moderators.list",
55          "File containing moderators list"],
56     ]
57     
58     subCommands = None
59
60     def postOptions(self):
61         # XXX - Hmmm.
62         filename = self['file']
63         self['groups'] = [g.strip() for g in open(self['groups']).readlines()
64                           if not g.startswith('#')]
65         self['servers'] = [s.strip() for s in open(self['servers']).readlines()
66                            if not s.startswith('#')]
67         self['moderators'] = [s.split()
68                               for s in open(self['moderators']).readlines()
69                               if not s.startswith('#')]
70         self.db = database.PickleStorage(filename, self['groups'],
71                                          self['moderators'])
72
73
74 class Options(usage.Options):
75     synopsis = "[options]"
76     
77     groups = None
78     servers = None
79     subscriptions = None
80
81     optParameters = [
82         ["port",       "p", "119",           "Listen port"],
83         ["interface",  "i", "",              "Interface to which to bind"],
84         ["datadir",    "d", "news.db",       "Root data storage path"],
85         ["mailhost",   "m", "localhost",     "Host of SMTP server to use"]
86     ]
87     compData = usage.Completions(
88                    optActions={"datadir" : usage.CompleteDirs(),
89                                "mailhost" : usage.CompleteHostnames(),
90                                "interface" : usage.CompleteNetInterfaces()}
91                    )
92
93     def __init__(self):
94         usage.Options.__init__(self)
95         self.groups = []
96         self.servers = []
97         self.subscriptions = []
98
99
100     def opt_group(self, group):
101         """The name of a newsgroup to carry."""
102         self.groups.append([group, None])
103
104
105     def opt_moderator(self, moderator):
106         """The email of the moderator for the most recently passed group."""
107         self.groups[-1][1] = moderator
108
109
110     def opt_subscription(self, group):
111         """A newsgroup to list as a recommended subscription."""
112         self.subscriptions.append(group)
113
114
115     def opt_server(self, server):
116         """The address of a Usenet server to pass messages to and receive messages from."""
117         self.servers.append(server)
118
119
120 def makeService(config):
121     if not len(config.groups):
122         raise usage.UsageError("No newsgroups specified")
123     
124     db = database.NewsShelf(config['mailhost'], config['datadir'])
125     for (g, m) in config.groups:
126         if m:
127             db.addGroup(g, 'm')
128             db.addModerator(g, m)
129         else:
130             db.addGroup(g, 'y')
131     for s in config.subscriptions:
132         print s
133         db.addSubscription(s)
134     s = config['port']
135     if config['interface']:
136         # Add a warning here
137         s += ':interface='+config['interface']
138     return strports.service(s, news.UsenetServerFactory(db, config.servers))