diff options
Diffstat (limited to 'plugins/t')
0 files changed, 0 insertions, 0 deletions
diff --git a/plugins/check_apt.c b/plugins/check_apt.c index 3fdee5d..db328a0 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 */ |
42 | int process_arguments(int, char **); | 44 | int process_arguments(int, char **); |
43 | void print_help(void); | 45 | void print_help(void); |
@@ -46,7 +48,7 @@ void print_usage(void); | |||
46 | /* run an apt-get update */ | 48 | /* run an apt-get update */ |
47 | int run_update(void); | 49 | int run_update(void); |
48 | /* run an apt-get upgrade */ | 50 | /* run an apt-get upgrade */ |
49 | int run_upgrade(int *pkgcount); | 51 | int run_upgrade(int *pkgcount, int *secpkgcount); |
50 | /* add another clause to a regexp */ | 52 | /* add another clause to a regexp */ |
51 | char* add_to_regexp(char *expr, const char *next); | 53 | char* 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 */ | |||
62 | static int exec_warning = 0; /* if a cmd exited non-zero */ | 64 | static int exec_warning = 0; /* if a cmd exited non-zero */ |
63 | 65 | ||
64 | int main (int argc, char **argv) { | 66 | int 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 */ |
196 | int run_upgrade(int *pkgcount){ | 201 | int 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){ |