Lines 11-29
Link Here
|
11 |
__version__ = "1.1" |
11 |
__version__ = "1.1" |
12 |
__author__ = "Lindsey Smith (lindsey.smith@gmail.com)" |
12 |
__author__ = "Lindsey Smith (lindsey.smith@gmail.com)" |
13 |
__copyright__ = "(C) 2009 by Lindsey Smith, Released under GNU GPL 2 License" |
13 |
__copyright__ = "(C) 2009 by Lindsey Smith, Released under GNU GPL 2 License" |
14 |
___contributors__ = [ "Lindsey Smith (lindsey.smith@gmail.com)" ] |
14 |
__contributors__ = [ "Lindsey Smith (lindsey.smith@gmail.com)", "Torsten Kurbad (torsten@tk-webart.de)" ] |
15 |
|
15 |
|
16 |
import web |
16 |
import web |
17 |
import rss2email |
17 |
import rss2email |
18 |
import os |
18 |
import os |
19 |
import sys |
19 |
import sys |
20 |
from rss2email import Feed, isstr |
20 |
from rss2email import Feed, isstr |
21 |
import logging |
21 |
import logging |
|
|
22 |
import getopt |
23 |
import os.path |
22 |
|
24 |
|
23 |
feedfile = 'feeds.dat' |
25 |
helptext = """\ |
|
|
26 |
Usage: %s [-h] [-f feeds.dat] [-p pid-file] [listen-address:port] |
24 |
|
27 |
|
25 |
render = web.template.render('templates/') |
28 |
-h | --help : display this help text |
|
|
29 |
-f | --feeds path/to/feeds.dat : use a source for feeds other than |
30 |
/etc/rss2email/feeds.dat |
31 |
-p | --pid path/to/r2eui.pid : write a pid file (for daemon use) |
32 |
listen-address:port : make r2eui listen to this IP:port |
33 |
(default: 0.0.0.0:8080) |
34 |
""" % sys.argv[0][:-3] |
35 |
|
36 |
optlist = None |
37 |
try: |
38 |
optlist, argv = getopt.gnu_getopt( |
39 |
sys.argv[1:], 'hf:p:', ['help', 'feeds=', 'pid=']) |
40 |
sys.argv[1:] = argv[:] |
41 |
except getopt.GetoptError, e: |
42 |
print 'Error: %s\n' % e |
43 |
print helptext |
44 |
sys.exit(1) |
45 |
else: |
46 |
pass |
47 |
|
48 |
feedfile = '/etc/rss2email/feeds.dat' |
49 |
pidfile = None |
50 |
|
51 |
if optlist is not None: |
52 |
for (option, value) in optlist: |
53 |
if option in ['-h', '--help']: |
54 |
print helptext |
55 |
sys.exit(0) |
56 |
if option in ['-f', '--feeds']: |
57 |
feedfile = value |
58 |
if option in ['-p', '--pid']: |
59 |
pidfile = value |
60 |
|
61 |
if pidfile is not None: |
62 |
if os.path.exists(pidfile): |
63 |
try: |
64 |
fd = open(pidfile, 'r') |
65 |
oldpid = fd.readline().strip() |
66 |
fd.close() |
67 |
except IOError, e: |
68 |
print 'Error: Old pid file exists, but cannot be read.' |
69 |
print 'Python returned: %s' % e |
70 |
sys.exit(1) |
71 |
if os.path.exists('/proc/%s' % oldpid): |
72 |
print 'Error: %s already running on pid %s.' % (sys.argv[0][:-3], oldpid) |
73 |
sys.exit(1) |
74 |
try: |
75 |
os.unlink(pidfile) |
76 |
print 'Warning: Removed stale pid file for pid %s.' % oldpid |
77 |
except OSError, e: |
78 |
print 'Error: Stale pid file exists, but cannot be removed.' |
79 |
print 'Python returned: %s' % e |
80 |
sys.exit(1) |
81 |
fd = open(pidfile, 'w') |
82 |
fd.write('%d\n' % os.getpid()) |
83 |
fd.close() |
26 |
|
84 |
|
|
|
85 |
render = web.template.render('templates/') |
27 |
urls = ( |
86 |
urls = ( |
28 |
'/', 'index', |
87 |
'/', 'index', |
29 |
'/add', 'add', |
88 |
'/add', 'add', |
Lines 40-158
Link Here
|
40 |
formatter = logging.Formatter("%(levelname)s - %(message)s") |
99 |
formatter = logging.Formatter("%(levelname)s - %(message)s") |
41 |
ch.setFormatter(formatter) |
100 |
ch.setFormatter(formatter) |
42 |
logger.addHandler(ch) |
101 |
logger.addHandler(ch) |
43 |
|
102 |
|
44 |
|
103 |
|
45 |
def load(lock=0): |
104 |
def load(lock=0): |
46 |
rss2email.feedfile = feedfile |
105 |
rss2email.feedfile = feedfile |
47 |
return rss2email.load(lock) |
106 |
return rss2email.load(lock) |
48 |
|
107 |
|
49 |
|
108 |
|
50 |
def updatefeedlist(sitevars): |
109 |
def updatefeedlist(sitevars): |
51 |
sitevars['feeds'], sitevars['feedfileObject'] = load() |
110 |
sitevars['feeds'], sitevars['feedfileObject'] = load() |
52 |
|
111 |
|
53 |
if sitevars['feeds'] and isstr(sitevars['feeds'][0]): |
112 |
if sitevars['feeds'] and isstr(sitevars['feeds'][0]): |
54 |
sitevars['default_to'] = sitevars['feeds'][0]; |
113 |
sitevars['default_to'] = sitevars['feeds'][0]; |
55 |
sitevars['ifeeds'] = sitevars['feeds'][1:]; |
114 |
sitevars['ifeeds'] = sitevars['feeds'][1:]; |
56 |
sitevars['i']=1 |
115 |
sitevars['i']=1 |
57 |
else: |
116 |
else: |
58 |
sitevars['ifeeds'] = sitevars['feeds']; |
117 |
sitevars['ifeeds'] = sitevars['feeds']; |
59 |
sitevars['i'] = 0; |
118 |
sitevars['i'] = 0; |
60 |
sitevars['default_to'] = '' |
119 |
sitevars['default_to'] = '' |
61 |
|
120 |
|
62 |
class base: |
121 |
class base: |
63 |
def __init__(self): |
122 |
def __init__(self): |
64 |
feeds, feedfileObject = load() |
123 |
feeds, feedfileObject = load() |
65 |
|
124 |
|
66 |
if feeds and isstr(feeds[0]): |
125 |
if feeds and isstr(feeds[0]): |
67 |
default_to = feeds[0]; ifeeds = feeds[1:]; i=1 |
126 |
default_to = feeds[0]; ifeeds = feeds[1:]; i=1 |
68 |
else: ifeeds = feeds; i = 0; default_to = '' |
127 |
else: ifeeds = feeds; i = 0; default_to = '' |
69 |
|
128 |
|
70 |
self.sitevars = {'urltoadd':'', 'adderrormsg':'', 'changeerrormsg':'', 'newemail':'', 'feeds': feeds, 'feedfileObject': feedfileObject, 'default_to': default_to, 'ifeeds': ifeeds, 'i':i, 'addemail': '', 'version': __version__, 'copyright': __copyright__, 'author':__author__, 'usedefaultemail':'checked'} |
129 |
self.sitevars = {'urltoadd':'', 'adderrormsg':'', 'changeerrormsg':'', 'newemail':'', 'feeds': feeds, 'feedfileObject': feedfileObject, 'default_to': default_to, 'ifeeds': ifeeds, 'i':i, 'addemail': '', 'version': __version__, 'copyright': __copyright__, 'author':__author__, 'usedefaultemail':'checked', 'contributors':', '.join(__contributors__[1:])} |
71 |
|
130 |
|
72 |
def GET(self): |
131 |
def GET(self): |
73 |
web.redirect('/') |
132 |
web.redirect('/') |
74 |
|
133 |
|
75 |
class index(base): |
134 |
class index(base): |
76 |
def GET(self): |
135 |
def GET(self): |
77 |
return render.ui(self.sitevars) |
136 |
return render.ui(self.sitevars) |
78 |
|
137 |
|
79 |
class add(base): |
138 |
class add(base): |
80 |
def POST(self): |
139 |
def POST(self): |
81 |
i = web.input() |
140 |
i = web.input() |
82 |
|
141 |
|
83 |
self.sitevars['urltoadd'] = i.urltoadd |
142 |
self.sitevars['urltoadd'] = i.urltoadd |
84 |
self.sitevars['addemail'] = i.addemail |
143 |
self.sitevars['addemail'] = i.addemail |
85 |
errmsg = '' |
144 |
errmsg = '' |
86 |
usedefault = i.has_key('defaultemail') |
145 |
usedefault = i.has_key('defaultemail') |
87 |
if usedefault: self.sitevars['usedefaultemail'] = 'checked' |
146 |
if usedefault: |
88 |
else: self.sitevars['usedefaultemail'] = '' |
147 |
self.sitevars['usedefaultemail'] = 'checked' |
89 |
print self.sitevars['usedefaultemail'] |
148 |
else: |
|
|
149 |
self.sitevars['usedefaultemail'] = '' |
150 |
print self.sitevars['usedefaultemail'] |
90 |
|
151 |
|
91 |
# TODO: add validity checks on url and email address |
152 |
# TODO: add validity checks on url and email address |
92 |
if i.urltoadd == '': |
153 |
if i.urltoadd == '': |
93 |
errmsg = '* Enter a new feed URL ("http://www.site.com/rss.xml" for example). ' |
154 |
errmsg = '* Enter a new feed URL ("http://www.site.com/rss.xml" for example). ' |
94 |
|
155 |
|
95 |
if not usedefault: |
156 |
if not usedefault: |
96 |
if i.addemail == '': |
157 |
if i.addemail == '': |
97 |
errmsg += '* Enter an email address for feed updates. ' |
158 |
errmsg += '* Enter an email address for feed updates. ' |
98 |
elif (i.addemail.find('@') == -1): |
159 |
elif (i.addemail.find('@') == -1): |
99 |
errmsg += '* Please enter a valid email address in the form email@site.com' |
160 |
errmsg += '* Please enter a valid email address in the form email@site.com' |
100 |
|
161 |
|
101 |
if usedefault and self.sitevars['default_to'] == '': |
162 |
if usedefault and self.sitevars['default_to'] == '': |
102 |
errmsg += '* You must either set a default email address or specify an address for this new feed. ' |
163 |
errmsg += '* You must either set a default email address or specify an address for this new feed. ' |
103 |
|
164 |
|
104 |
self.sitevars['adderrormsg'] = errmsg |
165 |
self.sitevars['adderrormsg'] = errmsg |
105 |
|
166 |
|
106 |
if errmsg == '': |
167 |
if errmsg == '': |
107 |
if usedefault: args = [i.urltoadd] |
168 |
if usedefault: |
108 |
else: args = [i.urltoadd, i.addemail] |
169 |
args = [i.urltoadd] |
109 |
rss2email.add(*args) |
170 |
else: |
110 |
updatefeedlist(self.sitevars) |
171 |
args = [i.urltoadd, i.addemail] |
111 |
|
172 |
rss2email.add(*args) |
|
|
173 |
updatefeedlist(self.sitevars) |
174 |
|
112 |
return render.ui(self.sitevars) |
175 |
return render.ui(self.sitevars) |
113 |
|
176 |
|
114 |
class change(base): |
177 |
class change(base): |
115 |
def POST(self): |
178 |
def POST(self): |
116 |
i = web.input() |
179 |
i = web.input() |
117 |
|
180 |
|
118 |
self.sitevars['newemail'] = i.newemail |
181 |
self.sitevars['newemail'] = i.newemail |
119 |
if i.newemail == '': |
182 |
if i.newemail == '': |
120 |
self.sitevars['changeerrormsg'] = 'Enter a new email address please' |
183 |
self.sitevars['changeerrormsg'] = 'Enter a new email address please' |
121 |
else: |
184 |
else: |
122 |
rss2email.email(i.newemail) |
185 |
rss2email.email(i.newemail) |
123 |
updatefeedlist(self.sitevars) |
186 |
updatefeedlist(self.sitevars) |
124 |
|
187 |
|
125 |
return render.ui(self.sitevars) |
188 |
return render.ui(self.sitevars) |
126 |
|
189 |
|
127 |
class delete(base): |
190 |
class delete(base): |
128 |
def POST(self): |
191 |
def POST(self): |
129 |
inputs = web.input() |
192 |
inputs = web.input() |
130 |
if self.sitevars['i'] == 1: |
193 |
if self.sitevars['i'] == 1: |
131 |
offset = 0 |
194 |
offset = 0 |
132 |
else: |
195 |
else: |
133 |
offset = 1 |
196 |
offset = 1 |
134 |
i = len(self.sitevars['ifeeds']) |
197 |
i = len(self.sitevars['ifeeds']) |
135 |
while i >= 0: |
198 |
while i >= 0: |
136 |
feed = self.sitevars['ifeeds'][i-1] |
199 |
feed = self.sitevars['ifeeds'][i-1] |
137 |
s = 'D' + str(i) |
200 |
s = 'D' + str(i) |
138 |
if inputs.has_key(s): |
201 |
if inputs.has_key(s): |
139 |
rss2email.delete(i) |
202 |
rss2email.delete(i) |
140 |
i -= 1 |
203 |
i -= 1 |
141 |
|
204 |
|
142 |
updatefeedlist(self.sitevars) |
205 |
updatefeedlist(self.sitevars) |
143 |
return render.ui(self.sitevars) |
206 |
return render.ui(self.sitevars) |
144 |
|
207 |
|
145 |
class run(base): |
208 |
class run(base): |
146 |
def POST(self): |
209 |
def POST(self): |
147 |
rss2email.run() |
210 |
rss2email.run() |
148 |
return render.ui(self.sitevars) |
211 |
return render.ui(self.sitevars) |
149 |
|
|
|
150 |
|
151 |
if __name__ == '__main__': |
152 |
if not os.path.exists(feedfile): |
153 |
print 'Feedfile "%s" does not exist. If you\'re using r2e for the first time,' % feedfile |
154 |
print "you have to run 'r2e new' first." |
155 |
sys.exit(1) |
156 |
app.run() |
157 |
|
212 |
|
158 |
|
213 |
|
|
|
214 |
if __name__ == '__main__': |
215 |
if not os.path.exists(feedfile): |
216 |
print 'Feedfile "%s" does not exist. If you\'re using r2e for the first time,' % feedfile |
217 |
print "you have to run 'r2e new' first." |
218 |
sys.exit(1) |
219 |
try: |
220 |
app.run() |
221 |
except: |
222 |
pass |
223 |
finally: |
224 |
# Cleanup |
225 |
if pidfile is not None: |
226 |
os.unlink(pidfile) |