Skip to content

Commit

Permalink
project: Minor updates
Browse files Browse the repository at this point in the history
* Add tools folder with systemd service and script
* Add fixes in WiFiControl module
* Update repo
  • Loading branch information
merindorium committed Jul 7, 2017
1 parent 8a77201 commit 90b8dba
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 49 deletions.
37 changes: 37 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,40 @@ Network with WPA Enterprise security protocol has additional field 'identity'

If you don't have hostapd or wpa_supplicant package, `__init__` function raise `OSError` exception.
WiFiControl raise `WiFiControlError` exception on failure.


### WiFiMonitor

Monitor module which processing WPA Supplicant and HostAPD D-Bus signals

#### Usage Example

```python
import signal
from reachstatus import StateClient
from wificontrol import WiFiMonitor


def main():
def handler(signum, frame):
wifi_monitor.shutdown()

wifi_monitor = WiFiMonitor()

wifi_monitor.register_callback(wifi_monitor.HOST_STATE, StateClient.set_network_host_state)
wifi_monitor.register_callback(wifi_monitor.CLIENT_STATE, StateClient.set_network_client_state)
wifi_monitor.register_callback(wifi_monitor.OFF_STATE, StateClient.set_network_disabled_state)
wifi_monitor.register_callback(wifi_monitor.SCAN_STATE, StateClient.set_network_scan_state)
wifi_monitor.register_callback(wifi_monitor.REVERT_EVENT, StateClient.send_revert_connect_notify)
wifi_monitor.register_callback(wifi_monitor.SUCCESS_EVENT, StateClient.send_success_connect_notify)

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)

wifi_monitor.run()


if __name__ == '__main__':
main()

```
16 changes: 11 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@

setup(
name='wificontrol',
version='0.3.2',
author='Ivan Sapozhkov',
author_email='[email protected]',
version='0.4.0',
author='Ivan Sapozhkov, Denis Changin',
author_email='[email protected], [email protected]',
packages=['wificontrol', 'wificontrol.utils'],
license='GPLv3',
url='https://github.com/emlid/reach-wifi-configurator.git',
description='Module for control WiFi connections with host(AP) and client(WPA) modes.',
tests_require="nose",
test_suite="nose.collector",
install_requires=[
'reachstatus',
'sysdmanager',
'netifaces'
],
extras_require={
'test': ['pytest', 'pytest-cov'],
},
long_description=open('README.md').read()
)
32 changes: 32 additions & 0 deletions tools/wifimonitor
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/python
import signal
from reachstatus import StateClient
from wificontrol import WiFiMonitor
from reach_setup import configure_logging


def main():
configure_logging()

def handler(signum, frame):
wifi_monitor.shutdown()

wifi_monitor = WiFiMonitor()

wifi_monitor.register_callback(wifi_monitor.HOST_STATE, StateClient.set_network_host_state)
wifi_monitor.register_callback(wifi_monitor.CLIENT_STATE, StateClient.set_network_client_state)
wifi_monitor.register_callback(wifi_monitor.OFF_STATE, StateClient.set_network_disabled_state)
wifi_monitor.register_callback(wifi_monitor.SCAN_STATE, StateClient.set_network_scan_state)
wifi_monitor.register_callback(wifi_monitor.REVERT_EVENT,
StateClient.send_revert_connect_notify)
wifi_monitor.register_callback(wifi_monitor.SUCCESS_EVENT,
StateClient.send_success_connect_notify)

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)

wifi_monitor.run()


if __name__ == '__main__':
main()
12 changes: 12 additions & 0 deletions tools/wifimonitor.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[Unit]
Description=Reach WiFi Status Monitor
After=reach_status.service

[Service]
Type=simple
ExecStart=/usr/bin/wifimonitor
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
2 changes: 2 additions & 0 deletions wificontrol/wificontrol.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ def start_host_mode(self):
if not self.hotspot.started():
self.wpasupplicant.stop()
self.hotspot.start()
return True

def start_client_mode(self):
if not self.wpasupplicant.started():
self.hotspot.stop()
self.wpasupplicant.start()
return True

def turn_on_wifi(self):
if self.get_state() == self.OFF_STATE:
Expand Down
49 changes: 13 additions & 36 deletions wificontrol/wifimonitor.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import dbus
import dbus.service
import dbus.mainloop.glib
import signal
import logging
from wificontrol import WiFiControl
from reachstatus import StateClient
from . import WiFiControl

