@cryptotaxi247 / netdata-1 / commits / 1053bb8bd

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}'"