-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathnm_tools.py
119 lines (88 loc) · 4.15 KB
/
nm_tools.py
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
import logging
import os
import subprocess
import dbus
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
system = dbus.SystemBus()
logger = logging.getLogger(__name__)
def send_notification(text):
subprocess.run(["notify-send",
"-h", "int:transient:1",
"--icon=" + os.path.dirname(os.path.realpath(__file__)) + "/images/icon.png",
text,
"ULauncher NetworkManager"
])
def get_active_connection_uuids():
manager = system.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
manager = dbus.Interface(manager, "org.freedesktop.DBus.Properties")
active_paths = manager.Get("org.freedesktop.NetworkManager", "ActiveConnections")
active_connections = []
for path in active_paths:
active_con = system.get_object("org.freedesktop.NetworkManager", path)
active_con = dbus.Interface(active_con, "org.freedesktop.DBus.Properties")
con_path = active_con.Get("org.freedesktop.NetworkManager.Connection.Active", "Connection")
con_data = system.get_object("org.freedesktop.NetworkManager", con_path)
con_data = dbus.Interface(con_data, "org.freedesktop.NetworkManager.Settings.Connection").GetSettings()
uuid = str(con_data["connection"]["uuid"])
active_connections.append(uuid)
return active_connections
def connect(uuid):
log = subprocess.run(["nmcli", "connection", "up", uuid], stdout=subprocess.PIPE)
active_cons = get_active_connection_uuids()
result = uuid in active_cons
return str(log.stdout, "utf-8"), result
def disconnect(uuid):
log = subprocess.run(["nmcli", "connection", "down", uuid], stdout=subprocess.PIPE)
active_cons = get_active_connection_uuids()
result = uuid not in active_cons
return str(log.stdout, "utf-8"), result
def visible_wifis():
settings = system.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
settings = dbus.Interface(settings, "org.freedesktop.NetworkManager")
devices = settings.GetDevices()
wifis = []
for device in devices:
device = system.get_object("org.freedesktop.NetworkManager", device)
device = dbus.Interface(device, "org.freedesktop.NetworkManager.Device.Wireless")
# if this fails, the device is not a wireless device
try:
aps = dbus.Interface(
device, "org.freedesktop.NetworkManager.Device.Wireless"
).GetAccessPoints()
except dbus.exceptions.DBusException:
continue
for ap in aps:
ap = system.get_object("org.freedesktop.NetworkManager", ap)
ap = dbus.Interface(ap, "org.freedesktop.DBus.Properties").GetAll(
"org.freedesktop.NetworkManager.AccessPoint")
wifis.append({
"ssid": str(bytes(ap["Ssid"]).decode()),
"strength": int(ap["Strength"])
})
return wifis
def get_connections():
active_connections = get_active_connection_uuids()
settings = system.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager/Settings")
settings = dbus.Interface(settings, "org.freedesktop.NetworkManager.Settings")
paths = settings.ListConnections()
aps = visible_wifis()
logger.debug("Visible APs: ", str(aps))
connections = []
for path in paths:
con_data = system.get_object("org.freedesktop.NetworkManager", path)
con_data = dbus.Interface(con_data, "org.freedesktop.NetworkManager.Settings.Connection").GetSettings()
strength = [
ap["strength"] for ap in aps if ap["ssid"] == con_data["connection"]["id"]
] or [0]
connections.append({
"name": str(con_data["connection"]["id"]),
"uuid": str(con_data["connection"]["uuid"]),
"type": str(con_data["connection"]["type"]),
"strength": str(strength.pop()),
"active": str(con_data["connection"]["uuid"]) in active_connections
})
return connections