summaryrefslogtreecommitdiffstats
path: root/dock-action.py
blob: 454cab8f7849677c6e7f88170b3d2bceb5244741 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/python

import logging
import argparse
import os
from subprocess import run

DRY_RUN = False
WLAN_ADAPTER = "wlp1s0"
DEVICES = {
    "work-desk" : {
        "displays" : {
            "DisplayPort-2" : "auto",
            "eDP" : "off"
        },
        "mac_address" : "ac:91:a1:fe:97:bf"
    }
}

def get_adapter_name(mac_address: str) -> str:
    import json
    interfaces = json.loads(run(["ip", "-j", "link"], capture_output=True).stdout)
    matches = [i for i in interfaces if i["address"].lower() == mac_address]
    if len(matches) > 0:
        return matches[0]["ifname"]
    else:
        return None

def do(command: list[str]) -> None:
    if DRY_RUN:
        logging.info(f"Run command: {command}")
    else:
        result = run(command, capture_output=True)
        if result.returncode != 0:
            logging.error(f"Command returned {result.returncode}: {' '.join(command)}")
            logging.error(result.stdout)
            logging.error(result.stderr)

def connected(device_name: str) -> None:
    logging.info(f"Connected notification for {device_name}")

    if device_name not in DEVICES:
        logging.info(f"Unregistered device {device_name}, ignoring")
        return
    device = DEVICES[device_name]

    eth_adapter = get_adapter_name(device["mac_address"])
    if eth_adapter is None:
        logging.error("No network adapter found, exiting")
        return

    logging.debug("Disabling wireless adapter")
    do(["ip", "link", "set", WLAN_ADAPTER, "down"])

    logging.debug("Enabling ethernet adapter")
    do(["ip", "link", "set", eth_adapter, "up"])

    logging.debug("Configuring monitors")
    xrandr_args = ["xrandr"]
    for display, mode in device["displays"].items():
        xrandr_args.append("--output")
        xrandr_args.append(display)
        xrandr_args.append(f"--{mode}")
    do(xrandr_args)

def disconnected(device_name: str) -> None:
    logging.info(f"Disconnected notification for {device_name}")

    logging.debug("Enabling wireless adapter")
    do(["ip", "link", "set", WLAN_ADAPTER, "up"])

    logging.debug("Configuring monitors")
    do(["xrandr", "--auto"])

def main() -> None:
    #logging.basicConfig(filename="/home/eddy/dock.log", encoding="utf-8", level=logging.DEBUG)
    os.environ["DISPLAY"] = ":0"
    os.environ["XAUTHORITY"] = "/home/eddy/.Xauthority"

    parser = argparse.ArgumentParser()
    parser.add_argument("action")
    parser.add_argument("device")
    args = parser.parse_args()

    if args.action == "connected":
        connected(args.device)
    elif args.action == "disconnected":
        disconnected(args.device)

    logging.info("Done")

if __name__ == "__main__":
    main()