Code

Added -4 and -6 command line options into check_http, check_ldap and
[nagiosplug.git] / plugins / check_nwstat.c
index e1426702c5f0a7710d78ddbcef3533519c25b4f7..5dbde9cedb8824995b9ec75768f78f863fe84c7f 100644 (file)
@@ -23,7 +23,7 @@
  *
  *****************************************************************************/
 
-#define PROGNAME "check_nwstat"
+const char *progname = "check_nwstat";
 #define REVISION "$Revision$"
 #define COPYRIGHT "Copyright (c) 1999-2001 Ethan Galstad"
 
@@ -51,6 +51,7 @@ to gather the requested system information.\n"
      CDBUFF   = current number of dirty cache buffers\n\
      LRUM     = LRU sitting time in minutes\n\
      DSDB     = check to see if DS Database is open\n\
+     DSVER    = NDS version\n\
      LOGINS   = check to see if logins are enabled\n\
      UPRB     = used packet receive buffers\n\
      PUPRB    = percent (of max) used packet receive buffers\n\
@@ -63,6 +64,12 @@ to gather the requested system information.\n"
      VKNP<vol> = KB of not yet purgeable space on volume <vol>\n\
      ABENDS   = number of abended threads (NW 5.x only)\n\
      CSPROCS  = number of current service processes (NW 5.x only)\n\
