-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrsv.bash
More file actions
141 lines (131 loc) · 4.88 KB
/
Copy pathrsv.bash
File metadata and controls
141 lines (131 loc) · 4.88 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# rsv bash completions
# Source in ~/.bashrc or drop in /etc/bash_completion.d/rsv
_rsv() {
local cur prev words cword
_init_completion || return
local commands="start stop restart reload enable disable status list logs edit new init once watch doctor log-setup log-remove finish-setup help"
# Distro-aware system paths
local svdir runsvdir
local -a svdirs
local _distro
_distro=$(grep '^ID=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"')
case "$_distro" in
void) svdir="/etc/sv"; svdirs=("/etc/sv"); runsvdir="/var/service" ;;
devuan) svdir="/etc/sv"; svdirs=("/etc/sv" "/usr/share/runit/sv.current"); runsvdir="/etc/runit/runsvdir/default" ;;
artix) svdir="/etc/runit/sv"; svdirs=("/etc/runit/sv"); runsvdir="/etc/runit/runsvdir/default" ;;
*) svdir="/etc/sv"; svdirs=("/etc/sv"); runsvdir="/var/service" ;;
esac
local user_svdir="${RUNIT_SVDIR:-$HOME/.runit/sv}"
local user_runsvdir="${RUNIT_RUNSVDIR:-$HOME/.runit/runsvdir}"
_rsv_all() {
local _d
{ for _d in "${svdirs[@]}"; do
[[ -d "$_d" ]] && ls "$_d" 2>/dev/null
done
[[ -d "$user_svdir" ]] && ls "$user_svdir" 2>/dev/null
} | grep -v 'current\|supervise\|\.supervisor' | sort -u
}
_rsv_enabled() {
{ [[ -d "$runsvdir" ]] && ls "$runsvdir" 2>/dev/null
[[ -d "$user_runsvdir" ]] && ls "$user_runsvdir" 2>/dev/null
} | grep -v 'current\|supervise\|\.supervisor' | sort -u
}
_rsv_no_log() {
local _d svc
for _d in "${svdirs[@]}"; do
[[ -d "$_d" ]] || continue
for svc in $(ls "$_d" 2>/dev/null | grep -v 'current\|supervise\|\.supervisor'); do
[[ -f "$_d/$svc/log/run" ]] || echo "$svc"
done
done
[[ -d "$user_svdir" ]] && for svc in $(ls "$user_svdir" 2>/dev/null | grep -v 'current\|supervise\|\.supervisor'); do
[[ -f "$user_svdir/$svc/log/run" ]] || echo "$svc"
done
}
_rsv_no_finish() {
local _d svc
for _d in "${svdirs[@]}"; do
[[ -d "$_d" ]] || continue
for svc in $(ls "$_d" 2>/dev/null | grep -v 'current\|supervise\|\.supervisor'); do
[[ -f "$_d/$svc/finish" ]] || echo "$svc"
done
done
[[ -d "$user_svdir" ]] && for svc in $(ls "$user_svdir" 2>/dev/null | grep -v 'current\|supervise\|\.supervisor'); do
[[ -f "$user_svdir/$svc/finish" ]] || echo "$svc"
done
}
_rsv_disabled() {
local enabled
enabled=$(_rsv_enabled)
for svc in $(_rsv_all); do
echo "$enabled" | grep -qx "$svc" || echo "$svc"
done
}
# Complete --as-user argument with usernames
if [[ "$prev" == "--as-user" ]]; then
COMPREPLY=($(compgen -u -- "$cur"))
return
fi
# Complete --level argument
if [[ "$prev" == "--level" ]]; then
COMPREPLY=($(compgen -W "error warn info debug crit fail emerg alert" -- "$cur"))
return
fi
local cmd=""
for word in "${words[@]:1}"; do
[[ "$word" == --* ]] && continue
if [[ " $commands " == *" $word "* ]]; then
cmd="$word"
break
fi
done
case "$cmd" in
"")
COMPREPLY=($(compgen -W "$commands --user --as-user" -- "$cur"))
;;
enable)
if [[ "$cur" == --* ]]; then
COMPREPLY=($(compgen -W "--now" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(_rsv_disabled)" -- "$cur"))
fi
;;
start|once)
COMPREPLY=($(compgen -W "$(_rsv_all)" -- "$cur"))
;;
stop|restart|reload|disable|status)
COMPREPLY=($(compgen -W "$(_rsv_enabled)" -- "$cur"))
;;
logs)
if [[ "$cur" == --* ]]; then
COMPREPLY=($(compgen -W "--errors --level --lines" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(_rsv_enabled)" -- "$cur"))
fi
;;
watch)
if [[ "$cur" == --* ]]; then
COMPREPLY=($(compgen -W "--interval" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(_rsv_enabled)" -- "$cur"))
fi
;;
edit|log-remove)
COMPREPLY=($(compgen -W "$(_rsv_all)" -- "$cur"))
;;
log-setup)
COMPREPLY=($(compgen -W "$(_rsv_no_log)" -- "$cur"))
;;
finish-setup)
COMPREPLY=($(compgen -W "$(_rsv_no_finish)" -- "$cur"))
;;
list)
;;
new)
if [[ "$cur" == --* ]]; then
COMPREPLY=($(compgen -W "--log --user" -- "$cur"))
fi
;;
esac
}
complete -F _rsv rsv