Package sparked :: Package hardware :: Module network
[hide private]
[frames] | no frames]

Source Code for Module sparked.hardware.network

 1  # Copyright (c) 2010 Arjan Scherpenisse 
 2  # See LICENSE for details. 
 3   
 4  """ 
 5  Network monitoring class: check if the internet is reachable. 
 6  """ 
 7   
 8  import dbus 
 9   
10  from twisted.application import service 
11  from twisted.web import client 
12  from twisted.internet import reactor, defer 
13   
14  from sparked import events 
15   
16   
17 -class NetworkConnectionService(service.Service):
18 """ 19 Check on network connection existence through NetworkManager. 20 """ 21
22 - def startService(self):
23 bus = dbus.SystemBus() 24 interface = 'org.freedesktop.NetworkManager' 25 udi = '/org/freedesktop/NetworkManager' 26 27 managerObj = bus.get_object(interface, udi) 28 bus.add_signal_receiver(self.stateChanged, 29 dbus_interface=interface, 30 signal_name='PropertiesChanged') 31 self.properties = dbus.Interface(managerObj, 'org.freedesktop.DBus.Properties') 32 self.stateChanged()
33 34
35 - def stateChanged(self, *a):
36 interface = 'org.freedesktop.NetworkManager' 37 state = self.properties.Get(interface, "ActiveConnections") 38 self.connected = len(state) > 0 39 networkEvents.dispatch("connected", self.connected)
40 41 42
43 -class NetworkWebConnectionService(service.Service):
44 """ 45 Checks if the network connection is up by trying to reach a website. 46 """ 47 48 url = "http://www.google.com/" 49 delay = 30 50
51 - def startService(self):
52 self.connected = False 53 self.loop() 54 # Listen to events from NetworkManager 55 networkEvents.addObserver("connected", self.event)
56 57
58 - def loop(self):
59 d = client.getPage(self.url) 60 def ok(_): 61 if not self.connected: 62 networkEvents.dispatch("web-connected", True) 63 self.connected = True
64 d.addCallback(ok) 65 66 def error(f): 67 print f 68 if self.connected: 69 networkEvents.dispatch("web-connected", False) 70 self.connected = False
71 d.addErrback(error) 72 73 d = defer.Deferred() 74 self._dc = reactor.callLater(self.delay, lambda : d.callback(None)) 75 d.addCallback(lambda _: self.loop()) 76 return d 77 78
79 - def event(self, connected=False):
80 """ 81 Event from networkmanager came in. If network connection is 82 down, do not try to fetch webpages. 83 """ 84 if self._dc and self._dc.active(): 85 self._dc.cancel() 86 87 self.connected = False 88 if connected: 89 self.loop() 90 else: 91 networkEvents.dispatch("web-connected", False)
92 93 94 networkEvents = events.EventDispatcher() 95