def remove(ssid): for device in nm.managedWifiDevices(): if device.State == NetworkManager.NM_DEVICE_STATE_ACTIVATED: current_connection = device.GetAppliedConnection(0) # SSID returned as list of bytes if ssid == b''.join(current_connection[0]['802-11-wireless'] ['ssid']).decode("utf-8"): print("WARN: Connection is currently active") print("WARN: Deleting can disrupt existing SSH connetions") if query_yes_no("Continue Deletion?") == False: return pending = var_io.readPendingConnections() for con in pending: if ssid == con['802-11-wireless']['ssid']: pending.remove(con) try: var_io.writePendingConnections(pending) except PermissionError: print( "Error writing to /var/lib/pifi/pending, make sure you are running with sudo" ) return for con in nm.existingConnections(): settings = con.GetSettings() if ssid == settings['802-11-wireless']['ssid']: pass con.Delete()
def main(): pifi_conf_settings = etc_io.get_conf() ApModeDevice, ClientModeDevice = nm.select_devices(pifi_conf_settings) print("Using %s for AP mode support" % ApModeDevice.Interface) print("Using %s for wifi client mode" % ClientModeDevice.Interface) status_led = pifi_conf_settings["status_led"] leds.try_blink(status_led, delay_on=initializing_led[0], delay_off=initializing_led[1]) # Allow 30 seconds for network manager to sort itself out time.sleep(30) var_io.writeSeenSSIDs(nm.seenSSIDs([ClientModeDevice])) if ClientModeDevice.State == NetworkManager.NM_DEVICE_STATE_ACTIVATED: print("Client Device currently connected to: %s" % ClientModeDevice.SpecificDevice().ActiveAccessPoint.Ssid) leds.try_blink(status_led, delay_on=connected_led[0], delay_off=connected_led[1]) # Run button handler, and when that is done, exit handle_button(pifi_conf_settings, ApModeDevice, ClientModeDevice) return else: print( "Device is not connected to any network, Looking for pending connections" ) pending = var_io.readPendingConnections() # Try to pick a connection to use, if none found, just continue try: # Use the best connection best_ap, best_con = nm.selectConnection( nm.availibleConnections(ClientModeDevice, pending)) print("Connecting to %s" % best_con["802-11-wireless"]["ssid"]) NetworkManager.NetworkManager.AddAndActivateConnection( best_con, ClientModeDevice, best_ap) new_pending = var_io.readPendingConnections().remove(best_con) var_io.writePendingConnections(new_pending) leds.try_blink(status_led, delay_on=connected_led[0], delay_off=connected_led[1]) # Run button handler, and when that is done, exit handle_button(pifi_conf_settings, ApModeDevice, ClientModeDevice) return except ValueError: pass # If we reach this point, we gave up on Client mode print("No SSIDs from pending connections found") start_ap_mode(pifi_conf_settings, ApModeDevice, ClientModeDevice)
def test_none_write_pending(self): output = StringIO() ed = mock.MagicMock() f = mock.Mock(return_value=output) output.close = mock.MagicMock() var_io.writePendingConnections(None, open=f, ensureDir=ed) ed.assert_called_once_with(var_io.pending_path) self.assertEqual('[]', output.getvalue().strip())
def test_one_write_existing_pending(self): output = StringIO('[{ "foo" : "baz" }]') ed = mock.MagicMock() f = mock.Mock(return_value=output) output.close = mock.MagicMock() var_io.writePendingConnections([{'foo': 'bar'}], open=f, ensureDir=ed) ed.assert_called_once_with(var_io.pending_path) self.assertEqual('[{ "foo" : "bar" }]'.replace(" ", ""), output.getvalue().replace(" ", ""))
def rescan(): pifi_conf_settings = etc_io.get_conf() ApModeDevice, ClientModeDevice = nm.select_devices(pifi_conf_settings) if ApModeDevice.State != 100: print("AP Device is not active") else: current_connection = ApModeDevice.GetAppliedConnection(0) if 'mode' in current_connection[0][ '802-11-wireless'] and current_connection[0][ '802-11-wireless']['mode'] == "ap": print( "Device is currently acting as an Access Point, Rescanning requires turning this off" ) print("This will disrupt any SSH connections") if query_yes_no("Continue?") == False: return ApModeDevice.Disconnect() print("Waiting for wifi rescan") time.sleep(30) try: var_io.writeSeenSSIDs(nm.seenSSIDs([ClientModeDevice])) except PermissionError: print("Error writing to /var/lib/pifi/seen_ssids, continuing") if (ClientModeDevice.State == NetworkManager.NM_DEVICE_STATE_ACTIVATED): print("Connected to: %s" % ClientModeDevice.SpecificDevice().ActiveAccessPoint.Ssid) return print( "Device is not connected to any network, Looking for pending connections" ) pending = var_io.readPendingConnections() # Try to pick a connection to use, if none found, just continue try: # Use the best connection best_ap, best_con = nm.selectConnection( nm.availibleConnections(ClientModeDevice, pending)) print("Connecting to %s" % best_con['802-11-wireless']['ssid']) NetworkManager.NetworkManager.AddAndActivateConnection( best_con, ClientModeDevice, best_ap) new_pending = var_io.readPendingConnections().remove(best_con) var_io.writePendingConnections(new_pending) return except ValueError: pass # If we reach this point, we gave up on Client mode print("No SSIDs from pending connections found") startup.start_ap_mode(pifi_conf_settings, ApModeDevice, ClientModeDevice)
def remove(argv): parser = argparse.ArgumentParser( description="Remove a network from both pending and current connections" ) parser.add_argument("ssid") parser.add_argument("-y", action="store_true") args = parser.parse_args(argv) ssid = args.ssid skip_prompt = args.y for device in nm.managedWifiDevices(): if device.State == NetworkManager.NM_DEVICE_STATE_ACTIVATED: current_connection = device.GetAppliedConnection(0) # SSID returned as list of bytes if ssid == b"".join( current_connection[0]["802-11-wireless"]["ssid"] ).decode("utf-8"): print("WARN: Connection is currently active") print("WARN: Deleting can disrupt existing SSH connetions") # If skip_prompt is true, short circuit the if, otherwise go into the query if not skip_prompt and not query_yes_no("Continue Removal?"): return pending = var_io.readPendingConnections() for con in pending: if ssid == con["802-11-wireless"]["ssid"]: pending.remove(con) try: var_io.writePendingConnections(pending) except PermissionError: print( "Error writing to /var/lib/pifi/pending, make sure you are running with sudo" ) return for con in nm.existingConnections(): settings = con.GetSettings() if ssid == settings["802-11-wireless"]["ssid"]: pass con.Delete()
def add(argv, var_io=var_io): parser = argparse.ArgumentParser( description="Add a network to connect to on the next reboot/rescan" ) parser.add_argument("ssid") parser.add_argument("password", nargs="?") args = parser.parse_args(argv) ssid = args.ssid password = args.password if etc_io.get_hostname() == "ubiquityrobot": print( "WARN: Please use `pifi set-hostname` to change the hostname before connecting" ) pending = var_io.readPendingConnections() if password is not None: new_connection = { "connection": { "id": str(ssid), "type": "802-11-wireless", "autoconnect": True, "uuid": str(uuid.uuid4()), }, "802-11-wireless": { "mode": "infrastructure", "security": "802-11-wireless-security", "ssid": ssid, }, "802-11-wireless-security": { "key-mgmt": "wpa-psk", # We only support WPA2-PSK networks for now "psk": password, }, "ipv4": {"method": "auto"}, "ipv6": {"method": "auto"}, } else: new_connection = { "connection": { "id": str(ssid), "type": "802-11-wireless", "autoconnect": True, "uuid": str(uuid.uuid4()), }, "802-11-wireless": {"mode": "infrastructure", "ssid": ssid}, "ipv4": {"method": "auto"}, "ipv6": {"method": "auto"}, } print("Added connection %s, will attempt to connect to it on future reboots" % ssid) pending.append(new_connection) try: var_io.writePendingConnections(pending) except PermissionError: print( "Error writing to /var/lib/pifi/pending, make sure you are running with sudo" )
def rescan(argv): parser = argparse.ArgumentParser( description="Stop AP mode and rescan for known networks, start AP mode again if none found" ) parser.add_argument("-y", action="store_true") args = parser.parse_args(argv) skip_prompt = args.y pifi_conf_settings = etc_io.get_conf() ApModeDevice, ClientModeDevice = nm.select_devices(pifi_conf_settings) if ApModeDevice.State != 100: print("AP Device is not active") else: current_connection = ApModeDevice.GetAppliedConnection(0) if ( "mode" in current_connection[0]["802-11-wireless"] and current_connection[0]["802-11-wireless"]["mode"] == "ap" ): print( "Device is currently acting as an Access Point, Rescanning requires turning this off" ) print("This will disrupt any SSH connections") # If skip_prompt is true, short circuit the if, otherwise go into the query if not skip_prompt and not query_yes_no("Continue?"): return ApModeDevice.Disconnect() print("Waiting for wifi rescan") time.sleep(30) try: var_io.writeSeenSSIDs(nm.seenSSIDs([ClientModeDevice])) except PermissionError: print("Error writing to /var/lib/pifi/seen_ssids, continuing") if ClientModeDevice.State == NetworkManager.NM_DEVICE_STATE_ACTIVATED: print( "Connected to: %s" % ClientModeDevice.SpecificDevice().ActiveAccessPoint.Ssid ) return print("Device is not connected to any network, Looking for pending connections") pending = var_io.readPendingConnections() # Try to pick a connection to use, if none found, just continue try: # Use the best connection best_ap, best_con = nm.selectConnection( nm.availibleConnections(ClientModeDevice, pending) ) print("Connecting to %s" % best_con["802-11-wireless"]["ssid"]) NetworkManager.NetworkManager.AddAndActivateConnection( best_con, ClientModeDevice, best_ap ) new_pending = var_io.readPendingConnections().remove(best_con) var_io.writePendingConnections(new_pending) return except ValueError: pass # If we reach this point, we gave up on Client mode print("No SSIDs from pending connections found") startup.start_ap_mode(pifi_conf_settings, ApModeDevice, ClientModeDevice)
def add(ssid, password, var_io=var_io): if etc_io.get_hostname() == "ubiquityrobot": print( "WARN: Please use `pifi set-hostname` to change the hostname before connecting" ) pending = var_io.readPendingConnections() if password is not None: new_connection = { 'connection': { 'id': str(ssid), 'type': '802-11-wireless', 'autoconnect': True, 'uuid': str(uuid.uuid4()) }, '802-11-wireless': { 'mode': 'infrastructure', 'security': '802-11-wireless-security', 'ssid': ssid }, '802-11-wireless-security': { 'key-mgmt': 'wpa-psk', # We only support WPA2-PSK networks for now 'psk': password }, 'ipv4': { 'method': 'auto' }, 'ipv6': { 'method': 'auto' } } else: new_connection = { 'connection': { 'id': str(ssid), 'type': '802-11-wireless', 'autoconnect': True, 'uuid': str(uuid.uuid4()) }, '802-11-wireless': { 'mode': 'infrastructure', 'ssid': ssid }, 'ipv4': { 'method': 'auto' }, 'ipv6': { 'method': 'auto' } } print( "Added connection %s, will attempt to connect to it on future reboots" % ssid) pending.append(new_connection) try: var_io.writePendingConnections(pending) except PermissionError: print( "Error writing to /var/lib/pifi/pending, make sure you are running with sudo" )