~ubuntu-branches/ubuntu/precise/gozerbot/precise

« back to all changes in this revision

Viewing changes to gozerplugs/plugs/webserver.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2008-06-02 19:26:39 UTC
  • mfrom: (1.1.3 upstream) (3.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080602192639-3rn65nx4q1sgd6sy
Tags: 0.8.1-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
__copyright__ = 'this file is in the public domain'
8
8
__credits__ = 'thanks to John Munn (jrmunn@home.com) for his form focus \
9
9
javascript'
 
10
__gendocfirst__ = ['web-enable', ]
 
11
__gendoclast__ = ['web-disable', ]
10
12
 
11
13
from gozerbot.thr import start_new_thread
12
14
from gozerbot.generic import rlog, handle_exception
23
25
from SocketServer import ThreadingMixIn
24
26
from urllib import unquote_plus
25
27
from cgi import escape
26
 
import time, sys, select
 
28
import time, sys, select, types
27
29
 
28
30
plughelp.add('webserver', 'maintain the bots webserver')
29
31
 
90
92
    def __init__(self, addr, handler):
91
93
        self.stop = False
92
94
        self.addr = addr
93
 
        self.dontshow = ['nodes', 'ping', 'dispatch']
 
95
        self.dontshow = ['nodes', 'ping', 'dispatch', 'join']
94
96
        self.handlers = {}
95
97
        self.webmods = {}
96
98
        self.whitelist = []
117
119
        txt = request.path[1:].split('?')[0]
118
120
        if self.handlers.has_key(txt):
119
121
            func = self.handlers[txt]
120
 
            return func(request)
 
122
            try:
 
123
                result = func(request)
 
124
            except Exception, ex:
 
125
                handle_exception()
 
126
                result = None
 
127
            return result
121
128
        else:
122
129
            return None
123
130
 
168
175
</html>
169
176
"""
170
177
 
 
178
def writeheaderplain(request):
 
179
    request.send_response(200)
 
180
    request.send_header('Content-type', 'text/plain; charset=%s' % \
 
181
sys.getdefaultencoding())
 
182
    request.send_header('Server', config['version'])
 
183
    request.end_headers()
 
184
 
 
185
def writeheaderhtml(request):
 
186
    request.send_response(200)
 
187
    request.send_header('Content-type', 'text/html; charset=%s' % \
 
188
sys.getdefaultencoding())
 
189
    request.send_header('Server', config['version'])
 
190
    request.end_headers()
 
191
 
171
192
def webheader(request):
172
193
    """ create web header """
173
194
    request.wfile.write('<form action="dispatch">')
179
200
% ' '.join(cmndslist))
180
201
    request.wfile.write('use chan #channel to provide a channel for \
181
202
channel related commands<br>example: search http chan #dunkbots<br><br>')
182
 
    for i in cfg.get('showplugs'):
183
 
        request.wfile.write("<a href='/%s'>%s</a>" % (i, i))
184
 
        request.wfile.write("    ")
 
203
    #for i in cfg.get('showplugs'):
 
204
    #    request.wfile.write("<a href='/%s'>%s</a>" % (i, i))
 
205
    #    request.wfile.write("    ")
185
206
    request.wfile.write('<br>')
186
207
 
 
208
def sendresult(request, result, how=[]):
 
209
    if not result:
 
210
        return
 
211
    if type(result) == types.StringType:
 
212
        result = [result, ]
 
213
    for i in result:
 
214
        output = i
 
215
        if 'escape' in how:
 
216
            output = escape(output)
 
217
        request.wfile.write(output)
 
218
        if 'break' in how:
 
219
            request.wfile.write("<br>")
 
220
            request.wfile.write("\n")
 
221
    return True
 
222
 
 
223
def makeresult(request):
 
224
    try:
 
225
        result = request.server.do(request)
 
226
    except:
 
227
        handle_exception()
 
228
        return
 
229
    if result:
 
230
        return result
 
231
 
187
232
class BotHTTPRequestHandler(BaseHTTPRequestHandler):
188
233
 
189
234
    """ bots request handler class """
192
237
        """ called on GET """
193
238
        ip = self.client_address[0]
194
239
        if not cfg.get('whitelistenable') and ip in cfg.get('blacklist'):
195
 
            rlog(5, 'webserver', 'denied %s' % ip)
 
240
            rlog(100, 'webserver', 'denied %s' % ip)
196
241
            self.send_error(404)
197
242
            return
198
243
        if  cfg.get('whitelistenable') and ip not in cfg.get('whitelist'):
199
 
            rlog(5, 'webserver', 'denied %s' % ip)
 
244
            rlog(100, 'webserver', 'denied %s' % ip)
200
245
            self.send_error(404)
201
246
            return
202
 
        pathin = unquote_plus(self.path)
203
 
        if pathin.endswith('&how=direct'):
204
 
            self.send_response(200)
205
 
            self.send_header('Content-type', 'text/plain; charset=%s' % \
206
 
sys.getdefaultencoding())
207
 
            self.send_header('Server', config['version'])
208
 
            self.end_headers()
209
 
            self.path = self.path[:-11]
210
 
            result = self.server.do(self)
211
 
            for i in result:
212
 
                self.wfile.write("%s\n\n" % escape(str(i)))
213
 
            return
214
 
        if pathin.endswith('&how=noescape'):
215
 
            self.send_response(200)
216
 
            self.send_header('Content-type', 'text/plain; charset=%s' % \
217
 
sys.getdefaultencoding())
218
 
            self.send_header('Server', config['version'])
219
 
            self.end_headers()
220
 
            self.path = self.path[:-13]
221
 
            result = self.server.do(self)
222
 
            for i in result:
223
 
                self.wfile.write("%s\n" % str(i))
224
 
            return
225
 
        if self.path == '/':
226
 
            self.send_response(200)
227
 
            self.send_header('Content-type', 'text/html; charset=%s' % \
228
 
sys.getdefaultencoding())
229
 
            self.send_header('Server', config['version'])
230
 
            self.end_headers()
231
 
            self.wfile.write(focustxt)
232
 
            self.wfile.write("<h1>GOZERBOT</h1>")
233
 
            webheader(self)
234
 
            self.wfile.write(endtxt)
235
 
            return
236
 
        result = self.server.do(self)
237
 
        if result:
238
 
            self.send_response(200)
239
 
            self.send_header('Content-type', 'text/html; charset=%s' % \
240
 
sys.getdefaultencoding())
241
 
            self.send_header('Server', config['version'])
242
 
            self.end_headers()
243
 
            self.wfile.write(focustxt)
244
 
            self.wfile.write("<h1>GOZERBOT</h1>")
245
 
            webheader(self)
246
 
            self.wfile.write('<h2>results</h2>')
247
 
            for i in result:
248
 
                self.wfile.write("%s<br>" % escape(str(i)))
249
 
            self.wfile.write(endtxt)
 
247
        if self.path == '/' or self.path.startswith('/dispatch'):
 
248
            writeheaderhtml(self)
 
249
            self.wfile.write(focustxt)
 
250
            self.wfile.write("<h1>GOZERBOT</h1>")
 
251
            webheader(self)
 
252
            self.wfile.write(endtxt)
 
253
            result = makeresult(self)
 
254
            if result:
 
255
                self.wfile.write('<h2>results</h2>')
 
256
                sendresult(self, result, ['break', 'escape'])
 
257
        elif self.path.startswith('/json'):
 
258
            result = makeresult(self)
 
259
            self.wfile.write(result)
250
260
        else:
251
 
            self.send_error(404)
 
261
            result = makeresult(self)
 
262
            if result:
 
263
                writeheaderplain(self)
 
264
                sendresult(self, result)
 
265
            else:
 
266
                writeheaderplain(self)
 
267
                sendresult(self, 'no data')
 
268
        self.wfile.close()
252
269
 
253
270
    #localhost - - [18/Mar/2006 14:51:53] "GET / HTTP/1.1" 200 -
254
271
    def log_request(self, code, size='-'):