46 lines
1.1 KiB
Python
Executable file
46 lines
1.1 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
import argparse
|
|
from io import StringIO
|
|
import subprocess
|
|
import urllib.parse
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="""
|
|
Fetch the wifi password and generate a QR code.
|
|
|
|
This program assumes that the network PSK is stored
|
|
in the password-store, and will look for it
|
|
at the path `wifi/<essid>`.
|
|
""",
|
|
)
|
|
parser.add_argument(
|
|
"-H",
|
|
"--hidden",
|
|
action="store_true",
|
|
help="Indicate that this network's SSID is hidden.",
|
|
)
|
|
parser.add_argument("essid", help="ESSID for this network")
|
|
|
|
args = parser.parse_args()
|
|
|
|
psk = subprocess.check_output(["pass", f"wifi/{args.essid}"], text=True).strip()
|
|
|
|
hidden_data = "H:true;" if args.hidden else ""
|
|
qr_data = f"WIFI:T:WPA;S:{quote(args.essid)};{hidden_data}P:{quote(psk)};;"
|
|
|
|
proc = subprocess.Popen(["qrencode", "-tANSI"], stdin=subprocess.PIPE, text=True)
|
|
proc.communicate(qr_data)
|
|
|
|
|
|
PRINTABLE = [*range(0x20, 0x3B), *range(0x3C, 0x7F)]
|
|
|
|
|
|
def quote(s: str) -> str:
|
|
return urllib.parse.quote(s, safe=PRINTABLE)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|