0.2: config still hardwired, code less ugly, can dump signals
[cnetworkmanager.git] / cnetworkmanager
blob257bb57080d32593cbe32a0d8fc61de2735488db
1 #! /usr/bin/python
2 # cnetworkmanager: Command Line Interface for NetworkManager
3 # by: http://en.opensuse.org/User:Mvidner
4 # license: http://creativecommons.org/licenses/by/3.0/
6 VERSION = "0.2"
7 print "cnetworkmanager %s - Command Line Interface for NetworkManager" % VERSION
9 import sys
10 import os
11 import dbus
12 import dbus.service
13 import gobject
15 from dbus.mainloop.glib import DBusGMainLoop
16 DBusGMainLoop(set_as_default=True)
18 HELP = False
19 NMVER = "07"
20 DUMP_DEVS = False
21 DUMP_APS = False
22 DUMP_ACTCON = False
23 DUMP_SYSCON = False
24 DUMP_USRCON = False
25 CONNECT = False
26 LOOP = False
28 bus = dbus.SystemBus()
30 # FOOC = connection (service) string
31 # FOOI = interface string
32 # fooo = object
33 # fooi = interface
34 # foopi = property interface
35 NMC = 'org.freedesktop.NetworkManager'
36 NMI = NMC
37 PI = 'org.freedesktop.DBus.Properties'
38 SSC = "org.freedesktop.NetworkManagerSystemSettings"
39 USC = "org.freedesktop.NetworkManagerUserSettings"
42 def introspect(obj):
43 ii = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
44 print ii.Introspect()
46 # TODO: pull them from introspection.xml
47 NM_STATE = ["UNKNOWN", "ASLEEP", "CONNECTING", "CONNECTED", "DISCONNECTED",]
49 def dump_nm(opath):
50 nmo = bus.get_object(NMC, opath)
51 nmi = dbus.Interface(nmo, NMI)
52 nmpi = dbus.Interface(nmo, PI)
54 print "state:", NM_STATE[nmpi.Get(NMI, "State")]
55 print "wifi:", nmpi.Get(NMI, "WirelessEnabled")
56 print "wifi hw:", nmpi.Get(NMI, "WirelessHardwareEnabled")
57 # nmpi.Set(NMI, "WirelessEnabled", True)
58 # nmi.Sleep(True)
60 if DUMP_DEVS:
61 devices = nmi.GetDevices()
62 for device in devices:
63 print device
64 dump_device(device)
66 if DUMP_ACTCON:
67 print "Active Connections"
68 aconns = nmpi.Get(NMI, "ActiveConnections")
69 for aconn in aconns:
70 print aconn
71 dump_aconn(aconn)
73 def dump_aconn(opath):
74 co = bus.get_object(NMC, opath)
75 copi = dbus.Interface(co, PI)
76 for P in ["ServiceName", "Connection", "SpecificObject", "SharedServiceName", "SharedConnection", "Devices"]:
77 print " %s: %s" % (P, copi.Get(NMI, P))
79 def dump_nm_06(opath):
80 nmo = bus.get_object(NMC, opath)
81 nmi = dbus.Interface(nmo, NMI)
83 print "state:", NM_STATE[nmi.state()]
85 if DUMP_DEVS:
86 devices = nmi.getDevices()
87 for device in devices:
88 print device
89 dump_device_06(device)
91 if DUMP_ACTCON:
92 print "Active Connections"
93 # FIXME
94 print nmi.GetActiveConnections()
96 def bitmask_str(map, value):
97 ret = []
98 for mask, s in map.iteritems():
99 if value & mask: ret.append(s)
100 return ",".join(ret)
102 def ip_str(i32):
103 ret = []
104 ret.append("%d" % (i32 % 256))
105 i32 /= 256
106 ret.append("%d" % (i32 % 256))
107 i32 /= 256
108 ret.append("%d" % (i32 % 256))
109 i32 /= 256
110 ret.append("%d" % (i32 % 256))
111 i32 /= 256
112 return ".".join(ret)
114 NM_DEVICE_CAP = {1: "NM_SUPPORTED", 2: "CARRIER_DETECT",}
116 NM_DEVICE_STATE = [
117 "UNKNOWN", "UNMANAGED", "UNAVAILABLE", "DISCONNECTED", "PREPARE", "CONFIG",
118 "NEED_AUTH", "IP_CONFIG", "ACTIVATED", "FAILED",]
120 DEVICE_TYPE = ["UNKNOWN", "802_3_ETHERNET", "802_11_WIRELESS", "GSM", "CDMA",]
122 def dump_ip4config(opath):
123 print " Ip4Config:"
124 o = bus.get_object(NMC, opath)
125 pi = dbus.Interface(o, PI)
126 for P in ["Address", "Netmask", "Broadcast", "Gateway",]:
127 print " %s: %s" % (P, ip_str(pi.Get(NMI, P)))
128 for P in ["Hostname", "Nameservers", "Domains", "NisDomain", "NisServers"]:
129 print " %s: %s" % (P, pi.Get(NMI, P))
132 def dump_device(opath):
133 devo = bus.get_object(NMC, opath)
134 devpi = dbus.Interface(devo, PI)
135 # "Ip4Config", only for NM_DEVICE_STATE_ACTIVATED
136 for P in ["Udi", "Interface", "Driver",]:
137 print " %s: %s" % (P, devpi.Get(NMI, P))
138 addr = devpi.Get(NMI, "Ip4Address")
139 print " Ip4Address:", ip_str(addr)
140 caps = devpi.Get(NMI, "Capabilities")
141 print " Capabilities:", bitmask_str(NM_DEVICE_CAP, caps)
142 state = NM_DEVICE_STATE[devpi.Get(NMI, "State")]
143 print " Dev State:", state
144 if state == "ACTIVATED":
145 dump_ip4config(devpi.Get(NMI, "Ip4Config"))
146 dt = DEVICE_TYPE[devpi.Get(NMI, "DeviceType")]
147 print " Dev Type:", dt
148 if dt == "802_3_ETHERNET":
149 dump_device_eth(opath)
150 elif dt == "802_11_WIRELESS":
151 dump_device_wifi(opath)
153 def dump_device_06(opath):
154 devo = bus.get_object(NMC, opath)
155 introspect(devo)
156 devi = dbus.Interface(devo, NMI + ".Device")
157 print " Driver:", devi.getDriver()
158 props = devi.getProperties()
159 # TODO: annotate struct
160 for prop in props:
161 print " ", prop
163 def dump_device_eth(opath):
164 devo = bus.get_object(NMC, opath)
165 devpi = dbus.Interface(devo, PI)
166 for P in ["HwAddress", "Speed", "Carrier"]:
167 print " %s: %s" % (P, devpi.Get(NMI, P))
169 IW_MODE = ["AUTO", "ADHOC", "INFRA", "MASTER", "REPEAT", "SECOND", "MONITOR",]
171 NM_802_11_DEVICE_CAP = {1:"CIPHER_WEP40", 2:"CIPHER_WEP104", 4:"CIPHER_TKIP",
172 8:"CIPHER_CCMP", 16:"WPA", 32:"RSN",}
174 def dump_device_wifi(opath):
175 devo = bus.get_object(NMC, opath)
176 devpi = dbus.Interface(devo, PI)
177 print " Dev Mode:", IW_MODE[devpi.Get(NMI, "Mode")]
178 wcaps = devpi.Get(NMI, "WirelessCapabilities")
179 print " Wifi Capabilities:", bitmask_str(NM_802_11_DEVICE_CAP, wcaps)
180 for P in ["HwAddress", "Bitrate", "ActiveAccessPoint"]:
181 print " %s: %s" % (P, devpi.Get(NMI, P))
182 if DUMP_APS:
183 print " Access Points"
184 wdevi = dbus.Interface(devo, NMI + ".Device.Wireless")
185 aps = wdevi.GetAccessPoints()
186 for ap in aps:
187 print " ", ap
188 dump_access_point(ap)
190 NM_802_11_AP_FLAGS = {1: "PRIVACY",}
192 NM_802_11_AP_SEC = {
193 1: "PAIR_WEP40", 2: "PAIR_WEP104", 4: "PAIR_TKIP", 8: "PAIR_CCMP",
194 16: "GROUP_WEP40", 32: "GROUP_WEP104", 64: "GROUP_TKIP",
195 128: "GROUP_CCMP", 256: "KEY_MGMT_PSK", 512: "KEY_MGMT_802_1X",}
197 def ssid_str(array):
198 s = ""
199 for b in array:
200 s = s + ("%c" % b)
201 return s
203 def dump_access_point(opath):
204 apo = bus.get_object(NMC, opath)
205 appi = dbus.Interface(apo, PI)
206 print " Ssid:", ssid_str(appi.Get(NMI, "Ssid"))
207 # FIXME strength as number
208 for P in ["Frequency", "HwAddress", "MaxBitrate",]:
209 print " %s: %s" % (P, appi.Get(NMI, P))
210 print " Strength:", int(appi.Get(NMI, "Strength"))
211 print " AP Mode:", IW_MODE[appi.Get(NMI, "Mode")]
212 print " AP Flags:", bitmask_str(NM_802_11_AP_FLAGS,
213 appi.Get(NMI, "Flags"))
214 print " AP WPA Flags:", bitmask_str(NM_802_11_AP_SEC,
215 appi.Get(NMI, "WpaFlags"))
216 print " AP RSN Flags:", bitmask_str(NM_802_11_AP_SEC,
217 appi.Get(NMI, "RsnFlags"))
219 def dump_settings(svc, obj):
220 si = dbus.Interface(obj, 'org.freedesktop.NetworkManagerSettings')
221 conns = si.ListConnections()
222 for conn in conns:
223 dump_settings_conn(svc, conn)
225 def dump_system_settings(svc, obj):
226 sspi = dbus.Interface(obj, PI)
227 print "Unmanaged Devices"
228 umds = sspi.Get(NMI, "UnmanagedDevices")
229 for umd in umds:
230 print " ", umd
231 dump_settings_conn(svc, conn)
233 def dump_settings_dict(settings):
234 for n1, v1 in settings.iteritems():
235 print " ",n1
236 for n2, v2 in v1.iteritems():
237 print " %s: %s" % (n2, v2)
239 def dump_settings_conn(svc, opath):
240 print "Conn:",opath
241 co = bus.get_object(svc, opath)
242 ci = dbus.Interface(co, 'org.freedesktop.NetworkManagerSettings.Connection')
243 print " Id:", ci.GetID()
244 settings = ci.GetSettings()
245 dump_settings_dict(settings)
246 si = dbus.Interface(co, 'org.freedesktop.NetworkManagerSettings.Connection.Secrets')
247 print " SECRETS"
248 secrets = si.GetSecrets("802-11-wireless-security",[],False)
249 dump_settings_dict(secrets)
251 def loop():
252 loop = gobject.MainLoop()
253 try:
254 loop.run()
255 except:
256 print "Loop exited"
259 # main
261 for arg in sys.argv:
262 if arg == "-h" or arg == "--help":
263 HELP = True
264 elif arg == "--06":
265 NMVER = "06"
266 elif arg == "-d" or arg == "--dev":
267 DUMP_DEVS = True
268 elif arg == "-c" or arg == "--actcon":
269 DUMP_ACTCON = True
270 elif arg == "-u" or arg == "--usrcon":
271 DUMP_USRCON = True
272 elif arg == "-s" or arg == "--syscon":
273 DUMP_SYSCON = True
274 elif arg == "-a" or arg == "--ap":
275 DUMP_APS = True
276 DUMP_DEVS = True # aps are under wifi devs
277 elif arg == "-C":
278 CONNECT = True
279 LOOP = True
280 elif arg == "--loop":
281 LOOP = True
283 if HELP:
284 print "Options:"
285 print " -6, --06 assume NetworkManager 0.6 API"
286 print " -d, --dev list devices"
287 print " -c, --actcon list active connections"
288 print " -s, --syscon list system connection settings"
289 print " -u, --usrcon list user connection settings (can CRASH nm-applet)"
290 print " -a, --ap list found access points"
291 print " -C connect"
292 print " --loop loop to show dbus signals"
293 sys.exit(0)
295 nmp = '/org/freedesktop/NetworkManager'
296 # TODO autodetect (try getDevices?)
297 if NMVER == "06":
298 dump_nm_06(nmp)
299 else:
300 dump_nm(nmp)
302 if DUMP_SYSCON:
303 print "SYSTEM Connections"
304 sso = bus.get_object(SSC, '/org/freedesktop/NetworkManagerSettings')
305 dump_settings(SSC, sso)
306 dump_system_settings(SSC, sso)
308 if DUMP_USRCON:
309 print "USER Connections"
310 uso = bus.get_object(USC, '/org/freedesktop/NetworkManagerSettings')
311 dump_settings(USC, uso)
313 #sys.exit(0)
315 class UserSettings(dbus.service.Object):
316 def __init__(self, opath):
317 dbus.service.Object.__init__(self, bus, opath)
319 @dbus.service.method(dbus_interface='org.freedesktop.NetworkManagerSettings',
320 in_signature='', out_signature='ao')
321 def ListConnections(self):
322 return ["/org/freedesktop/NetworkManagerSettings/1"]
324 #this is for EMITTING a signal, not receiving it
325 @dbus.service.signal(dbus_interface='org.freedesktop.NetworkManagerSettings',
326 signature='o')
327 def NewConnection(self, opath):
328 print "signalling newconn:", opath
330 class Connection(dbus.service.Object):
331 def __init__(self, opath):
332 dbus.service.Object.__init__(self, bus, opath)
334 @dbus.service.method(dbus_interface='org.freedesktop.NetworkManagerSettings.Connection',
335 in_signature='', out_signature='a{sa{sv}}')
336 def GetSettings(self):
337 return {
338 'connection': {
339 'id': 'frogcon',
340 'type': '802-11-wireless',
342 '802-11-wireless': {
343 'ssid': dbus.ByteArray('frogs'),
344 'mode': 'infrastructure',
345 'security': '802-11-wireless-security',
347 '802-11-wireless-security': {
348 'key-mgmt': 'none',
349 'wep-tx-keyidx': 0,
350 # 'auth-alg': 'shared',
353 @dbus.service.method(dbus_interface='org.freedesktop.NetworkManagerSettings.Connection.Secrets',
354 in_signature='sasb', out_signature='a{sa{sv}}')
355 def GetSecrets(self,tag,hints,ask):
356 return {
357 '802-11-wireless-security': {
358 'key-mgmt': 'none',
359 'wep-tx-keyidx': 0,
360 #FIXME SECRET
361 'wep-key0': '66666666666666666666666666', # secret hint
366 nmo = bus.get_object(NMC, nmp)
367 nmi = dbus.Interface(nmo, NMI)
369 us = UserSettings("/org/freedesktop/NetworkManagerSettings")
370 c = Connection("/org/freedesktop/NetworkManagerSettings/1")
372 bus.request_name(USC)
373 #os.system("sleep 3")
375 def reply_handler(*args):
376 print "REPLY:", args
377 global todo
378 todo = 0
380 def uni_handler(*args):
381 print "UNI:", args
383 todo = 15
384 def doit():
385 global todo
386 todo = todo - 1
387 print "doing it"
388 try:
389 nmi.ActivateConnection(USC,
390 "/org/freedesktop/NetworkManagerSettings/1",
391 # "/org/freedesktop/Hal/devices/net_00_11_d8_70_00_2f", # ralink
392 "/org/freedesktop/Hal/devices/net_00_11_d8_70_00_2f_0", # ralink
393 "/org/freedesktop/NetworkManager/AccessPoint/0",
394 reply_handler=reply_handler,
395 error_handler=uni_handler,
397 except Exception, e:
398 print str(e)
401 def a1(s):
402 try:
403 return s[0]
404 except:
405 return ""
407 def abbrev(s, sep):
408 words = s.split(sep)
409 words = map (a1, words)
410 return sep.join(words)
412 def abbr_signal_handler(*args, **kwargs):
413 ifc = kwargs["interface"]
414 sig = kwargs["member"]
415 opath = kwargs["path"]
416 line = "A %s: %s: %s%s" % (abbrev(ifc,".") , abbrev(opath,"/") , sig, args)
417 print line
419 bus.add_signal_receiver(abbr_signal_handler,
420 path_keyword="path",
421 interface_keyword="interface",
422 member_keyword="member")
424 if CONNECT:
425 us.NewConnection("/org/freedesktop/NetworkManagerSettings/1")
426 doit()
428 if LOOP:
429 loop()