+     TSYNC    = timesync status \n\
+     LRUS     = LRU sitting time in seconds\n\
+     DCB      = dirty cache buffers as a percentage of the total\n\
+     TCB      = dirty cache buffers as a percentage of the original\n\
+     UPTIME   = server uptime\n\
+     NLM:<nlm> = check if NLM is loaded and report version (e.g. \"NLM:TSANDS.NLM\")\n\
 -w, --warning=INTEGER\n\
   Threshold which will result in a warning status\n\
 -c, --critical=INTEGER\n\
@@ -84,7 +91,8 @@ Notes:\n\
   extension for NetWare be loaded on the Novell servers you wish to check.\n\
   (available from http://www.engr.wisc.edu/~drews/mrtg/)\n\
 - Values for critical thresholds should be lower than warning thresholds\n\
-  when the following variables are checked: VPF, VKF, LTCH, CBUFF, and LRUM.\n"
+  when the following variables are checked: VPF, VKF, LTCH, CBUFF, DCB, \n\
+  TCB, LRUS and LRUM.\n"
 
 #include "config.h"
 #include "common.h"
@@ -114,11 +122,19 @@ Notes:\n\
 #define CHECK_VPNP          20 /* check % not yet purgeable space on volume */
 #define CHECK_ABENDS        21 /* check abended thread count */
 #define CHECK_CSPROCS       22 /* check number of current service processes */
+#define CHECK_TSYNC         23 /* check timesync status 0=no 1=yes in sync to the network */
+#define CHECK_LRUS          24 /* check LRU sitting time in seconds */
+#define CHECK_DCB           25 /* check dirty cache buffers as a percentage of the total */
+#define CHECK_TCB           26 /* check total cache buffers as a percentage of the original */
+#define CHECK_DSVER         27 /* check NDS version */
+#define CHECK_UPTIME        28 /* check server uptime */
+#define CHECK_NLM           29 /* check NLM loaded */
 
 #define PORT 9999
 
 char *server_address=NULL;
 char *volume_name=NULL;
+char *nlm_name=NULL;
 int server_port=PORT;
 unsigned long warning_value=0L;
 unsigned long critical_value=0L;
@@ -128,8 +144,6 @@ int check_netware_version=FALSE;
 unsigned long vars_to_check=CHECK_NONE;
 int sap_number=-1;
 
-#define PROGNAME "check_nwstat"
-
 int process_arguments(int, char **);
 void print_usage(void);
 void print_help(void);
@@ -142,6 +156,9 @@ int main(int argc, char **argv){
        char *temp_buffer=NULL;
        char *netware_version=NULL;
 
+       int total_cache_buffers=0;
+       int dirty_cache_buffers=0;
+       int time_sync_status=0;
        int open_files=0;
        int abended_threads=0;
        int max_service_processes=0;
@@ -180,13 +197,13 @@ int main(int argc, char **argv){
                if(result!=STATE_OK)
                        return result;
                if(!strcmp(recv_buffer,"-1\n"))
-                       netware_version = ssprintf(netware_version,"");
+                       asprintf(&netware_version,"");
                else {
                        recv_buffer[strlen(recv_buffer)-1]=0;
-                       netware_version = ssprintf(netware_version,"NetWare %s: ",recv_buffer);
+                       asprintf(&netware_version,"NetWare %s: ",recv_buffer);
                }
        } else
-               netware_version = ssprintf(netware_version,"");
+               asprintf(&netware_version,"");
 
 
        /* check CPU load */
@@ -204,7 +221,7 @@ int main(int argc, char **argv){
                        break;
                }
 
-               send_buffer = ssprintf(send_buffer,"UTIL%s\r\n",temp_buffer);
+               asprintf(&send_buffer,"UTIL%s\r\n",temp_buffer);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -221,7 +238,7 @@ int main(int argc, char **argv){
                else if(check_warning_value==TRUE && utilization >= warning_value)
                        result=STATE_WARNING;
 
-               output_message = ssprintf(output_message,"Load %s - %s %s-min load average = %lu%%",(result==STATE_OK)?"ok":"problem",uptime,temp_buffer,utilization);
+               asprintf(&output_message,"Load %s - %s %s-min load average = %lu%%",(result==STATE_OK)?"ok":"problem",uptime,temp_buffer,utilization);
 
        /* check number of user connections */
        } else if (vars_to_check==CHECK_CONNS) {
@@ -236,7 +253,7 @@ int main(int argc, char **argv){
                        result=STATE_CRITICAL;
                else if(check_warning_value==TRUE && current_connections >= warning_value)
                        result=STATE_WARNING;
-               output_message = ssprintf(output_message,"Conns %s - %lu current connections",(result==STATE_OK)?"ok":"problem",current_connections);
+               asprintf(&output_message,"Conns %s - %lu current connections",(result==STATE_OK)?"ok":"problem",current_connections);
 
        /* check % long term cache hits */
        } else if (vars_to_check==CHECK_LTCH) {
@@ -251,7 +268,7 @@ int main(int argc, char **argv){
                        result=STATE_CRITICAL;
                else if(check_warning_value==TRUE && cache_hits <= warning_value)
                        result=STATE_WARNING;
-               output_message = ssprintf(output_message,"Long term cache hits = %d%%",cache_hits);
+               asprintf(&output_message,"Long term cache hits = %d%%",cache_hits);
 
        /* check cache buffers */
        } else if (vars_to_check==CHECK_CBUFF) {
@@ -266,7 +283,7 @@ int main(int argc, char **argv){
                        result=STATE_CRITICAL;
                else if(check_warning_value==TRUE && cache_buffers <= warning_value)
                        result=STATE_WARNING;
-               output_message = ssprintf(output_message,"Total cache buffers = %lu",cache_buffers);
+               asprintf(&output_message,"Total cache buffers = %lu",cache_buffers);
 
        /* check dirty cache buffers */
        } else if (vars_to_check==CHECK_CDBUFF) {
@@ -281,7 +298,7 @@ int main(int argc, char **argv){
                        result=STATE_CRITICAL;
                else if(check_warning_value==TRUE && cache_buffers >= warning_value)
                        result=STATE_WARNING;
-               output_message = ssprintf(output_message,"Dirty cache buffers = %lu",cache_buffers);
+               asprintf(&output_message,"Dirty cache buffers = %lu",cache_buffers);
 
        /* check LRU sitting time in minutes */
        } else if (vars_to_check==CHECK_LRUM) {
@@ -296,19 +313,19 @@ int main(int argc, char **argv){
                        result=STATE_CRITICAL;
                else if(check_warning_value==TRUE && lru_time <= warning_value)
                        result=STATE_WARNING;
-               output_message = ssprintf(output_message,"LRU sitting time = %lu minutes",lru_time);
+               asprintf(&output_message,"LRU sitting time = %lu minutes",lru_time);
 
 
        /* check KB free space on volume */
        } else if (vars_to_check==CHECK_VKF) {
 
-               send_buffer = ssprintf(send_buffer,"VKF%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKF%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if (!strcmp(recv_buffer,"-1\n")) {
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
                }       else {
                        free_disk_space=strtoul(recv_buffer,NULL,10);
@@ -316,27 +333,27 @@ int main(int argc, char **argv){
                                result=STATE_CRITICAL;
                        else if(check_warning_value==TRUE && free_disk_space <= warning_value)
                                result=STATE_WARNING;
-                       output_message = ssprintf(output_message,"%s%lu KB free on volume %s",(result==STATE_OK)?"":"Only ",free_disk_space,volume_name);
+                       asprintf(&output_message,"%s%lu KB free on volume %s",(result==STATE_OK)?"":"Only ",free_disk_space,volume_name);
                }
 
        /* check % free space on volume */
        } else if (vars_to_check==CHECK_VPF) {
 
-               send_buffer = ssprintf(send_buffer,"VKF%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKF%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if(!strcmp(recv_buffer,"-1\n")){
 
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
 
                } else {
 
                        free_disk_space=strtoul(recv_buffer,NULL,10);
 
-                       send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
+                       asprintf(&send_buffer,"VKS%s\r\n",volume_name);
                        result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                        if(result!=STATE_OK)
                                return result;
@@ -349,7 +366,7 @@ int main(int argc, char **argv){
                        else if(check_warning_value==TRUE && percent_free_space <= warning_value)
                                result=STATE_WARNING;
                        free_disk_space/=1024;
-                       output_message = ssprintf(output_message,"%lu MB (%d%%) free on volume %s",free_disk_space,percent_free_space,volume_name);
+                       asprintf(&output_message,"%lu MB (%d%%) free on volume %s",free_disk_space,percent_free_space,volume_name);
                }
 
        /* check to see if DS Database is open or closed */
@@ -368,7 +385,7 @@ int main(int argc, char **argv){
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                temp_buffer=strtok(recv_buffer,"\r\n");
  
-               output_message = ssprintf(output_message,"Directory Services Database is %s (DS version %s)",(result==STATE_OK)?"open":"closed",temp_buffer);
+               asprintf(&output_message,"Directory Services Database is %s (DS version %s)",(result==STATE_OK)?"open":"closed",temp_buffer);
 
        /* check to see if logins are enabled */
        } else if (vars_to_check==CHECK_LOGINS) {
@@ -382,19 +399,19 @@ int main(int argc, char **argv){
                else
                        result=STATE_WARNING;
  
-               output_message = ssprintf(output_message,"Logins are %s",(result==STATE_OK)?"enabled":"disabled");
+               asprintf(&output_message,"Logins are %s",(result==STATE_OK)?"enabled":"disabled");
 
        /* check packet receive buffers */
        } else if (vars_to_check==CHECK_UPRB || vars_to_check==CHECK_PUPRB) {
  
-               send_buffer = ssprintf(send_buffer,"S15\r\n",volume_name);
+               asprintf(&send_buffer,"S15\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                used_packet_receive_buffers=atoi(recv_buffer);
 
-               send_buffer = ssprintf(send_buffer,"S16\r\n",volume_name);
+               asprintf(&send_buffer,"S16\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -415,15 +432,15 @@ int main(int argc, char **argv){
                                result=STATE_WARNING;
                }
  
-               output_message = ssprintf(output_message,"%d of %d (%lu%%) packet receive buffers used",used_packet_receive_buffers,max_packet_receive_buffers,percent_used_packet_receive_buffers);
+               asprintf(&output_message,"%d of %d (%lu%%) packet receive buffers used",used_packet_receive_buffers,max_packet_receive_buffers,percent_used_packet_receive_buffers);
 
        /* check SAP table entries */
        } else if (vars_to_check==CHECK_SAPENTRIES) {
 
                if(sap_number==-1)
-                       send_buffer = ssprintf(send_buffer,"S9\r\n");
+                       asprintf(&send_buffer,"S9\r\n");
                else
-                       send_buffer = ssprintf(send_buffer,"S9.%d\r\n",sap_number);
+                       asprintf(&send_buffer,"S9.%d\r\n",sap_number);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -436,20 +453,20 @@ int main(int argc, char **argv){
                        result=STATE_WARNING;
 
                if(sap_number==-1)
-                       output_message = ssprintf(output_message,"%d entries in SAP table",sap_entries);
+                       asprintf(&output_message,"%d entries in SAP table",sap_entries);
                else
-                       output_message = ssprintf(output_message,"%d entries in SAP table for SAP type %d",sap_entries,sap_number);
+                       asprintf(&output_message,"%d entries in SAP table for SAP type %d",sap_entries,sap_number);
 
        /* check KB purgeable space on volume */
        } else if (vars_to_check==CHECK_VKP) {
 
-               send_buffer = ssprintf(send_buffer,"VKP%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKP%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if (!strcmp(recv_buffer,"-1\n")) {
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
                } else {
                        purgeable_disk_space=strtoul(recv_buffer,NULL,10);
@@ -457,27 +474,27 @@ int main(int argc, char **argv){
                                result=STATE_CRITICAL;
                        else if(check_warning_value==TRUE && purgeable_disk_space >= warning_value)
                                result=STATE_WARNING;
-                       output_message = ssprintf(output_message,"%s%lu KB purgeable on volume %s",(result==STATE_OK)?"":"Only ",purgeable_disk_space,volume_name);
+                       asprintf(&output_message,"%s%lu KB purgeable on volume %s",(result==STATE_OK)?"":"Only ",purgeable_disk_space,volume_name);
                }
 
        /* check % purgeable space on volume */
        } else if (vars_to_check==CHECK_VPP) {
 
-               send_buffer = ssprintf(send_buffer,"VKP%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKP%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if(!strcmp(recv_buffer,"-1\n")){
 
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
 
                } else {
 
                        purgeable_disk_space=strtoul(recv_buffer,NULL,10);
 
-                       send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
+                       asprintf(&send_buffer,"VKS%s\r\n",volume_name);
                        result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                        if(result!=STATE_OK)
                                return result;
@@ -490,19 +507,19 @@ int main(int argc, char **argv){
                        else if(check_warning_value==TRUE && percent_purgeable_space >= warning_value)
                                result=STATE_WARNING;
                        purgeable_disk_space/=1024;
-                       output_message = ssprintf(output_message,"%lu MB (%d%%) purgeable on volume %s",purgeable_disk_space,percent_purgeable_space,volume_name);
+                       asprintf(&output_message,"%lu MB (%d%%) purgeable on volume %s",purgeable_disk_space,percent_purgeable_space,volume_name);
                }
 
        /* check KB not yet purgeable space on volume */
        } else if (vars_to_check==CHECK_VKNP) {
 
-               send_buffer = ssprintf(send_buffer,"VKNP%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKNP%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if (!strcmp(recv_buffer,"-1\n")) {
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
                } else {
                        non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
@@ -510,27 +527,27 @@ int main(int argc, char **argv){
                                result=STATE_CRITICAL;
                        else if(check_warning_value==TRUE && non_purgeable_disk_space >= warning_value)
                                result=STATE_WARNING;
-                       output_message = ssprintf(output_message,"%s%lu KB not yet purgeable on volume %s",(result==STATE_OK)?"":"Only ",non_purgeable_disk_space,volume_name);
+                       asprintf(&output_message,"%s%lu KB not yet purgeable on volume %s",(result==STATE_OK)?"":"Only ",non_purgeable_disk_space,volume_name);
                }
 
        /* check % not yet purgeable space on volume */
        } else if (vars_to_check==CHECK_VPNP) {
 
-               send_buffer = ssprintf(send_buffer,"VKNP%s\r\n",volume_name);
+               asprintf(&send_buffer,"VKNP%s\r\n",volume_name);
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
 
                if(!strcmp(recv_buffer,"-1\n")){
 
-                       output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
+                       asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
                        result=STATE_CRITICAL;
 
                } else {
 
                        non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
 
-                       send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
+                       asprintf(&send_buffer,"VKS%s\r\n",volume_name);
                        result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                        if(result!=STATE_OK)
                                return result;
@@ -543,13 +560,13 @@ int main(int argc, char **argv){
                        else if(check_warning_value==TRUE && percent_non_purgeable_space >= warning_value)
                                result=STATE_WARNING;
                        purgeable_disk_space/=1024;
-                       output_message = ssprintf(output_message,"%lu MB (%d%%) not yet purgeable on volume %s",non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
+                       asprintf(&output_message,"%lu MB (%d%%) not yet purgeable on volume %s",non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
                }
 
        /* check # of open files */
        } else if (vars_to_check==CHECK_OFILES) {
 
-               send_buffer = ssprintf(send_buffer,"S18\r\n");
+               asprintf(&send_buffer,"S18\r\n");
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -561,12 +578,12 @@ int main(int argc, char **argv){
                else if(check_warning_value==TRUE && open_files >= warning_value)
                        result=STATE_WARNING;
 
-               output_message = ssprintf(output_message,"%d open files",open_files);
+               asprintf(&output_message,"%d open files",open_files);
 
        /* check # of abended threads (Netware 5.x only) */
        } else if (vars_to_check==CHECK_ABENDS) {
 
-               send_buffer = ssprintf(send_buffer,"S17\r\n");
+               asprintf(&send_buffer,"S17\r\n");
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -578,19 +595,19 @@ int main(int argc, char **argv){
                else if(check_warning_value==TRUE && abended_threads >= warning_value)
                        result=STATE_WARNING;
 
-               output_message = ssprintf(output_message,"%d abended threads",abended_threads);
+               asprintf(&output_message,"%d abended threads",abended_threads);
 
        /* check # of current service processes (Netware 5.x only) */
        } else if (vars_to_check==CHECK_CSPROCS) {
 
-               send_buffer = ssprintf(send_buffer,"S20\r\n");
+               asprintf(&send_buffer,"S20\r\n");
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
  
                max_service_processes=atoi(recv_buffer);
  
-               send_buffer = ssprintf(send_buffer,"S21\r\n");
+               asprintf(&send_buffer,"S21\r\n");
                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
                if(result!=STATE_OK)
                        return result;
@@ -602,7 +619,105 @@ int main(int argc, char **argv){
                else if(check_warning_value==TRUE && current_service_processes >= warning_value)
                        result=STATE_WARNING;
 
-               output_message = ssprintf(output_message,"%d current service processes (%d max)",current_service_processes,max_service_processes);
+               asprintf(&output_message,"%d current service processes (%d max)",current_service_processes,max_service_processes);
+
+       /* check # Timesync Status */
+        } else if (vars_to_check==CHECK_TSYNC) {
+
+               asprintf(&send_buffer,"S22\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+
+               time_sync_status=atoi(recv_buffer);
+
+               if(time_sync_status==0) {
+                       result=STATE_CRITICAL;
+                       asprintf(&output_message,"Critical: Time not in sync with network!");
+               }
+               else {
+                       asprintf(&output_message,"OK! Time in sync with network!");
+               }
+
+       /* check LRU sitting time in secondss */
+       } else if (vars_to_check==CHECK_LRUS) {
+
+               send_buffer = strscpy(send_buffer,"S4\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+               lru_time=strtoul(recv_buffer,NULL,10);
+
+               if(check_critical_value==TRUE && lru_time <= critical_value)
+                       result=STATE_CRITICAL;
+               else if(check_warning_value==TRUE && lru_time <= warning_value)
+                       result=STATE_WARNING;
+               asprintf(&output_message,"LRU sitting time = %lu seconds",lru_time);
+
+
+       /* check % dirty cache buffers as a percentage of the total*/
+       } else if (vars_to_check==CHECK_DCB) {
+
+               send_buffer = strscpy(send_buffer,"S6\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+               dirty_cache_buffers=atoi(recv_buffer);
+
+               if(check_critical_value==TRUE && dirty_cache_buffers <= critical_value)
+                       result=STATE_CRITICAL;
+               else if(check_warning_value==TRUE && dirty_cache_buffers <= warning_value)
+                       result=STATE_WARNING;
+               asprintf(&output_message,"dirty cache buffers = %d%% of the total",dirty_cache_buffers);
+
+       /* check % total cache buffers as a percentage of the original*/
+        } else if (vars_to_check==CHECK_TCB) {
+
+               send_buffer = strscpy(send_buffer,"S7\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+               total_cache_buffers=atoi(recv_buffer);
+
+               if(check_critical_value==TRUE && total_cache_buffers <= critical_value)
+                       result=STATE_CRITICAL;
+               else if(check_warning_value==TRUE && total_cache_buffers <= warning_value)
+                       result=STATE_WARNING;
+               asprintf(&output_message,"total cache buffers = %d%% of the original",total_cache_buffers);
+               
+        } else if (vars_to_check==CHECK_DSVER) {
+               asprintf(&send_buffer,"S13\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+
+               recv_buffer[strlen(recv_buffer)-1]=0;
+
+               asprintf(&output_message,"NDS Version %s",recv_buffer);
+
+        } else if (vars_to_check==CHECK_UPTIME) {
+               asprintf(&send_buffer,"UPTIME\r\n");
+               result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+               if(result!=STATE_OK)
+                       return result;
+
+               recv_buffer[strlen(recv_buffer)-1]=0;
+
+               asprintf(&output_message,"Up %s",recv_buffer);
+
+        } else if (vars_to_check==CHECK_NLM) {
+               asprintf(&send_buffer,"S24:%s\r\n",nlm_name);
+                result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
+                if(result!=STATE_OK)
+                       return result;
+
+                recv_buffer[strlen(recv_buffer)-1]=0;
+                if(strcmp(recv_buffer,"-1")) {
+                        asprintf(&output_message,"Module %s version %s is loaded",nlm_name,recv_buffer);
+                } else {
+                       result=STATE_CRITICAL;
+                        asprintf(&output_message,"Module %s is not loaded",nlm_name);
+               }
 
        } else {
 
@@ -624,7 +739,6 @@ int main(int argc, char **argv){
 int process_arguments(int argc, char **argv){
        int c;
 
-#ifdef HAVE_GETOPT_H
        int option_index = 0;
        static struct option long_options[] =
        { 
@@ -639,7 +753,6 @@ int process_arguments(int argc, char **argv){
                {"help",     no_argument,      0,'h'},
                {0,0,0,0}
        };
-#endif
 
        /* no options were supplied */
        if(argc<2) return ERROR;
@@ -662,11 +775,7 @@ int process_arguments(int argc, char **argv){
        }
 
        while (1){
-#ifdef HAVE_GETOPT_H
                c = getopt_long(argc,argv,"+hoVH:t:c:w:p:v:",long_options,&option_index);
-#else
-               c = getopt(argc,argv,"+hoVH:t:c:w:p:v:");
-#endif
 
                if (c==-1||c==EOF||c==1)
                        break;
@@ -674,14 +783,14 @@ int process_arguments(int argc, char **argv){
                switch (c)
                        {
                        case '?': /* print short usage statement if args not parsable */
-                               printf("%s: Unknown argument: %s\n\n",my_basename(argv[0]),optarg);
+                               printf ("%s: Unknown argument: %s\n\n", progname, optarg);
                                print_usage();
                                exit(STATE_UNKNOWN);
                        case 'h': /* help */
                                print_help();
                                exit(STATE_OK);
                        case 'V': /* version */
-                               print_revision(my_basename(argv[0]),"$Revision$");
+                               print_revision(progname,"$Revision$");
                                exit(STATE_OK);
                        case 'H': /* hostname */
                                server_address=optarg;
@@ -693,7 +802,7 @@ int process_arguments(int argc, char **argv){
                                if (is_intnonneg(optarg))
                                        server_port=atoi(optarg);
                                else
-                                       terminate(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",PROGNAME);
+                                       terminate(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",progname);
                                break;
                        case 'v':
                                if(strlen(optarg)<3)
@@ -708,12 +817,18 @@ int process_arguments(int argc, char **argv){
                                        vars_to_check=CHECK_CONNS;
                                else if(!strcmp(optarg,"LTCH"))
                                        vars_to_check=CHECK_LTCH;
+                               else if(!strcmp(optarg,"DCB"))
+                                       vars_to_check=CHECK_DCB;
+                               else if(!strcmp(optarg,"TCB"))
+                                       vars_to_check=CHECK_TCB;
                                else if(!strcmp(optarg,"CBUFF"))
                                        vars_to_check=CHECK_CBUFF;
                                else if(!strcmp(optarg,"CDBUFF"))
                                        vars_to_check=CHECK_CDBUFF;
                                else if(!strcmp(optarg,"LRUM"))
                                        vars_to_check=CHECK_LRUM;
+                               else if(!strcmp(optarg,"LRUS"))
+                                       vars_to_check=CHECK_LRUS;
                                else if(strncmp(optarg,"VPF",3)==0){
                                        vars_to_check=CHECK_VPF;
                                        volume_name = strscpy(volume_name,optarg+3);
@@ -771,6 +886,16 @@ int process_arguments(int argc, char **argv){
                                        vars_to_check=CHECK_ABENDS;
                                else if(!strcmp(optarg,"CSPROCS"))
                                        vars_to_check=CHECK_CSPROCS;
+                               else if(!strcmp(optarg,"TSYNC"))
+                                       vars_to_check=CHECK_TSYNC;
+                               else if(!strcmp(optarg,"DSVER"))
+                                       vars_to_check=CHECK_DSVER;
+                               else if(!strcmp(optarg,"UPTIME"))
+                                       vars_to_check=CHECK_UPTIME;
+                               else if(strncmp(optarg,"NLM:",4)==0) {
+                                       vars_to_check=CHECK_NLM;
+                                       nlm_name=strscpy(nlm_name,optarg+4);
+                                }
                                else
                                        return ERROR;
                                break;
@@ -799,19 +924,14 @@ void print_usage(void)
        printf
                ("Usage:\n"
                 " %s %s\n"
-#ifdef HAVE_GETOPT_H
                 " %s (-h | --help) for detailed help\n"
                 " %s (-V | --version) for version information\n",
-#else
-                " %s -h for detailed help\n"
-                " %s -V for version information\n",
-#endif
-                PROGNAME, OPTIONS, PROGNAME, PROGNAME);
+                progname, OPTIONS, progname, progname);
 }
 
 void print_help(void)
 {
-       print_revision (PROGNAME, REVISION);
+       print_revision (progname, REVISION);
        printf ("%s\n\n%s\n", COPYRIGHT, SUMMARY);
        print_usage();
        printf