check_nwstat.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  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. #define 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. LOGINS = check to see if logins are enabled\n\
  51. UPRB = used packet receive buffers\n\
  52. PUPRB = percent (of max) used packet receive buffers\n\
  53. SAPENTRIES = number of entries in the SAP table\n\
  54. SAPENTRIES<n> = number of entries in the SAP table for SAP type <n>\n\
  55. OFILES = number of open files\n\
  56. VPP<vol> = percent purgeable space on volume <vol>\n\
  57. VKP<vol> = KB of purgeable space on volume <vol>\n\
  58. VPNP<vol> = percent not yet purgeable space on volume <vol>\n\
  59. VKNP<vol> = KB of not yet purgeable space on volume <vol>\n\
  60. ABENDS = number of abended threads (NW 5.x only)\n\
  61. CSPROCS = number of current service processes (NW 5.x only)\n\
  62. -w, --warning=INTEGER\n\
  63. Threshold which will result in a warning status\n\
  64. -c, --critical=INTEGER\n\
  65. Threshold which will result in a critical status\n\
  66. -p, --port=INTEGER\n\
  67. Optional port number (default: %d)\n\
  68. -t, --timeout=INTEGER\n\
  69. Seconds before connection attempt times out (default: %d)\n\
  70. -o, --osversion\n\
  71. Include server version string in results\n\
  72. -h, --help\n\
  73. Print this help screen\n\
  74. -V, --version\n\
  75. Print version information\n"
  76. #define DESCRIPTION "\
  77. Notes:\n\
  78. - This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG\n\
  79. extension for NetWare be loaded on the Novell servers you wish to check.\n\
  80. (available from http://www.engr.wisc.edu/~drews/mrtg/)\n\
  81. - Values for critical thresholds should be lower than warning thresholds\n\
  82. when the following variables are checked: VPF, VKF, LTCH, CBUFF, and LRUM.\n"
  83. #include "config.h"
  84. #include "common.h"
  85. #include "netutils.h"
  86. #include "utils.h"
  87. #define CHECK_NONE 0
  88. #define CHECK_LOAD1 1 /* check 1 minute CPU load */
  89. #define CHECK_LOAD5 2 /* check 5 minute CPU load */
  90. #define CHECK_LOAD15 3 /* check 15 minute CPU load */
  91. #define CHECK_CONNS 4 /* check number of connections */
  92. #define CHECK_VPF 5 /* check % free space on volume */
  93. #define CHECK_VKF 6 /* check KB free space on volume */
  94. #define CHECK_LTCH 7 /* check long-term cache hit percentage */
  95. #define CHECK_CBUFF 8 /* check total cache buffers */
  96. #define CHECK_CDBUFF 9 /* check dirty cache buffers */
  97. #define CHECK_LRUM 10 /* check LRU sitting time in minutes */
  98. #define CHECK_DSDB 11 /* check to see if DS Database is open */
  99. #define CHECK_LOGINS 12 /* check to see if logins are enabled */
  100. #define CHECK_PUPRB 13 /* check % of used packet receive buffers */
  101. #define CHECK_UPRB 14 /* check used packet receive buffers */
  102. #define CHECK_SAPENTRIES 15 /* check SAP entries */
  103. #define CHECK_OFILES 16 /* check number of open files */
  104. #define CHECK_VKP 17 /* check KB purgeable space on volume */
  105. #define CHECK_VPP 18 /* check % purgeable space on volume */
  106. #define CHECK_VKNP 19 /* check KB not yet purgeable space on volume */
  107. #define CHECK_VPNP 20 /* check % not yet purgeable space on volume */
  108. #define CHECK_ABENDS 21 /* check abended thread count */
  109. #define CHECK_CSPROCS 22 /* check number of current service processes */
  110. #define PORT 9999
  111. char *server_address=NULL;
  112. char *volume_name=NULL;
  113. int server_port=PORT;
  114. unsigned long warning_value=0L;
  115. unsigned long critical_value=0L;
  116. int check_warning_value=FALSE;
  117. int check_critical_value=FALSE;
  118. int check_netware_version=FALSE;
  119. unsigned long vars_to_check=CHECK_NONE;
  120. int sap_number=-1;
  121. #define PROGNAME "check_nwstat"
  122. int process_arguments(int, char **);
  123. void print_usage(void);
  124. void print_help(void);
  125. int main(int argc, char **argv){
  126. int result;
  127. char *send_buffer=NULL;
  128. char recv_buffer[MAX_INPUT_BUFFER];
  129. char *output_message=NULL;
  130. char *temp_buffer=NULL;
  131. char *netware_version=NULL;
  132. int open_files=0;
  133. int abended_threads=0;
  134. int max_service_processes=0;
  135. int current_service_processes=0;
  136. unsigned long free_disk_space=0L;
  137. unsigned long total_disk_space=0L;
  138. unsigned long purgeable_disk_space=0L;
  139. unsigned long non_purgeable_disk_space=0L;
  140. int percent_free_space=0;
  141. int percent_purgeable_space=0;
  142. int percent_non_purgeable_space=0;
  143. unsigned long current_connections=0L;
  144. unsigned long utilization=0L;
  145. int cache_hits=0;
  146. unsigned long cache_buffers=0L;
  147. unsigned long lru_time=0L;
  148. char uptime[MAX_INPUT_BUFFER];
  149. int max_packet_receive_buffers=0;
  150. int used_packet_receive_buffers=0;
  151. unsigned long percent_used_packet_receive_buffers=0L;
  152. int sap_entries=0;
  153. if(process_arguments(argc,argv)==ERROR)
  154. usage("Could not parse arguments\n");
  155. /* initialize alarm signal handling */
  156. signal(SIGALRM,socket_timeout_alarm_handler);
  157. /* set socket timeout */
  158. alarm(socket_timeout);
  159. /* get OS version string */
  160. if (check_netware_version==TRUE) {
  161. send_buffer = strscpy(send_buffer,"S19\r\n");
  162. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  163. if(result!=STATE_OK)
  164. return result;
  165. if(!strcmp(recv_buffer,"-1\n"))
  166. netware_version = ssprintf(netware_version,"");
  167. else {
  168. recv_buffer[strlen(recv_buffer)-1]=0;
  169. netware_version = ssprintf(netware_version,"NetWare %s: ",recv_buffer);
  170. }
  171. } else
  172. netware_version = ssprintf(netware_version,"");
  173. /* check CPU load */
  174. if (vars_to_check==CHECK_LOAD1 || vars_to_check==CHECK_LOAD5 || vars_to_check==CHECK_LOAD15) {
  175. switch(vars_to_check){
  176. case CHECK_LOAD1:
  177. temp_buffer = strscpy(temp_buffer,"1");
  178. break;
  179. case CHECK_LOAD5:
  180. temp_buffer = strscpy(temp_buffer,"5");
  181. break;
  182. default:
  183. temp_buffer = strscpy(temp_buffer,"15");
  184. break;
  185. }
  186. send_buffer = ssprintf(send_buffer,"UTIL%s\r\n",temp_buffer);
  187. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  188. if(result!=STATE_OK)
  189. return result;
  190. utilization=strtoul(recv_buffer,NULL,10);
  191. send_buffer = strscpy(send_buffer,"UPTIME\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. recv_buffer[strlen(recv_buffer)-1]=0;
  196. sprintf(uptime,"Up %s,",recv_buffer);
  197. if(check_critical_value==TRUE && utilization >= critical_value)
  198. result=STATE_CRITICAL;
  199. else if(check_warning_value==TRUE && utilization >= warning_value)
  200. result=STATE_WARNING;
  201. output_message = ssprintf(output_message,"Load %s - %s %s-min load average = %lu%%",(result==STATE_OK)?"ok":"problem",uptime,temp_buffer,utilization);
  202. /* check number of user connections */
  203. } else if (vars_to_check==CHECK_CONNS) {
  204. send_buffer = strscpy(send_buffer,"CONNECT\r\n");
  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. current_connections=strtoul(recv_buffer,NULL,10);
  209. if(check_critical_value==TRUE && current_connections >= critical_value)
  210. result=STATE_CRITICAL;
  211. else if(check_warning_value==TRUE && current_connections >= warning_value)
  212. result=STATE_WARNING;
  213. output_message = ssprintf(output_message,"Conns %s - %lu current connections",(result==STATE_OK)?"ok":"problem",current_connections);
  214. /* check % long term cache hits */
  215. } else if (vars_to_check==CHECK_LTCH) {
  216. send_buffer = strscpy(send_buffer,"S1\r\n");
  217. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  218. if(result!=STATE_OK)
  219. return result;
  220. cache_hits=atoi(recv_buffer);
  221. if(check_critical_value==TRUE && cache_hits <= critical_value)
  222. result=STATE_CRITICAL;
  223. else if(check_warning_value==TRUE && cache_hits <= warning_value)
  224. result=STATE_WARNING;
  225. output_message = ssprintf(output_message,"Long term cache hits = %d%%",cache_hits);
  226. /* check cache buffers */
  227. } else if (vars_to_check==CHECK_CBUFF) {
  228. send_buffer = strscpy(send_buffer,"S2\r\n");
  229. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  230. if(result!=STATE_OK)
  231. return result;
  232. cache_buffers=strtoul(recv_buffer,NULL,10);
  233. if(check_critical_value==TRUE && cache_buffers <= critical_value)
  234. result=STATE_CRITICAL;
  235. else if(check_warning_value==TRUE && cache_buffers <= warning_value)
  236. result=STATE_WARNING;
  237. output_message = ssprintf(output_message,"Total cache buffers = %lu",cache_buffers);
  238. /* check dirty cache buffers */
  239. } else if (vars_to_check==CHECK_CDBUFF) {
  240. send_buffer = strscpy(send_buffer,"S3\r\n");
  241. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  242. if(result!=STATE_OK)
  243. return result;
  244. cache_buffers=strtoul(recv_buffer,NULL,10);
  245. if(check_critical_value==TRUE && cache_buffers >= critical_value)
  246. result=STATE_CRITICAL;
  247. else if(check_warning_value==TRUE && cache_buffers >= warning_value)
  248. result=STATE_WARNING;
  249. output_message = ssprintf(output_message,"Dirty cache buffers = %lu",cache_buffers);
  250. /* check LRU sitting time in minutes */
  251. } else if (vars_to_check==CHECK_LRUM) {
  252. send_buffer = strscpy(send_buffer,"S5\r\n");
  253. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  254. if(result!=STATE_OK)
  255. return result;
  256. lru_time=strtoul(recv_buffer,NULL,10);
  257. if(check_critical_value==TRUE && lru_time <= critical_value)
  258. result=STATE_CRITICAL;
  259. else if(check_warning_value==TRUE && lru_time <= warning_value)
  260. result=STATE_WARNING;
  261. output_message = ssprintf(output_message,"LRU sitting time = %lu minutes",lru_time);
  262. /* check KB free space on volume */
  263. } else if (vars_to_check==CHECK_VKF) {
  264. send_buffer = ssprintf(send_buffer,"VKF%s\r\n",volume_name);
  265. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  266. if(result!=STATE_OK)
  267. return result;
  268. if (!strcmp(recv_buffer,"-1\n")) {
  269. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  270. result=STATE_CRITICAL;
  271. } else {
  272. free_disk_space=strtoul(recv_buffer,NULL,10);
  273. if(check_critical_value==TRUE && free_disk_space <= critical_value)
  274. result=STATE_CRITICAL;
  275. else if(check_warning_value==TRUE && free_disk_space <= warning_value)
  276. result=STATE_WARNING;
  277. output_message = ssprintf(output_message,"%s%lu KB free on volume %s",(result==STATE_OK)?"":"Only ",free_disk_space,volume_name);
  278. }
  279. /* check % free space on volume */
  280. } else if (vars_to_check==CHECK_VPF) {
  281. send_buffer = ssprintf(send_buffer,"VKF%s\r\n",volume_name);
  282. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  283. if(result!=STATE_OK)
  284. return result;
  285. if(!strcmp(recv_buffer,"-1\n")){
  286. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  287. result=STATE_CRITICAL;
  288. } else {
  289. free_disk_space=strtoul(recv_buffer,NULL,10);
  290. send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
  291. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  292. if(result!=STATE_OK)
  293. return result;
  294. total_disk_space=strtoul(recv_buffer,NULL,10);
  295. percent_free_space=(int)(((double)free_disk_space/(double)total_disk_space)*100.0);
  296. if(check_critical_value==TRUE && percent_free_space <= critical_value)
  297. result=STATE_CRITICAL;
  298. else if(check_warning_value==TRUE && percent_free_space <= warning_value)
  299. result=STATE_WARNING;
  300. free_disk_space/=1024;
  301. output_message = ssprintf(output_message,"%lu MB (%d%%) free on volume %s",free_disk_space,percent_free_space,volume_name);
  302. }
  303. /* check to see if DS Database is open or closed */
  304. } else if(vars_to_check==CHECK_DSDB) {
  305. send_buffer = strscpy(send_buffer,"S11\r\n");
  306. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  307. if(result!=STATE_OK)
  308. return result;
  309. if(atoi(recv_buffer)==1)
  310. result=STATE_OK;
  311. else
  312. result=STATE_WARNING;
  313. send_buffer = strscpy(send_buffer,"S13\r\n");
  314. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  315. temp_buffer=strtok(recv_buffer,"\r\n");
  316. output_message = ssprintf(output_message,"Directory Services Database is %s (DS version %s)",(result==STATE_OK)?"open":"closed",temp_buffer);
  317. /* check to see if logins are enabled */
  318. } else if (vars_to_check==CHECK_LOGINS) {
  319. send_buffer = strscpy(send_buffer,"S12\r\n");
  320. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  321. if(result!=STATE_OK)
  322. return result;
  323. if(atoi(recv_buffer)==1)
  324. result=STATE_OK;
  325. else
  326. result=STATE_WARNING;
  327. output_message = ssprintf(output_message,"Logins are %s",(result==STATE_OK)?"enabled":"disabled");
  328. /* check packet receive buffers */
  329. } else if (vars_to_check==CHECK_UPRB || vars_to_check==CHECK_PUPRB) {
  330. send_buffer = ssprintf(send_buffer,"S15\r\n",volume_name);
  331. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  332. if(result!=STATE_OK)
  333. return result;
  334. used_packet_receive_buffers=atoi(recv_buffer);
  335. send_buffer = ssprintf(send_buffer,"S16\r\n",volume_name);
  336. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  337. if(result!=STATE_OK)
  338. return result;
  339. max_packet_receive_buffers=atoi(recv_buffer);
  340. percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0);
  341. if(vars_to_check==CHECK_UPRB){
  342. if(check_critical_value==TRUE && used_packet_receive_buffers >= critical_value)
  343. result=STATE_CRITICAL;
  344. else if(check_warning_value==TRUE && used_packet_receive_buffers >= warning_value)
  345. result=STATE_WARNING;
  346. } else {
  347. if(check_critical_value==TRUE && percent_used_packet_receive_buffers >= critical_value)
  348. result=STATE_CRITICAL;
  349. else if(check_warning_value==TRUE && percent_used_packet_receive_buffers >= warning_value)
  350. result=STATE_WARNING;
  351. }
  352. 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);
  353. /* check SAP table entries */
  354. } else if (vars_to_check==CHECK_SAPENTRIES) {
  355. if(sap_number==-1)
  356. send_buffer = ssprintf(send_buffer,"S9\r\n");
  357. else
  358. send_buffer = ssprintf(send_buffer,"S9.%d\r\n",sap_number);
  359. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  360. if(result!=STATE_OK)
  361. return result;
  362. sap_entries=atoi(recv_buffer);
  363. if(check_critical_value==TRUE && sap_entries >= critical_value)
  364. result=STATE_CRITICAL;
  365. else if(check_warning_value==TRUE && sap_entries >= warning_value)
  366. result=STATE_WARNING;
  367. if(sap_number==-1)
  368. output_message = ssprintf(output_message,"%d entries in SAP table",sap_entries);
  369. else
  370. output_message = ssprintf(output_message,"%d entries in SAP table for SAP type %d",sap_entries,sap_number);
  371. /* check KB purgeable space on volume */
  372. } else if (vars_to_check==CHECK_VKP) {
  373. send_buffer = ssprintf(send_buffer,"VKP%s\r\n",volume_name);
  374. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  375. if(result!=STATE_OK)
  376. return result;
  377. if (!strcmp(recv_buffer,"-1\n")) {
  378. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  379. result=STATE_CRITICAL;
  380. } else {
  381. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  382. if(check_critical_value==TRUE && purgeable_disk_space >= critical_value)
  383. result=STATE_CRITICAL;
  384. else if(check_warning_value==TRUE && purgeable_disk_space >= warning_value)
  385. result=STATE_WARNING;
  386. output_message = ssprintf(output_message,"%s%lu KB purgeable on volume %s",(result==STATE_OK)?"":"Only ",purgeable_disk_space,volume_name);
  387. }
  388. /* check % purgeable space on volume */
  389. } else if (vars_to_check==CHECK_VPP) {
  390. send_buffer = ssprintf(send_buffer,"VKP%s\r\n",volume_name);
  391. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  392. if(result!=STATE_OK)
  393. return result;
  394. if(!strcmp(recv_buffer,"-1\n")){
  395. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  396. result=STATE_CRITICAL;
  397. } else {
  398. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  399. send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
  400. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  401. if(result!=STATE_OK)
  402. return result;
  403. total_disk_space=strtoul(recv_buffer,NULL,10);
  404. percent_purgeable_space=(int)(((double)purgeable_disk_space/(double)total_disk_space)*100.0);
  405. if(check_critical_value==TRUE && percent_purgeable_space >= critical_value)
  406. result=STATE_CRITICAL;
  407. else if(check_warning_value==TRUE && percent_purgeable_space >= warning_value)
  408. result=STATE_WARNING;
  409. purgeable_disk_space/=1024;
  410. output_message = ssprintf(output_message,"%lu MB (%d%%) purgeable on volume %s",purgeable_disk_space,percent_purgeable_space,volume_name);
  411. }
  412. /* check KB not yet purgeable space on volume */
  413. } else if (vars_to_check==CHECK_VKNP) {
  414. send_buffer = ssprintf(send_buffer,"VKNP%s\r\n",volume_name);
  415. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  416. if(result!=STATE_OK)
  417. return result;
  418. if (!strcmp(recv_buffer,"-1\n")) {
  419. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  420. result=STATE_CRITICAL;
  421. } else {
  422. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  423. if(check_critical_value==TRUE && non_purgeable_disk_space >= critical_value)
  424. result=STATE_CRITICAL;
  425. else if(check_warning_value==TRUE && non_purgeable_disk_space >= warning_value)
  426. result=STATE_WARNING;
  427. output_message = ssprintf(output_message,"%s%lu KB not yet purgeable on volume %s",(result==STATE_OK)?"":"Only ",non_purgeable_disk_space,volume_name);
  428. }
  429. /* check % not yet purgeable space on volume */
  430. } else if (vars_to_check==CHECK_VPNP) {
  431. send_buffer = ssprintf(send_buffer,"VKNP%s\r\n",volume_name);
  432. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  433. if(result!=STATE_OK)
  434. return result;
  435. if(!strcmp(recv_buffer,"-1\n")){
  436. output_message = ssprintf(output_message,"Error: Volume '%s' does not exist!",volume_name);
  437. result=STATE_CRITICAL;
  438. } else {
  439. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  440. send_buffer = ssprintf(send_buffer,"VKS%s\r\n",volume_name);
  441. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  442. if(result!=STATE_OK)
  443. return result;
  444. total_disk_space=strtoul(recv_buffer,NULL,10);
  445. percent_non_purgeable_space=(int)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0);
  446. if(check_critical_value==TRUE && percent_non_purgeable_space >= critical_value)
  447. result=STATE_CRITICAL;
  448. else if(check_warning_value==TRUE && percent_non_purgeable_space >= warning_value)
  449. result=STATE_WARNING;
  450. purgeable_disk_space/=1024;
  451. output_message = ssprintf(output_message,"%lu MB (%d%%) not yet purgeable on volume %s",non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
  452. }
  453. /* check # of open files */
  454. } else if (vars_to_check==CHECK_OFILES) {
  455. send_buffer = ssprintf(send_buffer,"S18\r\n");
  456. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  457. if(result!=STATE_OK)
  458. return result;
  459. open_files=atoi(recv_buffer);
  460. if(check_critical_value==TRUE && open_files >= critical_value)
  461. result=STATE_CRITICAL;
  462. else if(check_warning_value==TRUE && open_files >= warning_value)
  463. result=STATE_WARNING;
  464. output_message = ssprintf(output_message,"%d open files",open_files);
  465. /* check # of abended threads (Netware 5.x only) */
  466. } else if (vars_to_check==CHECK_ABENDS) {
  467. send_buffer = ssprintf(send_buffer,"S17\r\n");
  468. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  469. if(result!=STATE_OK)
  470. return result;
  471. abended_threads=atoi(recv_buffer);
  472. if(check_critical_value==TRUE && abended_threads >= critical_value)
  473. result=STATE_CRITICAL;
  474. else if(check_warning_value==TRUE && abended_threads >= warning_value)
  475. result=STATE_WARNING;
  476. output_message = ssprintf(output_message,"%d abended threads",abended_threads);
  477. /* check # of current service processes (Netware 5.x only) */
  478. } else if (vars_to_check==CHECK_CSPROCS) {
  479. send_buffer = ssprintf(send_buffer,"S20\r\n");
  480. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  481. if(result!=STATE_OK)
  482. return result;
  483. max_service_processes=atoi(recv_buffer);
  484. send_buffer = ssprintf(send_buffer,"S21\r\n");
  485. result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer));
  486. if(result!=STATE_OK)
  487. return result;
  488. current_service_processes=atoi(recv_buffer);
  489. if(check_critical_value==TRUE && current_service_processes >= critical_value)
  490. result=STATE_CRITICAL;
  491. else if(check_warning_value==TRUE && current_service_processes >= warning_value)
  492. result=STATE_WARNING;
  493. output_message = ssprintf(output_message,"%d current service processes (%d max)",current_service_processes,max_service_processes);
  494. } else {
  495. output_message = strscpy(output_message,"Nothing to check!\n");
  496. result=STATE_UNKNOWN;
  497. }
  498. /* reset timeout */
  499. alarm(0);
  500. printf("%s%s\n",netware_version,output_message);
  501. return result;
  502. }
  503. /* process command-line arguments */
  504. int process_arguments(int argc, char **argv){
  505. int c;
  506. #ifdef HAVE_GETOPT_H
  507. int option_index = 0;
  508. static struct option long_options[] =
  509. {
  510. {"port", required_argument,0,'p'},
  511. {"timeout", required_argument,0,'t'},
  512. {"critical", required_argument,0,'c'},
  513. {"warning", required_argument,0,'w'},
  514. {"variable", required_argument,0,'v'},
  515. {"hostname", required_argument,0,'H'},
  516. {"osversion",no_argument, 0,'o'},
  517. {"version", no_argument, 0,'V'},
  518. {"help", no_argument, 0,'h'},
  519. {0,0,0,0}
  520. };
  521. #endif
  522. /* no options were supplied */
  523. if(argc<2) return ERROR;
  524. /* backwards compatibility */
  525. if (! is_option(argv[1])) {
  526. server_address=argv[1];
  527. argv[1]=argv[0];
  528. argv=&argv[1];
  529. argc--;
  530. }
  531. for (c=1;c<argc;c++) {
  532. if(strcmp("-to",argv[c])==0)
  533. strcpy(argv[c],"-t");
  534. else if (strcmp("-wv",argv[c])==0)
  535. strcpy(argv[c],"-w");
  536. else if (strcmp("-cv",argv[c])==0)
  537. strcpy(argv[c],"-c");
  538. }
  539. while (1){
  540. #ifdef HAVE_GETOPT_H
  541. c = getopt_long(argc,argv,"+hoVH:t:c:w:p:v:",long_options,&option_index);
  542. #else
  543. c = getopt(argc,argv,"+hoVH:t:c:w:p:v:");
  544. #endif
  545. if (c==-1||c==EOF||c==1)
  546. break;
  547. switch (c)
  548. {
  549. case '?': /* print short usage statement if args not parsable */
  550. printf("%s: Unknown argument: %s\n\n",my_basename(argv[0]),optarg);
  551. print_usage();
  552. exit(STATE_UNKNOWN);
  553. case 'h': /* help */
  554. print_help();
  555. exit(STATE_OK);
  556. case 'V': /* version */
  557. print_revision(my_basename(argv[0]),"$Revision$");
  558. exit(STATE_OK);
  559. case 'H': /* hostname */
  560. server_address=optarg;
  561. break;
  562. case 'o': /* display nos version */
  563. check_netware_version=TRUE;
  564. break;
  565. case 'p': /* port */
  566. if (is_intnonneg(optarg))
  567. server_port=atoi(optarg);
  568. else
  569. terminate(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",PROGNAME);
  570. break;
  571. case 'v':
  572. if(strlen(optarg)<3)
  573. return ERROR;
  574. if(!strcmp(optarg,"LOAD1"))
  575. vars_to_check=CHECK_LOAD1;
  576. else if(!strcmp(optarg,"LOAD5"))
  577. vars_to_check=CHECK_LOAD5;
  578. else if(!strcmp(optarg,"LOAD15"))
  579. vars_to_check=CHECK_LOAD15;
  580. else if(!strcmp(optarg,"CONNS"))
  581. vars_to_check=CHECK_CONNS;
  582. else if(!strcmp(optarg,"LTCH"))
  583. vars_to_check=CHECK_LTCH;
  584. else if(!strcmp(optarg,"CBUFF"))
  585. vars_to_check=CHECK_CBUFF;
  586. else if(!strcmp(optarg,"CDBUFF"))
  587. vars_to_check=CHECK_CDBUFF;
  588. else if(!strcmp(optarg,"LRUM"))
  589. vars_to_check=CHECK_LRUM;
  590. else if(strncmp(optarg,"VPF",3)==0){
  591. vars_to_check=CHECK_VPF;
  592. volume_name = strscpy(volume_name,optarg+3);
  593. if(!strcmp(volume_name,""))
  594. volume_name = strscpy(volume_name,"SYS");
  595. }
  596. else if(strncmp(optarg,"VKF",3)==0){
  597. vars_to_check=CHECK_VKF;
  598. volume_name = strscpy(volume_name,optarg+3);
  599. if(!strcmp(volume_name,""))
  600. volume_name = strscpy(volume_name,"SYS");
  601. }
  602. else if(!strcmp(optarg,"DSDB"))
  603. vars_to_check=CHECK_DSDB;
  604. else if(!strcmp(optarg,"LOGINS"))
  605. vars_to_check=CHECK_LOGINS;
  606. else if(!strcmp(optarg,"UPRB"))
  607. vars_to_check=CHECK_UPRB;
  608. else if(!strcmp(optarg,"PUPRB"))
  609. vars_to_check=CHECK_PUPRB;
  610. else if(!strncmp(optarg,"SAPENTRIES",10)){
  611. vars_to_check=CHECK_SAPENTRIES;
  612. if(strlen(optarg)>10)
  613. sap_number=atoi(optarg+10);
  614. else
  615. sap_number=-1;
  616. }
  617. else if(!strcmp(optarg,"OFILES"))
  618. vars_to_check=CHECK_OFILES;
  619. else if(strncmp(optarg,"VKP",3)==0){
  620. vars_to_check=CHECK_VKP;
  621. volume_name = strscpy(volume_name,optarg+3);
  622. if(!strcmp(volume_name,""))
  623. volume_name = strscpy(volume_name,"SYS");
  624. }
  625. else if(strncmp(optarg,"VPP",3)==0){
  626. vars_to_check=CHECK_VPP;
  627. volume_name = strscpy(volume_name,optarg+3);
  628. if(!strcmp(volume_name,""))
  629. volume_name = strscpy(volume_name,"SYS");
  630. }
  631. else if(strncmp(optarg,"VKNP",4)==0){
  632. vars_to_check=CHECK_VKNP;
  633. volume_name = strscpy(volume_name,optarg+4);
  634. if(!strcmp(volume_name,""))
  635. volume_name = strscpy(volume_name,"SYS");
  636. }
  637. else if(strncmp(optarg,"VPNP",4)==0){
  638. vars_to_check=CHECK_VPNP;
  639. volume_name = strscpy(volume_name,optarg+4);
  640. if(!strcmp(volume_name,""))
  641. volume_name = strscpy(volume_name,"SYS");
  642. }
  643. else if(!strcmp(optarg,"ABENDS"))
  644. vars_to_check=CHECK_ABENDS;
  645. else if(!strcmp(optarg,"CSPROCS"))
  646. vars_to_check=CHECK_CSPROCS;
  647. else
  648. return ERROR;
  649. break;
  650. case 'w': /* warning threshold */
  651. warning_value=strtoul(optarg,NULL,10);
  652. check_warning_value=TRUE;
  653. break;
  654. case 'c': /* critical threshold */
  655. critical_value=strtoul(optarg,NULL,10);
  656. check_critical_value=TRUE;
  657. break;
  658. case 't': /* timeout */
  659. socket_timeout=atoi(optarg);
  660. if(socket_timeout<=0)
  661. return ERROR;
  662. }
  663. }
  664. return OK;
  665. }
  666. void print_usage(void)
  667. {
  668. printf
  669. ("Usage:\n"
  670. " %s %s\n"
  671. #ifdef HAVE_GETOPT_H
  672. " %s (-h | --help) for detailed help\n"
  673. " %s (-V | --version) for version information\n",
  674. #else
  675. " %s -h for detailed help\n"
  676. " %s -V for version information\n",
  677. #endif
  678. PROGNAME, OPTIONS, PROGNAME, PROGNAME);
  679. }
  680. void print_help(void)
  681. {
  682. print_revision (PROGNAME, REVISION);
  683. printf ("%s\n\n%s\n", COPYRIGHT, SUMMARY);
  684. print_usage();
  685. printf
  686. ("\nOptions:\n" LONGOPTIONS "\n" DESCRIPTION "\n",
  687. PORT, DEFAULT_SOCKET_TIMEOUT);
  688. support ();
  689. }