summary refs log tree commit diff
path: root/bin/svcm
blob: b7daf39af67d7cf1f1b88aa29c63d746742bf9ba (plain) (blame)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
set -eu

# shellcheck disable=2034
description="service manager"

export FUZL_PROMPT=svcm
export FUZL_ICON=󰲽
. libfuzl.sh

SVCM_SCOPE=usr

main() {
	fuzl_action_add "usr" "󰀄" "User"
	fuzl_action_add "sys" "󰟀" "System"
	fuzl_action_menu || return

	select_service
}

#
# helpers
#

select_service() {
	local rl
	rl=$(runlevel_current)

	local srv
	srv=$(get_services |
		FUZL_PROMPT="$FUZL_PROMPT [$rl]" fuzl_menu $FUZL_MENU_FILTER || true)

	test -n "$srv" || main

	if [[ "$srv" = runlevel:* ]]; then
		runlevel_start "$(cut -c10- <<<"$srv")"
		return
	fi

	fuzl_action_add "restart" "󰜉" "Restart"
	fuzl_action_add "start" "󰈸" "Start"
	fuzl_action_add "stop" "" "Stop"
	fuzl_action_menu "$srv" || select_service
}

get_services() {
	case "${SVCM_SCOPE:?missing scope}" in
	usr)
		fuzl_try -- rc-service -U -l | sort -u
		find ~/.config/rc/runlevels/ -mindepth 1 -type d -printf 'runlevel:%P\n'
		;;
	sys)
		fuzl_try -- rc-service -l | sort -u
		find /etc/runlevels/ -mindepth 1 -type d -printf 'runlevel:%P\n'
		;;
	esac
}

runlevel_current() {
	case "${SVCM_SCOPE:?missing scope}" in
	usr) fuzl_try -- rc-status -U -r ;;
	sys) fuzl_try -- rc-status -r ;;
	esac
}
runlevel_start() {
	local rl=${1:?missing runlevel}
	case "${SVCM_SCOPE:?missing scope}" in
	usr) fuzl_try -- openrc -U "$rl" ;;
	sys) fuzl_try -- doas -n openrc "$rl" ;;
	esac
}

#
# actions
#

svcm_usr() {
	SVCM_SCOPE=usr
}
svcm_sys() {
	SVCM_SCOPE=sys
}

svcm_start() {
	local srv=${1:?missing service}
	case "${SVCM_SCOPE:?missing scope}" in
	usr) fuzl_try -- rc-service -U "$srv" start ;;
	sys) fuzl_try -- doas -n rc-service "$srv" start ;;
	esac
}

svcm_stop() {
	local srv=${1:?missing service}
	case "${SVCM_SCOPE:?missing scope}" in
	usr) fuzl_try -- rc-service -U "$srv" stop ;;
	sys) fuzl_try -- doas -n rc-service "$srv" stop ;;
	esac
}

svcm_restart() {
	local srv=${1:?missing service}
	case "${SVCM_SCOPE:?missing scope}" in
	usr) fuzl_try -- rc-service -U "$srv" restart ;;
	sys) fuzl_try -- doas -n rc-service "$srv" stop ;;
	esac
}

main