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
|
#!/usr/bin/python3
# Copyright (c) 2017-2019 David Steele <dsteele@gmail.com>
#
# SPDX-License-Identifier: GPL-2.0-or-later
# License-Filename: LICENSE
#
# Copyright 2016-2017 David Steele <steele@debian.org>
# This file is part of comitup
# Available under the terms of the GNU General Public License version 2
# or later
#
import dbus
from gi.repository.GLib import MainLoop
from dbus.mainloop.glib import DBusGMainLoop
import logging
if __name__ == '__main__':
DBusGMainLoop(set_as_default=True)
from comitup import nm # noqa
from comitup import modemgr # noqa
#
# globals
#
log = logging.getLogger('comitup')
bus = dbus.SystemBus()
device_path = None
device_listener = None
comstate = 'HOTSPOT'
def null_fn():
pass
nm_dev_connect = null_fn
nm_dev_fail = null_fn
#
# functions
#
def set_device_callbacks(state, up, down):
global nm_dev_connect
global nm_dev_fail
global comstate
nm_dev_connect = null_fn
nm_dev_fail = null_fn
comstate = state
check_device_listener()
nm_dev_connect = up
nm_dev_fail = down
def nm_device_change(state, *args):
# see for device states:
# https://developer.gnome.org/NetworkManager/stable/spec.html
# #type-NM_DEVICE_STATE
if state == 100:
nm_dev_connect()
elif state == 120:
nm_dev_fail()
def set_device_listener(path):
global device_listener
if device_listener:
device_listener.remove()
log.debug("adding listener for path %s" % path)
device_listener = bus.add_signal_receiver(
nm_device_change,
signal_name="StateChanged",
dbus_interface="org.freedesktop.NetworkManager.Device",
path=path
)
def check_device_listener(force=False):
global device_path
current_path = nm.get_device_path(modemgr.get_state_device(comstate))
if force or (current_path and current_path != device_path):
device_path = current_path
set_device_listener(device_path)
def nm_state_change(state):
global device_path
# https://developer.gnome.org/NetworkManager/stable/spec.html
# #type-NM_STATE
if state >= 50:
check_device_listener()
def set_nm_listeners():
bus.add_signal_receiver(
check_device_listener,
signal_name="DeviceAdded",
dbus_interface="org.freedesktop.NetworkManager"
)
bus.add_signal_receiver(
check_device_listener,
signal_name="DeviceRemoved",
dbus_interface="org.freedesktop.NetworkManager"
)
check_device_listener()
bus.add_signal_receiver(
nm_state_change,
signal_name="StateChanged",
dbus_interface="org.freedesktop.NetworkManager"
)
nm_state_change(nm.nm_state())
def init_nmmon():
set_nm_listeners()
def main():
handler = logging.StreamHandler(stream=None)
log.addHandler(handler)
log.setLevel(logging.DEBUG)
log.info('starting')
init_nmmon()
def up():
print("wifi up")
def down():
print("wifi down")
set_device_callbacks('HOTSPOT', up, down)
loop = MainLoop()
loop.run()
if __name__ == '__main__':
main()
|