forked from Stefar77/cbsd
/
jrctl
executable file
·189 lines (161 loc) · 3.67 KB
/
jrctl
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/local/bin/cbsd
#v10.0.7
CBSDMODULE="jail"
MYARG=""
MYOPTARG="mode jname alljails shownode display node header human"
MYDESC="Set or flush resource limit for jail"
ADDHELP="mode= set (apply), unset, show (show current state) or get (show limits)\n\
alljails=1 - get jaillist from remote node\n\
shownode=1 - show nodename for jails\n\
node= only for current node\n\
header=0 don't print header\n\
human=0 don't convert bytes to human readable form\n\
display= list by comma for column. Default: jname,memoryuse,maxproc,openfiles,vmemoryuse,swapuse,pcpu,fsquota,nice,bw\n"
EXTHELP="wf_jrctl.html"
. ${subr}
. ${strings}
. ${tools}
. ${sharedir}/rctl.conf
. ${workdir}/jrctl.subr
readconf jrctl.conf
init $*
[ -z "${display}" ] && display="jname,memoryuse,maxproc,openfiles,vmemoryuse,swapuse,pcpu,fsquota,nice,bw"
[ "${shownode}" = "1" ] && display="nodename,${display}"
#remove commas for loop action on header
mydisplay=$( echo ${display} |/usr/bin/tr ',' ' ' )
# upper for header
myheader=$( echo ${mydisplay} |/usr/bin/tr '[:lower:]' '[:upper:]' )
JLS=""
show_header()
{
local _header="${BOLD}${myheader}${NORMAL}"
[ ${header} -ne 0 ] && $ECHO ${_header}
}
# if $1 = "Unregister" then overwrite status to "Unregister"
populate_output_data()
{
#populate values for in output string
for _i in ${mydisplay}; do
_val=""
eval _val=\$$_i
[ -z "${_val}" ] && _val="-"
if rctl_humanize ${_i}; then
if conv2human ${_val}; then
_val="${convval}"
fi
fi
if [ -z "${_status}" ]; then
_status="${NORMAL}${_val}"
else
_status="${_status} ${_val}"
fi
done
}
# $1 - which file from. Eg: local
show_jaildata_from_sql()
{
local _i _sqlq
# set sqlfile for ". rcconf" including
if [ -n "${1}" ]; then
sqlfile="$1"
else
sqlfile="local"
fi
if [ -n "${jname}" ]; then
_sqlq="cbsdsql ${sqlfile} SELECT jname FROM jails WHERE jname=\"${jname}\" AND emulator != \"bhyve\""
else
_sqlq="cbsdsql ${sqlfile} SELECT jname FROM jails WHERE emulator != \"bhyve\""
fi
${_sqlq}| while read jname; do
_status=""
. ${workdir}/rctl.subr
populate_output_data
$ECHO "${_status}${NORMAL}"
done
}
show_local()
{
local _errcode _status
show_header
show_jaildata_from_sql local
}
show_remote()
{
show_header
if [ -z "${node}" ]; then
node=$(cbsd node mode=list header=0 allinfo=0)
fi
for _n in $node; do
nodename="${_n}"
show_jaildata_from_sql ${_n}
done
}
show_jails()
{
if [ -n "${node}" ]; then
show_remote
exit
fi
if [ "${alljails}" = "1" ]; then
show_local
header=0
show_remote
else
show_local
fi
}
jail_rctl()
{
local _action _str _p _out
local LIMITS="${jailsysdir}/${jname}/jail.limits"
case "${mode}" in
"set")
_action="/usr/bin/rctl -a "
;;
"unset")
[ -z "${jname}" ] && err 1 "${MAGENTA}jname= must be set${NORMAL}"
/usr/bin/rctl -r jail:${jname}
#_action="rctl -r "
return 0
;;
"show")
/usr/bin/rctl -hu jail:${jname}
return 0
;;
"get")
# Here must be
# rctl -l jail:$jname::=/
# or
# rctl -u jail:$jname::=/
# but it still unusable or crashed
[ -f "${LIMITS}" ] && /bin/cat ${LIMITS}
return 0
;;
*)
show_jails|/usr/bin/column -t
;;
esac
if [ -f "${LIMITS}" ]; then
printf "${MAGENTA}${mode} resource limit: [ ${GREEN}"
cat ${LIMITS} |while read _p; do
case ":${_p}" in
:#* | :)
continue
;;
esac
_str="${_action} jail:${jname}:$_p"
_out=$( eval $_str )
[ $? -eq 0 ] && printf "${_p} "
done
printf "${MAGENTA}]${NORMAL}\n"
fi
}
#### MAIN
if [ -n "${jname}" ]; then
. ${jrcconf}
[ $? -eq 1 ] && err 1 "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
fi
[ -z "${header}" ] && header=1
[ -z "${human}" ] && human=1
sqldelimer=" "
jail_rctl