#!/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" }, "lab-bench" : { "displays" : { "DisplayPort-2" : "auto", "eDP" : "off" }, "mac_address" : "ac:91:a1:fe:9a:23" } } 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()