check_nwstat.c 32 KB

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