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()
|