Skip to content

Instantly share code, notes, and snippets.

@Mic92
Last active November 3, 2021 17:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mic92/3ca60e6865a9793423a41db0480275d8 to your computer and use it in GitHub Desktop.
Save Mic92/3ca60e6865a9793423a41db0480275d8 to your computer and use it in GitHub Desktop.
Convert networkmanager/wpa_supplicant WPA/WPA2 networks to iwd networks
import glob
import re
import sys
import os
import subprocess
import curses.ascii
import binascii
from typing import Tuple, Optional
def parse_network_manager(filename: str) -> Tuple[Optional[str], Optional[str]]:
with open(filename) as f:
ssid = None
psk = None
for line in f:
match = re.match("^ssid=(.+)", line)
if match:
ssid = match.group(1)
match2 = re.match("^psk=(.+)", line)
if match2:
psk = match2.group(1)
return (ssid, psk)
def main() -> None:
networks = {}
with open("/etc/wpa_supplicant.conf") as f:
ssid = None
psk = None
for line in f:
match = re.match("\s*ssid=\"(.+)\"", line)
if match:
ssid = match.group(1)
match2 = re.match("\s*psk=\"(.+)\"", line)
if match2:
psk = match2.group(1)
match3 = re.match("\s*network\s*=\s*", line)
if match3:
if ssid and psk:
networks[ssid] = psk
ssid = None
psk = None
nm_profiles = glob.glob("/etc/NetworkManager/system-connections/*")
for f in nm_profiles:
ssid, psk = parse_network_manager(f)
if ssid and psk:
networks[ssid] = psk
for ssid, psk in networks.items():
if not re.match("^[0-9 \-_a-zA-z]+$", ssid):
hexstr = binascii.hexlify(ssid.encode("utf-8")).decode("ascii")
filename = f"={hexstr}.psk"
else:
filename = f"{ssid}.psk"
name = os.path.join("/var/lib/iwd", filename)
#if os.path.exists(name):
# continue
proc = subprocess.run(["wpa_passphrase", ssid, psk], check=True,capture_output=True)
out = proc.stdout.decode("utf-8")
preshared_key = out.split("\n")[3].replace("psk=", "").strip()
print(f"{ssid} -> {name}")
with open(name, "w") as f:
f.write(f"""[Security]
PreSharedKey={preshared_key}
Passphrase={psk}
""")
if __name__ == '__main__':
main()
@bjesus
Copy link

bjesus commented Nov 3, 2021

Thank you for this 🙏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment