Merge lp:~sil/lolocopter/to-protect-and-serve into lp:lolocopter

Proposed by Stuart Langridge
Status: Merged
Approved by: Jono Bacon
Approved revision: not available
Merged at revision: not available
Proposed branch: lp:~sil/lolocopter/to-protect-and-serve
Merge into: lp:lolocopter
Diff against target: 98 lines (+94/-0)
1 file modified
lolocopter/lolocopter_server.py (+94/-0)
To merge this branch: bzr merge lp:~sil/lolocopter/to-protect-and-serve
Reviewer Review Type Date Requested Status
Jono Bacon Approve
Review via email: mp+14866@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Stuart Langridge (sil) wrote :

Here I have added the server. No integration work done yet.

Revision history for this message
Jono Bacon (jonobacon) wrote :

Looks good to me. Thanks.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'lolocopter/lolocopter_server.py'
--- lolocopter/lolocopter_server.py 1970-01-01 00:00:00 +0000
+++ lolocopter/lolocopter_server.py 2009-11-14 17:40:21 +0000
@@ -0,0 +1,94 @@
1import gtk, BaseHTTPServer, threading, gobject, json, shutil, avahi, dbus, os
2
3class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
4 counts = 0
5 def do_GET(self):
6 if self.path == "/":
7 self.send_summary()
8 elif self.path == "/loldata":
9 self.send_lolfile()
10 else:
11 self.send_error()
12 def send_summary(self):
13 self.send_response(200)
14 self.send_header("Content-type", "text/plain")
15 self.end_headers()
16 self.wfile.write(json.dumps({
17 "lol_data": "/loldata",
18 "network_clock_udp_port": self.network_clock_udp_port
19 }))
20 def send_error(self):
21 self.send_response(404)
22 self.send_header("Content-type", "text/plain")
23 self.end_headers()
24 self.wfile.write("fail.")
25 def send_lolfile(self):
26 self.send_response(200)
27 self.send_header("Content-type", "application/octet-stream")
28 self.end_headers()
29 fp = open(self.lol_to_advertise)
30 shutil.copyfileobj(fp, self.wfile)
31 fp.close()
32 # tell lolocopter that someone's downloaded the file
33 if self.joiner_callback:
34 # call it in idle so it's on the main thread
35 gobject.idle_add(self.joiner_callback)
36
37class LolocopterServer(object):
38 def __init__(self, network_clock_udp_port,
39 lol_to_advertise, public_name, joiner_callback=None):
40 self.network_clock_udp_port = network_clock_udp_port
41 self.lol_to_advertise = lol_to_advertise
42 self.public_name = public_name
43 self.joiner_callback = joiner_callback
44
45 def __advertise_service(self):
46 bus = dbus.SystemBus()
47 server = dbus.Interface(bus.get_object(avahi.DBUS_NAME,
48 avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
49
50 g = dbus.Interface(bus.get_object(avahi.DBUS_NAME,
51 server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP)
52 shortlol = os.path.splitext(
53 os.path.split(self.lol_to_advertise)[1])[0]
54 advertise_name = "%s on %s's lolocopter" % (shortlol,
55 self.public_name)
56 g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0),
57 advertise_name,
58 "_http._tcp", "", "",
59 dbus.UInt16(self.httpd_port), "")
60 g.Commit()
61 self.group = g
62
63 print "serving on ", self.httpd_port
64
65 def __starthttp(self, network_clock_udp_port,
66 lol_to_advertise, public_name, joiner_callback=None):
67 MyHandler.protocol_version = "HTTP/1.0"
68 MyHandler.network_clock_udp_port = network_clock_udp_port
69 MyHandler.joiner_callback = joiner_callback
70 MyHandler.lol_to_advertise = lol_to_advertise
71 httpd = BaseHTTPServer.HTTPServer(('', 0), MyHandler)
72 sa = httpd.socket.getsockname()
73 self.httpd_port = sa[1]
74 self.__advertise_service()
75 httpd.serve_forever()
76
77 # start http server in a thread
78 def start_server(self):
79 self.thr = threading.Thread(target=self.__starthttp, args=(
80 self.network_clock_udp_port,
81 self.lol_to_advertise,
82 self.public_name,
83 self.joiner_callback))
84 self.thr.daemon = True
85 self.thr.start()
86
87 def stop_server(self):
88 # unpublish
89 self.group.Reset()
90 # kill thread
91 # erm, not sure how to stop a serve_forever
92 # so do nothing here. epic fail.
93 # should kill the thread.
94

Subscribers

People subscribed via source and target branches

to all changes: