Lint cgroup name.sh.in (#5162)
* lint cgroup-name.sh script * run automatic shfmt linter
Paweł Krupa committed
Jan 14, 2019 at 11:09 UTC
1053bb8bd92cbc1564eba2cad8e7ced01c497a70
1 file changed
+119
-152
collectors/cgroups.plugin/cgroup-name.sh.in
+119
-152
@@ -1,4 +1,5 @@
1
#!/usr/bin/env bash
2
+#shellcheck disable=SC2001
3
4
# netdata
5
# real-time performance and health monitoring, done right!
@@ -16,42 +17,80 @@ export LC_ALL=C
17
PROGRAM_NAME="$(basename "${0}")"
18
19
logdate() {
19
- date "+%Y-%m-%d %H:%M:%S"
20
+ date "+%Y-%m-%d %H:%M:%S"
21
}
22
23
log() {
23
- local status="${1}"
24
- shift
24
+ local status="${1}"
25
+ shift
26
26
- echo >&2 "$(logdate): ${PROGRAM_NAME}: ${status}: ${*}"
27
+ echo >&2 "$(logdate): ${PROGRAM_NAME}: ${status}: ${*}"
28
29
}
30
31
warning() {
31
- log WARNING "${@}"
32
+ log WARNING "${@}"
33
}
34
35
error() {
35
- log ERROR "${@}"
36
+ log ERROR "${@}"
37
}
38
39
info() {
39
- log INFO "${@}"
40
+ log INFO "${@}"
41
}
42
43
fatal() {
43
- log FATAL "${@}"
44
- exit 1
44
+ log FATAL "${@}"
45
+ exit 1
46
}
47
47
-debug=0
48
-debug() {
49
- [ $debug -eq 1 ] && log DEBUG "${@}"
48
+function docker_get_name_classic() {
49
+ local id="${1}"
50
+ info "Running command: docker ps --filter=id=\"${id}\" --format=\"{{.Names}}\""
51
+ NAME="$(docker ps --filter=id="${id}" --format="{{.Names}}")"
52
+ return 0
53
+}
54
+
55
+function docker_get_name_api() {
56
+ local id="${1}"
57
+ if [ ! -S "${DOCKER_HOST}" ]; then
58
+ warning "Can't find ${DOCKER_HOST}"
59
+ return 1
60
+ fi
61
+ info "Running API command: /containers/${id}/json"
62
+ JSON=$(echo -e "GET /containers/${id}/json HTTP/1.0\\r\\n" | nc -U "${DOCKER_HOST}" | grep '^{.*')
63
+ NAME=$(echo "$JSON" | jq -r .Name,.Config.Hostname | grep -v null | head -n1 | sed 's|^/||')
64
+ return 0
65
+}
66
+
67
+function docker_get_name() {
68
+ local id="${1}"
69
+ if hash docker 2>/dev/null; then
70
+ docker_get_name_classic "${id}"
71
+ else
72
+ docker_get_name_api "${id}" || docker_get_name_classic "${id}"
73
+ fi
74
+ if [ -z "${NAME}" ]; then
75
+ warning "cannot find the name of docker container '${id}'"
76
+ NAME="${id:0:12}"
77
+ else
78
+ info "docker container '${id}' is named '${NAME}'"
79
+ fi
80
+}
81
+
82
+function docker_validate_id() {
83
+ local id="${1}"
84
+ if [ -n "${id}" ] && { [ ${#id} -eq 64 ] || [ ${#id} -eq 12 ]; }; then
85
+ docker_get_name "${id}"
86
+ else
87
+ error "a docker id cannot be extracted from docker cgroup '${CGROUP}'."
88
+ fi
89
}
90
91
# -----------------------------------------------------------------------------
92
54
-[ -z "${NETDATA_USER_CONFIG_DIR}" ] && NETDATA_USER_CONFIG_DIR="@configdir_POST@"
93
+[ -z "${NETDATA_USER_CONFIG_DIR}" ] && NETDATA_USER_CONFIG_DIR="@configdir_POST@"
94
[ -z "${NETDATA_STOCK_CONFIG_DIR}" ] && NETDATA_STOCK_CONFIG_DIR="@libconfigdir_POST@"
95
96
DOCKER_HOST="${DOCKER_HOST:=/var/run/docker.sock}"
@@ -60,149 +99,77 @@ NAME=
99
100
# -----------------------------------------------------------------------------
101
63
-if [ -z "${CGROUP}" ]
64
- then
65
- fatal "called without a cgroup name. Nothing to do."
102
+if [ -z "${CGROUP}" ]; then
103
+ fatal "called without a cgroup name. Nothing to do."
104
fi
105
68
-for CONFIG in "${NETDATA_USER_CONFIG_DIR}/cgroups-names.conf" "${NETDATA_STOCK_CONFIG_DIR}/cgroups-names.conf"
69
-do
70
- if [ -f "${CONFIG}" ]
71
- then
72
- NAME="$(grep "^${CGROUP} " "${CONFIG}" | sed "s/[[:space:]]\+/ /g" | cut -d ' ' -f 2)"
73
- if [ -z "${NAME}" ]
74
- then
75
- info "cannot find cgroup '${CGROUP}' in '${CONFIG}'."
76
- else
77
- break
78
- fi
79
- #else
80
- # info "configuration file '${CONFIG}' is not available."
81
- fi
106
+for CONFIG in "${NETDATA_USER_CONFIG_DIR}/cgroups-names.conf" "${NETDATA_STOCK_CONFIG_DIR}/cgroups-names.conf"; do
107
+ if [ -f "${CONFIG}" ]; then
108
+ NAME="$(grep "^${CGROUP} " "${CONFIG}" | sed 's/[[:space:]]\+/ /g' | cut -d ' ' -f 2)"
109
+ if [ -z "${NAME}" ]; then
110
+ info "cannot find cgroup '${CGROUP}' in '${CONFIG}'."
111
+ else
112
+ break
113
+ fi
114
+ #else
115
+ # info "configuration file '${CONFIG}' is not available."
116
+ fi
117
done
118
84
-function docker_get_name_classic {
85
- local id="${1}"
86
- info "Running command: docker ps --filter=id=\"${id}\" --format=\"{{.Names}}\""
87
- NAME="$( docker ps --filter=id="${id}" --format="{{.Names}}" )"
88
- return 0
89
-}
90
-
91
-function docker_get_name_api {
92
- local id="${1}"
93
- if [ ! -S "${DOCKER_HOST}" ]
94
- then
95
- warning "Can't find ${DOCKER_HOST}"
96
- return 1
97
- fi
98
- info "Running API command: /containers/${id}/json"
99
- JSON=$(echo -e "GET /containers/${id}/json HTTP/1.0\r\n" | nc -U ${DOCKER_HOST} | grep '^{.*')
100
- NAME=$(echo $JSON | jq -r .Name,.Config.Hostname | grep -v null | head -n1 | sed 's|^/||')
101
- return 0
102
-}
103
-
104
-function docker_get_name {
105
- local id="${1}"
106
- if hash docker 2>/dev/null
107
- then
108
- docker_get_name_classic "${id}"
109
- else
110
- docker_get_name_api "${id}" || docker_get_name_classic "${id}"
111
- fi
112
- if [ -z "${NAME}" ]
113
- then
114
- warning "cannot find the name of docker container '${id}'"
115
- NAME="${id:0:12}"
116
- else
117
- info "docker container '${id}' is named '${NAME}'"
118
- fi
119
-}
120
-
121
-if [ -z "${NAME}" ]
122
- then
123
- if [[ "${CGROUP}" =~ ^.*docker[-_/\.][a-fA-F0-9]+[-_\.]?.*$ ]]
124
- then
125
- # docker containers
126
-
127
- DOCKERID="$( echo "${CGROUP}" | sed "s|^.*docker[-_/]\([a-fA-F0-9]\+\)[-_\.]\?.*$|\1|" )"
128
- # echo "DOCKERID=${DOCKERID}"
129
-
130
- if [ ! -z "${DOCKERID}" -a \( ${#DOCKERID} -eq 64 -o ${#DOCKERID} -eq 12 \) ]
131
- then
132
- docker_get_name "${DOCKERID}"
133
- else
134
- error "a docker id cannot be extracted from docker cgroup '${CGROUP}'."
135
- fi
136
- elif [[ "${CGROUP}" =~ ^.*ecs[-_/\.][a-fA-F0-9]+[-_\.]?.*$ ]]
137
- then
138
- # ECS
139
-
140
- DOCKERID="$( echo "${CGROUP}" | sed "s|^.*ecs[-_/].*[-_/]\([a-fA-F0-9]\+\)[-_\.]\?.*$|\1|" )"
141
- # echo "DOCKERID=${DOCKERID}"
142
-
143
- if [ ! -z "${DOCKERID}" -a \( ${#DOCKERID} -eq 64 -o ${#DOCKERID} -eq 12 \) ]
144
- then
145
- docker_get_name "${DOCKERID}"
146
- else
147
- error "a docker id cannot be extracted from docker cgroup '${CGROUP}'."
148
- fi
149
- elif [[ "${CGROUP}" =~ ^.*kubepods[_/].*[_/]pod[a-fA-F0-9-]+[_/][a-fA-F0-9]+$ ]]
150
- then
151
- # kubernetes
152
-
153
- DOCKERID="$( echo "${CGROUP}" | sed "s|^.*kubepods[_/].*[_/]pod[a-fA-F0-9-]\+[_/]\([a-fA-F0-9]\+\)$|\1|" )"
154
- # echo "DOCKERID=${DOCKERID}"
155
-
156
- if [ ! -z "${DOCKERID}" -a \( ${#DOCKERID} -eq 64 -o ${#DOCKERID} -eq 12 \) ]
157
- then
158
- docker_get_name "${DOCKERID}"
159
- else
160
- error "a docker id cannot be extracted from kubernetes cgroup '${CGROUP}'."
161
- fi
162
- elif [[ "${CGROUP}" =~ machine.slice[_/].*\.service ]]
163
- then
164
- # systemd-nspawn
165
-
166
- NAME="$(echo ${CGROUP} | sed 's/.*machine.slice[_\/]\(.*\)\.service/\1/g')"
167
-
168
- elif [[ "${CGROUP}" =~ machine.slice_machine.*-qemu ]]
169
- then
170
- # libvirtd / qemu virtual machines
171
-
172
- # NAME="$(echo ${CGROUP} | sed 's/machine.slice_machine.*-qemu//; s/\/x2d//; s/\/x2d/\-/g; s/\.scope//g')"
173
- NAME="qemu_$(echo ${CGROUP} | sed 's/machine.slice_machine.*-qemu//; s/\/x2d[[:digit:]]*//; s/\/x2d//g; s/\.scope//g')"
174
-
175
- elif [[ "${CGROUP}" =~ machine_.*\.libvirt-qemu ]]
176
- then
177
- # libvirtd / qemu virtual machines
178
- NAME="qemu_$(echo ${CGROUP} | sed 's/^machine_//; s/\.libvirt-qemu$//; s/-/_/;')"
179
-
180
- elif [[ "${CGROUP}" =~ qemu.slice_([0-9]+).scope && -d /etc/pve ]]
181
- then
182
- # Proxmox VMs
183
-
184
- FILENAME="/etc/pve/qemu-server/${BASH_REMATCH[1]}.conf"
185
- if [[ -f $FILENAME && -r $FILENAME ]]
186
- then
187
- NAME="qemu_$(grep -e '^name: ' "/etc/pve/qemu-server/${BASH_REMATCH[1]}.conf" | head -1 | sed -rn 's|\s*name\s*:\s*(.*)?$|\1|p')"
188
- else
189
- error "proxmox config file missing ${FILENAME} or netdata does not have read access. Please ensure netdata is a member of www-data group."
190
- fi
191
- elif [[ "${CGROUP}" =~ lxc_([0-9]+) && -d /etc/pve ]]
192
- then
193
- # Proxmox Containers (LXC)
194
-
195
- FILENAME="/etc/pve/lxc/${BASH_REMATCH[1]}.conf"
196
- if [[ -f ${FILENAME} && -r ${FILENAME} ]]
197
- then
198
- NAME=$(grep -e '^hostname: ' /etc/pve/lxc/${BASH_REMATCH[1]}.conf | head -1 | sed -rn 's|\s*hostname\s*:\s*(.*)?$|\1|p')
199
- else
200
- error "proxmox config file missing ${FILENAME} or netdata does not have read access. Please ensure netdata is a member of www-data group."
201
- fi
202
- fi
203
-
204
- [ -z "${NAME}" ] && NAME="${CGROUP}"
205
- [ ${#NAME} -gt 100 ] && NAME="${NAME:0:100}"
119
+if [ -z "${NAME}" ]; then
120
+ if [[ ${CGROUP} =~ ^.*docker[-_/\.][a-fA-F0-9]+[-_\.]?.*$ ]]; then
121
+ # docker containers
122
+ #shellcheck disable=SC1117
123
+ DOCKERID="$(echo "${CGROUP}" | sed "s|^.*docker[-_/]\([a-fA-F0-9]\+\)[-_\.]\?.*$|\1|")"
124
+ docker_validate_id "${DOCKERID}"
125
+
126
+ elif [[ ${CGROUP} =~ ^.*ecs[-_/\.][a-fA-F0-9]+[-_\.]?.*$ ]]; then
127
+ # ECS
128
+ #shellcheck disable=SC1117
129
+ DOCKERID="$(echo "${CGROUP}" | sed "s|^.*ecs[-_/].*[-_/]\([a-fA-F0-9]\+\)[-_\.]\?.*$|\1|")"
130
+ docker_validate_id "${DOCKERID}"
131
+
132
+ elif [[ ${CGROUP} =~ ^.*kubepods[_/].*[_/]pod[a-fA-F0-9-]+[_/][a-fA-F0-9]+$ ]]; then
133
+ # kubernetes
134
+ #shellcheck disable=SC1117
135
+ DOCKERID="$(echo "${CGROUP}" | sed "s|^.*kubepods[_/].*[_/]pod[a-fA-F0-9-]\+[_/]\([a-fA-F0-9]\+\)$|\1|")"
136
+ docker_validate_id "${DOCKERID}"
137
+
138
+ elif [[ ${CGROUP} =~ machine.slice[_/].*\.service ]]; then
139
+ # systemd-nspawn
140
+ NAME="$(echo "${CGROUP}" | sed 's/.*machine.slice[_\/]\(.*\)\.service/\1/g')"
141
+
142
+ elif [[ ${CGROUP} =~ machine.slice_machine.*-qemu ]]; then
143
+ # libvirtd / qemu virtual machines
144
+ # NAME="$(echo ${CGROUP} | sed 's/machine.slice_machine.*-qemu//; s/\/x2d//; s/\/x2d/\-/g; s/\.scope//g')"
145
+ NAME="qemu_$(echo "${CGROUP}" | sed 's/machine.slice_machine.*-qemu//; s/\/x2d[[:digit:]]*//; s/\/x2d//g; s/\.scope//g')"
146
+
147
+ elif [[ ${CGROUP} =~ machine_.*\.libvirt-qemu ]]; then
148
+ # libvirtd / qemu virtual machines
149
+ NAME="qemu_$(echo "${CGROUP}" | sed 's/^machine_//; s/\.libvirt-qemu$//; s/-/_/;')"
150
+
151
+ elif [[ ${CGROUP} =~ qemu.slice_([0-9]+).scope && -d /etc/pve ]]; then
152
+ # Proxmox VMs
153
+
154
+ FILENAME="/etc/pve/qemu-server/${BASH_REMATCH[1]}.conf"
155
+ if [[ -f $FILENAME && -r $FILENAME ]]; then
156
+ NAME="qemu_$(grep -e '^name: ' "/etc/pve/qemu-server/${BASH_REMATCH[1]}.conf" | head -1 | sed -rn 's|\s*name\s*:\s*(.*)?$|\1|p')"
157
+ else
158
+ error "proxmox config file missing ${FILENAME} or netdata does not have read access. Please ensure netdata is a member of www-data group."
159
+ fi
160
+ elif [[ ${CGROUP} =~ lxc_([0-9]+) && -d /etc/pve ]]; then
161
+ # Proxmox Containers (LXC)
162
+
163
+ FILENAME="/etc/pve/lxc/${BASH_REMATCH[1]}.conf"
164
+ if [[ -f ${FILENAME} && -r ${FILENAME} ]]; then
165
+ NAME=$(grep -e '^hostname: ' "/etc/pve/lxc/${BASH_REMATCH[1]}.conf" | head -1 | sed -rn 's|\s*hostname\s*:\s*(.*)?$|\1|p')
166
+ else
167
+ error "proxmox config file missing ${FILENAME} or netdata does not have read access. Please ensure netdata is a member of www-data group."
168
+ fi
169
+ fi
170
+
171
+ [ -z "${NAME}" ] && NAME="${CGROUP}"
172
+ [ ${#NAME} -gt 100 ] && NAME="${NAME:0:100}"
173
fi
174
175
info "cgroup '${CGROUP}' is called '${NAME}'"