--- r2eui.py.dist 2009-11-21 19:56:01.800482805 +0100 +++ r2eui.py 2009-11-22 12:26:33.880483473 +0100 @@ -11,19 +11,78 @@ __version__ = "1.1" __author__ = "Lindsey Smith (lindsey.smith@gmail.com)" __copyright__ = "(C) 2009 by Lindsey Smith, Released under GNU GPL 2 License" -___contributors__ = [ "Lindsey Smith (lindsey.smith@gmail.com)" ] - +__contributors__ = [ "Lindsey Smith (lindsey.smith@gmail.com)", "Torsten Kurbad (torsten@tk-webart.de)" ] + import web import rss2email import os import sys from rss2email import Feed, isstr import logging +import getopt +import os.path -feedfile = 'feeds.dat' +helptext = """\ +Usage: %s [-h] [-f feeds.dat] [-p pid-file] [listen-address:port] -render = web.template.render('templates/') + -h | --help : display this help text + -f | --feeds path/to/feeds.dat : use a source for feeds other than + /etc/rss2email/feeds.dat + -p | --pid path/to/r2eui.pid : write a pid file (for daemon use) + listen-address:port : make r2eui listen to this IP:port + (default: 0.0.0.0:8080) +""" % sys.argv[0][:-3] + +optlist = None +try: + optlist, argv = getopt.gnu_getopt( + sys.argv[1:], 'hf:p:', ['help', 'feeds=', 'pid=']) + sys.argv[1:] = argv[:] +except getopt.GetoptError, e: + print 'Error: %s\n' % e + print helptext + sys.exit(1) +else: + pass + +feedfile = '/etc/rss2email/feeds.dat' +pidfile = None + +if optlist is not None: + for (option, value) in optlist: + if option in ['-h', '--help']: + print helptext + sys.exit(0) + if option in ['-f', '--feeds']: + feedfile = value + if option in ['-p', '--pid']: + pidfile = value + +if pidfile is not None: + if os.path.exists(pidfile): + try: + fd = open(pidfile, 'r') + oldpid = fd.readline().strip() + fd.close() + except IOError, e: + print 'Error: Old pid file exists, but cannot be read.' + print 'Python returned: %s' % e + sys.exit(1) + if os.path.exists('/proc/%s' % oldpid): + print 'Error: %s already running on pid %s.' % (sys.argv[0][:-3], oldpid) + sys.exit(1) + try: + os.unlink(pidfile) + print 'Warning: Removed stale pid file for pid %s.' % oldpid + except OSError, e: + print 'Error: Stale pid file exists, but cannot be removed.' + print 'Python returned: %s' % e + sys.exit(1) + fd = open(pidfile, 'w') + fd.write('%d\n' % os.getpid()) + fd.close() +render = web.template.render('templates/') urls = ( '/', 'index', '/add', 'add', @@ -40,119 +99,128 @@ formatter = logging.Formatter("%(levelname)s - %(message)s") ch.setFormatter(formatter) logger.addHandler(ch) - + def load(lock=0): - rss2email.feedfile = feedfile - return rss2email.load(lock) - + rss2email.feedfile = feedfile + return rss2email.load(lock) + def updatefeedlist(sitevars): - sitevars['feeds'], sitevars['feedfileObject'] = load() - - if sitevars['feeds'] and isstr(sitevars['feeds'][0]): - sitevars['default_to'] = sitevars['feeds'][0]; - sitevars['ifeeds'] = sitevars['feeds'][1:]; - sitevars['i']=1 - else: - sitevars['ifeeds'] = sitevars['feeds']; - sitevars['i'] = 0; - sitevars['default_to'] = '' + sitevars['feeds'], sitevars['feedfileObject'] = load() + + if sitevars['feeds'] and isstr(sitevars['feeds'][0]): + sitevars['default_to'] = sitevars['feeds'][0]; + sitevars['ifeeds'] = sitevars['feeds'][1:]; + sitevars['i']=1 + else: + sitevars['ifeeds'] = sitevars['feeds']; + sitevars['i'] = 0; + sitevars['default_to'] = '' class base: def __init__(self): feeds, feedfileObject = load() - + if feeds and isstr(feeds[0]): default_to = feeds[0]; ifeeds = feeds[1:]; i=1 else: ifeeds = feeds; i = 0; default_to = '' - 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'} + 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:])} def GET(self): web.redirect('/') -class index(base): +class index(base): def GET(self): return render.ui(self.sitevars) class add(base): def POST(self): - i = web.input() - - self.sitevars['urltoadd'] = i.urltoadd - self.sitevars['addemail'] = i.addemail - errmsg = '' - usedefault = i.has_key('defaultemail') - if usedefault: self.sitevars['usedefaultemail'] = 'checked' - else: self.sitevars['usedefaultemail'] = '' - print self.sitevars['usedefaultemail'] + i = web.input() + + self.sitevars['urltoadd'] = i.urltoadd + self.sitevars['addemail'] = i.addemail + errmsg = '' + usedefault = i.has_key('defaultemail') + if usedefault: + self.sitevars['usedefaultemail'] = 'checked' + else: + self.sitevars['usedefaultemail'] = '' + print self.sitevars['usedefaultemail'] # TODO: add validity checks on url and email address - if i.urltoadd == '': - errmsg = '* Enter a new feed URL ("http://www.site.com/rss.xml" for example). ' - - if not usedefault: - if i.addemail == '': - errmsg += '* Enter an email address for feed updates. ' - elif (i.addemail.find('@') == -1): - errmsg += '* Please enter a valid email address in the form email@site.com' + if i.urltoadd == '': + errmsg = '* Enter a new feed URL ("http://www.site.com/rss.xml" for example). ' + + if not usedefault: + if i.addemail == '': + errmsg += '* Enter an email address for feed updates. ' + elif (i.addemail.find('@') == -1): + errmsg += '* Please enter a valid email address in the form email@site.com' if usedefault and self.sitevars['default_to'] == '': - errmsg += '* You must either set a default email address or specify an address for this new feed. ' + errmsg += '* You must either set a default email address or specify an address for this new feed. ' - self.sitevars['adderrormsg'] = errmsg - - if errmsg == '': - if usedefault: args = [i.urltoadd] - else: args = [i.urltoadd, i.addemail] - rss2email.add(*args) - updatefeedlist(self.sitevars) - + self.sitevars['adderrormsg'] = errmsg + + if errmsg == '': + if usedefault: + args = [i.urltoadd] + else: + args = [i.urltoadd, i.addemail] + rss2email.add(*args) + updatefeedlist(self.sitevars) + return render.ui(self.sitevars) - + class change(base): def POST(self): - i = web.input() - - self.sitevars['newemail'] = i.newemail - if i.newemail == '': - self.sitevars['changeerrormsg'] = 'Enter a new email address please' - else: - rss2email.email(i.newemail) - updatefeedlist(self.sitevars) + i = web.input() + + self.sitevars['newemail'] = i.newemail + if i.newemail == '': + self.sitevars['changeerrormsg'] = 'Enter a new email address please' + else: + rss2email.email(i.newemail) + updatefeedlist(self.sitevars) return render.ui(self.sitevars) - + class delete(base): def POST(self): - inputs = web.input() - if self.sitevars['i'] == 1: - offset = 0 - else: - offset = 1 - i = len(self.sitevars['ifeeds']) - while i >= 0: - feed = self.sitevars['ifeeds'][i-1] - s = 'D' + str(i) - if inputs.has_key(s): - rss2email.delete(i) - i -= 1 + inputs = web.input() + if self.sitevars['i'] == 1: + offset = 0 + else: + offset = 1 + i = len(self.sitevars['ifeeds']) + while i >= 0: + feed = self.sitevars['ifeeds'][i-1] + s = 'D' + str(i) + if inputs.has_key(s): + rss2email.delete(i) + i -= 1 - updatefeedlist(self.sitevars) + updatefeedlist(self.sitevars) return render.ui(self.sitevars) - + class run(base): def POST(self): - rss2email.run() - return render.ui(self.sitevars) - - -if __name__ == '__main__': - if not os.path.exists(feedfile): - print 'Feedfile "%s" does not exist. If you\'re using r2e for the first time,' % feedfile - print "you have to run 'r2e new' first." - sys.exit(1) - app.run() + rss2email.run() + return render.ui(self.sitevars) - + +if __name__ == '__main__': + if not os.path.exists(feedfile): + print 'Feedfile "%s" does not exist. If you\'re using r2e for the first time,' % feedfile + print "you have to run 'r2e new' first." + sys.exit(1) + try: + app.run() + except: + pass + finally: + # Cleanup + if pidfile is not None: + os.unlink(pidfile)