예제 #1
0
파일: startup.py 프로젝트: rohbotics/pifi
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)
예제 #2
0
파일: pifi.py 프로젝트: ihelal/pifi
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)
예제 #3
0
파일: pifi.py 프로젝트: ihelal/pifi
def list_pending():
    for con in var_io.readPendingConnections():
        try:
            print(con['802-11-wireless']['ssid'])
        except KeyError:
            print("WARN: Found non wireless pending connection: %s" %
                  con['connection']['id'])
예제 #4
0
파일: pifi.py 프로젝트: ihelal/pifi
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()
예제 #5
0
def list_command(argv):
    list_parser = argparse.ArgumentParser(
        description="List either seen or pending connections")
    list_parser.add_argument("list")
    args = list_parser.parse_args(argv)

    if args.list == "seen":
        for ssid in var_io.readSeenSSIDs():
            print(ssid)
    if args.list == "pending":
        for con in var_io.readPendingConnections():
            try:
                print(con["802-11-wireless"]["ssid"])
            except KeyError:
                print("WARN: Found non wireless pending connection: %s" %
                      con["connection"]["id"])
예제 #6
0
파일: pifi.py 프로젝트: MoffKalast/pifi
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()
예제 #7
0
파일: pifi.py 프로젝트: MoffKalast/pifi
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"
        )
예제 #8
0
파일: pifi.py 프로젝트: MoffKalast/pifi
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)
예제 #9
0
파일: pifi.py 프로젝트: ihelal/pifi
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"
        )
예제 #10
0
 def test_empty_list_pending(self):
     f = mock.mock_open(read_data='[]')
     self.assertEqual([], var_io.readPendingConnections(open=f))
예제 #11
0
 def test_non_existant_pending(self):
     f = mock.Mock(side_effect=FileNotFoundError('foo'))
     self.assertEqual([], var_io.readPendingConnections(open=f))
예제 #12
0
 def test_one_list_pending(self):
     f = mock.mock_open(read_data='[{ "foo" : "bar" }]')
     self.assertEqual([{
         'foo': 'bar'
     }], var_io.readPendingConnections(open=f))
예제 #13
0
 def test_non_list_pending(self):
     f = mock.mock_open(read_data='{ "foo" : "bar" }')
     with self.assertRaises(ValueError):
         var_io.readPendingConnections(open=f)