From fd00eaede8c5d0cb1f55dbda0375e189074fcdb9 Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 28 Oct 2023 10:28:47 +0000 Subject: [PATCH] net: add LTE connection details --- hosts/modules/roles/client/install-nm | 61 +++++++++++++++++++++------ secrets/common/net/README.md | 4 +- secrets/common/net/all.json.bin | 8 ++-- 3 files changed, 55 insertions(+), 18 deletions(-) diff --git a/hosts/modules/roles/client/install-nm b/hosts/modules/roles/client/install-nm index d1d13978..6bb180b0 100755 --- a/hosts/modules/roles/client/install-nm +++ b/hosts/modules/roles/client/install-nm @@ -10,16 +10,36 @@ from dataclasses import dataclass @dataclass class Connection: comment: str | None - ssid: str + ssid: str # also used as "id", more generally passphrase: str | None + # LTE connections: + uuid: str | None + gsm_apn: str | None + gsm_number: str | None + + @property + def type_(self) -> str: + if self.gsm_apn is not None or self.gsm_number is not None: + return "gsm" + return "wifi" def parse_manifest(manifest_path: str) -> list[Connection]: for entry in json.load(open(manifest_path)): comment = entry.get("comment") ssid = entry["ssid"] passphrase = entry.get("passphrase") + uuid = entry.get("uuid") + gsm_apn = entry.get("gsm_apn") + gsm_number = entry.get("gsm_number") if ssid != "": - yield Connection(comment=comment, ssid=ssid, passphrase=passphrase) + yield Connection( + comment=comment, + ssid=ssid, + passphrase=passphrase, + uuid=uuid, + gsm_apn=gsm_apn, + gsm_number=gsm_number, + ) def write_iwd(fh: "file", con: Connection) -> None: fh.write("[Security]\n") @@ -29,19 +49,31 @@ def write_iwd(fh: "file", con: Connection) -> None: def write_nm(fh: "file", con: Connection) -> None: fh.write("[connection]\n") fh.write(f"id={con.ssid}\n") - fh.write("type=wifi\n") #< TODO: needed? + if con.uuid is not None: + fh.write(f"uuid={con.uuid}\n") + fh.write(f"type={con.type_}\n") - fh.write("\n") - fh.write("[wifi]\n") - fh.write("mode=infrastructure\n") - fh.write(f"ssid={con.ssid}\n") + if con.type_ == "wifi": + fh.write("\n") + fh.write("[wifi]\n") + fh.write("mode=infrastructure\n") + fh.write(f"ssid={con.ssid}\n") - fh.write("\n") - fh.write("[wifi-security]\n") - fh.write("auth-alg=open\n") - fh.write("key-mgmt=wpa-psk\n") - if con.passphrase is not None: - fh.write(f"psk={con.passphrase}\n") + fh.write("\n") + fh.write("[wifi-security]\n") + fh.write("auth-alg=open\n") + fh.write("key-mgmt=wpa-psk\n") + if con.passphrase is not None: + fh.write(f"psk={con.passphrase}\n") + elif con.type_ == "gsm": + fh.write("\n") + fh.write("[gsm]\n") + if con.gsm_apn is not None: + fh.write(f"apn={con.gsm_apn}\n") + if con.gsm_number is not None: + fh.write(f"number={con.gsm_number}\n") + fh.write("\n") + fh.write("[ppp]\n") fh.write("\n") fh.write("[ipv4]\n") @@ -52,6 +84,9 @@ def write_nm(fh: "file", con: Connection) -> None: fh.write("addr-gen-mode=default\n") fh.write("method=auto\n") + # fh.write("\n") + # fh.write("[proxy]\n") + def install_all(manifest: list[Connection], destination: str, flavor: str) -> None: ext, writer = dict( iwd=("psk", write_iwd), diff --git a/secrets/common/net/README.md b/secrets/common/net/README.md index 6b59a8bf..1e019cc0 100644 --- a/secrets/common/net/README.md +++ b/secrets/common/net/README.md @@ -1,7 +1,9 @@ ## to add a new network - connect to it - iwd: `iwctl` - - networkmanager:`nmtui` + - networkmanager: + - `nmtui` (WiFi) + - `nm-connection-editor` (for LTE, may need `swaymsg -- output '*' scale 1` for mobile) - find it under: - iwd: `/var/lib/iwd` - networkmanager: `/var/lib/NetworkManager/system-connections` diff --git a/secrets/common/net/all.json.bin b/secrets/common/net/all.json.bin index 9454da1f..a4adba02 100644 --- a/secrets/common/net/all.json.bin +++ b/secrets/common/net/all.json.bin @@ -1,5 +1,5 @@ { - "data": "ENC[AES256_GCM,data:U1sTuZ0Wd96HKuLY8nvNhikENeh4eR05/OilWNzxK0DAgMQnLzgGgAgJm9omRyHWZznsoYpnNIiYhptGSxv+IwDHZGT7siNOPZN/NlegmJSgW44HFOb11nZ4SRRsOoUxfM57Vt+tbO3DM6xz932qqHMjEg07M3xt7UDf+uu1GWRd0KZOYBMZJux3wjZr7YfKON3RK6sLRTmp2wvOe11RlQb7eX/PN/0STcml7HU/UV0kTVhDIbJdAkmGBYZ+IIOprLowbQcLtUzbTYNVv1KLi5ooi7kcUXEPeash3FBe/DAQHeUKr803qsa/NCIJob9FH7xwKmxt+8G9jFVuUrS0BWjn/s71ACfmxOOwhctVGmDN5zCeoSQ+xP6vZF74fwq0i+Uokq0oSewXhL6WKvtdnMVULMgzQWkjqC+PfIE4rQaOQTMOxV1pwwRSYeLvrbJHqFNnGoWxbmCUrF0IdjM+al9XAuYBHiiROnzxpgfRrMwrmRIxhmVot9TAh3pCwbxnlXWD1NvIdDA+7rpiP8/TA3vAeQgILYV0OFy0DuNgSvby4nN3yoqizRvkfqDXRb4GlDkWivYQYN/wqVYzpanwSqts2U/aYBm19UeMCNtHlaWM3/qdm2WsKRoljoxsmpO+HsnuR85eY/YTdrZpXf2E3k7d6F8971s0I/RI532cYd5vU3i0sGzb5boNxk/3VMdwo5o470f/7jVY8KlPSdbo5TsHlAiCyGMiiD5sLtMsGrJg5pJSm8oClM7ujDrfhu6N9Jjggn58CnjUID2um4uMxT3+BUSTrf2uYbjKtJgk++J/4y6rmj3wD4iT5PmB5QTCqvTeVa4ItT/5zmCJQIeJ2wBYDfTxo+wvZ9yZu1egy0huW4zjwvPE9ycslkHzKKVlGNQf6SQa3rmx+ss7iWEAhPS9e0U3Wm00NF+jJhvhS27FkTsD+WQMntPs+GrAPwfUNNksH+tQz+o+xqFoOA/woOgVgROitY+kgBwl7FNJexZvuzydb6Ddr/wHExhyQVg3uda3jQczjZE7DvQO5FqJkhoRETK72qPPxtY6ANapPrl+hbHbBUlmiBpNx7Vit0bqGjDRJAf6koZgCqUm4K7+dK5dw/YAlKq34JdcXjRbIT2YDgJO5tGVgP7Q6r6yW3bkpmIPhkXDnLEu8g024rVv1YGRxmudlkRe9WjlayLuzwL6/W2lFm1/CD4BP9+MQlbEfLucKd4PWxCUXDlWGmz+A2OVb+x3h8q7t0x6L+9CKyRcbh9Bonz4hB3xHGxH9CR+oFwkB1JWHrlKnyVUIdPKQ48iEmH0tO8Cbn9D08twSxqGdmeybbkdLFEHvEQNFAC1dtGGnLoE3FX3GFod+WwtpzoC01tdUJncS5JvsaPiU6BLpVCFwoAPZonUHrRDNjwOeh59Xb2kkKY6bQUK6J3W1meinSRRYCau2qvLMEnvcRu7I3rNEvg10kzFdVjFSfQkSqQsz5o6PU6yi2vlfyG/aH9Nym0zrt2J20P1DEf9zLsiKMpATXQgYJSZiySD85HNTwgVzDASTFVR5Zo9wlFhYuRdOgCSJM+bQ66qgmoYM+Ai2cZ1CI64kY/5Z9pnHu/lbaPNPDOtTNXeXAe7dz1DOtsAEfHsdjshVNZ+Wgz2AteY6MLqhMZ44l230elVnLxaCOJp2Zp148nHNkhu4VPpBC9zs2LMCjbPzI4rWrNrc66ii/3BPh0BtKKIOeZtAGt8yHzXtcx3GgnZzrWJYAivz2sjmff129FVGl2GksKSIrD1UbWXd5Pag7NO5d+IYkSSD6V7zCQ=,iv:vJ2MXlzdrh/8LL4nfUBH9i+zls/Vc0euExLa/Wk97Ks=,tag:fJu//rG9dH5iMj4jOu0DhQ==,type:str]", + "data": "ENC[AES256_GCM,data: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,iv:9WvW3DScrLPI3bEb7neJgWI/MDTvBfajWDtDj3rGxJs=,tag:VTDd0X5Oep/dSlZbjIO6tw==,type:str]", "sops": { "kms": null, "gcp_kms": null, @@ -39,10 +39,10 @@ "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKMXhCRzVmNGFCZVZ4cjZn\ndEdqK1htOWczL3M1bDVrb1hqeE1SNkY2Nm1ZCkdoeThESTZHNUhpZTVwa2kvV3lD\nMnF4T3dDTG03cU1SZ1BuY2pzcng1SncKLS0tIDkyS0NsYm44RkE3NG9MditRKzBD\nL2o1dFBURUI2T3lKckdHVllzb3FWUE0K+qzPZWUIXMeXWuzpAhNES9Hqi98Qj4jT\nU/uff1VLwjE3SDwaFwW7rVur8gews4Bxph1qzJfZVnRFvON6xGqzjQ==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2023-07-15T22:40:02Z", - "mac": "ENC[AES256_GCM,data:1gPIpBZhCvoKIoNswpZTAJO/Fo07d3v8doYdvwYMlQhPkPB8J2gNWrlkboLe0wxOpKV7lwaBrynyUR9wrR9e+5P8avs1ewqqT1uSllBJ+ZKkVweli+vjWlynNSOmCPfb5PY8QJtp8K5s0/Ky/Ef5ZqLJRXmHzfUsULG91Hk5aac=,iv:oSVkYGMZT4hIc1Ft7YBb2m9aj9SY8j7hwTir10b4lhk=,tag:Mt1M/Pvjy7pT5bo6RyWVww==,type:str]", + "lastmodified": "2023-10-28T10:34:31Z", + "mac": "ENC[AES256_GCM,data:GS492dizmvoW6uCO4Wz+YzwFbtM6LfUdEgx7DzSbHG3hM/q3k5LW8E4HzxkBkDUylL5GS3FUWCADcoKe+JWqX3TUqQDqqrYScAVcE5e9TM2mZ12U6xz1SU8Tc5DkqQuUgrv/pvaJBI1UlEEdFkSOSIBzHZ5C7xW0WsNFauC9HFI=,iv:rnDBUWzieefIpES4WjWWEiAY3LtKkfazAgHaSoJ9VEw=,tag:n4b6kctXHHKiQfQAeQeFTw==,type:str]", "pgp": null, "unencrypted_suffix": "_unencrypted", - "version": "3.7.3" + "version": "3.8.1" } } \ No newline at end of file