summaryrefslogtreecommitdiffstats
path: root/plugins/check_apt.c
diff options
context:
space:
mode:
authorLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2024-11-08 10:37:30 (GMT)
committerLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2024-11-08 10:37:30 (GMT)
commit4079ba3c474054af6c8bb2c3b426540b2de01628 (patch)
tree659ff04461a7a207dcc152ba95545accea83f969 /plugins/check_apt.c
parent540d609d845869a5c826f8190bdfed47db1e4259 (diff)
downloadmonitoring-plugins-4079ba3c474054af6c8bb2c3b426540b2de01628.tar.gz
check_apt: Purify run_upgrade function
Diffstat (limited to 'plugins/check_apt.c')
-rw-r--r--plugins/check_apt.c66
1 files changed, 42 insertions, 24 deletions
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
index ac89f81..1eda45d 100644
--- a/plugins/check_apt.c
+++ b/plugins/check_apt.c
@@ -69,8 +69,18 @@ void print_usage(void);
69static char *construct_cmdline(upgrade_type u, const char *opts); 69static char *construct_cmdline(upgrade_type u, const char *opts);
70/* run an apt-get update */ 70/* run an apt-get update */
71static int run_update(void); 71static int run_update(void);
72
73typedef struct {
74 int errorcode;
75 int package_count;
76 int security_package_count;
77 char **packages_list;
78 char **secpackages_list;
79} run_upgrade_result;
80
72/* run an apt-get upgrade */ 81/* run an apt-get upgrade */
73static int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkglist); 82static run_upgrade_result run_upgrade(void);
83
74/* add another clause to a regexp */ 84/* add another clause to a regexp */
75static char *add_to_regexp(char *expr, const char *next); 85static char *add_to_regexp(char *expr, const char *next);
76/* extract package name from Inst line */ 86/* extract package name from Inst line */
@@ -119,12 +129,14 @@ int main(int argc, char **argv) {
119 result = run_update(); 129 result = run_update();
120 } 130 }
121 131
122 int packages_available = 0;
123 int sec_count = 0;
124 char **packages_list = NULL;
125 char **secpackages_list = NULL;
126 /* apt-get upgrade */ 132 /* apt-get upgrade */
127 result = max_state(result, run_upgrade(&packages_available, &sec_count, &packages_list, &secpackages_list)); 133 run_upgrade_result upgrad_res = run_upgrade();
134
135 result = max_state(result, upgrad_res.errorcode);
136 int packages_available = upgrad_res.package_count;
137 int sec_count = upgrad_res.security_package_count;
138 char **packages_list = upgrad_res.packages_list;
139 char **secpackages_list = upgrad_res.secpackages_list;
128 140
129 if (sec_count > 0) { 141 if (sec_count > 0) {
130 result = max_state(result, STATE_CRITICAL); 142 result = max_state(result, STATE_CRITICAL);
@@ -257,13 +269,18 @@ int process_arguments(int argc, char **argv) {
257} 269}
258 270
259/* run an apt-get upgrade */ 271/* run an apt-get upgrade */
260int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkglist) { 272run_upgrade_result run_upgrade(void) {
261 regex_t ereg; 273 regex_t ereg;
262 /* initialize ereg as it is possible it is printed while uninitialized */ 274 /* initialize ereg as it is possible it is printed while uninitialized */
263 memset(&ereg, '\0', sizeof(ereg.buffer)); 275 memset(&ereg, '\0', sizeof(ereg.buffer));
264 276
277 run_upgrade_result result = {
278 .errorcode = STATE_UNKNOWN,
279 };
280
265 if (upgrade == NO_UPGRADE) { 281 if (upgrade == NO_UPGRADE) {
266 return STATE_OK; 282 result.errorcode = STATE_OK;
283 return result;
267 } 284 }
268 285
269 int regres = 0; 286 int regres = 0;
@@ -294,33 +311,32 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
294 die(STATE_UNKNOWN, _("%s: Error compiling regexp: %s"), progname, rerrbuf); 311 die(STATE_UNKNOWN, _("%s: Error compiling regexp: %s"), progname, rerrbuf);
295 } 312 }
296 313
297 int result = STATE_UNKNOWN;
298 struct output chld_out; 314 struct output chld_out;
299 struct output chld_err; 315 struct output chld_err;
300 char *cmdline = NULL; 316 char *cmdline = NULL;
301 cmdline = construct_cmdline(upgrade, upgrade_opts); 317 cmdline = construct_cmdline(upgrade, upgrade_opts);
302 if (input_filename != NULL) { 318 if (input_filename != NULL) {
303 /* read input from a file for testing */ 319 /* read input from a file for testing */
304 result = cmd_file_read(input_filename, &chld_out, 0); 320 result.errorcode = cmd_file_read(input_filename, &chld_out, 0);
305 } else { 321 } else {
306 /* run the upgrade */ 322 /* run the upgrade */
307 result = np_runcmd(cmdline, &chld_out, &chld_err, 0); 323 result.errorcode = np_runcmd(cmdline, &chld_out, &chld_err, 0);
308 } 324 }
309 325
310 /* apt-get upgrade only changes exit status if there is an 326 /* apt-get upgrade only changes exit status if there is an
311 * internal error when run in dry-run mode. therefore we will 327 * internal error when run in dry-run mode. therefore we will
312 * treat such an error as UNKNOWN */ 328 * treat such an error as UNKNOWN */
313 if (result != 0) { 329 if (result.errorcode != STATE_OK) {
314 exec_warning = 1; 330 exec_warning = 1;
315 result = STATE_UNKNOWN; 331 result.errorcode = STATE_UNKNOWN;
316 fprintf(stderr, _("'%s' exited with non-zero status.\n"), cmdline); 332 fprintf(stderr, _("'%s' exited with non-zero status.\n"), cmdline);
317 } 333 }
318 334
319 *pkglist = malloc(sizeof(char *) * chld_out.lines); 335 char **pkglist = malloc(sizeof(char *) * chld_out.lines);
320 if (!pkglist) { 336 if (!pkglist) {
321 die(STATE_UNKNOWN, "malloc failed!\n"); 337 die(STATE_UNKNOWN, "malloc failed!\n");
322 } 338 }
323 *secpkglist = malloc(sizeof(char *) * chld_out.lines); 339 char **secpkglist = malloc(sizeof(char *) * chld_out.lines);
324 if (!secpkglist) { 340 if (!secpkglist) {
325 die(STATE_UNKNOWN, "malloc failed!\n"); 341 die(STATE_UNKNOWN, "malloc failed!\n");
326 } 342 }
@@ -334,8 +350,8 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
334 * we may need to switch to the --print-uris output format, 350 * we may need to switch to the --print-uris output format,
335 * in which case the logic here will slightly change. 351 * in which case the logic here will slightly change.
336 */ 352 */
337 int pc = 0; 353 int package_counter = 0;
338 int spc = 0; 354 int security_package_counter = 0;
339 for (size_t i = 0; i < chld_out.lines; i++) { 355 for (size_t i = 0; i < chld_out.lines; i++) {
340 if (verbose) { 356 if (verbose) {
341 printf("%s\n", chld_out.line[i]); 357 printf("%s\n", chld_out.line[i]);
@@ -346,15 +362,15 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
346 /* if we're not excluding, or it's not in the 362 /* if we're not excluding, or it's not in the
347 * list of stuff to exclude */ 363 * list of stuff to exclude */
348 if (do_exclude == NULL || regexec(&ereg, chld_out.line[i], 0, NULL, 0) != 0) { 364 if (do_exclude == NULL || regexec(&ereg, chld_out.line[i], 0, NULL, 0) != 0) {
349 pc++; 365 package_counter++;
350 if (regexec(&sreg, chld_out.line[i], 0, NULL, 0) == 0) { 366 if (regexec(&sreg, chld_out.line[i], 0, NULL, 0) == 0) {
351 spc++; 367 security_package_counter++;
352 if (verbose) { 368 if (verbose) {
353 printf("*"); 369 printf("*");
354 } 370 }
355 (*secpkglist)[spc - 1] = pkg_name(chld_out.line[i]); 371 (secpkglist)[security_package_counter - 1] = pkg_name(chld_out.line[i]);
356 } else { 372 } else {
357 (*pkglist)[pc - spc - 1] = pkg_name(chld_out.line[i]); 373 (pkglist)[package_counter - security_package_counter - 1] = pkg_name(chld_out.line[i]);
358 } 374 }
359 if (verbose) { 375 if (verbose) {
360 printf("*%s\n", chld_out.line[i]); 376 printf("*%s\n", chld_out.line[i]);
@@ -362,13 +378,15 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
362 } 378 }
363 } 379 }
364 } 380 }
365 *pkgcount = pc; 381 result.package_count = package_counter;
366 *secpkgcount = spc; 382 result.security_package_count = security_package_counter;
383 result.packages_list = pkglist;
384 result.secpackages_list = secpkglist;
367 385
368 /* If we get anything on stderr, at least set warning */ 386 /* If we get anything on stderr, at least set warning */
369 if (input_filename == NULL && chld_err.buflen) { 387 if (input_filename == NULL && chld_err.buflen) {
370 stderr_warning = 1; 388 stderr_warning = 1;
371 result = max_state(result, STATE_WARNING); 389 result.errorcode = max_state(result.errorcode, STATE_WARNING);
372 if (verbose) { 390 if (verbose) {
373 for (size_t i = 0; i < chld_err.lines; i++) { 391 for (size_t i = 0; i < chld_err.lines; i++) {
374 fprintf(stderr, "%s\n", chld_err.line[i]); 392 fprintf(stderr, "%s\n", chld_err.line[i]);