dotfiles/dotfiles/lib/bin/rofi_systemd.sh

114 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env sh
export SYSTEMD_COLORS=0
term=${ROFI_SYSTEMD_TERM-urxvt -e}
default_action=${ROFI_SYSTEMD_DEFAULT_ACTION-"list_actions"}
function unit_files {
systemctl "$1" list-unit-files --no-legend
}
# This is needed to list services started from template units
function running_units {
systemctl "$1" list-units --all --type=service --no-legend |
awk '{print $1 " " $3}'
}
function get_units {
{ unit_files "--$1"; running_units "--$1"; } | sort -u -k1,1 |
awk -v unit_type="$1" '{print $0 " " unit_type}'
}
enable="Alt+e"
disable="Alt+d"
stop="Alt+k"
restart="Alt+r"
tail="Alt+t"
list_actions="Alt+l"
all_actions="enable
disable
stop
restart
tail
list_actions"
function select_service_and_act {
result=$(rofi -dmenu -i -p "systemd unit: " \
-kb-custom-1 "${enable}" \
-kb-custom-2 "${disable}" \
-kb-custom-3 "${stop}" \
-kb-custom-4 "${restart}" \
-kb-custom-5 "${tail}" \
-kb-custom-6 "${list_actions}")
rofi_exit="$?"
case "$rofi_exit" in
1)
action="exit"
exit 1
;;
10)
action="enable"
;;
11)
action="disable"
;;
12)
action="stop"
;;
13)
action="restart"
;;
14)
action="tail"
;;
15)
action="list_actions"
;;
*)
action="$default_action"
;;
esac
selection="$(echo $result | sed -n 's/ \+/ /gp')"
service_name=$(echo "$selection" | awk '{ print $1 }' | tr -d ' ')
is_user="$(echo $selection | awk '{ print $3 }' )"
case "$is_user" in
user*)
user_arg="--user"
command="systemctl $user_arg"
;;
system*)
user_arg=""
command="sudo systemctl"
;;
*)
command="systemctl"
esac
to_run="$(get_command_with_args)"
echo "Running $to_run"
eval "$term $to_run"
}
function get_command_with_args {
case "$action" in
"tail")
echo "journalctl $user_arg -u '$service_name' -f"
;;
"list_actions")
action=$(echo "$all_actions" | rofi -dmenu -i -p "Select action: ")
get_command_with_args
;;
*)
echo "$command $action '$service_name'"
;;
esac
}
{ get_units user; get_units system; } | column -tc 1 | select_service_and_act