Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 294053 | Differences between
and this patch

Collapse All | Expand All

(-)r2eui.py.dist (-82 / +150 lines)
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)

Return to bug 294053