about summary refs log tree commit diff
path: root/tools/waybar-systemd-units/waybar-systemd.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/waybar-systemd-units/waybar-systemd.py')
-rwxr-xr-xtools/waybar-systemd-units/waybar-systemd.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/tools/waybar-systemd-units/waybar-systemd.py b/tools/waybar-systemd-units/waybar-systemd.py
new file mode 100755
index 0000000..de5c2e0
--- /dev/null
+++ b/tools/waybar-systemd-units/waybar-systemd.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+import json
+import subprocess
+from typing import List
+
+import click
+
+
+def _get_failed_units(cmd) -> List[str]:
+    res = subprocess.run(cmd, capture_output=True, check=True)
+    if res.returncode == 0:
+        units = json.loads(res.stdout)
+        return [unit.get("unit") for unit in units]
+    else:
+        click.echo(f"failed to run {cmd}", err=True)
+        return []
+
+
+@click.command()
+@click.version_option(version="0.1.0")
+def cli() -> int:
+    """
+    Get a list of systemd units (system and users) that have
+    failed, and print the output in JSON, in a format compatible to
+    waybar.
+    """
+    failed_system_units = _get_failed_units(
+        [
+            "systemctl",
+            "list-units",
+            "-o",
+            "json",
+            "--state=failed",
+        ],
+    )
+
+    failed_user_units = _get_failed_units(
+        [
+            "systemctl",
+            "--user",
+            "list-units",
+            "-o",
+            "json",
+            "--state=failed",
+        ],
+    )
+
+    failed_units = len(failed_user_units) + len(failed_system_units)
+
+    # The output format documentation:
+    # https://github.com/Alexays/Waybar/wiki/Module:-Custom
+    output = {"text": failed_units, "class": "success"}
+
+    if failed_units > 0:
+        output["class"] = "errors"
+
+        tooltip = []
+
+        if len(failed_user_units) > 0:
+            tooltip.append("failed user units: {}".format(", ".join(failed_user_units)))
+
+        if len(failed_system_units) > 0:
+            tooltip.append(
+                "failed system units: {}".format(", ".join(failed_system_units))
+            )
+
+        output["tooltip"] = "\n".join(tooltip)
+
+    click.echo(json.dumps(output))
+
+    return 0
+
+
+if __name__ == "__main__":
+    cli()