summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/check_apt.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
new file mode 100644
index 00000000..8d020f50
--- /dev/null
+++ b/plugins/check_apt.c
@@ -0,0 +1,173 @@
1/******************************************************************************
2 * check_apt.c: check for available updates in apt package management systems
3 * original author: sean finney <seanius@seanius.net>
4 * (with some common bits stolen from check_nagios.c)
5 ******************************************************************************
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 $Id$
22
23******************************************************************************/
24
25const char *progname = "check_apt";
26const char *revision = "$Revision$";
27const char *copyright = "2006";
28const char *email = "nagiosplug-devel@lists.sourceforge.net";
29
30#include "common.h"
31#include "runcmd.h"
32#include "utils.h"
33
34#define APTGET_UPGRADE "/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq upgrade"
35#define APTGET_DISTUPGRADE "/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq dist-upgrade"
36#define APTGET_UPDATE "/usr/bin/apt-get update"
37
38int process_arguments(int, char **);
39void print_help(void);
40void print_usage(void);
41
42int run_upgrade(int *pkgcount);
43
44static int verbose = 0;
45
46int main (int argc, char **argv) {
47 int result=STATE_UNKNOWN, packages_available=0;
48
49 if (process_arguments(argc, argv) == ERROR)
50 usage_va(_("Could not parse arguments"));
51
52 /* Set signal handling and alarm timeout */
53 if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
54 usage_va(_("Cannot catch SIGALRM"));
55 }
56
57 /* handle timeouts gracefully... */
58 alarm (timeout_interval);
59
60 /* apt-get upgrade */
61 result = run_upgrade(&packages_available);
62
63 if(packages_available > 0){
64 result = STATE_WARNING;
65 printf("APT WARNING: ");
66 } else {
67 result = STATE_OK;
68 printf("APT OK: ");
69 }
70 printf("%d packages available for upgrade\n", packages_available);
71
72 return result;
73}
74
75/* process command-line arguments */
76int process_arguments (int argc, char **argv) {
77 int c;
78
79 static struct option longopts[] = {
80 {"version", no_argument, 0, 'V'},
81 {"help", no_argument, 0, 'h'},
82 {"verbose", no_argument, 0, 'v'},
83 {"timeout", required_argument, 0, 't'},
84 {0, 0, 0, 0}
85 };
86
87 while(1) {
88 c = getopt_long(argc, argv, "hVvt", longopts, NULL);
89
90 if(c == -1 || c == EOF || c == 1) break;
91
92 switch(c) {
93 case 'h': /* help */
94 print_help();
95 exit(STATE_OK);
96 case 'V': /* version */
97 print_revision(progname, revision);
98 exit(STATE_OK);
99 case 'v':
100 verbose++;
101 break;
102 case 't':
103 timeout_interval=atoi(optarg);
104 break;
105 default:
106 /* print short usage statement if args not parsable */
107 usage_va(_("Unknown argument - %s"), optarg);
108 }
109 }
110
111 return OK;
112}
113
114
115/* informative help message */
116void print_help(void){
117 print_revision(progname, revision);
118 printf(_(COPYRIGHT), copyright, email);
119 printf(_("\
120This plugin checks for software updates on systems that use\n\
121package management systems based on the apt-get(8) command\n\
122found in Debian GNU/Linux\n\
123\n\n"));
124 print_usage();
125 printf(_(UT_HELP_VRSN));
126 printf(_("\
127 -t, --timeout=INTEGER\n\
128 Seconds to wait for plugin execution to complete\n\
129"));
130}
131
132/* simple usage heading */
133void print_usage(void){
134 printf ("Usage: %s [-u] [-t timeout]\n", progname);
135}
136
137/* run an apt-get upgrade */
138int run_upgrade(int *pkgcount){
139 int i=0, result=STATE_UNKNOWN, pc=0;
140 struct output chld_out, chld_err;
141
142 /* run the upgrade */
143 if((result = np_runcmd(APTGET_UPGRADE, &chld_out, &chld_err, 0)) != 0)
144 result = STATE_WARNING;
145
146 /* parse the output, which should only consist of lines like
147 *
148 * Inst package ....
149 * Conf package ....
150 *
151 * so we'll filter based on "Inst"
152 */
153 for(i = 0; i < chld_out.lines; i++) {
154 if(strncmp(chld_out.line[i], "Inst", 4)==0){
155 if(verbose){
156 printf("%s\n", chld_out.line[i]);
157 }
158 pc++;
159 }
160 }
161 *pkgcount=pc;
162
163 /* If we get anything on stderr, at least set warning */
164 if(chld_err.buflen){
165 fprintf(stderr, "warning, output detected on stderr\n");
166 for(i = 0; i < chld_err.lines; i++) {
167 printf("got this: %s\n", chld_err.line[i]);
168 result = max_state (result, STATE_WARNING);
169 }
170 }
171
172 return result;
173}