Fix (and improve) Coverity scanning. (#16605)
* Split feature detection code to functions. This lets us reuse it in places like the coverity scan script. * Add ninja to the coverity build environment. * Restructure coverity scan script to use cmake. * Fix incorrect function name. * Add extra plugin deps for coverity scan environment. * Fix new issues introduced in coverity script. * Fix things broken by previous fix. * Fix Docker image builds. * Assorted fixes. * Correctly handle common case of set but empty prefix.
Austin S. Hemmelgarn committed
Jan 8, 2024 at 08:40 UTC
2710a3134d33aa02d14fd08d0446b187e5527662
5 files changed
+127
-131
.github/workflows/coverity.yml
+2
-1
@@ -33,7 +33,8 @@ jobs:
33
sudo apt-get install -y libjson-c-dev libyaml-dev libipmimonitoring-dev \
34
libcups2-dev libsnappy-dev libprotobuf-dev \
35
libprotoc-dev libssl-dev protobuf-compiler \
36
- libnetfilter-acct-dev
36
+ libnetfilter-acct-dev libmongoc-dev libxen-dev \
37
+ libsystemd-dev ninja-build
38
- name: Run coverity-scan
39
id: run
40
env:
coverity-scan.sh
+17
-23
@@ -42,11 +42,19 @@ INSTALL_DIR="/opt"
42
# the version of coverity to use
43
COVERITY_BUILD_VERSION="${COVERITY_BUILD_VERSION:-cov-analysis-linux64-2023.6.2}"
44
45
-# TODO: For some reasons this does not fully load on Debian 10 (Haven't checked if it happens on other distros yet), it breaks
46
-source packaging/installer/functions.sh || echo "Failed to fully load the functions library"
45
+. packaging/installer/functions.sh
46
48
-cpus=$(find_processors)
49
-[ -z "${cpus}" ] && cpus=1
47
+JOBS=$(find_processors)
48
+[ -z "${JOBS}" ] && JOBS=1
49
+
50
+if command -v ninja 2>&1; then
51
+ ninja="$(command -v ninja)"
52
+fi
53
+
54
+CMAKE_OPTS="${ninja:+-G Ninja}"
55
+BUILD_OPTS="VERBOSE=1"
56
+[ -n "${ninja}" ] && BUILD_OPTS="-v"
57
+NETDATA_BUILD_DIR="${NETDATA_BUILD_DIR:-./cmake-build-release/}"
58
59
if [ -f ".coverity-scan.conf" ]; then
60
source ".coverity-scan.conf"
@@ -102,19 +110,20 @@ scanit() {
110
progress "Working on netdata version: ${version}"
111
112
progress "Cleaning up old builds..."
105
- run make clean || echo >&2 "Nothing to clean"
113
+ rm -rf "${NETDATA_BUILD_DIR}"
114
115
[ -d "cov-int" ] && rm -rf "cov-int"
116
117
[ -f netdata-coverity-analysis.tgz ] && run rm netdata-coverity-analysis.tgz
118
119
progress "Configuring netdata source..."
120
+ USE_SYSTEM_PROTOBUF=1
121
+ prepare_cmake_options
122
113
- run autoreconf -ivf
114
- run ./configure ${OTHER_OPTIONS}
123
+ run cmake ${NETDATA_CMAKE_OPTIONS}
124
125
progress "Analyzing netdata..."
117
- run "${covbuild}" --dir cov-int make -j${cpus}
126
+ run "${covbuild}" --dir cov-int cmake --build "${NETDATA_BUILD_DIR}" --parallel ${JOBS} -- ${BUILD_OPTS}
127
128
echo >&2 "Compressing analysis..."
129
run tar czvf netdata-coverity-analysis.tgz cov-int
@@ -170,21 +179,6 @@ installit() {
179
return 0
180
}
181
173
-OTHER_OPTIONS="--disable-lto"
174
-OTHER_OPTIONS+=" --with-zlib"
175
-OTHER_OPTIONS+=" --with-math"
176
-OTHER_OPTIONS+=" --enable-lz4"
177
-OTHER_OPTIONS+=" --enable-openssl"
178
-OTHER_OPTIONS+=" --enable-jsonc"
179
-OTHER_OPTIONS+=" --enable-plugin-nfacct"
180
-OTHER_OPTIONS+=" --enable-plugin-freeipmi"
181
-OTHER_OPTIONS+=" --enable-plugin-cups"
182
-OTHER_OPTIONS+=" --enable-exporting-prometheus-remote-write"
183
-# TODO: enable these plugins too
184
-#OTHER_OPTIONS+=" --enable-plugin-xenstat"
185
-#OTHER_OPTIONS+=" --enable-exporting-kinesis"
186
-#OTHER_OPTIONS+=" --enable-exporting-mongodb"
187
-
182
FOUND_OPTS="NO"
183
while [ -n "${1}" ]; do
184
if [ "${1}" = "--with-install" ]; then
netdata-installer.sh
+1
-106
@@ -454,15 +454,6 @@ if [ "$(uname -s)" = "Linux" ] && [ -f /proc/meminfo ]; then
454
fi
455
fi
456
457
-enable_feature() {
458
- NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed -e "s/-DENABLE_${1}=Off[[:space:]]*//g" -e "s/-DENABLE_${1}=On[[:space:]]*//g")"
459
- if [ "${2}" -eq 1 ]; then
460
- NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed "s/$/ -DENABLE_${1}=On/")"
461
- else
462
- NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed "s/$/ -DENABLE_${1}=Off/")"
463
- fi
464
-}
465
-
457
# set default make options
458
if [ -z "${MAKEOPTS}" ]; then
459
MAKEOPTS="-j$(find_processors)"
@@ -1104,35 +1095,6 @@ echo >&2
1095
NETDATA_BUILD_DIR="${NETDATA_BUILD_DIR:-./cmake-build-release/}"
1096
rm -rf "${NETDATA_BUILD_DIR}"
1097
1107
-check_for_module() {
1108
- if [ -z "${pkgconf}" ]; then
1109
- pkgconf="$(command -v pkgconf 2>/dev/null)"
1110
- [ -z "${pkgconf}" ] && pkgconf="$(command -v pkg-config 2>/dev/null)"
1111
- [ -z "${pkgconf}" ] && fatal "Unable to find a usable pkgconf/pkg-config command, cannot build Netdata." I0013
1112
- fi
1113
-
1114
- "${pkgconf}" "${1}"
1115
- return "${?}"
1116
-}
1117
-
1118
-check_for_feature() {
1119
- feature_name="${1}"
1120
- feature_state="${2}"
1121
- shift 2
1122
- feature_modules="${*}"
1123
-
1124
- if [ -z "${feature_state}" ]; then
1125
- # shellcheck disable=SC2086
1126
- if check_for_module ${feature_modules}; then
1127
- enable_feature "${feature_name}" 1
1128
- else
1129
- enable_feature "${feature_name}" 0
1130
- fi
1131
- else
1132
- enable_feature "${feature_name}" "${feature_state}"
1133
- fi
1134
-}
1135
-
1098
# function to extract values from the config file
1099
config_option() {
1100
section="${1}"
@@ -1161,74 +1123,7 @@ NETDATA_GROUP="$(id -g -n "${NETDATA_USER}" 2> /dev/null)"
1123
[ -z "${NETDATA_GROUP}" ] && NETDATA_GROUP="${NETDATA_USER}"
1124
echo >&2 "Netdata user and group set to: ${NETDATA_USER}/${NETDATA_GROUP}"
1125
1164
-NETDATA_CMAKE_OPTIONS="-S ./ -B ${NETDATA_BUILD_DIR} ${CMAKE_OPTS} -DCMAKE_INSTALL_PREFIX=${NETDATA_PREFIX} ${NETDATA_USER:+-DNETDATA_USER=${NETDATA_USER}} ${NETDATA_CMAKE_OPTIONS} "
1165
-
1166
-# Feature autodetection code starts here
1167
-
1168
-if [ "${USE_SYSTEM_PROTOBUF}" -eq 1 ]; then
1169
- enable_feature BUNDLED_PROTOBUF 0
1170
-else
1171
- enable_feature BUNDLED_PROTOBUF 1
1172
-fi
1173
-
1174
-if [ -z "${ENABLE_SYSTEMD_PLUGIN}" ]; then
1175
- if check_for_module libsystemd; then
1176
- if check_for_module libelogind; then
1177
- ENABLE_SYSTEMD_JOURNAL=0
1178
- else
1179
- ENABLE_SYSTEMD_JOURNAL=1
1180
- fi
1181
- else
1182
- ENABLE_SYSTEMD_JOURNAL=0
1183
- fi
1184
-fi
1185
-
1186
-enable_feature PLUGIN_SYSTEMD_JOURNAL "${ENABLE_SYSTEMD_JOURNAL}"
1187
-
1188
-[ -z "${NETDATA_ENABLE_ML}" ] && NETDATA_ENABLE_ML=1
1189
-enable_feature ML "${NETDATA_ENABLE_ML}"
1190
-
1191
-if command -v cups-config >/dev/null 2>&1 || check_for_module libcups || check_for_module cups; then
1192
- ENABLE_CUPS=1
1193
-else
1194
- ENABLE_CUPS=0
1195
-fi
1196
-
1197
-enable_feature PLUGIN_CUPS "${ENABLE_CUPS}"
1198
-
1199
-IS_LINUX=0
1200
-[ "$(uname -s)" = "Linux" ] && IS_LINUX=1
1201
-enable_feature PLUGIN_DEBUGFS "${IS_LINUX}"
1202
-enable_feature PLUGIN_PERF "${IS_LINUX}"
1203
-enable_feature PLUGIN_SLABINFO "${IS_LINUX}"
1204
-enable_feature PLUGIN_CGROUP_NETWORK "${IS_LINUX}"
1205
-enable_feature PLUGIN_LOCAL_LISTENERS "${IS_LINUX}"
1206
-enable_feature PLUGIN_LOGS_MANAGEMENT "${ENABLE_LOGS_MANAGEMENT}"
1207
-enable_feature LOGS_MANAGEMENT_TESTS "${ENABLE_LOGS_MANAGEMENT_TESTS}"
1208
-
1209
-enable_feature ACLK "${ENABLE_CLOUD}"
1210
-enable_feature CLOUD "${ENABLE_CLOUD}"
1211
-enable_feature BUNDLED_JSONC "${NETDATA_BUILD_JSON_C}"
1212
-enable_feature BUNDLED_YAML "${BUNDLE_YAML}"
1213
-enable_feature DBENGINE "${ENABLE_DBENGINE}"
1214
-enable_feature H2O "${ENABLE_H2O}"
1215
-enable_feature PLUGIN_EBPF "${ENABLE_EBPF}"
1216
-
1217
-ENABLE_APPS=0
1218
-
1219
-if [ "${IS_LINUX}" = 1 ] || [ "$(uname -s)" = "FreeBSD" ]; then
1220
- ENABLE_APPS=1
1221
-fi
1222
-
1223
-enable_feature PLUGIN_APPS "${ENABLE_APPS}"
1224
-
1225
-check_for_feature EXPORTER_PROMETHEUS_REMOTE_WRITE "${EXPORTER_PROMETHEUS}" snappy
1226
-check_for_feature EXPORTER_MONGODB "${EXPORTER_MONGODB}" libmongoc-1.0
1227
-check_for_feature PLUGIN_FREEIPMI "${ENABLE_FREEIPMI}" libipmimonitoring
1228
-check_for_feature PLUGIN_NFACCT "${ENABLE_NFACCT}" libnetfilter_acct libnml
1229
-check_for_feature PLUGIN_XENSTAT "${ENABLE_XENSTAT}" xenstat xenlight
1230
-
1231
-# End of feature autodetection code
1126
+prepare_cmake_options
1127
1128
if [ -n "${NETDATA_PREPARE_ONLY}" ]; then
1129
progress "Exiting before building Netdata as requested."
packaging/docker/Dockerfile
+1
-1
@@ -29,7 +29,7 @@ RUN chmod +x netdata-installer.sh && \
29
cp -rp /deps/* /usr/local/ && \
30
/bin/echo -e "INSTALL_TYPE='oci'\nPREBUILT_ARCH='$(uname -m)'" > ./system/.install-type && \
31
CFLAGS="$(packaging/docker/gen-cflags.sh)" LDFLAGS="-Wl,--gc-sections" ./netdata-installer.sh --dont-wait --dont-start-it --use-system-protobuf \
32
- ${EXTRA_INSTALL_OPTS} --disable-ebpf --one-time-build --enable-lto "$([ "$RELEASE_CHANNEL" = stable ] && echo --stable-channel)"
32
+ ${EXTRA_INSTALL_OPTS} --disable-ebpf --install-no-prefix / "$([ "$RELEASE_CHANNEL" = stable ] && echo --stable-channel)"
33
34
# files to one directory
35
RUN mkdir -p /app/usr/sbin/ \
packaging/installer/functions.sh
+106
@@ -191,6 +191,112 @@ netdata_banner() {
191
echo >&2
192
}
193
194
+# -----------------------------------------------------------------------------
195
+# Feature management and configuration commands
196
+
197
+enable_feature() {
198
+ NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed -e "s/-DENABLE_${1}=Off[[:space:]]*//g" -e "s/-DENABLE_${1}=On[[:space:]]*//g")"
199
+ if [ "${2}" -eq 1 ]; then
200
+ NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed "s/$/ -DENABLE_${1}=On/")"
201
+ else
202
+ NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS}" | sed "s/$/ -DENABLE_${1}=Off/")"
203
+ fi
204
+}
205
+
206
+check_for_module() {
207
+ if [ -z "${pkgconf}" ]; then
208
+ pkgconf="$(command -v pkgconf 2>/dev/null)"
209
+ [ -z "${pkgconf}" ] && pkgconf="$(command -v pkg-config 2>/dev/null)"
210
+ [ -z "${pkgconf}" ] && fatal "Unable to find a usable pkgconf/pkg-config command, cannot build Netdata." I0013
211
+ fi
212
+
213
+ "${pkgconf}" "${1}"
214
+ return "${?}"
215
+}
216
+
217
+check_for_feature() {
218
+ feature_name="${1}"
219
+ feature_state="${2}"
220
+ shift 2
221
+ feature_modules="${*}"
222
+
223
+ if [ -z "${feature_state}" ]; then
224
+ # shellcheck disable=SC2086
225
+ if check_for_module ${feature_modules}; then
226
+ enable_feature "${feature_name}" 1
227
+ else
228
+ enable_feature "${feature_name}" 0
229
+ fi
230
+ else
231
+ enable_feature "${feature_name}" "${feature_state}"
232
+ fi
233
+}
234
+
235
+prepare_cmake_options() {
236
+ NETDATA_CMAKE_OPTIONS="-S ./ -B ${NETDATA_BUILD_DIR} ${CMAKE_OPTS} ${NETDATA_PREFIX+-DCMAKE_INSTALL_PREFIX="${NETDATA_PREFIX}"} ${NETDATA_USER:+-DNETDATA_USER=${NETDATA_USER}} ${NETDATA_CMAKE_OPTIONS} "
237
+
238
+ if [ "${USE_SYSTEM_PROTOBUF:-1}" -eq 1 ]; then
239
+ enable_feature BUNDLED_PROTOBUF 0
240
+ else
241
+ enable_feature BUNDLED_PROTOBUF 1
242
+ fi
243
+
244
+ if [ -z "${ENABLE_SYSTEMD_JOURNAL}" ]; then
245
+ if check_for_module libsystemd; then
246
+ if check_for_module libelogind; then
247
+ ENABLE_SYSTEMD_JOURNAL=0
248
+ else
249
+ ENABLE_SYSTEMD_JOURNAL=1
250
+ fi
251
+ else
252
+ ENABLE_SYSTEMD_JOURNAL=0
253
+ fi
254
+ fi
255
+
256
+ enable_feature PLUGIN_SYSTEMD_JOURNAL "${ENABLE_SYSTEMD_JOURNAL}"
257
+
258
+ if command -v cups-config >/dev/null 2>&1 || check_for_module libcups || check_for_module cups; then
259
+ ENABLE_CUPS=1
260
+ else
261
+ ENABLE_CUPS=0
262
+ fi
263
+
264
+ enable_feature PLUGIN_CUPS "${ENABLE_CUPS}"
265
+
266
+ IS_LINUX=0
267
+ [ "$(uname -s)" = "Linux" ] && IS_LINUX=1
268
+ enable_feature PLUGIN_DEBUGFS "${IS_LINUX}"
269
+ enable_feature PLUGIN_PERF "${IS_LINUX}"
270
+ enable_feature PLUGIN_SLABINFO "${IS_LINUX}"
271
+ enable_feature PLUGIN_CGROUP_NETWORK "${IS_LINUX}"
272
+ enable_feature PLUGIN_LOCAL_LISTENERS "${IS_LINUX}"
273
+ enable_feature PLUGIN_EBPF "${ENABLE_EBPF:-0}"
274
+ enable_feature PLUGIN_LOGS_MANAGEMENT "${ENABLE_LOGS_MANAGEMENT:-0}"
275
+ enable_feature LOGS_MANAGEMENT_TESTS "${ENABLE_LOGS_MANAGEMENT_TESTS:-0}"
276
+
277
+ enable_feature ACLK "${ENABLE_CLOUD:-1}"
278
+ enable_feature CLOUD "${ENABLE_CLOUD:-1}"
279
+ enable_feature BUNDLED_JSONC "${NETDATA_BUILD_JSON_C:-0}"
280
+ enable_feature BUNDLED_YAML "${BUNDLE_YAML:-0}"
281
+ enable_feature DBENGINE "${ENABLE_DBENGINE:-1}"
282
+ enable_feature H2O "${ENABLE_H2O:-1}"
283
+ enable_feature ML "${NETDATA_ENABLE_ML:-1}"
284
+
285
+ ENABLE_APPS=0
286
+
287
+ if [ "${IS_LINUX}" = 1 ] || [ "$(uname -s)" = "FreeBSD" ]; then
288
+ ENABLE_APPS=1
289
+ fi
290
+
291
+ enable_feature PLUGIN_APPS "${ENABLE_APPS}"
292
+
293
+ check_for_feature EXPORTER_PROMETHEUS_REMOTE_WRITE "${EXPORTER_PROMETHEUS}" snappy
294
+ check_for_feature EXPORTER_MONGODB "${EXPORTER_MONGODB}" libmongoc-1.0
295
+ check_for_feature PLUGIN_FREEIPMI "${ENABLE_FREEIPMI}" libipmimonitoring
296
+ check_for_feature PLUGIN_NFACCT "${ENABLE_NFACCT}" libnetfilter_acct libnml
297
+ check_for_feature PLUGIN_XENSTAT "${ENABLE_XENSTAT}" xenstat xenlight
298
+}
299
+
300
# -----------------------------------------------------------------------------
301
# portable service command
302