summaryrefslogtreecommitdiff
path: root/examples/python/NetworkManager.py
blob: be26c5c4a03d81d1f58cff837ac3b59ccca45f6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/usr/bin/python

import dbus
from  dbus_bindings import DBusException

NM_SERVICE="org.freedesktop.NetworkManager"
NM_PATH="/org/freedesktop/NetworkManager"
NM_INTERFACE=NM_SERVICE

# i can append device names like eth0 to this path to get more info
NM_PATH_DEVICES="/org/freedesktop/NetworkManager/Devices"
NM_INTERFACE_DEVICES="org.freedesktop.NetworkManager.Devices"

NMI_SERVICE="org.freedesktop.NetworkManagerInfo"
NMI_PATH="/org/freedesktop/NetworkManagerInfo"
NMI_INTERFACE=NMI_SERVICE

HAL_SERVICE="org.freedesktop.Hal"
HAL_PATH="/org/freedesktop/Hal/Manager"
HAL_INTERFACE="org.freedesktop.Hal.Manager"
HAL_INTERFACE_DEVICE="org.freedesktop.Hal.Device"

class NetworkManager:
    WIRED_DEVICE    = 1
    WIRELESS_DEVICE = 2

    CONNECTED       = "connected"
    CONNECTING      = "connecting"
    DISCONNECTED    = "disconnected"

    NM_SIGNALS = [ "DeviceNoLongerActive",
                   "DeviceNowActive",
                   "DeviceActivating",
                   "DevicesChanged",
                   "DeviceIP4AddressChange",
                   "WirelessNetworkDisappeared",
                   "WirelessNetworkAppeared"
                   ]

    NMI_SIGNALS = [ "TrustedNetworkUpdate",
                    "PreferredNetworkUpdate"
                    ]
    
    def __init__(self):
        self.__init_dbus__()

        # dictionary of devices
        self.__devices = {}

    def __init_dbus__(self):
        try:
            self._bus = dbus.SystemBus()
            try:
                self._nm_service = self._bus.get_service(NM_SERVICE)
                self.nm_object  = self._nm_service.get_object(NM_PATH,
                                                              NM_INTERFACE)
            except Exception, e:
                print "Counldn't get the %s service" % NM_SERVICE
                print e
                
            try:
                self._nmi_service = self._bus.get_service(NMI_SERVICE)
                self.nmi_object  = self._nmi_service.get_object(NMI_PATH,
                                                                NMI_INTERFACE)
            except Exception, e:
                print "Counldn't get the %s service" % NMI_SERVICE
                print e

            try:
                self._hal_service = self._bus.get_service(HAL_SERVICE)
                self._hal_manager = self._hal_service.get_object(HAL_PATH,
                                                                 HAL_INTERFACE)
            except Exception, e:
                print "Counldn't get the %s service" % HAL_SERVICE
                print e
                
        except Exception, e:
            print e

    """
    returns dictionary of the active device information
    if device does not exist returns get_device failure method
    """
    def get_active_device(self):
        active_device = self.nm_object.getActiveDevice()
        return self.get_device(active_device)

    """
    pass device string /org/freedesktop/NetworkManager/Device/eth0
    returns dictionary of device information
    if device does not exist returns None
    """
    def get_device(self, device):
        try:
            nm_dev_obj  = self._nm_service.get_object(device,
                                                      NM_INTERFACE_DEVICES)
            d = {}
            d["nm.device"]      = device
            d["nm.name"]        = nm_dev_obj.getName(device)
            d["nm.type"]        = nm_dev_obj.getType(device)
            d["nm.udi"]         = nm_dev_obj.getHalUdi(device)
            d["nm.ip4"]         = nm_dev_obj.getIP4Address(device)
            d["nm.link_active"] = nm_dev_obj.getLinkActive(device)
            
            try:
                d["nm.active_network"] = nm_dev_obj.getActiveNetwork(device)
                d["nm.strength"] = nm_dev_obj.getStrength(device)
            except DBusException, e:
                pass
        
            try:
                d["nm.networks"] = {}
                networks = nm_dev_obj.getNetworks(device)
                for network in networks:
                    nm_network_object  = self._nm_service.get_object(network,
                                                                     NM_INTERFACE_DEVICES)
                    n = {}
                    n["network"]    = network
                    n["name"]       = nm_network_object.getName()
                    n["address"]    = nm_network_object.getAddress()
                    n["strength"]    = nm_network_object.getStrength()
                    n["frequency"]  = nm_network_object.getFrequency()
                    n["rate"]       = nm_network_object.getRate()
                    n["encrypted"]  = nm_network_object.getEncrypted()

                    d["nm.networks"][network] = n

            except DBusException, e:
                pass

            active_device = self.nm_object.getActiveDevice()
        
            if device == active_device:
                d["nm.status"] = self.nm_object.status()
            else:
                d["nm.status"] = self.DISCONNECTED

            # we already have this device cached, so just update the status
            if device in self.__devices:
                for k,v in d.iteritems():
                    self.__devices[device][k] = v
            # it's a new device so get the info from HAL
            else:
                hal = self._get_hal_info(d["nm.udi"])
                for k,v in hal.iteritems():
                    d[k] = v
                self.__devices[device] = d

            return self.__devices[device]
            
        except Exception, e:
            print e
            return None

    """
    Returns list of dictionary objects of all active devices
    Returns empty list if no active devices
    """
    def get_devices(self):
        
        active_devices = self.nm_object.getDevices()
        devices = []

        for device in active_devices:
            devices.append(self.get_device(device))

        return devices

    """
    Returns list of dictionary objects of all devices active or not
    Returns empty list if no active devices
    """
    def get_all_devices(self):
        return self.__devices.values()

    def has_type_device (self, type):
        for device in self.get_devices():
            if device["nm.type"] == type:
                return True
        return False        

    def number_device_types(self, type):
        count = 0
        for device in self.get_devices():
            if device["nm.type"] == type:
                count = count + 1
        return count

    def number_wired_devices(self):
        return self.number_device_types(self.WIRED_DEVICE)

    def number_wireless_devices(self):
        return self.number_device_types(self.WIRELESS_DEVICE)
    
    def has_wired_device(self):
        return self.has_type_device(self.WIRED_DEVICE)

    def has_wireless_device(self):
        return self.has_type_device(self.WIRELESS_DEVICE)
    
    def _get_hal_info(self, udi):
        hal_devices = self._hal_manager.FindDeviceStringMatch("info.udi",
                                                              udi)
        for hal_device in hal_devices:
            device_dbus_obj = self._hal_service.get_object(hal_device,
                                                           HAL_INTERFACE_DEVICE)
            properties = device_dbus_obj.GetAllProperties()
            return  properties

if __name__ == "__main__":
    nm = NetworkManager()