Code

- bindtextdomain for gettext, a few other smale cleanups here and there
[nagiosplug.git] / plugins / check_nwstat.c
1 /******************************************************************************
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; either version 2 of the License, or
6  (at your option) any later version.
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  GNU General Public License for more details.
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 ******************************************************************************/
19 const char *progname = "check_nwstat";
20 const char *revision = "$Revision$";
21 const char *copyright = "2000-2003";
22 const char *email = "nagiosplug-devel@lists.sourceforge.net";
24 #include "common.h"
25 #include "netutils.h"
26 #include "utils.h"
28 enum checkvar {
29         NONE,
30         LOAD1,      /* check 1 minute CPU load */
31         LOAD5,      /* check 5 minute CPU load */
32         LOAD15,     /* check 15 minute CPU load */
33         CONNS,      /* check number of connections */
34         VPF,        /* check % free space on volume */
35         VKF,        /* check KB free space on volume */
36         LTCH,       /* check long-term cache hit percentage */
37         CBUFF,      /* check total cache buffers */
38         CDBUFF,     /* check dirty cache buffers */
39         LRUM,       /* check LRU sitting time in minutes */
40         DSDB,       /* check to see if DS Database is open */
41         LOGINS,     /* check to see if logins are enabled */
42         PUPRB,      /* check % of used packet receive buffers */
43         UPRB,       /* check used packet receive buffers */
44         SAPENTRIES, /* check SAP entries */
45         OFILES,     /* check number of open files */
46         VKP,        /* check KB purgeable space on volume */
47         VPP,        /* check % purgeable space on volume */
48         VKNP,       /* check KB not yet purgeable space on volume */
49         VPNP,       /* check % not yet purgeable space on volume */
50         ABENDS,     /* check abended thread count */
51         CSPROCS,    /* check number of current service processes */
52         TSYNC,      /* check timesync status 0=no 1=yes in sync to the network */
53         LRUS,       /* check LRU sitting time in seconds */
54         DCB,        /* check dirty cache buffers as a percentage of the total */
55         TCB,        /* check total cache buffers as a percentage of the original */
56         DSVER,      /* check NDS version */
57         UPTIME,     /* check server uptime */
58         NLM         /* check NLM loaded */
59 };
61 enum {
62         PORT = 9999
63 };
65 char *server_address=NULL;
66 char *volume_name=NULL;
67 char *nlm_name=NULL;
68 int server_port=PORT;
69 unsigned long warning_value=0L;
70 unsigned long critical_value=0L;
71 int check_warning_value=FALSE;
72 int check_critical_value=FALSE;
73 int check_netware_version=FALSE;
74 enum checkvar vars_to_check = NONE;
75 int sap_number=-1;
77 int process_arguments(int, char **);
78 void print_help(void);
79 void print_usage(void);
85 \f
86 int
87 main(int argc, char **argv) {
88         int result;
89         char *send_buffer=NULL;
90         char recv_buffer[MAX_INPUT_BUFFER];
91         char *output_message=NULL;
92         char *temp_buffer=NULL;
93         char *netware_version=NULL;
95         int time_sync_status=0;
96         unsigned long total_cache_buffers=0;
97         unsigned long dirty_cache_buffers=0;
98         unsigned long open_files=0;
99         unsigned long abended_threads=0;
100         unsigned long max_service_processes=0;
101         unsigned long current_service_processes=0;
102         unsigned long free_disk_space=0L;
103         unsigned long total_disk_space=0L;
104         unsigned long purgeable_disk_space=0L;
105         unsigned long non_purgeable_disk_space=0L;
106         unsigned long percent_free_space=0;
107         unsigned long percent_purgeable_space=0;
108         unsigned long percent_non_purgeable_space=0;
109         unsigned long current_connections=0L;
110         unsigned long utilization=0L;
111         unsigned long cache_hits=0;
112         unsigned long cache_buffers=0L;
113         unsigned long lru_time=0L;
114         unsigned long max_packet_receive_buffers=0;
115         unsigned long used_packet_receive_buffers=0;
116         unsigned long percent_used_packet_receive_buffers=0L;
117         unsigned long sap_entries=0;
118         char uptime[MAX_INPUT_BUFFER];
120         setlocale (LC_ALL, "");
121         bindtextdomain (PACKAGE, LOCALEDIR);
122         textdomain (PACKAGE);
124         if (process_arguments(argc,argv)==ERROR)
125                 usage(_("Could not parse arguments\n"));
127         /* initialize alarm signal handling */
128         signal(SIGALRM,socket_timeout_alarm_handler);
130         /* set socket timeout */
131         alarm(socket_timeout);
132         
133         /* get OS version string */
134         if (check_netware_version==TRUE) {
135                 send_buffer = strdup ("S19\r\n");
136                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
137                 if (result!=STATE_OK)
138                         return result;
139                 if (!strcmp(recv_buffer,"-1\n"))
140                         asprintf (&netware_version, "%s", "");
141                 else {
142                         recv_buffer[strlen(recv_buffer)-1]=0;
143                         asprintf (&netware_version,_("NetWare %s: "),recv_buffer);
144                 }
145         } else
146                 asprintf (&netware_version, "%s", "");
149         /* check CPU load */
150         if (vars_to_check==LOAD1 || vars_to_check==LOAD5 || vars_to_check==LOAD15) {
151                         
152                 switch(vars_to_check) {
153                 case LOAD1:
154                         temp_buffer = strdup ("1");
155                         break;
156                 case LOAD5:
157                         temp_buffer = strdup ("5");
158                         break;
159                 default:
160                         temp_buffer = strdup ("15");
161                         break;
162                 }
164                 asprintf (&send_buffer,"UTIL%s\r\n",temp_buffer);
165                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
166                 if (result!=STATE_OK)
167                         return result;
168                 utilization=strtoul(recv_buffer,NULL,10);
169                 send_buffer = strdup ("UPTIME\r\n");
170                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
171                 if (result!=STATE_OK)
172                         return result;
173                 recv_buffer[strlen(recv_buffer)-1]=0;
174                 sprintf(uptime,_("Up %s,"),recv_buffer);
176                 if (check_critical_value==TRUE && utilization >= critical_value)
177                         result=STATE_CRITICAL;
178                 else if (check_warning_value==TRUE && utilization >= warning_value)
179                         result=STATE_WARNING;
181                 asprintf (&output_message,
182                           _("Load %s - %s %s-min load average = %lu%%"),
183                           state_text(result),
184                           uptime,
185                           temp_buffer,
186                           utilization);
188                 /* check number of user connections */
189         } else if (vars_to_check==CONNS) {
191                 send_buffer = strdup ("CONNECT\r\n");
192                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
193                 if (result!=STATE_OK)
194                         return result;
195                 current_connections=strtoul(recv_buffer,NULL,10);
197                 if (check_critical_value==TRUE && current_connections >= critical_value)
198                         result=STATE_CRITICAL;
199                 else if (check_warning_value==TRUE && current_connections >= warning_value)
200                         result=STATE_WARNING;
202                 asprintf (&output_message,
203                                                         _("Conns %s - %lu current connections"),
204                           state_text(result),
205                           current_connections);
207                 /* check % long term cache hits */
208         } else if (vars_to_check==LTCH) {
210                 send_buffer = strdup ("S1\r\n");
211                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
212                 if (result!=STATE_OK)
213                         return result;
214                 cache_hits=atoi(recv_buffer);
216                 if (check_critical_value==TRUE && cache_hits <= critical_value)
217                         result=STATE_CRITICAL;
218                 else if (check_warning_value==TRUE && cache_hits <= warning_value)
219                         result=STATE_WARNING;
221                 asprintf (&output_message,
222                           _("%s: Long term cache hits = %lu%%"),
223                           state_text(result),
224                           cache_hits);
226                 /* check cache buffers */
227         } else if (vars_to_check==CBUFF) {
229                 send_buffer = strdup ("S2\r\n");
230                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
231                 if (result!=STATE_OK)
232                         return result;
233                 cache_buffers=strtoul(recv_buffer,NULL,10);
235                 if (check_critical_value==TRUE && cache_buffers <= critical_value)
236                         result=STATE_CRITICAL;
237                 else if (check_warning_value==TRUE && cache_buffers <= warning_value)
238                         result=STATE_WARNING;
240                 asprintf (&output_message,
241                           _("%s: Total cache buffers = %lu"),
242                           state_text(result),
243                           cache_buffers);
245                 /* check dirty cache buffers */
246         } else if (vars_to_check==CDBUFF) {
248                 send_buffer = strdup ("S3\r\n");
249                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
250                 if (result!=STATE_OK)
251                         return result;
252                 cache_buffers=strtoul(recv_buffer,NULL,10);
254                 if (check_critical_value==TRUE && cache_buffers >= critical_value)
255                         result=STATE_CRITICAL;
256                 else if (check_warning_value==TRUE && cache_buffers >= warning_value)
257                         result=STATE_WARNING;
259                 asprintf (&output_message,
260                           _("%s: Dirty cache buffers = %lu"),
261                           state_text(result),
262                           cache_buffers);
264                 /* check LRU sitting time in minutes */
265         } else if (vars_to_check==LRUM) {
267                 send_buffer = strdup ("S5\r\n");
268                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
269                 if (result!=STATE_OK)
270                         return result;
271                 lru_time=strtoul(recv_buffer,NULL,10);
273                 if (check_critical_value==TRUE && lru_time <= critical_value)
274                         result=STATE_CRITICAL;
275                 else if (check_warning_value==TRUE && lru_time <= warning_value)
276                         result=STATE_WARNING;
278                 asprintf (&output_message,
279                           _("%s: LRU sitting time = %lu minutes"),
280                           state_text(result),
281                           lru_time);
284                 /* check KB free space on volume */
285         } else if (vars_to_check==VKF) {
287                 asprintf (&send_buffer,"VKF%s\r\n",volume_name);
288                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
289                 if (result!=STATE_OK)
290                         return result;
292                 if (!strcmp(recv_buffer,"-1\n")) {
293                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
294                         result=STATE_CRITICAL;
295                 }       else {
296                         free_disk_space=strtoul(recv_buffer,NULL,10);
297                         if (check_critical_value==TRUE && free_disk_space <= critical_value)
298                                 result=STATE_CRITICAL;
299                         else if (check_warning_value==TRUE && free_disk_space <= warning_value)
300                                 result=STATE_WARNING;
301                         asprintf (&output_message,
302                                   _("%s%lu KB free on volume %s"),
303                                  (result==STATE_OK)?"":_("Only "),
304                                  free_disk_space,
305                                  volume_name);
306                 }
308                 /* check % free space on volume */
309         } else if (vars_to_check==VPF) {
311                 asprintf (&send_buffer,"VKF%s\r\n",volume_name);
312                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
313                 if (result!=STATE_OK)
314                         return result;
316                 if (!strcmp(recv_buffer,"-1\n")) {
318                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
319                         result=STATE_CRITICAL;
321                 } else {
323                         free_disk_space=strtoul(recv_buffer,NULL,10);
325                         asprintf (&send_buffer,"VKS%s\r\n",volume_name);
326                         result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
327                         if (result!=STATE_OK)
328                                 return result;
329                         total_disk_space=strtoul(recv_buffer,NULL,10);
331                         percent_free_space=(int)(((double)free_disk_space/(double)total_disk_space)*100.0);
333                         if (check_critical_value==TRUE && percent_free_space <= critical_value)
334                                 result=STATE_CRITICAL;
335                         else if (check_warning_value==TRUE && percent_free_space <= warning_value)
336                                 result=STATE_WARNING;
337                         free_disk_space/=1024;
338                         asprintf (&output_message,_("%lu MB (%lu%%) free on volume %s"),free_disk_space,percent_free_space,volume_name);
339                 }
341                 /* check to see if DS Database is open or closed */
342         } else if (vars_to_check==DSDB) {
344                 send_buffer = strdup ("S11\r\n");
345                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
346                 if (result!=STATE_OK)
347                         return result;
348                 if (atoi(recv_buffer)==1)
349                         result=STATE_OK;
350                 else
351                         result=STATE_WARNING;
352  
353                 send_buffer = strdup ("S13\r\n");
354                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
355                 temp_buffer=strtok(recv_buffer,"\r\n");
356  
357                 asprintf (&output_message,_("Directory Services Database is %s (DS version %s)"),(result==STATE_OK)?"open":"closed",temp_buffer);
359                 /* check to see if logins are enabled */
360         } else if (vars_to_check==LOGINS) {
362                 send_buffer = strdup ("S12\r\n");
363                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
364                 if (result!=STATE_OK)
365                         return result;
366                 if (atoi(recv_buffer)==1)
367                         result=STATE_OK;
368                 else
369                         result=STATE_WARNING;
370  
371                 asprintf (&output_message,_("Logins are %s"),(result==STATE_OK)?_("enabled"):_("disabled"));
373                 /* check packet receive buffers */
374         } else if (vars_to_check==UPRB || vars_to_check==PUPRB) {
375  
376                 asprintf (&send_buffer,"S15\r\n");
377                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
378                 if (result!=STATE_OK)
379                         return result;
381                 used_packet_receive_buffers=atoi(recv_buffer);
383                 asprintf (&send_buffer,"S16\r\n");
384                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
385                 if (result!=STATE_OK)
386                         return result;
388                 max_packet_receive_buffers=atoi(recv_buffer);
389  
390                 percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0);
392                 if (vars_to_check==UPRB) {
393                         if (check_critical_value==TRUE && used_packet_receive_buffers >= critical_value)
394                                 result=STATE_CRITICAL;
395                         else if (check_warning_value==TRUE && used_packet_receive_buffers >= warning_value)
396                                 result=STATE_WARNING;
397                 } else {
398                         if (check_critical_value==TRUE && percent_used_packet_receive_buffers >= critical_value)
399                                 result=STATE_CRITICAL;
400                         else if (check_warning_value==TRUE && percent_used_packet_receive_buffers >= warning_value)
401                                 result=STATE_WARNING;
402                 }
403  
404                 asprintf (&output_message,_("%lu of %lu (%lu%%) packet receive buffers used"),used_packet_receive_buffers,max_packet_receive_buffers,percent_used_packet_receive_buffers);
406                 /* check SAP table entries */
407         } else if (vars_to_check==SAPENTRIES) {
409                 if (sap_number==-1)
410                         asprintf (&send_buffer,"S9\r\n");
411                 else
412                         asprintf (&send_buffer,"S9.%d\r\n",sap_number);
413                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
414                 if (result!=STATE_OK)
415                         return result;
416  
417                 sap_entries=atoi(recv_buffer);
418  
419                 if (check_critical_value==TRUE && sap_entries >= critical_value)
420                         result=STATE_CRITICAL;
421                 else if (check_warning_value==TRUE && sap_entries >= warning_value)
422                         result=STATE_WARNING;
424                 if (sap_number==-1)
425                         asprintf (&output_message,_("%lu entries in SAP table"),sap_entries);
426                 else
427                         asprintf (&output_message,_("%lu entries in SAP table for SAP type %d"),sap_entries,sap_number);
429                 /* check KB purgeable space on volume */
430         } else if (vars_to_check==VKP) {
432                 asprintf (&send_buffer,"VKP%s\r\n",volume_name);
433                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
434                 if (result!=STATE_OK)
435                         return result;
437                 if (!strcmp(recv_buffer,"-1\n")) {
438                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
439                         result=STATE_CRITICAL;
440                 } else {
441                         purgeable_disk_space=strtoul(recv_buffer,NULL,10);
442                         if (check_critical_value==TRUE && purgeable_disk_space >= critical_value)
443                                 result=STATE_CRITICAL;
444                         else if (check_warning_value==TRUE && purgeable_disk_space >= warning_value)
445                                 result=STATE_WARNING;
446                         asprintf (&output_message,_("%s%lu KB purgeable on volume %s"),(result==STATE_OK)?"":_("Only "),purgeable_disk_space,volume_name);
447                 }
449                 /* check % purgeable space on volume */
450         } else if (vars_to_check==VPP) {
452                 asprintf (&send_buffer,"VKP%s\r\n",volume_name);
453                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
454                 if (result!=STATE_OK)
455                         return result;
457                 if (!strcmp(recv_buffer,"-1\n")) {
459                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
460                         result=STATE_CRITICAL;
462                 } else {
464                         purgeable_disk_space=strtoul(recv_buffer,NULL,10);
466                         asprintf (&send_buffer,"VKS%s\r\n",volume_name);
467                         result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
468                         if (result!=STATE_OK)
469                                 return result;
470                         total_disk_space=strtoul(recv_buffer,NULL,10);
472                         percent_purgeable_space=(int)(((double)purgeable_disk_space/(double)total_disk_space)*100.0);
474                         if (check_critical_value==TRUE && percent_purgeable_space >= critical_value)
475                                 result=STATE_CRITICAL;
476                         else if (check_warning_value==TRUE && percent_purgeable_space >= warning_value)
477                                 result=STATE_WARNING;
478                         purgeable_disk_space/=1024;
479                         asprintf (&output_message,_("%lu MB (%lu%%) purgeable on volume %s"),purgeable_disk_space,percent_purgeable_space,volume_name);
480                 }
482                 /* check KB not yet purgeable space on volume */
483         } else if (vars_to_check==VKNP) {
485                 asprintf (&send_buffer,"VKNP%s\r\n",volume_name);
486                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
487                 if (result!=STATE_OK)
488                         return result;
490                 if (!strcmp(recv_buffer,"-1\n")) {
491                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
492                         result=STATE_CRITICAL;
493                 } else {
494                         non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
495                         if (check_critical_value==TRUE && non_purgeable_disk_space >= critical_value)
496                                 result=STATE_CRITICAL;
497                         else if (check_warning_value==TRUE && non_purgeable_disk_space >= warning_value)
498                                 result=STATE_WARNING;
499                         asprintf (&output_message,_("%s%lu KB not yet purgeable on volume %s"),(result==STATE_OK)?"":_("Only "),non_purgeable_disk_space,volume_name);
500                 }
502                 /* check % not yet purgeable space on volume */
503         } else if (vars_to_check==VPNP) {
505                 asprintf (&send_buffer,"VKNP%s\r\n",volume_name);
506                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
507                 if (result!=STATE_OK)
508                         return result;
510                 if (!strcmp(recv_buffer,"-1\n")) {
512                         asprintf (&output_message,_("Error: Volume '%s' does not exist!"),volume_name);
513                         result=STATE_CRITICAL;
515                 } else {
517                         non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
519                         asprintf (&send_buffer,"VKS%s\r\n",volume_name);
520                         result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
521                         if (result!=STATE_OK)
522                                 return result;
523                         total_disk_space=strtoul(recv_buffer,NULL,10);
525                         percent_non_purgeable_space=(int)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0);
527                         if (check_critical_value==TRUE && percent_non_purgeable_space >= critical_value)
528                                 result=STATE_CRITICAL;
529                         else if (check_warning_value==TRUE && percent_non_purgeable_space >= warning_value)
530                                 result=STATE_WARNING;
531                         purgeable_disk_space/=1024;
532                         asprintf (&output_message,_("%lu MB (%lu%%) not yet purgeable on volume %s"),non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
533                 }
535                 /* check # of open files */
536         } else if (vars_to_check==OFILES) {
538                 asprintf (&send_buffer,"S18\r\n");
539                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
540                 if (result!=STATE_OK)
541                         return result;
542  
543                 open_files=atoi(recv_buffer);
544  
545                 if (check_critical_value==TRUE && open_files >= critical_value)
546                         result=STATE_CRITICAL;
547                 else if (check_warning_value==TRUE && open_files >= warning_value)
548                         result=STATE_WARNING;
550                 asprintf (&output_message,_("%lu open files"),open_files);
552                 /* check # of abended threads (Netware 5.x only) */
553         } else if (vars_to_check==ABENDS) {
555                 asprintf (&send_buffer,"S17\r\n");
556                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
557                 if (result!=STATE_OK)
558                         return result;
559  
560                 abended_threads=atoi(recv_buffer);
561  
562                 if (check_critical_value==TRUE && abended_threads >= critical_value)
563                         result=STATE_CRITICAL;
564                 else if (check_warning_value==TRUE && abended_threads >= warning_value)
565                         result=STATE_WARNING;
567                 asprintf (&output_message,_("%lu abended threads"),abended_threads);
569                 /* check # of current service processes (Netware 5.x only) */
570         } else if (vars_to_check==CSPROCS) {
572                 asprintf (&send_buffer,"S20\r\n");
573                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
574                 if (result!=STATE_OK)
575                         return result;
576  
577                 max_service_processes=atoi(recv_buffer);
578  
579                 asprintf (&send_buffer,"S21\r\n");
580                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
581                 if (result!=STATE_OK)
582                         return result;
583  
584                 current_service_processes=atoi(recv_buffer);
585  
586                 if (check_critical_value==TRUE && current_service_processes >= critical_value)
587                         result=STATE_CRITICAL;
588                 else if (check_warning_value==TRUE && current_service_processes >= warning_value)
589                         result=STATE_WARNING;
591                 asprintf (&output_message,
592                           _("%lu current service processes (%lu max)"),
593                           current_service_processes,
594                           max_service_processes);
596                 /* check # Timesync Status */
597         } else if (vars_to_check==TSYNC) {
599                 asprintf (&send_buffer,"S22\r\n");
600                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
601                 if (result!=STATE_OK)
602                         return result;
604                 time_sync_status=atoi(recv_buffer);
606                 if (time_sync_status==0) {
607                         result=STATE_CRITICAL;
608                         asprintf (&output_message,_("Critical: Time not in sync with network!"));
609                 }
610                 else {
611                         asprintf (&output_message,_("OK! Time in sync with network!"));
612                 }
614                 /* check LRU sitting time in secondss */
615         } else if (vars_to_check==LRUS) {
617                 send_buffer = strdup ("S4\r\n");
618                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
619                 if (result!=STATE_OK)
620                         return result;
621                 lru_time=strtoul(recv_buffer,NULL,10);
623                 if (check_critical_value==TRUE && lru_time <= critical_value)
624                         result=STATE_CRITICAL;
625                 else if (check_warning_value==TRUE && lru_time <= warning_value)
626                         result=STATE_WARNING;
627                 asprintf (&output_message,_("LRU sitting time = %lu seconds"),lru_time);
630                 /* check % dirty cacheobuffers as a percentage of the total*/
631         } else if (vars_to_check==DCB) {
633                 send_buffer = strdup ("S6\r\n");
634                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
635                 if (result!=STATE_OK)
636                         return result;
637                 dirty_cache_buffers=atoi(recv_buffer);
639                 if (check_critical_value==TRUE && dirty_cache_buffers <= critical_value)
640                         result=STATE_CRITICAL;
641                 else if (check_warning_value==TRUE && dirty_cache_buffers <= warning_value)
642                         result=STATE_WARNING;
643                 asprintf (&output_message,_("dirty cache buffers = %lu%% of the total"),dirty_cache_buffers);
645                 /* check % total cache buffers as a percentage of the original*/
646         } else if (vars_to_check==TCB) {
648                 send_buffer = strdup ("S7\r\n");
649                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
650                 if (result!=STATE_OK)
651                         return result;
652                 total_cache_buffers=atoi(recv_buffer);
654                 if (check_critical_value==TRUE && total_cache_buffers <= critical_value)
655                         result=STATE_CRITICAL;
656                 else if (check_warning_value==TRUE && total_cache_buffers <= warning_value)
657                         result=STATE_WARNING;
658                 asprintf (&output_message,_("total cache buffers = %lu%% of the original"),total_cache_buffers);
659                 
660         } else if (vars_to_check==DSVER) {
661                 asprintf (&send_buffer,"S13\r\n");
662                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
663                 if (result!=STATE_OK)
664                         return result;
666                 recv_buffer[strlen(recv_buffer)-1]=0;
668                 asprintf (&output_message,_("NDS Version %s"),recv_buffer);
670         } else if (vars_to_check==UPTIME) {
671                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
672                 if (result!=STATE_OK)
673                         return result;
675                 recv_buffer[strlen(recv_buffer)-1]=0;
677                 asprintf (&output_message,_("Up %s"),recv_buffer);
679         } else if (vars_to_check==NLM) {
680                 asprintf (&send_buffer,"S24:%s\r\n",nlm_name);
681                 result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
682                 if (result!=STATE_OK)
683                         return result;
685                 recv_buffer[strlen(recv_buffer)-1]=0;
686                 if (strcmp(recv_buffer,"-1")) {
687                         asprintf (&output_message,_("Module %s version %s is loaded"),nlm_name,recv_buffer);
688                 } else {
689                         result=STATE_CRITICAL;
690                         asprintf (&output_message,_("Module %s is not loaded"),nlm_name);
691                 }
693         } else {
695                 output_message = strdup (_("Nothing to check!\n"));
696                 result=STATE_UNKNOWN;
698         }
700         /* reset timeout */
701         alarm(0);
703         printf("%s%s\n",netware_version,output_message);
705         return result;
707 \f
708 /* process command-line arguments */
709 int process_arguments(int argc, char **argv) {
710         int c;
712         int option = 0;
713         static struct option longopts[] =
714                 { 
715                         {"port",     required_argument,0,'p'},
716                         {"timeout",  required_argument,0,'t'},
717                         {"critical", required_argument,0,'c'},
718                         {"warning",  required_argument,0,'w'},
719                         {"variable", required_argument,0,'v'},
720                         {"hostname", required_argument,0,'H'},
721                         {"osversion",no_argument,      0,'o'},
722                         {"version",  no_argument,      0,'V'},
723                         {"help",     no_argument,      0,'h'},
724                         {0,0,0,0}
725                 };
727         /* no options were supplied */
728         if (argc<2) return ERROR;
730         /* backwards compatibility */
731         if (! is_option(argv[1])) {
732                 server_address=argv[1];
733                 argv[1]=argv[0];
734                 argv=&argv[1];
735                 argc--;
736         }
738   for (c=1;c<argc;c++) {
739     if (strcmp("-to",argv[c])==0)
740       strcpy(argv[c],"-t");
741     else if (strcmp("-wv",argv[c])==0)
742       strcpy(argv[c],"-w");
743     else if (strcmp("-cv",argv[c])==0)
744       strcpy(argv[c],"-c");
745         }
747         while (1) {
748                 c = getopt_long(argc,argv,"+hoVH:t:c:w:p:v:",longopts,&option);
750                 if (c==-1||c==EOF||c==1)
751                         break;
753                 switch (c)
754                         {
755                         case '?': /* print short usage statement if args not parsable */
756                                 printf ("%s: Unknown argument: %s\n\n", progname, optarg);
757                                 print_usage();
758                                 exit(STATE_UNKNOWN);
759                         case 'h': /* help */
760                                 print_help();
761                                 exit(STATE_OK);
762                         case 'V': /* version */
763                                 print_revision(progname, revision);
764                                 exit(STATE_OK);
765                         case 'H': /* hostname */
766                                 server_address=optarg;
767                                 break;
768                         case 'o': /* display nos version */
769                                 check_netware_version=TRUE;
770                                 break;
771                         case 'p': /* port */
772                                 if (is_intnonneg(optarg))
773                                         server_port=atoi(optarg);
774                                 else
775                                         die(STATE_UNKNOWN,_("Server port an integer (seconds)\nType '%s -h' for additional help\n"),progname);
776                                 break;
777                         case 'v':
778                                 if (strlen(optarg)<3)
779                                         return ERROR;
780                                 if (!strcmp(optarg,"LOAD1"))
781                                         vars_to_check=LOAD1;
782                                 else if (!strcmp(optarg,"LOAD5"))
783                                         vars_to_check=LOAD5;
784                                 else if (!strcmp(optarg,"LOAD15"))
785                                         vars_to_check=LOAD15;
786                                 else if (!strcmp(optarg,"CONNS"))
787                                         vars_to_check=CONNS;
788                                 else if (!strcmp(optarg,"LTCH"))
789                                         vars_to_check=LTCH;
790                                 else if (!strcmp(optarg,"DCB"))
791                                         vars_to_check=DCB;
792                                 else if (!strcmp(optarg,"TCB"))
793                                         vars_to_check=TCB;
794                                 else if (!strcmp(optarg,"CBUFF"))
795                                         vars_to_check=CBUFF;
796                                 else if (!strcmp(optarg,"CDBUFF"))
797                                         vars_to_check=CDBUFF;
798                                 else if (!strcmp(optarg,"LRUM"))
799                                         vars_to_check=LRUM;
800                                 else if (!strcmp(optarg,"LRUS"))
801                                         vars_to_check=LRUS;
802                                 else if (strncmp(optarg,"VPF",3)==0) {
803                                         vars_to_check=VPF;
804                                         volume_name = strdup (optarg+3);
805                                         if (!strcmp(volume_name,""))
806                                                 volume_name = strdup ("SYS");
807                                 }
808                                 else if (strncmp(optarg,"VKF",3)==0) {
809                                         vars_to_check=VKF;
810                                         volume_name = strdup (optarg+3);
811                                         if (!strcmp(volume_name,""))
812                                                 volume_name = strdup ("SYS");
813                                 }
814                                 else if (!strcmp(optarg,"DSDB"))
815                                         vars_to_check=DSDB;
816                                 else if (!strcmp(optarg,"LOGINS"))
817                                         vars_to_check=LOGINS;
818                                 else if (!strcmp(optarg,"UPRB"))
819                                         vars_to_check=UPRB;
820                                 else if (!strcmp(optarg,"PUPRB"))
821                                         vars_to_check=PUPRB;
822                                 else if (!strncmp(optarg,"SAPENTRIES",10)) {
823                                         vars_to_check=SAPENTRIES;
824                                         if (strlen(optarg)>10)
825                                                 sap_number=atoi(optarg+10);
826                                         else
827                                                 sap_number=-1;
828                                 }
829                                 else if (!strcmp(optarg,"OFILES"))
830                                         vars_to_check=OFILES;
831                                 else if (strncmp(optarg,"VKP",3)==0) {
832                                         vars_to_check=VKP;
833                                         volume_name = strdup (optarg+3);
834                                         if (!strcmp(volume_name,""))
835                                                 volume_name = strdup ("SYS");
836                                 }
837                                 else if (strncmp(optarg,"VPP",3)==0) {
838                                         vars_to_check=VPP;
839                                         volume_name = strdup (optarg+3);
840                                         if (!strcmp(volume_name,""))
841                                                 volume_name = strdup ("SYS");
842                                 }
843                                 else if (strncmp(optarg,"VKNP",4)==0) {
844                                         vars_to_check=VKNP;
845                                         volume_name = strdup (optarg+4);
846                                         if (!strcmp(volume_name,""))
847                                                 volume_name = strdup ("SYS");
848                                 }
849                                 else if (strncmp(optarg,"VPNP",4)==0) {
850                                         vars_to_check=VPNP;
851                                         volume_name = strdup (optarg+4);
852                                         if (!strcmp(volume_name,""))
853                                                 volume_name = strdup("SYS");
854                                 }
855                                 else if (!strcmp(optarg,"ABENDS"))
856                                         vars_to_check=ABENDS;
857                                 else if (!strcmp(optarg,"CSPROCS"))
858                                         vars_to_check=CSPROCS;
859                                 else if (!strcmp(optarg,"TSYNC"))
860                                         vars_to_check=TSYNC;
861                                 else if (!strcmp(optarg,"DSVER"))
862                                         vars_to_check=DSVER;
863                                 else if (!strcmp(optarg,"UPTIME"))
864                                         vars_to_check=UPTIME;
865                                 else if (strncmp(optarg,"NLM:",4)==0) {
866                                         vars_to_check=NLM;
867                                         nlm_name=strdup (optarg+4);
868                                 }
869                                 else
870                                         return ERROR;
871                                 break;
872                         case 'w': /* warning threshold */
873                                 warning_value=strtoul(optarg,NULL,10);
874                                 check_warning_value=TRUE;
875                                 break;
876                         case 'c': /* critical threshold */
877                                 critical_value=strtoul(optarg,NULL,10);
878                                 check_critical_value=TRUE;
879                                 break;
880                         case 't': /* timeout */
881                                 socket_timeout=atoi(optarg);
882                                 if (socket_timeout<=0)
883                                         return ERROR;
884                         }
886         }
888         return OK;
895 \f
896 void print_help(void)
898         char *myport;
899         asprintf (&myport, "%d", PORT);
901         print_revision (progname, revision);
903         printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"));
904         printf (_(COPYRIGHT), copyright, email);
906         printf (_("\
907 Usage: %s This plugin attempts to contact the MRTGEXT NLM running\n\
908 on a Novell server to gather the requested system information.\n\n"),
909                 progname);
911         print_usage();
913         printf (_(UT_HELP_VRSN));
915         printf (_(UT_HOST_PORT), 'p', myport);
917         printf (_("\
918  -v, --variable=STRING\n\
919     Variable to check.  Valid variables include:\n\
920       LOAD1     = 1 minute average CPU load\n\
921       LOAD5     = 5 minute average CPU load\n\
922       LOAD15    = 15 minute average CPU load\n\
923       CSPROCS   = number of current service processes (NW 5.x only)\n\
924       ABENDS    = number of abended threads (NW 5.x only)\n\
925       UPTIME    = server uptime\n"));
927         printf (_("\
928       LTCH      = percent long term cache hits\n\
929       CBUFF     = current number of cache buffers\n\
930       CDBUFF    = current number of dirty cache buffers\n\
931       DCB       = dirty cache buffers as a percentage of the total\n\
932       TCB       = dirty cache buffers as a percentage of the original\n"));
934         printf (_("\
935       OFILES    = number of open files\n\
936       VPF<vol>  = percent free space on volume <vol>\n\
937       VKF<vol>  = KB of free space on volume <vol>\n\
938       VPP<vol>  = percent purgeable space on volume <vol>\n\
939       VKP<vol>  = KB of purgeable space on volume <vol>\n\
940       VPNP<vol> = percent not yet purgeable space on volume <vol>\n\
941       VKNP<vol> = KB of not yet purgeable space on volume <vol>\n"));
943         printf (_("\
944       LRUM      = LRU sitting time in minutes\n\
945       LRUS      = LRU sitting time in seconds\n\
946       DSDB      = check to see if DS Database is open\n\
947       DSVER     = NDS version\n\
948       UPRB      = used packet receive buffers\n\
949       PUPRB     = percent (of max) used packet receive buffers\n\
950       SAPENTRIES = number of entries in the SAP table\n\
951       SAPENTRIES<n> = number of entries in the SAP table for SAP type <n>\n"));
953         printf (_("\
954       TSYNC     = timesync status \n\
955       LOGINS    = check to see if logins are enabled\n\
956       CONNS     = number of currently licensed connections\n\
957       NLM:<nlm> = check if NLM is loaded and report version\n\
958                   (e.g. \"NLM:TSANDS.NLM\")\n"));
960         printf (_("\
961  -w, --warning=INTEGER\n\
962     Threshold which will result in a warning status\n\
963  -c, --critical=INTEGER\n\
964     Threshold which will result in a critical status\n\
965  -o, --osversion\n\
966     Include server version string in results\n"));
968         printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
970         printf (_("\n\
971 Notes:\n\
972 - This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG\n\
973   extension for NetWare be loaded on the Novell servers you wish to check.\n\
974   (available from http://www.engr.wisc.edu/~drews/mrtg/)\n\
975 - Values for critical thresholds should be lower than warning thresholds\n\
976   when the following variables are checked: VPF, VKF, LTCH, CBUFF, DCB, \n\
977   TCB, LRUS and LRUM.\n"));
979         printf (_(UT_SUPPORT));
985 void print_usage(void)
987         printf (_("\
988 Usage: %s -H host [-p port] [-v variable] [-w warning] [-c critical]\n\
989   [-t timeout].\n"), progname);
990         printf (_(UT_HLP_VRS), progname, progname);