summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/check_apt.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
index 3fdee5d3..db328a06 100644
--- a/plugins/check_apt.c
+++ b/plugins/check_apt.c
@@ -38,6 +38,8 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
38#define APTGET_DISTUPGRADE "/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq dist-upgrade" 38#define APTGET_DISTUPGRADE "/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq dist-upgrade"
39#define APTGET_UPDATE "/usr/bin/apt-get -q update" 39#define APTGET_UPDATE "/usr/bin/apt-get -q update"
40 40
41#define SECURITY_RE "^[^\\(]*\\([^ ]* (Debian-Security:|Ubuntu:[^/]*/[^-]*-security)"
42
41/* some standard functions */ 43/* some standard functions */
42int process_arguments(int, char **); 44int process_arguments(int, char **);
43void print_help(void); 45void print_help(void);
@@ -46,7 +48,7 @@ void print_usage(void);
46/* run an apt-get update */ 48/* run an apt-get update */
47int run_update(void); 49int run_update(void);
48/* run an apt-get upgrade */ 50/* run an apt-get upgrade */
49int run_upgrade(int *pkgcount); 51int run_upgrade(int *pkgcount, int *secpkgcount);
50/* add another clause to a regexp */ 52/* add another clause to a regexp */
51char* add_to_regexp(char *expr, const char *next); 53char* add_to_regexp(char *expr, const char *next);
52 54
@@ -62,7 +64,7 @@ static int stderr_warning = 0; /* if a cmd issued output on stderr */
62static int exec_warning = 0; /* if a cmd exited non-zero */ 64static int exec_warning = 0; /* if a cmd exited non-zero */
63 65
64int main (int argc, char **argv) { 66int main (int argc, char **argv) {
65 int result=STATE_UNKNOWN, packages_available=0; 67 int result=STATE_UNKNOWN, packages_available=0, sec_count=0;
66 68
67 if (process_arguments(argc, argv) == ERROR) 69 if (process_arguments(argc, argv) == ERROR)
68 usage_va(_("Could not parse arguments")); 70 usage_va(_("Could not parse arguments"));
@@ -79,18 +81,21 @@ int main (int argc, char **argv) {
79 if(do_update) result = run_update(); 81 if(do_update) result = run_update();
80 82
81 /* apt-get upgrade */ 83 /* apt-get upgrade */
82 result = max_state(result, run_upgrade(&packages_available)); 84 result = max_state(result, run_upgrade(&packages_available, &sec_count));
83 85
84 if(packages_available > 0){ 86 if(sec_count > 0){
87 result = max_state(result, STATE_CRITICAL);
88 } else if(packages_available > 0){
85 result = max_state(result, STATE_WARNING); 89 result = max_state(result, STATE_WARNING);
86 } else { 90 } else {
87 result = max_state(result, STATE_OK); 91 result = max_state(result, STATE_OK);
88 } 92 }
89 93
90 printf("APT %s: %d packages available for %s.%s%s%s%s\n", 94 printf("APT %s: %d packages available for %s (%d critical updates). %s%s%s%s\n",
91 state_text(result), 95 state_text(result),
92 packages_available, 96 packages_available,
93 (dist_upgrade)?"dist-upgrade":"upgrade", 97 (dist_upgrade)?"dist-upgrade":"upgrade",
98 sec_count,
94 (stderr_warning)?" warnings detected":"", 99 (stderr_warning)?" warnings detected":"",
95 (stderr_warning && exec_warning)?",":"", 100 (stderr_warning && exec_warning)?",":"",
96 (exec_warning)?" errors detected":"", 101 (exec_warning)?" errors detected":"",
@@ -193,10 +198,10 @@ void print_usage(void){
193} 198}
194 199
195/* run an apt-get upgrade */ 200/* run an apt-get upgrade */
196int run_upgrade(int *pkgcount){ 201int run_upgrade(int *pkgcount, int *secpkgcount){
197 int i=0, result=STATE_UNKNOWN, regres=0, pc=0; 202 int i=0, result=STATE_UNKNOWN, regres=0, pc=0, spc=0;
198 struct output chld_out, chld_err; 203 struct output chld_out, chld_err;
199 regex_t ireg, ereg; 204 regex_t ireg, ereg, sreg;
200 char rerrbuf[64]; 205 char rerrbuf[64];
201 const char *default_include_expr="^Inst"; 206 const char *default_include_expr="^Inst";
202 207
@@ -224,6 +229,13 @@ int run_upgrade(int *pkgcount){
224 progname, rerrbuf); 229 progname, rerrbuf);
225 } 230 }
226 } 231 }
232 regres=regcomp(&sreg, SECURITY_RE, REG_EXTENDED);
233 if(regres!=0) {
234 regerror(regres, &ereg, rerrbuf, 64);
235 die(STATE_UNKNOWN, "%s: Error compiling regexp: %s",
236 progname, rerrbuf);
237 }
238
227 239
228 240
229 /* run the upgrade */ 241 /* run the upgrade */
@@ -262,6 +274,9 @@ int run_upgrade(int *pkgcount){
262 if(do_exclude==NULL || 274 if(do_exclude==NULL ||
263 regexec(&ereg, chld_out.line[i], 0, NULL, 0)!=0){ 275 regexec(&ereg, chld_out.line[i], 0, NULL, 0)!=0){
264 pc++; 276 pc++;
277 if(regexec(&sreg, chld_out.line[i], 0, NULL, 0)==0){
278 spc++;
279 }
265 if(verbose){ 280 if(verbose){
266 printf("*%s\n", chld_out.line[i]); 281 printf("*%s\n", chld_out.line[i]);
267 } 282 }
@@ -269,6 +284,7 @@ int run_upgrade(int *pkgcount){
269 } 284 }
270 } 285 }
271 *pkgcount=pc; 286 *pkgcount=pc;
287 *secpkgcount=spc;
272 288
273 /* If we get anything on stderr, at least set warning */ 289 /* If we get anything on stderr, at least set warning */
274 if(chld_err.buflen){ 290 if(chld_err.buflen){