try:
from gi.repository import GObject
except ImportError:
import gobject as GObject

logging.basicConfig()
logger = logging.getLogger(__name__)

DBUS_PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties'
Expand Down Expand Up @@ -61,15 +58,9 @@ def __init__(self):

self.callbacks = {}

self.current_state = None
self.current_state = self.OFF_STATE
self.current_ssid = None

try:
self._initialize()
except dbus.exceptions.DBusException as error:
logger.error(error)
raise WiFiMonitorError(error)

def _initialize(self):
systemd_obj = self.bus.get_object(SYSTEMD_DBUS_SERVICE,
SYSTEMD_DBUS_OPATH)
Expand All @@ -96,6 +87,7 @@ def _register_local_callbacks(self):

def _set_initial_state(self):
state = self.wifi_manager.get_state()
logger.debug('Initiate WiFiMonitor with "{}" state'.format(state))
self._process_new_state(state)

def _host_props_changed(self, *args):
Expand All @@ -119,6 +111,7 @@ def _wpa_props_changed(self, props):
def _process_new_state(self, state):
state = self.STATES.get(state)
if state and self.current_state != state:
logger.debug('Switching to {} state'.format(state))
self.current_state = state
self._execute_callbacks(state)

Expand All @@ -137,6 +130,7 @@ def _ssid_updated(self):
try:
ssid = status['ssid']
except (KeyError, TypeError) as error:
logger.debug('Got empty network status')
raise WiFiMonitorError(error)

if self.current_ssid != ssid:
Expand All @@ -162,42 +156,25 @@ def _execute_callbacks(self, msg):
try:
callback(*args)
except Exception as error:
logger.error(error)
logger.error('Callback {} execution error. {}'.format(callback.__name__, error))

def run(self):
try:
self._initialize()
except dbus.exceptions.DBusException as error:
logger.error(error)
raise WiFiMonitorError(error)

self._mainloop.run()

def shutdown(self):
self._deinitialize()
self._mainloop.quit()
logger.info('WiFiMonitor stopped')

def _deinitialize(self):
try:
self.sysd_manager.Unsubscribe()
except dbus.exceptions.DBusException as error:
logger.error(error)
raise WiFiMonitorError(error)


def main():
def handler(signum, frame):
wifi.shutdown()

wifi = WiFiMonitor()

wifi.register_callback(wifi.HOST_STATE, StateClient.set_network_state, ('hotspot',))
wifi.register_callback(wifi.CLIENT_STATE, StateClient.set_network_state, ('client',))
wifi.register_callback(wifi.OFF_STATE, StateClient.set_network_state, ('disabled',))
wifi.register_callback(wifi.SCAN_STATE, StateClient.set_network_state, ('scan',))
wifi.register_callback(wifi.REVERT_EVENT, StateClient.send_notification, ('connection_failed',))
wifi.register_callback(wifi.SUCCESS_EVENT, StateClient.send_notification,
('connection_success',))

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)

wifi.run()


if __name__ == '__main__':
main()
18 changes: 10 additions & 8 deletions wificontrol/wpasupplicant.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
from utils import FileError
from utils import ServiceError, InterfaceError, PropertyError
from threading import Thread, Event, Timer
import time
import sys


class WpaSupplicant(WiFi):
Expand Down Expand Up @@ -75,16 +77,13 @@ def stop(self):
self.execute_command(self.wpas_control("stop"))

def get_status(self):
network_params = dict()
try:
network_params = None
if self.started():
network_params = dict()
network_params['ssid'] = self.get_current_network_ssid()
except PropertyError:
network_params = None
else:
network_params['mac address'] = self.get_device_mac()
network_params['IP address'] = self.get_device_ip()
finally:
return network_params
return network_params

def scan(self):
if self.started():
Expand All @@ -99,7 +98,9 @@ def get_scan_results(self):
return []

def get_added_networks(self):
current_network = self.get_status()
current_network = None
if self.started():
current_network = self.get_status()
return [convert_to_wificontrol_network(network, current_network) for
network in self.config_updater.networks]

Expand Down Expand Up @@ -223,6 +224,7 @@ def wait_untill_connection_complete(self):
while self.wpa_supplicant_interface.get_state() != "completed":
if not self.connection_event.is_set():
raise RuntimeError("Can't connect to network")
time.sleep(0.5)

def check_correct_connection(self, aim_network):
if aim_network is not None:
Expand Down

0 comments on commit 90b8dba

Please sign in to comment.