check_nwstat.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. /******************************************************************************
  2. *
  3. * Program: NetWare statistics plugin for Nagios
  4. * License: GPL
  5. *
  6. * License Information:
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. *
  22. * $Id$
  23. *
  24. *****************************************************************************/
  25. const char *progname = "check_nwstat";
  26. #define REVISION "$Revision$"
  27. #define COPYRIGHT "Copyright (c) 1999-2001 Ethan Galstad"
  28. #define SUMMARY "\
  29. This plugin attempts to contact the MRTGEXT NLM running on a Novell server\n\
  30. to gather the requested system information.\n"
  31. #define OPTIONS "\
  32. -H host [-v variable] [-w warning] [-c critical]\n\
  33. [-p port] [-t timeout]"
  34. #define LONGOPTIONS "\
  35. -H, --hostname=HOST\n\
  36. Name of the host to check\n\
  37. -v, --variable=STRING\n\
  38. Variable to check. Valid variables include:\n\
  39. LOAD1 = 1 minute average CPU load\n\
  40. LOAD5 = 5 minute average CPU load\n\
  41. LOAD15 = 15 minute average CPU load\n\
  42. CONNS = number of currently licensed connections\n\
  43. VPF<vol> = percent free space on volume <vol>\n\
  44. VKF<vol> = KB of free space on volume <vol>\n\
  45. LTCH = percent long term cache hits\n\
  46. CBUFF = current number of cache buffers\n\
  47. CDBUFF = current number of dirty cache buffers\n\
  48. LRUM = LRU sitting time in minutes\n\
  49. DSDB = check to see if DS Database is open\n\
  50. DSVER = NDS version\n\
  51. LOGINS = check to see if logins are enabled\n\
  52. UPRB = used packet receive buffers\n\
  53. PUPRB = percent (of max) used packet receive buffers\n\
  54. SAPENTRIES = number of entries in the SAP table\n\
  55. SAPENTRIES<n> = number of entries in the SAP table for SAP type <n>\n\
  56. OFILES = number of open files\n\
  57. VPP<vol> = percent purgeable space on volume <vol>\n\
  58. VKP<vol> = KB of purgeable space on volume <vol>\n\
  59. VPNP<vol> = percent not yet purgeable space on volume <vol>\n\
  60. VKNP<vol> = KB of not yet purgeable space on volume <vol>\n\
  61. ABENDS = number of abended threads (NW 5.x only)\n\
  62. CSPROCS = number of current service processes (NW 5.x only)\n\
  63. TSYNC = timesync status \n\
  64. LRUS = LRU sitting time in seconds\n\
  65. DCB = dirty cache buffers as a percentage of the total\n\
  66. TCB = dirty cache buffers as a percentage of the original\n\
  67. UPTIME = server uptime\n\
  68. NLM:<nlm> = check if NLM is loaded and report version (e.g. \"NLM:TSANDS.NLM\")\n\
  69. -w, --warning=INTEGER\n\
  70. Threshold which will result in a warning status\n\
  71. -c, --critical=INTEGER\n\
  72. Threshold which will result in a critical status\n\
  73. -p, --port=INTEGER\n\
  74. Optional port number (default: %d)\n\
  75. -t, --timeout=INTEGER\n\
  76. Seconds before connection attempt times out (default: %d)\n\
  77. -o, --osversion\n\
  78. Include server version string in results\n\
  79. -h, --help\n\
  80. Print this help screen\n\
  81. -V, --version\n\
  82. Print version information\n"
  83. #define DESCRIPTION "\
  84. Notes:\n\
  85. - This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG\n\
  86. extension for NetWare be loaded on the Novell servers you wish to check.\n\
  87. (available from http://www.engr.wisc.edu/~drews/mrtg/)\n\
  88. - Values for critical thresholds should be lower than warning thresholds\n\
  89. when the following variables are checked: VPF, VKF, LTCH, CBUFF, DCB, \n\
  90. TCB, LRUS and LRUM.\n"
  91. #include "config.h"
  92. #include "common.h"
  93. #include "netutils.h"
  94. #include "utils.h"
  95. #define CHECK_NONE 0
  96. #define CHECK_LOAD1 1 /* check 1 minute CPU load */
  97. #define CHECK_LOAD5 2 /* check 5 minute CPU load */
  98. #define CHECK_LOAD15 3 /* check 15 minute CPU load */
  99. #define CHECK_CONNS 4 /* check number of connections */
  100. #define CHECK_VPF 5 /* check % free space on volume */
  101. #define CHECK_VKF 6 /* check KB free space on volume */
  102. #define CHECK_LTCH 7 /* check long-term cache hit percentage */
  103. #define CHECK_CBUFF 8 /* check total cache buffers */
  104. #define CHECK_CDBUFF 9 /* check dirty cache buffers */
  105. #define CHECK_LRUM 10 /* check LRU sitting time in minutes */
  106. #define CHECK_DSDB 11 /* check to see if DS Database is open */
  107. #define CHECK_LOGINS 12 /* check to see if logins are enabled */
  108. #define CHECK_PUPRB 13 /* check % of used packet receive buffers */
  109. #define CHECK_UPRB 14 /* check used packet receive buffers */
  110. #define CHECK_SAPENTRIES 15 /* check SAP entries */
  111. #define CHECK_OFILES 16 /* check number of open files */
  112. #define CHECK_VKP 17 /* check KB purgeable space on volume */
  113. #define CHECK_VPP 18 /* check % purgeable space on volume */
  114. #define CHECK_VKNP 19 /* check KB not yet purgeable space on volume */
  115. #define CHECK_VPNP 20 /* check % not yet purgeable space on volume */
  116. #define CHECK_ABENDS 21 /* check abended thread count */
  117. #define CHECK_CSPROCS 22 /* check number of current service processes */
  118. #define CHECK_TSYNC 23 /* check timesync status 0=no 1=yes in sync to the network */
  119. #define CHECK_LRUS 24 /* check LRU sitting time in seconds */
  120. #define CHECK_DCB 25 /* check dirty cache buffers as a percentage of the total */
  121. #define CHECK_TCB 26 /* check total cache buffers as a percentage of the original */
  122. #define CHECK_DSVER 27 /* check NDS version */
  123. #define CHECK_UPTIME 28 /* check server uptime */
  124. #define CHECK_NLM 29 /* check NLM loaded */
  125. #define PORT 9999
  126. char *server_address=NULL;
  127. char *volume_name=NULL;
  128. char *nlm_name=NULL;
  129. int server_port=PORT;
  130. unsigned long warning_value=0L;
  131. unsigned long critical_value=0L;
  132. int check_warning_value=FALSE;
  133. int check_critical_value=FALSE;
  134. int check_netware_version=FALSE;
  135. unsigned long vars_to_check=CHECK_NONE;
  136. int sap_number=-1;
  137. int process_arguments(int, char **);
  138. void print_usage(void);
  139. void print_help(void);
  140. int main(int argc, char **argv){
  141. int result;
  142. char *send_buffer=NULL;
  143. char recv_buffer[MAX_INPUT_BUFFER];
  144. char *output_message=NULL;
  145. char *temp_buffer=NULL;
  146. char *netware_version=NULL;
  147. int total_cache_buffers=0;
  148. int dirty_cache_buffers=0;
  149. int time_sync_status=0;
  150. int open_files=0;
  151. int abended_threads=0;
  152. int max_service_processes=0;
  153. int current_service_processes=0;
  154. unsigned long free_disk_space=0L;
  155. unsigned long total_disk_space=0L;
  156. unsigned long purgeable_disk_space=0L;
  157. unsigned long non_purgeable_disk_space=0L;
  158. int percent_free_space=0;
  159. int percent_purgeable_space=0;
  160. int percent_non_purgeable_space=0;
  161. unsigned long current_connections=0L;
  162. unsigned long utilization=0L;
  163. int cache_hits=0;
  164. unsigned long cache_buffers=0L;
  165. unsigned long lru_time=0L;
  166. char uptime[MAX_INPUT_BUFFER];
  167. int max_packet_receive_buffers=0;
  168. int used_packet_receive_buffers=0;
  169. unsigned long percent_used_packet_receive_buffers=0L;
  170. int sap_entries=0;
  171. if(process_arguments(argc,argv)==ERROR)
  172. usage("Could not parse arguments\n");
  173. /* initialize alarm signal handling */
  174. signal(SIGALRM,socket_timeout_alarm_handler);
  175. /* set socket timeout */
  176. alarm(socket_timeout);
  177. /* get OS version string */
  178. if (check_netware_version==TRUE) {
  179. send_buffer = strscpy(send_buffer,"S19\r\n");
  180. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  181. if(result!=STATE_OK)
  182. return result;
  183. if(!strcmp(recv_buffer,"-1\n"))
  184. asprintf(&netware_version,"");
  185. else {
  186. recv_buffer[strlen(recv_buffer)-1]=0;
  187. asprintf(&netware_version,"NetWare %s: ",recv_buffer);
  188. }
  189. } else
  190. asprintf(&netware_version,"");
  191. /* check CPU load */
  192. if (vars_to_check==CHECK_LOAD1 || vars_to_check==CHECK_LOAD5 || vars_to_check==CHECK_LOAD15) {
  193. switch(vars_to_check){
  194. case CHECK_LOAD1:
  195. temp_buffer = strscpy(temp_buffer,"1");
  196. break;
  197. case CHECK_LOAD5:
  198. temp_buffer = strscpy(temp_buffer,"5");
  199. break;
  200. default:
  201. temp_buffer = strscpy(temp_buffer,"15");
  202. break;
  203. }
  204. asprintf(&send_buffer,"UTIL%s\r\n",temp_buffer);
  205. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  206. if(result!=STATE_OK)
  207. return result;
  208. utilization=strtoul(recv_buffer,NULL,10);
  209. send_buffer = strscpy(send_buffer,"UPTIME\r\n");
  210. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  211. if(result!=STATE_OK)
  212. return result;
  213. recv_buffer[strlen(recv_buffer)-1]=0;
  214. sprintf(uptime,"Up %s,",recv_buffer);
  215. if(check_critical_value==TRUE && utilization >= critical_value)
  216. result=STATE_CRITICAL;
  217. else if(check_warning_value==TRUE && utilization >= warning_value)
  218. result=STATE_WARNING;
  219. asprintf(&output_message,"Load %s - %s %s-min load average = %lu%%",(result==STATE_OK)?"ok":"problem",uptime,temp_buffer,utilization);
  220. /* check number of user connections */
  221. } else if (vars_to_check==CHECK_CONNS) {
  222. send_buffer = strscpy(send_buffer,"CONNECT\r\n");
  223. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  224. if(result!=STATE_OK)
  225. return result;
  226. current_connections=strtoul(recv_buffer,NULL,10);
  227. if(check_critical_value==TRUE && current_connections >= critical_value)
  228. result=STATE_CRITICAL;
  229. else if(check_warning_value==TRUE && current_connections >= warning_value)
  230. result=STATE_WARNING;
  231. asprintf(&output_message,"Conns %s - %lu current connections",(result==STATE_OK)?"ok":"problem",current_connections);
  232. /* check % long term cache hits */
  233. } else if (vars_to_check==CHECK_LTCH) {
  234. send_buffer = strscpy(send_buffer,"S1\r\n");
  235. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  236. if(result!=STATE_OK)
  237. return result;
  238. cache_hits=atoi(recv_buffer);
  239. if(check_critical_value==TRUE && cache_hits <= critical_value)
  240. result=STATE_CRITICAL;
  241. else if(check_warning_value==TRUE && cache_hits <= warning_value)
  242. result=STATE_WARNING;
  243. asprintf(&output_message,"Long term cache hits = %d%%",cache_hits);
  244. /* check cache buffers */
  245. } else if (vars_to_check==CHECK_CBUFF) {
  246. send_buffer = strscpy(send_buffer,"S2\r\n");
  247. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  248. if(result!=STATE_OK)
  249. return result;
  250. cache_buffers=strtoul(recv_buffer,NULL,10);
  251. if(check_critical_value==TRUE && cache_buffers <= critical_value)
  252. result=STATE_CRITICAL;
  253. else if(check_warning_value==TRUE && cache_buffers <= warning_value)
  254. result=STATE_WARNING;
  255. asprintf(&output_message,"Total cache buffers = %lu",cache_buffers);
  256. /* check dirty cache buffers */
  257. } else if (vars_to_check==CHECK_CDBUFF) {
  258. send_buffer = strscpy(send_buffer,"S3\r\n");
  259. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  260. if(result!=STATE_OK)
  261. return result;
  262. cache_buffers=strtoul(recv_buffer,NULL,10);
  263. if(check_critical_value==TRUE && cache_buffers >= critical_value)
  264. result=STATE_CRITICAL;
  265. else if(check_warning_value==TRUE && cache_buffers >= warning_value)
  266. result=STATE_WARNING;
  267. asprintf(&output_message,"Dirty cache buffers = %lu",cache_buffers);
  268. /* check LRU sitting time in minutes */
  269. } else if (vars_to_check==CHECK_LRUM) {
  270. send_buffer = strscpy(send_buffer,"S5\r\n");
  271. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  272. if(result!=STATE_OK)
  273. return result;
  274. lru_time=strtoul(recv_buffer,NULL,10);
  275. if(check_critical_value==TRUE && lru_time <= critical_value)
  276. result=STATE_CRITICAL;
  277. else if(check_warning_value==TRUE && lru_time <= warning_value)
  278. result=STATE_WARNING;
  279. asprintf(&output_message,"LRU sitting time = %lu minutes",lru_time);
  280. /* check KB free space on volume */
  281. } else if (vars_to_check==CHECK_VKF) {
  282. asprintf(&send_buffer,"VKF%s\r\n",volume_name);
  283. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  284. if(result!=STATE_OK)
  285. return result;
  286. if (!strcmp(recv_buffer,"-1\n")) {
  287. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  288. result=STATE_CRITICAL;
  289. } else {
  290. free_disk_space=strtoul(recv_buffer,NULL,10);
  291. if(check_critical_value==TRUE && free_disk_space <= critical_value)
  292. result=STATE_CRITICAL;
  293. else if(check_warning_value==TRUE && free_disk_space <= warning_value)
  294. result=STATE_WARNING;
  295. asprintf(&output_message,"%s%lu KB free on volume %s",(result==STATE_OK)?"":"Only ",free_disk_space,volume_name);
  296. }
  297. /* check % free space on volume */
  298. } else if (vars_to_check==CHECK_VPF) {
  299. asprintf(&send_buffer,"VKF%s\r\n",volume_name);
  300. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  301. if(result!=STATE_OK)
  302. return result;
  303. if(!strcmp(recv_buffer,"-1\n")){
  304. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  305. result=STATE_CRITICAL;
  306. } else {
  307. free_disk_space=strtoul(recv_buffer,NULL,10);
  308. asprintf(&send_buffer,"VKS%s\r\n",volume_name);
  309. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  310. if(result!=STATE_OK)
  311. return result;
  312. total_disk_space=strtoul(recv_buffer,NULL,10);
  313. percent_free_space=(int)(((double)free_disk_space/(double)total_disk_space)*100.0);
  314. if(check_critical_value==TRUE && percent_free_space <= critical_value)
  315. result=STATE_CRITICAL;
  316. else if(check_warning_value==TRUE && percent_free_space <= warning_value)
  317. result=STATE_WARNING;
  318. free_disk_space/=1024;
  319. asprintf(&output_message,"%lu MB (%d%%) free on volume %s",free_disk_space,percent_free_space,volume_name);
  320. }
  321. /* check to see if DS Database is open or closed */
  322. } else if(vars_to_check==CHECK_DSDB) {
  323. send_buffer = strscpy(send_buffer,"S11\r\n");
  324. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  325. if(result!=STATE_OK)
  326. return result;
  327. if(atoi(recv_buffer)==1)
  328. result=STATE_OK;
  329. else
  330. result=STATE_WARNING;
  331. send_buffer = strscpy(send_buffer,"S13\r\n");
  332. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  333. temp_buffer=strtok(recv_buffer,"\r\n");
  334. asprintf(&output_message,"Directory Services Database is %s (DS version %s)",(result==STATE_OK)?"open":"closed",temp_buffer);
  335. /* check to see if logins are enabled */
  336. } else if (vars_to_check==CHECK_LOGINS) {
  337. send_buffer = strscpy(send_buffer,"S12\r\n");
  338. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  339. if(result!=STATE_OK)
  340. return result;
  341. if(atoi(recv_buffer)==1)
  342. result=STATE_OK;
  343. else
  344. result=STATE_WARNING;
  345. asprintf(&output_message,"Logins are %s",(result==STATE_OK)?"enabled":"disabled");
  346. /* check packet receive buffers */
  347. } else if (vars_to_check==CHECK_UPRB || vars_to_check==CHECK_PUPRB) {
  348. asprintf(&send_buffer,"S15\r\n",volume_name);
  349. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  350. if(result!=STATE_OK)
  351. return result;
  352. used_packet_receive_buffers=atoi(recv_buffer);
  353. asprintf(&send_buffer,"S16\r\n",volume_name);
  354. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  355. if(result!=STATE_OK)
  356. return result;
  357. max_packet_receive_buffers=atoi(recv_buffer);
  358. percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0);
  359. if(vars_to_check==CHECK_UPRB){
  360. if(check_critical_value==TRUE && used_packet_receive_buffers >= critical_value)
  361. result=STATE_CRITICAL;
  362. else if(check_warning_value==TRUE && used_packet_receive_buffers >= warning_value)
  363. result=STATE_WARNING;
  364. } else {
  365. if(check_critical_value==TRUE && percent_used_packet_receive_buffers >= critical_value)
  366. result=STATE_CRITICAL;
  367. else if(check_warning_value==TRUE && percent_used_packet_receive_buffers >= warning_value)
  368. result=STATE_WARNING;
  369. }
  370. asprintf(&output_message,"%d of %d (%lu%%) packet receive buffers used",used_packet_receive_buffers,max_packet_receive_buffers,percent_used_packet_receive_buffers);
  371. /* check SAP table entries */
  372. } else if (vars_to_check==CHECK_SAPENTRIES) {
  373. if(sap_number==-1)
  374. asprintf(&send_buffer,"S9\r\n");
  375. else
  376. asprintf(&send_buffer,"S9.%d\r\n",sap_number);
  377. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  378. if(result!=STATE_OK)
  379. return result;
  380. sap_entries=atoi(recv_buffer);
  381. if(check_critical_value==TRUE && sap_entries >= critical_value)
  382. result=STATE_CRITICAL;
  383. else if(check_warning_value==TRUE && sap_entries >= warning_value)
  384. result=STATE_WARNING;
  385. if(sap_number==-1)
  386. asprintf(&output_message,"%d entries in SAP table",sap_entries);
  387. else
  388. asprintf(&output_message,"%d entries in SAP table for SAP type %d",sap_entries,sap_number);
  389. /* check KB purgeable space on volume */
  390. } else if (vars_to_check==CHECK_VKP) {
  391. asprintf(&send_buffer,"VKP%s\r\n",volume_name);
  392. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  393. if(result!=STATE_OK)
  394. return result;
  395. if (!strcmp(recv_buffer,"-1\n")) {
  396. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  397. result=STATE_CRITICAL;
  398. } else {
  399. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  400. if(check_critical_value==TRUE && purgeable_disk_space >= critical_value)
  401. result=STATE_CRITICAL;
  402. else if(check_warning_value==TRUE && purgeable_disk_space >= warning_value)
  403. result=STATE_WARNING;
  404. asprintf(&output_message,"%s%lu KB purgeable on volume %s",(result==STATE_OK)?"":"Only ",purgeable_disk_space,volume_name);
  405. }
  406. /* check % purgeable space on volume */
  407. } else if (vars_to_check==CHECK_VPP) {
  408. asprintf(&send_buffer,"VKP%s\r\n",volume_name);
  409. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  410. if(result!=STATE_OK)
  411. return result;
  412. if(!strcmp(recv_buffer,"-1\n")){
  413. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  414. result=STATE_CRITICAL;
  415. } else {
  416. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  417. asprintf(&send_buffer,"VKS%s\r\n",volume_name);
  418. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  419. if(result!=STATE_OK)
  420. return result;
  421. total_disk_space=strtoul(recv_buffer,NULL,10);
  422. percent_purgeable_space=(int)(((double)purgeable_disk_space/(double)total_disk_space)*100.0);
  423. if(check_critical_value==TRUE && percent_purgeable_space >= critical_value)
  424. result=STATE_CRITICAL;
  425. else if(check_warning_value==TRUE && percent_purgeable_space >= warning_value)
  426. result=STATE_WARNING;
  427. purgeable_disk_space/=1024;
  428. asprintf(&output_message,"%lu MB (%d%%) purgeable on volume %s",purgeable_disk_space,percent_purgeable_space,volume_name);
  429. }
  430. /* check KB not yet purgeable space on volume */
  431. } else if (vars_to_check==CHECK_VKNP) {
  432. asprintf(&send_buffer,"VKNP%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;
  436. if (!strcmp(recv_buffer,"-1\n")) {
  437. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  438. result=STATE_CRITICAL;
  439. } else {
  440. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  441. if(check_critical_value==TRUE && non_purgeable_disk_space >= critical_value)
  442. result=STATE_CRITICAL;
  443. else if(check_warning_value==TRUE && non_purgeable_disk_space >= warning_value)
  444. result=STATE_WARNING;
  445. asprintf(&output_message,"%s%lu KB not yet purgeable on volume %s",(result==STATE_OK)?"":"Only ",non_purgeable_disk_space,volume_name);
  446. }
  447. /* check % not yet purgeable space on volume */
  448. } else if (vars_to_check==CHECK_VPNP) {
  449. asprintf(&send_buffer,"VKNP%s\r\n",volume_name);
  450. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  451. if(result!=STATE_OK)
  452. return result;
  453. if(!strcmp(recv_buffer,"-1\n")){
  454. asprintf(&output_message,"Error: Volume '%s' does not exist!",volume_name);
  455. result=STATE_CRITICAL;
  456. } else {
  457. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  458. asprintf(&send_buffer,"VKS%s\r\n",volume_name);
  459. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  460. if(result!=STATE_OK)
  461. return result;
  462. total_disk_space=strtoul(recv_buffer,NULL,10);
  463. percent_non_purgeable_space=(int)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0);
  464. if(check_critical_value==TRUE && percent_non_purgeable_space >= critical_value)
  465. result=STATE_CRITICAL;
  466. else if(check_warning_value==TRUE && percent_non_purgeable_space >= warning_value)
  467. result=STATE_WARNING;
  468. purgeable_disk_space/=1024;
  469. asprintf(&output_message,"%lu MB (%d%%) not yet purgeable on volume %s",non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
  470. }
  471. /* check # of open files */
  472. } else if (vars_to_check==CHECK_OFILES) {
  473. asprintf(&send_buffer,"S18\r\n");
  474. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  475. if(result!=STATE_OK)
  476. return result;
  477. open_files=atoi(recv_buffer);
  478. if(check_critical_value==TRUE && open_files >= critical_value)
  479. result=STATE_CRITICAL;
  480. else if(check_warning_value==TRUE && open_files >= warning_value)
  481. result=STATE_WARNING;
  482. asprintf(&output_message,"%d open files",open_files);
  483. /* check # of abended threads (Netware 5.x only) */
  484. } else if (vars_to_check==CHECK_ABENDS) {
  485. asprintf(&send_buffer,"S17\r\n");
  486. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  487. if(result!=STATE_OK)
  488. return result;
  489. abended_threads=atoi(recv_buffer);
  490. if(check_critical_value==TRUE && abended_threads >= critical_value)
  491. result=STATE_CRITICAL;
  492. else if(check_warning_value==TRUE && abended_threads >= warning_value)
  493. result=STATE_WARNING;
  494. asprintf(&output_message,"%d abended threads",abended_threads);
  495. /* check # of current service processes (Netware 5.x only) */
  496. } else if (vars_to_check==CHECK_CSPROCS) {
  497. asprintf(&send_buffer,"S20\r\n");
  498. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  499. if(result!=STATE_OK)
  500. return result;
  501. max_service_processes=atoi(recv_buffer);
  502. asprintf(&send_buffer,"S21\r\n");
  503. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  504. if(result!=STATE_OK)
  505. return result;
  506. current_service_processes=atoi(recv_buffer);
  507. if(check_critical_value==TRUE && current_service_processes >= critical_value)
  508. result=STATE_CRITICAL;
  509. else if(check_warning_value==TRUE && current_service_processes >= warning_value)
  510. result=STATE_WARNING;
  511. asprintf(&output_message,"%d current service processes (%d max)",current_service_processes,max_service_processes);
  512. /* check # Timesync Status */
  513. } else if (vars_to_check==CHECK_TSYNC) {
  514. asprintf(&send_buffer,"S22\r\n");
  515. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  516. if(result!=STATE_OK)
  517. return result;
  518. time_sync_status=atoi(recv_buffer);
  519. if(time_sync_status==0) {
  520. result=STATE_CRITICAL;
  521. asprintf(&output_message,"Critical: Time not in sync with network!");
  522. }
  523. else {
  524. asprintf(&output_message,"OK! Time in sync with network!");
  525. }
  526. /* check LRU sitting time in secondss */
  527. } else if (vars_to_check==CHECK_LRUS) {
  528. send_buffer = strscpy(send_buffer,"S4\r\n");
  529. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  530. if(result!=STATE_OK)
  531. return result;
  532. lru_time=strtoul(recv_buffer,NULL,10);
  533. if(check_critical_value==TRUE && lru_time <= critical_value)
  534. result=STATE_CRITICAL;
  535. else if(check_warning_value==TRUE && lru_time <= warning_value)
  536. result=STATE_WARNING;
  537. asprintf(&output_message,"LRU sitting time = %lu seconds",lru_time);
  538. /* check % dirty cache buffers as a percentage of the total*/
  539. } else if (vars_to_check==CHECK_DCB) {
  540. send_buffer = strscpy(send_buffer,"S6\r\n");
  541. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  542. if(result!=STATE_OK)
  543. return result;
  544. dirty_cache_buffers=atoi(recv_buffer);
  545. if(check_critical_value==TRUE && dirty_cache_buffers <= critical_value)
  546. result=STATE_CRITICAL;
  547. else if(check_warning_value==TRUE && dirty_cache_buffers <= warning_value)
  548. result=STATE_WARNING;
  549. asprintf(&output_message,"dirty cache buffers = %d%% of the total",dirty_cache_buffers);
  550. /* check % total cache buffers as a percentage of the original*/
  551. } else if (vars_to_check==CHECK_TCB) {
  552. send_buffer = strscpy(send_buffer,"S7\r\n");
  553. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  554. if(result!=STATE_OK)
  555. return result;
  556. total_cache_buffers=atoi(recv_buffer);
  557. if(check_critical_value==TRUE && total_cache_buffers <= critical_value)
  558. result=STATE_CRITICAL;
  559. else if(check_warning_value==TRUE && total_cache_buffers <= warning_value)
  560. result=STATE_WARNING;
  561. asprintf(&output_message,"total cache buffers = %d%% of the original",total_cache_buffers);
  562. } else if (vars_to_check==CHECK_DSVER) {
  563. asprintf(&send_buffer,"S13\r\n");
  564. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  565. if(result!=STATE_OK)
  566. return result;
  567. recv_buffer[strlen(recv_buffer)-1]=0;
  568. asprintf(&output_message,"NDS Version %s",recv_buffer);
  569. } else if (vars_to_check==CHECK_UPTIME) {
  570. asprintf(&send_buffer,"UPTIME\r\n");
  571. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  572. if(result!=STATE_OK)
  573. return result;
  574. recv_buffer[strlen(recv_buffer)-1]=0;
  575. asprintf(&output_message,"Up %s",recv_buffer);
  576. } else if (vars_to_check==CHECK_NLM) {
  577. asprintf(&send_buffer,"S24:%s\r\n",nlm_name);
  578. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  579. if(result!=STATE_OK)
  580. return result;
  581. recv_buffer[strlen(recv_buffer)-1]=0;
  582. if(strcmp(recv_buffer,"-1")) {
  583. asprintf(&output_message,"Module %s version %s is loaded",nlm_name,recv_buffer);
  584. } else {
  585. result=STATE_CRITICAL;
  586. asprintf(&output_message,"Module %s is not loaded",nlm_name);
  587. }
  588. } else {
  589. output_message = strscpy(output_message,"Nothing to check!\n");
  590. result=STATE_UNKNOWN;
  591. }
  592. /* reset timeout */
  593. alarm(0);
  594. printf("%s%s\n",netware_version,output_message);
  595. return result;
  596. }
  597. /* process command-line arguments */
  598. int process_arguments(int argc, char **argv){
  599. int c;
  600. int option_index = 0;
  601. static struct option long_options[] =
  602. {
  603. {"port", required_argument,0,'p'},
  604. {"timeout", required_argument,0,'t'},
  605. {"critical", required_argument,0,'c'},
  606. {"warning", required_argument,0,'w'},
  607. {"variable", required_argument,0,'v'},
  608. {"hostname", required_argument,0,'H'},
  609. {"osversion",no_argument, 0,'o'},
  610. {"version", no_argument, 0,'V'},
  611. {"help", no_argument, 0,'h'},
  612. {0,0,0,0}
  613. };
  614. /* no options were supplied */
  615. if(argc<2) return ERROR;
  616. /* backwards compatibility */
  617. if (! is_option(argv[1])) {
  618. server_address=argv[1];
  619. argv[1]=argv[0];
  620. argv=&argv[1];
  621. argc--;
  622. }
  623. for (c=1;c<argc;c++) {
  624. if(strcmp("-to",argv[c])==0)
  625. strcpy(argv[c],"-t");
  626. else if (strcmp("-wv",argv[c])==0)
  627. strcpy(argv[c],"-w");
  628. else if (strcmp("-cv",argv[c])==0)
  629. strcpy(argv[c],"-c");
  630. }
  631. while (1){
  632. c = getopt_long(argc,argv,"+hoVH:t:c:w:p:v:",long_options,&option_index);
  633. if (c==-1||c==EOF||c==1)
  634. break;
  635. switch (c)
  636. {
  637. case '?': /* print short usage statement if args not parsable */
  638. printf ("%s: Unknown argument: %s\n\n", progname, optarg);
  639. print_usage();
  640. exit(STATE_UNKNOWN);
  641. case 'h': /* help */
  642. print_help();
  643. exit(STATE_OK);
  644. case 'V': /* version */
  645. print_revision(progname,"$Revision$");
  646. exit(STATE_OK);
  647. case 'H': /* hostname */
  648. server_address=optarg;
  649. break;
  650. case 'o': /* display nos version */
  651. check_netware_version=TRUE;
  652. break;
  653. case 'p': /* port */
  654. if (is_intnonneg(optarg))
  655. server_port=atoi(optarg);
  656. else
  657. terminate(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",progname);
  658. break;
  659. case 'v':
  660. if(strlen(optarg)<3)
  661. return ERROR;
  662. if(!strcmp(optarg,"LOAD1"))
  663. vars_to_check=CHECK_LOAD1;
  664. else if(!strcmp(optarg,"LOAD5"))
  665. vars_to_check=CHECK_LOAD5;
  666. else if(!strcmp(optarg,"LOAD15"))
  667. vars_to_check=CHECK_LOAD15;
  668. else if(!strcmp(optarg,"CONNS"))
  669. vars_to_check=CHECK_CONNS;
  670. else if(!strcmp(optarg,"LTCH"))
  671. vars_to_check=CHECK_LTCH;
  672. else if(!strcmp(optarg,"DCB"))
  673. vars_to_check=CHECK_DCB;
  674. else if(!strcmp(optarg,"TCB"))
  675. vars_to_check=CHECK_TCB;
  676. else if(!strcmp(optarg,"CBUFF"))
  677. vars_to_check=CHECK_CBUFF;
  678. else if(!strcmp(optarg,"CDBUFF"))
  679. vars_to_check=CHECK_CDBUFF;
  680. else if(!strcmp(optarg,"LRUM"))
  681. vars_to_check=CHECK_LRUM;
  682. else if(!strcmp(optarg,"LRUS"))
  683. vars_to_check=CHECK_LRUS;
  684. else if(strncmp(optarg,"VPF",3)==0){
  685. vars_to_check=CHECK_VPF;
  686. volume_name = strscpy(volume_name,optarg+3);
  687. if(!strcmp(volume_name,""))
  688. volume_name = strscpy(volume_name,"SYS");
  689. }
  690. else if(strncmp(optarg,"VKF",3)==0){
  691. vars_to_check=CHECK_VKF;
  692. volume_name = strscpy(volume_name,optarg+3);
  693. if(!strcmp(volume_name,""))
  694. volume_name = strscpy(volume_name,"SYS");
  695. }
  696. else if(!strcmp(optarg,"DSDB"))
  697. vars_to_check=CHECK_DSDB;
  698. else if(!strcmp(optarg,"LOGINS"))
  699. vars_to_check=CHECK_LOGINS;
  700. else if(!strcmp(optarg,"UPRB"))
  701. vars_to_check=CHECK_UPRB;
  702. else if(!strcmp(optarg,"PUPRB"))
  703. vars_to_check=CHECK_PUPRB;
  704. else if(!strncmp(optarg,"SAPENTRIES",10)){
  705. vars_to_check=CHECK_SAPENTRIES;
  706. if(strlen(optarg)>10)
  707. sap_number=atoi(optarg+10);
  708. else
  709. sap_number=-1;
  710. }
  711. else if(!strcmp(optarg,"OFILES"))
  712. vars_to_check=CHECK_OFILES;
  713. else if(strncmp(optarg,"VKP",3)==0){
  714. vars_to_check=CHECK_VKP;
  715. volume_name = strscpy(volume_name,optarg+3);
  716. if(!strcmp(volume_name,""))
  717. volume_name = strscpy(volume_name,"SYS");
  718. }
  719. else if(strncmp(optarg,"VPP",3)==0){
  720. vars_to_check=CHECK_VPP;
  721. volume_name = strscpy(volume_name,optarg+3);
  722. if(!strcmp(volume_name,""))
  723. volume_name = strscpy(volume_name,"SYS");
  724. }
  725. else if(strncmp(optarg,"VKNP",4)==0){
  726. vars_to_check=CHECK_VKNP;
  727. volume_name = strscpy(volume_name,optarg+4);
  728. if(!strcmp(volume_name,""))
  729. volume_name = strscpy(volume_name,"SYS");
  730. }
  731. else if(strncmp(optarg,"VPNP",4)==0){
  732. vars_to_check=CHECK_VPNP;
  733. volume_name = strscpy(volume_name,optarg+4);
  734. if(!strcmp(volume_name,""))
  735. volume_name = strscpy(volume_name,"SYS");
  736. }
  737. else if(!strcmp(optarg,"ABENDS"))
  738. vars_to_check=CHECK_ABENDS;
  739. else if(!strcmp(optarg,"CSPROCS"))
  740. vars_to_check=CHECK_CSPROCS;
  741. else if(!strcmp(optarg,"TSYNC"))
  742. vars_to_check=CHECK_TSYNC;
  743. else if(!strcmp(optarg,"DSVER"))
  744. vars_to_check=CHECK_DSVER;
  745. else if(!strcmp(optarg,"UPTIME"))
  746. vars_to_check=CHECK_UPTIME;
  747. else if(strncmp(optarg,"NLM:",4)==0) {
  748. vars_to_check=CHECK_NLM;
  749. nlm_name=strscpy(nlm_name,optarg+4);
  750. }
  751. else
  752. return ERROR;
  753. break;
  754. case 'w': /* warning threshold */
  755. warning_value=strtoul(optarg,NULL,10);
  756. check_warning_value=TRUE;
  757. break;
  758. case 'c': /* critical threshold */
  759. critical_value=strtoul(optarg,NULL,10);
  760. check_critical_value=TRUE;
  761. break;
  762. case 't': /* timeout */
  763. socket_timeout=atoi(optarg);
  764. if(socket_timeout<=0)
  765. return ERROR;
  766. }
  767. }
  768. return OK;
  769. }
  770. void print_usage(void)
  771. {
  772. printf
  773. ("Usage:\n"
  774. " %s %s\n"
  775. " %s (-h | --help) for detailed help\n"
  776. " %s (-V | --version) for version information\n",
  777. progname, OPTIONS, progname, progname);
  778. }
  779. void print_help(void)
  780. {
  781. print_revision (progname, REVISION);
  782. printf ("%s\n\n%s\n", COPYRIGHT, SUMMARY);
  783. print_usage();
  784. printf
  785. ("\nOptions:\n" LONGOPTIONS "\n" DESCRIPTION "\n",
  786. PORT, DEFAULT_SOCKET_TIMEOUT);
  787. support ();
  788. }