From 3bc422b57eb12ea41205cfff1d59d2d465be5003 Mon Sep 17 00:00:00 2001 From: xenia Date: Mon, 3 Feb 2025 21:51:29 -0500 Subject: [PATCH] pkgs: patch ZED to support desktop notifications --- overlay.nix | 4 + pkgs/lix/lix-plugins/default.nix | 1 + ...port-for-desktop-notifications-D-Bus.patch | 131 ++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 pkgs/zfs/0001-ZED-add-support-for-desktop-notifications-D-Bus.patch diff --git a/overlay.nix b/overlay.nix index f5d81be..dc57326 100644 --- a/overlay.nix +++ b/overlay.nix @@ -48,4 +48,8 @@ final: prev: { lix-plugins = prev.callPackage ./pkgs/lix/lix-plugins {}; nix-plugins = builtins.throw "nix-plugins is not supported. see pkgs.lix-plugins"; + + zfs_2_2 = prev.zfs_2_2.overrideAttrs { + patches = [ ./pkgs/zfs/0001-ZED-add-support-for-desktop-notifications-D-Bus.patch ]; + }; } diff --git a/pkgs/lix/lix-plugins/default.nix b/pkgs/lix/lix-plugins/default.nix index 83d3bc7..e4ed2fa 100644 --- a/pkgs/lix/lix-plugins/default.nix +++ b/pkgs/lix/lix-plugins/default.nix @@ -1,4 +1,5 @@ { + lib, fetchFromGitHub, stdenv, meson, diff --git a/pkgs/zfs/0001-ZED-add-support-for-desktop-notifications-D-Bus.patch b/pkgs/zfs/0001-ZED-add-support-for-desktop-notifications-D-Bus.patch new file mode 100644 index 0000000..40d6346 --- /dev/null +++ b/pkgs/zfs/0001-ZED-add-support-for-desktop-notifications-D-Bus.patch @@ -0,0 +1,131 @@ +From 4ec38cf16ad4cc5f7bb00b93c32cd8f1d313c14c Mon Sep 17 00:00:00 2001 +From: xenia +Date: Mon, 3 Feb 2025 21:36:29 -0500 +Subject: [PATCH] ZED: add support for desktop notifications (D-Bus) + +--- + cmd/zed/zed.d/zed-functions.sh | 85 ++++++++++++++++++++++++++++++++++ + cmd/zed/zed.d/zed.rc | 7 +++ + 2 files changed, 92 insertions(+) + +diff --git a/cmd/zed/zed.d/zed-functions.sh b/cmd/zed/zed.d/zed-functions.sh +index 3a2519633..d47ef070b 100644 +--- a/cmd/zed/zed.d/zed-functions.sh ++++ b/cmd/zed/zed.d/zed-functions.sh +@@ -209,6 +209,10 @@ zed_notify() + [ "${rv}" -eq 0 ] && num_success=$((num_success + 1)) + [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1)) + ++ zed_notify_dbus "${subject}" "${pathname}"; rv=$? ++ [ "${rv}" -eq 0 ] && num_success=$((num_success + 1)) ++ [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1)) ++ + [ "${num_success}" -gt 0 ] && return 0 + [ "${num_failure}" -gt 0 ] && return 1 + return 2 +@@ -624,6 +628,87 @@ zed_notify_ntfy() + } + + ++# zed_notify_dbus (subject, pathname) ++# ++# Send a notification via D-Bus ... ++# The variable (ZED_USE_DBUS) defines whether to use D-Bus. ++# ++# Requires systemd (busctl) executables to be installed in the standard PATH. ++# ++# References ++# ... ++# ++# Arguments ++# subject: notification subject ++# pathname: pathname containing the notification message (OPTIONAL) ++# ++# Globals ++# ZED_USE_DBUS ++# ++# Return ++# 0: notification sent ++# 1: notification failed ++# 2: not configured ++# ++zed_notify_dbus() ++{ ++ local subject="$1" ++ local pathname="${2:-"/dev/null"}" ++ local msg_body ++ local msg_out ++ local msg_err ++ local exit_status=0 ++ local dir ++ local userid ++ ++ [ -n "${ZED_USE_DBUS}" ] || return 2 ++ ++ if [ ! -r "${pathname}" ]; then ++ zed_log_err "dbus cannot read \"${pathname}\"" ++ return 1 ++ fi ++ ++ zed_check_cmd "busctl" || return 1 ++ ++ # Read the message body in. ++ # ++ msg_body="$(cat "${pathname}")" ++ ++ if [ -z "${msg_body}" ] ++ then ++ msg_body=$subject ++ subject="" ++ fi ++ ++ # Send the notification to all users with a dbus session and check for ++ # errors. ++ # We use busctl(1) manually rather than eg notify-send(1) due to its ++ # ability to send D-Bus messages from root to a non-root user with the ++ # "--machine=@.host" flag. ++ for dir in /run/user/*; do ++ if [ -S "$dir/bus" ]; then ++ userid="$(basename "$dir")" ++ msg_out="$( \ ++ busctl --user --machine "$userid@.host" -- \ ++ call org.freedesktop.Notifications \ ++ /org/freedesktop/Notifications \ ++ org.freedesktop.Notifications Notify \ ++ "susssasa{sv}i" \ ++ "ZFS" 0 "drive-harddisk-symbolic" \ ++ "$subject" "$msg_body" ++ 0 2 urgency y 2 sender-pid x "$$" "-1" \ ++ 2>/dev/null ++ )"; rv=$? ++ ++ if [ "${rv}" -ne 0 ]; then ++ zed_log_err "busctl exit=${rv}" ++ exit_status=1 ++ fi ++ fi ++ done ++ return $exit_status ++} ++ + + # zed_rate_limit (tag, [interval]) + # +diff --git a/cmd/zed/zed.d/zed.rc b/cmd/zed/zed.d/zed.rc +index 859c6f9cb..567cd556a 100644 +--- a/cmd/zed/zed.d/zed.rc ++++ b/cmd/zed/zed.d/zed.rc +@@ -176,3 +176,10 @@ ZED_SYSLOG_SUBCLASS_EXCLUDE="history_event" + # + # https://ntfy.sh by default; uncomment to enable an alternative service url. + #ZED_NTFY_URL="https://ntfy.sh" ++ ++## ++# Whether to send desktop notifications via D-Bus ++# If defined, busctl(1) will be used to send desktop notifications via ++# the org.freedesktop.Notifications D-Bus interface ++# Disabled by default; uncomment to enable. ++#ZED_USE_DBUS=1 +-- +2.47.0 +