4
0

check_nwstat.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680
  1. /*****************************************************************************
  2. *
  3. * Nagios check_nwstat plugin
  4. *
  5. * License: GPL
  6. * Copyright (c) 2000-2014 Nagios Plugins Development Team
  7. *
  8. * Description:
  9. *
  10. * This file contains the check_nwstat plugin
  11. *
  12. * This plugin attempts to contact the MRTGEXT NLM running on a
  13. * Novell server to gather the requested system information.
  14. *
  15. *
  16. * This program is free software: you can redistribute it and/or modify
  17. * it under the terms of the GNU General Public License as published by
  18. * the Free Software Foundation, either version 3 of the License, or
  19. * (at your option) any later version.
  20. *
  21. * This program is distributed in the hope that it will be useful,
  22. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. * GNU General Public License for more details.
  25. *
  26. * You should have received a copy of the GNU General Public License
  27. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  28. *
  29. *
  30. *****************************************************************************/
  31. const char *progname = "check_nwstat";
  32. const char *copyright = "2000-2014";
  33. const char *email = "devel@nagios-plugins.org";
  34. #include "common.h"
  35. #include "netutils.h"
  36. #include "utils.h"
  37. enum checkvar {
  38. NONE,
  39. LOAD1, /* check 1 minute CPU load */
  40. LOAD5, /* check 5 minute CPU load */
  41. LOAD15, /* check 15 minute CPU load */
  42. CONNS, /* check number of connections */
  43. VPF, /* check % free space on volume */
  44. VMF, /* check MB free space on volume */
  45. VMU, /* check MB used space on volume */
  46. VMP, /* check MB purgeable space on volume */
  47. VKF, /* check KB free space on volume */
  48. LTCH, /* check long-term cache hit percentage */
  49. CBUFF, /* check total cache buffers */
  50. CDBUFF, /* check dirty cache buffers */
  51. LRUM, /* check LRU sitting time in minutes */
  52. DSDB, /* check to see if DS Database is open */
  53. LOGINS, /* check to see if logins are enabled */
  54. NRMH, /* check to see NRM Health Status */
  55. PUPRB, /* check % of used packet receive buffers */
  56. UPRB, /* check used packet receive buffers */
  57. SAPENTRIES, /* check SAP entries */
  58. OFILES, /* check number of open files */
  59. VKP, /* check KB purgeable space on volume */
  60. VPP, /* check % purgeable space on volume */
  61. VKNP, /* check KB not yet purgeable space on volume */
  62. VPNP, /* check % not yet purgeable space on volume */
  63. ABENDS, /* check abended thread count */
  64. CSPROCS, /* check number of current service processes */
  65. TSYNC, /* check timesync status 0=no 1=yes in sync to the network */
  66. LRUS, /* check LRU sitting time in seconds */
  67. DCB, /* check dirty cache buffers as a percentage of the total */
  68. TCB, /* check total cache buffers as a percentage of the original */
  69. DSVER, /* check NDS version */
  70. UPTIME, /* check server uptime */
  71. NLM, /* check NLM loaded */
  72. NRMP, /* check NRM Process Values */
  73. NRMM, /* check NRM Memory Values */
  74. NRMS, /* check NRM Values */
  75. NSS1, /* check Statistics from _Admin:Manage_NSS\GeneralStats.xml */
  76. NSS2, /* check Statistics from _Admin:Manage_NSS\BufferCache.xml */
  77. NSS3, /* check statistics from _Admin:Manage_NSS\NameCache.xml */
  78. NSS4, /* check statistics from _Admin:Manage_NSS\FileStats.xml */
  79. NSS5, /* check statistics from _Admin:Manage_NSS\ObjectCache.xml */
  80. NSS6, /* check statistics from _Admin:Manage_NSS\Thread.xml */
  81. NSS7 /* check statistics from _Admin:Manage_NSS\AuthorizationCache.xml */
  82. };
  83. enum {
  84. PORT = 9999
  85. };
  86. char *server_address=NULL;
  87. char *volume_name=NULL;
  88. char *nlm_name=NULL;
  89. char *nrmp_name=NULL;
  90. char *nrmm_name=NULL;
  91. char *nrms_name=NULL;
  92. char *nss1_name=NULL;
  93. char *nss2_name=NULL;
  94. char *nss3_name=NULL;
  95. char *nss4_name=NULL;
  96. char *nss5_name=NULL;
  97. char *nss6_name=NULL;
  98. char *nss7_name=NULL;
  99. int server_port=PORT;
  100. unsigned long warning_value=0L;
  101. unsigned long critical_value=0L;
  102. int check_warning_value=FALSE;
  103. int check_critical_value=FALSE;
  104. int check_netware_version=FALSE;
  105. enum checkvar vars_to_check = NONE;
  106. int sap_number=-1;
  107. int process_arguments(int, char **);
  108. void print_help(void);
  109. void print_usage(void);
  110. int
  111. main(int argc, char **argv) {
  112. int result = STATE_UNKNOWN;
  113. int sd;
  114. char *send_buffer=NULL;
  115. char recv_buffer[MAX_INPUT_BUFFER];
  116. char *output_message=NULL;
  117. char *temp_buffer=NULL;
  118. char *netware_version=NULL;
  119. int time_sync_status=0;
  120. int nrm_health_status=0;
  121. unsigned long total_cache_buffers=0;
  122. unsigned long dirty_cache_buffers=0;
  123. unsigned long open_files=0;
  124. unsigned long abended_threads=0;
  125. unsigned long max_service_processes=0;
  126. unsigned long current_service_processes=0;
  127. unsigned long free_disk_space=0L;
  128. unsigned long nrmp_value=0L;
  129. unsigned long nrmm_value=0L;
  130. unsigned long nrms_value=0L;
  131. unsigned long nss1_value=0L;
  132. unsigned long nss2_value=0L;
  133. unsigned long nss3_value=0L;
  134. unsigned long nss4_value=0L;
  135. unsigned long nss5_value=0L;
  136. unsigned long nss6_value=0L;
  137. unsigned long nss7_value=0L;
  138. unsigned long total_disk_space=0L;
  139. unsigned long purgeable_disk_space=0L;
  140. unsigned long non_purgeable_disk_space=0L;
  141. unsigned long percent_free_space=0;
  142. unsigned long percent_purgeable_space=0;
  143. unsigned long percent_non_purgeable_space=0;
  144. unsigned long current_connections=0L;
  145. unsigned long utilization=0L;
  146. unsigned long cache_hits=0;
  147. unsigned long cache_buffers=0L;
  148. unsigned long lru_time=0L;
  149. unsigned long max_packet_receive_buffers=0;
  150. unsigned long used_packet_receive_buffers=0;
  151. unsigned long percent_used_packet_receive_buffers=0L;
  152. unsigned long sap_entries=0;
  153. char uptime[MAX_INPUT_BUFFER];
  154. setlocale (LC_ALL, "");
  155. bindtextdomain (PACKAGE, LOCALEDIR);
  156. textdomain (PACKAGE);
  157. /* Parse extra opts if any */
  158. argv=np_extra_opts(&argc, argv, progname);
  159. if (process_arguments(argc,argv) == ERROR)
  160. usage4 (_("Could not parse arguments"));
  161. /* initialize alarm signal handling */
  162. signal(SIGALRM,socket_timeout_alarm_handler);
  163. /* set socket timeout */
  164. alarm(timeout_interval);
  165. /* open connection */
  166. my_tcp_connect (server_address, server_port, &sd);
  167. /* get OS version string */
  168. if (check_netware_version==TRUE) {
  169. send_buffer = strdup ("S19\r\n");
  170. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  171. if (result!=STATE_OK)
  172. return result;
  173. if (!strcmp(recv_buffer,"-1\n"))
  174. netware_version = strdup("");
  175. else {
  176. recv_buffer[strlen(recv_buffer)-1]=0;
  177. xasprintf (&netware_version,_("NetWare %s: "),recv_buffer);
  178. }
  179. } else
  180. netware_version = strdup("");
  181. /* check CPU load */
  182. if (vars_to_check==LOAD1 || vars_to_check==LOAD5 || vars_to_check==LOAD15) {
  183. switch(vars_to_check) {
  184. case LOAD1:
  185. temp_buffer = strdup ("1");
  186. break;
  187. case LOAD5:
  188. temp_buffer = strdup ("5");
  189. break;
  190. default:
  191. temp_buffer = strdup ("15");
  192. break;
  193. }
  194. close(sd);
  195. my_tcp_connect (server_address, server_port, &sd);
  196. xasprintf (&send_buffer,"UTIL%s\r\n",temp_buffer);
  197. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  198. if (result!=STATE_OK)
  199. return result;
  200. utilization=strtoul(recv_buffer,NULL,10);
  201. close(sd);
  202. my_tcp_connect (server_address, server_port, &sd);
  203. send_buffer = strdup ("UPTIME\r\n");
  204. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  205. if (result!=STATE_OK)
  206. return result;
  207. recv_buffer[strlen(recv_buffer)-1]=0;
  208. sprintf(uptime,_("Up %s,"),recv_buffer);
  209. if (check_critical_value==TRUE && utilization >= critical_value)
  210. result=STATE_CRITICAL;
  211. else if (check_warning_value==TRUE && utilization >= warning_value)
  212. result=STATE_WARNING;
  213. xasprintf (&output_message,
  214. _("Load %s - %s %s-min load average = %lu%%|load%s=%lu;%lu;%lu;0;100"),
  215. state_text(result),
  216. uptime,
  217. temp_buffer,
  218. utilization,
  219. temp_buffer,
  220. utilization,
  221. warning_value,
  222. critical_value);
  223. /* check number of user connections */
  224. } else if (vars_to_check==CONNS) {
  225. close(sd);
  226. my_tcp_connect (server_address, server_port, &sd);
  227. send_buffer = strdup ("CONNECT\r\n");
  228. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  229. if (result!=STATE_OK)
  230. return result;
  231. current_connections=strtoul(recv_buffer,NULL,10);
  232. if (check_critical_value==TRUE && current_connections >= critical_value)
  233. result=STATE_CRITICAL;
  234. else if (check_warning_value==TRUE && current_connections >= warning_value)
  235. result=STATE_WARNING;
  236. xasprintf (&output_message,
  237. _("Conns %s - %lu current connections|Conns=%lu;%lu;%lu;;"),
  238. state_text(result),
  239. current_connections,
  240. current_connections,
  241. warning_value,
  242. critical_value);
  243. /* check % long term cache hits */
  244. } else if (vars_to_check==LTCH) {
  245. close(sd);
  246. my_tcp_connect (server_address, server_port, &sd);
  247. send_buffer = strdup ("S1\r\n");
  248. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  249. if (result!=STATE_OK)
  250. return result;
  251. cache_hits=atoi(recv_buffer);
  252. if (check_critical_value==TRUE && cache_hits <= critical_value)
  253. result=STATE_CRITICAL;
  254. else if (check_warning_value==TRUE && cache_hits <= warning_value)
  255. result=STATE_WARNING;
  256. xasprintf (&output_message,
  257. _("%s: Long term cache hits = %lu%%"),
  258. state_text(result),
  259. cache_hits);
  260. /* check cache buffers */
  261. } else if (vars_to_check==CBUFF) {
  262. close(sd);
  263. my_tcp_connect (server_address, server_port, &sd);
  264. send_buffer = strdup ("S2\r\n");
  265. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  266. if (result!=STATE_OK)
  267. return result;
  268. cache_buffers=strtoul(recv_buffer,NULL,10);
  269. if (check_critical_value==TRUE && cache_buffers <= critical_value)
  270. result=STATE_CRITICAL;
  271. else if (check_warning_value==TRUE && cache_buffers <= warning_value)
  272. result=STATE_WARNING;
  273. xasprintf (&output_message,
  274. _("%s: Total cache buffers = %lu|Cachebuffers=%lu;%lu;%lu;;"),
  275. state_text(result),
  276. cache_buffers,
  277. cache_buffers,
  278. warning_value,
  279. critical_value);
  280. /* check dirty cache buffers */
  281. } else if (vars_to_check==CDBUFF) {
  282. close(sd);
  283. my_tcp_connect (server_address, server_port, &sd);
  284. send_buffer = strdup ("S3\r\n");
  285. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  286. if (result!=STATE_OK)
  287. return result;
  288. cache_buffers=strtoul(recv_buffer,NULL,10);
  289. if (check_critical_value==TRUE && cache_buffers >= critical_value)
  290. result=STATE_CRITICAL;
  291. else if (check_warning_value==TRUE && cache_buffers >= warning_value)
  292. result=STATE_WARNING;
  293. xasprintf (&output_message,
  294. _("%s: Dirty cache buffers = %lu|Dirty-Cache-Buffers=%lu;%lu;%lu;;"),
  295. state_text(result),
  296. cache_buffers,
  297. cache_buffers,
  298. warning_value,
  299. critical_value);
  300. /* check LRU sitting time in minutes */
  301. } else if (vars_to_check==LRUM) {
  302. close(sd);
  303. my_tcp_connect (server_address, server_port, &sd);
  304. send_buffer = strdup ("S5\r\n");
  305. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  306. if (result!=STATE_OK)
  307. return result;
  308. lru_time=strtoul(recv_buffer,NULL,10);
  309. if (check_critical_value==TRUE && lru_time <= critical_value)
  310. result=STATE_CRITICAL;
  311. else if (check_warning_value==TRUE && lru_time <= warning_value)
  312. result=STATE_WARNING;
  313. xasprintf (&output_message,
  314. _("%s: LRU sitting time = %lu minutes"),
  315. state_text(result),
  316. lru_time);
  317. /* check KB free space on volume */
  318. } else if (vars_to_check==VKF) {
  319. close(sd);
  320. my_tcp_connect (server_address, server_port, &sd);
  321. xasprintf (&send_buffer,"VKF%s\r\n",volume_name);
  322. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  323. if (result!=STATE_OK)
  324. return result;
  325. if (!strcmp(recv_buffer,"-1\n")) {
  326. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  327. result=STATE_CRITICAL;
  328. } else {
  329. free_disk_space=strtoul(recv_buffer,NULL,10);
  330. if (check_critical_value==TRUE && free_disk_space <= critical_value)
  331. result=STATE_CRITICAL;
  332. else if (check_warning_value==TRUE && free_disk_space <= warning_value)
  333. result=STATE_WARNING;
  334. xasprintf (&output_message,
  335. _("%s%lu KB free on volume %s|KBFree%s=%lu;%lu;%lu;;"),
  336. (result==STATE_OK)?"":_("Only "),
  337. free_disk_space,
  338. volume_name,
  339. volume_name,
  340. free_disk_space,
  341. warning_value,
  342. critical_value);
  343. }
  344. /* check MB free space on volume */
  345. } else if (vars_to_check==VMF) {
  346. xasprintf (&send_buffer,"VMF%s\r\n",volume_name);
  347. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  348. if (result!=STATE_OK)
  349. return result;
  350. if (!strcmp(recv_buffer,"-1\n")) {
  351. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  352. result=STATE_CRITICAL;
  353. } else {
  354. free_disk_space=strtoul(recv_buffer,NULL,10);
  355. if (check_critical_value==TRUE && free_disk_space <= critical_value)
  356. result=STATE_CRITICAL;
  357. else if (check_warning_value==TRUE && free_disk_space <= warning_value)
  358. result=STATE_WARNING;
  359. xasprintf (&output_message,
  360. _("%s%lu MB free on volume %s|MBFree%s=%lu;%lu;%lu;;"),
  361. (result==STATE_OK)?"":_("Only "),
  362. free_disk_space,
  363. volume_name,
  364. volume_name,
  365. free_disk_space,
  366. warning_value,
  367. critical_value);
  368. }
  369. /* check MB used space on volume */
  370. } else if (vars_to_check==VMU) {
  371. xasprintf (&send_buffer,"VMU%s\r\n",volume_name);
  372. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  373. if (result!=STATE_OK)
  374. return result;
  375. if (!strcmp(recv_buffer,"-1\n")) {
  376. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  377. result=STATE_CRITICAL;
  378. } else {
  379. free_disk_space=strtoul(recv_buffer,NULL,10);
  380. if (check_critical_value==TRUE && free_disk_space <= critical_value)
  381. result=STATE_CRITICAL;
  382. else if (check_warning_value==TRUE && free_disk_space <= warning_value)
  383. result=STATE_WARNING;
  384. xasprintf (&output_message,
  385. _("%s%lu MB used on volume %s|MBUsed%s=%lu;%lu;%lu;;"),
  386. (result==STATE_OK)?"":_("Only "),
  387. free_disk_space,
  388. volume_name,
  389. volume_name,
  390. free_disk_space,
  391. warning_value,
  392. critical_value);
  393. }
  394. /* check % free space on volume */
  395. } else if (vars_to_check==VPF) {
  396. close(sd);
  397. my_tcp_connect (server_address, server_port, &sd);
  398. xasprintf (&send_buffer,"VKF%s\r\n",volume_name);
  399. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  400. if (result!=STATE_OK)
  401. return result;
  402. if (!strcmp(recv_buffer,"-1\n")) {
  403. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  404. result=STATE_CRITICAL;
  405. } else {
  406. free_disk_space=strtoul(recv_buffer,NULL,10);
  407. close(sd);
  408. my_tcp_connect (server_address, server_port, &sd);
  409. xasprintf (&send_buffer,"VKS%s\r\n",volume_name);
  410. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  411. if (result!=STATE_OK)
  412. return result;
  413. total_disk_space=strtoul(recv_buffer,NULL,10);
  414. percent_free_space=(unsigned long)(((double)free_disk_space/(double)total_disk_space)*100.0);
  415. if (check_critical_value==TRUE && percent_free_space <= critical_value)
  416. result=STATE_CRITICAL;
  417. else if (check_warning_value==TRUE && percent_free_space <= warning_value)
  418. result=STATE_WARNING;
  419. free_disk_space/=1024;
  420. total_disk_space/=1024;
  421. xasprintf (&output_message,_("%lu MB (%lu%%) free on volume %s - total %lu MB|FreeMB%s=%lu;%lu;%lu;0;100"),
  422. free_disk_space,
  423. percent_free_space,
  424. volume_name,
  425. total_disk_space,
  426. volume_name,
  427. percent_free_space,
  428. warning_value,
  429. critical_value
  430. );
  431. }
  432. /* check to see if DS Database is open or closed */
  433. } else if (vars_to_check==DSDB) {
  434. close(sd);
  435. my_tcp_connect (server_address, server_port, &sd);
  436. send_buffer = strdup ("S11\r\n");
  437. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  438. if (result!=STATE_OK)
  439. return result;
  440. close(sd);
  441. my_tcp_connect (server_address, server_port, &sd);
  442. send_buffer = strdup ("S13\r\n");
  443. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  444. temp_buffer=strtok(recv_buffer,"\r\n");
  445. xasprintf (&output_message,_("Directory Services Database is %s (DS version %s)"),(result==STATE_OK)?"open":"closed",temp_buffer);
  446. /* check to see if logins are enabled */
  447. } else if (vars_to_check==LOGINS) {
  448. close(sd);
  449. my_tcp_connect (server_address, server_port, &sd);
  450. send_buffer = strdup ("S12\r\n");
  451. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  452. if (result!=STATE_OK)
  453. return result;
  454. if (atoi(recv_buffer)==1)
  455. result=STATE_OK;
  456. else
  457. result=STATE_WARNING;
  458. xasprintf (&output_message,_("Logins are %s"),(result==STATE_OK)?_("enabled"):_("disabled"));
  459. /* check NRM Health Status Summary*/
  460. } else if (vars_to_check==NRMH) {
  461. xasprintf (&send_buffer,"NRMH\r\n");
  462. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  463. if (result!=STATE_OK)
  464. return result;
  465. nrm_health_status=atoi(recv_buffer);
  466. if (nrm_health_status==2) {
  467. result=STATE_OK;
  468. xasprintf (&output_message,_("CRITICAL - NRM Status is bad!"));
  469. }
  470. else {
  471. if (nrm_health_status==1) {
  472. result=STATE_WARNING;
  473. xasprintf (&output_message,_("Warning - NRM Status is suspect!"));
  474. }
  475. xasprintf (&output_message,_("OK - NRM Status is good!"));
  476. }
  477. /* check packet receive buffers */
  478. } else if (vars_to_check==UPRB || vars_to_check==PUPRB) {
  479. close(sd);
  480. my_tcp_connect (server_address, server_port, &sd);
  481. xasprintf (&send_buffer,"S15\r\n");
  482. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  483. if (result!=STATE_OK)
  484. return result;
  485. used_packet_receive_buffers=atoi(recv_buffer);
  486. close(sd);
  487. my_tcp_connect (server_address, server_port, &sd);
  488. xasprintf (&send_buffer,"S16\r\n");
  489. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  490. if (result!=STATE_OK)
  491. return result;
  492. max_packet_receive_buffers=atoi(recv_buffer);
  493. percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0);
  494. if (vars_to_check==UPRB) {
  495. if (check_critical_value==TRUE && used_packet_receive_buffers >= critical_value)
  496. result=STATE_CRITICAL;
  497. else if (check_warning_value==TRUE && used_packet_receive_buffers >= warning_value)
  498. result=STATE_WARNING;
  499. } else {
  500. if (check_critical_value==TRUE && percent_used_packet_receive_buffers >= critical_value)
  501. result=STATE_CRITICAL;
  502. else if (check_warning_value==TRUE && percent_used_packet_receive_buffers >= warning_value)
  503. result=STATE_WARNING;
  504. }
  505. xasprintf (&output_message,_("%lu of %lu (%lu%%) packet receive buffers used"),used_packet_receive_buffers,max_packet_receive_buffers,percent_used_packet_receive_buffers);
  506. /* check SAP table entries */
  507. } else if (vars_to_check==SAPENTRIES) {
  508. close(sd);
  509. my_tcp_connect (server_address, server_port, &sd);
  510. if (sap_number==-1)
  511. xasprintf (&send_buffer,"S9\r\n");
  512. else
  513. xasprintf (&send_buffer,"S9.%d\r\n",sap_number);
  514. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  515. if (result!=STATE_OK)
  516. return result;
  517. sap_entries=atoi(recv_buffer);
  518. if (check_critical_value==TRUE && sap_entries >= critical_value)
  519. result=STATE_CRITICAL;
  520. else if (check_warning_value==TRUE && sap_entries >= warning_value)
  521. result=STATE_WARNING;
  522. if (sap_number==-1)
  523. xasprintf (&output_message,_("%lu entries in SAP table"),sap_entries);
  524. else
  525. xasprintf (&output_message,_("%lu entries in SAP table for SAP type %d"),sap_entries,sap_number);
  526. /* check KB purgeable space on volume */
  527. } else if (vars_to_check==VKP) {
  528. close(sd);
  529. my_tcp_connect (server_address, server_port, &sd);
  530. xasprintf (&send_buffer,"VKP%s\r\n",volume_name);
  531. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  532. if (result!=STATE_OK)
  533. return result;
  534. if (!strcmp(recv_buffer,"-1\n")) {
  535. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  536. result=STATE_CRITICAL;
  537. } else {
  538. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  539. if (check_critical_value==TRUE && purgeable_disk_space >= critical_value)
  540. result=STATE_CRITICAL;
  541. else if (check_warning_value==TRUE && purgeable_disk_space >= warning_value)
  542. result=STATE_WARNING;
  543. xasprintf (&output_message,_("%s%lu KB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"),
  544. (result==STATE_OK)?"":_("Only "),
  545. purgeable_disk_space,
  546. volume_name,
  547. volume_name,
  548. purgeable_disk_space,
  549. warning_value,
  550. critical_value);
  551. }
  552. /* check MB purgeable space on volume */
  553. } else if (vars_to_check==VMP) {
  554. xasprintf (&send_buffer,"VMP%s\r\n",volume_name);
  555. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  556. if (result!=STATE_OK)
  557. return result;
  558. if (!strcmp(recv_buffer,"-1\n")) {
  559. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  560. result=STATE_CRITICAL;
  561. } else {
  562. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  563. if (check_critical_value==TRUE && purgeable_disk_space >= critical_value)
  564. result=STATE_CRITICAL;
  565. else if (check_warning_value==TRUE && purgeable_disk_space >= warning_value)
  566. result=STATE_WARNING;
  567. xasprintf (&output_message,_("%s%lu MB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"),
  568. (result==STATE_OK)?"":_("Only "),
  569. purgeable_disk_space,
  570. volume_name,
  571. volume_name,
  572. purgeable_disk_space,
  573. warning_value,
  574. critical_value);
  575. }
  576. /* check % purgeable space on volume */
  577. } else if (vars_to_check==VPP) {
  578. close(sd);
  579. my_tcp_connect (server_address, server_port, &sd);
  580. xasprintf (&send_buffer,"VKP%s\r\n",volume_name);
  581. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  582. if (result!=STATE_OK)
  583. return result;
  584. if (!strcmp(recv_buffer,"-1\n")) {
  585. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  586. result=STATE_CRITICAL;
  587. } else {
  588. purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  589. close(sd);
  590. my_tcp_connect (server_address, server_port, &sd);
  591. xasprintf (&send_buffer,"VKS%s\r\n",volume_name);
  592. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  593. if (result!=STATE_OK)
  594. return result;
  595. total_disk_space=strtoul(recv_buffer,NULL,10);
  596. percent_purgeable_space=(unsigned long)(((double)purgeable_disk_space/(double)total_disk_space)*100.0);
  597. if (check_critical_value==TRUE && percent_purgeable_space >= critical_value)
  598. result=STATE_CRITICAL;
  599. else if (check_warning_value==TRUE && percent_purgeable_space >= warning_value)
  600. result=STATE_WARNING;
  601. purgeable_disk_space/=1024;
  602. xasprintf (&output_message,_("%lu MB (%lu%%) purgeable on volume %s|Purgeable%s=%lu;%lu;%lu;0;100"),
  603. purgeable_disk_space,
  604. percent_purgeable_space,
  605. volume_name,
  606. volume_name,
  607. percent_purgeable_space,
  608. warning_value,
  609. critical_value
  610. );
  611. }
  612. /* check KB not yet purgeable space on volume */
  613. } else if (vars_to_check==VKNP) {
  614. close(sd);
  615. my_tcp_connect (server_address, server_port, &sd);
  616. xasprintf (&send_buffer,"VKNP%s\r\n",volume_name);
  617. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  618. if (result!=STATE_OK)
  619. return result;
  620. if (!strcmp(recv_buffer,"-1\n")) {
  621. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  622. result=STATE_CRITICAL;
  623. } else {
  624. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  625. if (check_critical_value==TRUE && non_purgeable_disk_space >= critical_value)
  626. result=STATE_CRITICAL;
  627. else if (check_warning_value==TRUE && non_purgeable_disk_space >= warning_value)
  628. result=STATE_WARNING;
  629. xasprintf (&output_message,_("%s%lu KB not yet purgeable on volume %s"),(result==STATE_OK)?"":_("Only "),non_purgeable_disk_space,volume_name);
  630. }
  631. /* check % not yet purgeable space on volume */
  632. } else if (vars_to_check==VPNP) {
  633. close(sd);
  634. my_tcp_connect (server_address, server_port, &sd);
  635. xasprintf (&send_buffer,"VKNP%s\r\n",volume_name);
  636. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  637. if (result!=STATE_OK)
  638. return result;
  639. if (!strcmp(recv_buffer,"-1\n")) {
  640. xasprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
  641. result=STATE_CRITICAL;
  642. } else {
  643. non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
  644. close(sd);
  645. my_tcp_connect (server_address, server_port, &sd);
  646. xasprintf (&send_buffer,"VKS%s\r\n",volume_name);
  647. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  648. if (result!=STATE_OK)
  649. return result;
  650. total_disk_space=strtoul(recv_buffer,NULL,10);
  651. percent_non_purgeable_space=(unsigned long)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0);
  652. if (check_critical_value==TRUE && percent_non_purgeable_space >= critical_value)
  653. result=STATE_CRITICAL;
  654. else if (check_warning_value==TRUE && percent_non_purgeable_space >= warning_value)
  655. result=STATE_WARNING;
  656. xasprintf (&output_message,_("%lu MB (%lu%%) not yet purgeable on volume %s"),non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
  657. }
  658. /* check # of open files */
  659. } else if (vars_to_check==OFILES) {
  660. close(sd);
  661. my_tcp_connect (server_address, server_port, &sd);
  662. xasprintf (&send_buffer,"S18\r\n");
  663. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  664. if (result!=STATE_OK)
  665. return result;
  666. open_files=atoi(recv_buffer);
  667. if (check_critical_value==TRUE && open_files >= critical_value)
  668. result=STATE_CRITICAL;
  669. else if (check_warning_value==TRUE && open_files >= warning_value)
  670. result=STATE_WARNING;
  671. xasprintf (&output_message,_("%lu open files|Openfiles=%lu;%lu;%lu;0,0"),
  672. open_files,
  673. open_files,
  674. warning_value,
  675. critical_value);
  676. /* check # of abended threads (Netware > 5.x only) */
  677. } else if (vars_to_check==ABENDS) {
  678. close(sd);
  679. my_tcp_connect (server_address, server_port, &sd);
  680. xasprintf (&send_buffer,"S17\r\n");
  681. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  682. if (result!=STATE_OK)
  683. return result;
  684. abended_threads=atoi(recv_buffer);
  685. if (check_critical_value==TRUE && abended_threads >= critical_value)
  686. result=STATE_CRITICAL;
  687. else if (check_warning_value==TRUE && abended_threads >= warning_value)
  688. result=STATE_WARNING;
  689. xasprintf (&output_message,_("%lu abended threads|Abends=%lu;%lu;%lu;;"),
  690. abended_threads,
  691. abended_threads,
  692. warning_value,
  693. critical_value);
  694. /* check # of current service processes (Netware 5.x only) */
  695. } else if (vars_to_check==CSPROCS) {
  696. close(sd);
  697. my_tcp_connect (server_address, server_port, &sd);
  698. xasprintf (&send_buffer,"S20\r\n");
  699. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  700. if (result!=STATE_OK)
  701. return result;
  702. max_service_processes=atoi(recv_buffer);
  703. close(sd);
  704. my_tcp_connect (server_address, server_port, &sd);
  705. xasprintf (&send_buffer,"S21\r\n");
  706. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  707. if (result!=STATE_OK)
  708. return result;
  709. current_service_processes=atoi(recv_buffer);
  710. if (check_critical_value==TRUE && current_service_processes >= critical_value)
  711. result=STATE_CRITICAL;
  712. else if (check_warning_value==TRUE && current_service_processes >= warning_value)
  713. result=STATE_WARNING;
  714. xasprintf (&output_message,
  715. _("%lu current service processes (%lu max)|Processes=%lu;%lu;%lu;0;%lu"),
  716. current_service_processes,
  717. max_service_processes,
  718. current_service_processes,
  719. warning_value,
  720. critical_value,
  721. max_service_processes);
  722. /* check # Timesync Status */
  723. } else if (vars_to_check==TSYNC) {
  724. close(sd);
  725. my_tcp_connect (server_address, server_port, &sd);
  726. xasprintf (&send_buffer,"S22\r\n");
  727. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  728. if (result!=STATE_OK)
  729. return result;
  730. time_sync_status=atoi(recv_buffer);
  731. if (time_sync_status==0) {
  732. result=STATE_CRITICAL;
  733. xasprintf (&output_message,_("CRITICAL - Time not in sync with network!"));
  734. }
  735. else {
  736. xasprintf (&output_message,_("OK - Time in sync with network!"));
  737. }
  738. /* check LRU sitting time in secondss */
  739. } else if (vars_to_check==LRUS) {
  740. close(sd);
  741. my_tcp_connect (server_address, server_port, &sd);
  742. send_buffer = strdup ("S4\r\n");
  743. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  744. if (result!=STATE_OK)
  745. return result;
  746. lru_time=strtoul(recv_buffer,NULL,10);
  747. if (check_critical_value==TRUE && lru_time <= critical_value)
  748. result=STATE_CRITICAL;
  749. else if (check_warning_value==TRUE && lru_time <= warning_value)
  750. result=STATE_WARNING;
  751. xasprintf (&output_message,_("LRU sitting time = %lu seconds"),lru_time);
  752. /* check % dirty cacheobuffers as a percentage of the total*/
  753. } else if (vars_to_check==DCB) {
  754. close(sd);
  755. my_tcp_connect (server_address, server_port, &sd);
  756. send_buffer = strdup ("S6\r\n");
  757. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  758. if (result!=STATE_OK)
  759. return result;
  760. dirty_cache_buffers=atoi(recv_buffer);
  761. if (check_critical_value==TRUE && dirty_cache_buffers <= critical_value)
  762. result=STATE_CRITICAL;
  763. else if (check_warning_value==TRUE && dirty_cache_buffers <= warning_value)
  764. result=STATE_WARNING;
  765. xasprintf (&output_message,_("Dirty cache buffers = %lu%% of the total|DCB=%lu;%lu;%lu;0;100"),
  766. dirty_cache_buffers,
  767. dirty_cache_buffers,
  768. warning_value,
  769. critical_value);
  770. /* check % total cache buffers as a percentage of the original*/
  771. } else if (vars_to_check==TCB) {
  772. close(sd);
  773. my_tcp_connect (server_address, server_port, &sd);
  774. send_buffer = strdup ("S7\r\n");
  775. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  776. if (result!=STATE_OK)
  777. return result;
  778. total_cache_buffers=atoi(recv_buffer);
  779. if (check_critical_value==TRUE && total_cache_buffers <= critical_value)
  780. result=STATE_CRITICAL;
  781. else if (check_warning_value==TRUE && total_cache_buffers <= warning_value)
  782. result=STATE_WARNING;
  783. xasprintf (&output_message,_("Total cache buffers = %lu%% of the original|TCB=%lu;%lu;%lu;0;100"),
  784. total_cache_buffers,
  785. total_cache_buffers,
  786. warning_value,
  787. critical_value);
  788. } else if (vars_to_check==DSVER) {
  789. close(sd);
  790. my_tcp_connect (server_address, server_port, &sd);
  791. xasprintf (&send_buffer,"S13\r\n");
  792. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  793. if (result!=STATE_OK)
  794. return result;
  795. recv_buffer[strlen(recv_buffer)-1]=0;
  796. xasprintf (&output_message,_("NDS Version %s"),recv_buffer);
  797. } else if (vars_to_check==UPTIME) {
  798. close(sd);
  799. my_tcp_connect (server_address, server_port, &sd);
  800. xasprintf (&send_buffer,"UPTIME\r\n");
  801. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  802. if (result!=STATE_OK)
  803. return result;
  804. recv_buffer[sizeof(recv_buffer)-1]=0;
  805. recv_buffer[strlen(recv_buffer)-1]=0;
  806. xasprintf (&output_message,_("Up %s"),recv_buffer);
  807. } else if (vars_to_check==NLM) {
  808. close(sd);
  809. my_tcp_connect (server_address, server_port, &sd);
  810. xasprintf (&send_buffer,"S24:%s\r\n",nlm_name);
  811. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  812. if (result!=STATE_OK)
  813. return result;
  814. recv_buffer[strlen(recv_buffer)-1]=0;
  815. if (strcmp(recv_buffer,"-1")) {
  816. xasprintf (&output_message,_("Module %s version %s is loaded"),nlm_name,recv_buffer);
  817. } else {
  818. result=STATE_CRITICAL;
  819. xasprintf (&output_message,_("Module %s is not loaded"),nlm_name);
  820. }
  821. } else if (vars_to_check==NRMP) {
  822. xasprintf (&send_buffer,"NRMP:%s\r\n",nrmp_name);
  823. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  824. if (result!=STATE_OK)
  825. return result;
  826. if (!strcmp(recv_buffer,"-1\n")) {
  827. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nrmp_name);
  828. result=STATE_CRITICAL;
  829. } else {
  830. nrmp_value=strtoul(recv_buffer,NULL,10);
  831. if (check_critical_value==TRUE && nrmp_value <= critical_value)
  832. result=STATE_CRITICAL;
  833. else if (check_warning_value==TRUE && nrmp_value <= warning_value)
  834. result=STATE_WARNING;
  835. xasprintf (&output_message,
  836. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  837. nrmp_name,
  838. nrmp_value,
  839. nrmp_name,
  840. nrmp_value,
  841. warning_value,
  842. critical_value);
  843. }
  844. } else if (vars_to_check==NRMM) {
  845. xasprintf (&send_buffer,"NRMM:%s\r\n",nrmm_name);
  846. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  847. if (result!=STATE_OK)
  848. return result;
  849. if (!strcmp(recv_buffer,"-1\n")) {
  850. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nrmm_name);
  851. result=STATE_CRITICAL;
  852. } else {
  853. nrmm_value=strtoul(recv_buffer,NULL,10);
  854. if (check_critical_value==TRUE && nrmm_value <= critical_value)
  855. result=STATE_CRITICAL;
  856. else if (check_warning_value==TRUE && nrmm_value <= warning_value)
  857. result=STATE_WARNING;
  858. xasprintf (&output_message,
  859. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  860. nrmm_name,
  861. nrmm_value,
  862. nrmm_name,
  863. nrmm_value,
  864. warning_value,
  865. critical_value);
  866. }
  867. } else if (vars_to_check==NRMS) {
  868. xasprintf (&send_buffer,"NRMS:%s\r\n",nrms_name);
  869. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  870. if (result!=STATE_OK)
  871. return result;
  872. if (!strcmp(recv_buffer,"-1\n")) {
  873. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nrms_name);
  874. result=STATE_CRITICAL;
  875. } else {
  876. nrms_value=strtoul(recv_buffer,NULL,10);
  877. if (check_critical_value==TRUE && nrms_value >= critical_value)
  878. result=STATE_CRITICAL;
  879. else if (check_warning_value==TRUE && nrms_value >= warning_value)
  880. result=STATE_WARNING;
  881. xasprintf (&output_message,
  882. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  883. nrms_name,
  884. nrms_value,
  885. nrms_name,
  886. nrms_value,
  887. warning_value,
  888. critical_value);
  889. }
  890. } else if (vars_to_check==NSS1) {
  891. xasprintf (&send_buffer,"NSS1:%s\r\n",nss1_name);
  892. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  893. if (result!=STATE_OK)
  894. return result;
  895. if (!strcmp(recv_buffer,"-1\n")) {
  896. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss1_name);
  897. result=STATE_CRITICAL;
  898. } else {
  899. nss1_value=strtoul(recv_buffer,NULL,10);
  900. if (check_critical_value==TRUE && nss1_value >= critical_value)
  901. result=STATE_CRITICAL;
  902. else if (check_warning_value==TRUE && nss1_value >= warning_value)
  903. result=STATE_WARNING;
  904. xasprintf (&output_message,
  905. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  906. nss1_name,
  907. nss1_value,
  908. nss1_name,
  909. nss1_value,
  910. warning_value,
  911. critical_value);
  912. }
  913. } else if (vars_to_check==NSS2) {
  914. xasprintf (&send_buffer,"NSS2:%s\r\n",nss2_name);
  915. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  916. if (result!=STATE_OK)
  917. return result;
  918. if (!strcmp(recv_buffer,"-1\n")) {
  919. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss2_name);
  920. result=STATE_CRITICAL;
  921. } else {
  922. nss2_value=strtoul(recv_buffer,NULL,10);
  923. if (check_critical_value==TRUE && nss2_value >= critical_value)
  924. result=STATE_CRITICAL;
  925. else if (check_warning_value==TRUE && nss2_value >= warning_value)
  926. result=STATE_WARNING;
  927. xasprintf (&output_message,
  928. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  929. nss2_name,
  930. nss2_value,
  931. nss2_name,
  932. nss2_value,
  933. warning_value,
  934. critical_value);
  935. }
  936. } else if (vars_to_check==NSS3) {
  937. xasprintf (&send_buffer,"NSS3:%s\r\n",nss3_name);
  938. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  939. if (result!=STATE_OK)
  940. return result;
  941. if (!strcmp(recv_buffer,"-1\n")) {
  942. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss3_name);
  943. result=STATE_CRITICAL;
  944. } else {
  945. nss3_value=strtoul(recv_buffer,NULL,10);
  946. if (check_critical_value==TRUE && nss3_value >= critical_value)
  947. result=STATE_CRITICAL;
  948. else if (check_warning_value==TRUE && nss3_value >= warning_value)
  949. result=STATE_WARNING;
  950. xasprintf (&output_message,
  951. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  952. nss3_name,
  953. nss3_value,
  954. nss3_name,
  955. nss3_value,
  956. warning_value,
  957. critical_value);
  958. }
  959. } else if (vars_to_check==NSS4) {
  960. xasprintf (&send_buffer,"NSS4:%s\r\n",nss4_name);
  961. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  962. if (result!=STATE_OK)
  963. return result;
  964. if (!strcmp(recv_buffer,"-1\n")) {
  965. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss4_name);
  966. result=STATE_CRITICAL;
  967. } else {
  968. nss4_value=strtoul(recv_buffer,NULL,10);
  969. if (check_critical_value==TRUE && nss4_value >= critical_value)
  970. result=STATE_CRITICAL;
  971. else if (check_warning_value==TRUE && nss4_value >= warning_value)
  972. result=STATE_WARNING;
  973. xasprintf (&output_message,
  974. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  975. nss4_name,
  976. nss4_value,
  977. nss4_name,
  978. nss4_value,
  979. warning_value,
  980. critical_value);
  981. }
  982. } else if (vars_to_check==NSS5) {
  983. xasprintf (&send_buffer,"NSS5:%s\r\n",nss5_name);
  984. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  985. if (result!=STATE_OK)
  986. return result;
  987. if (!strcmp(recv_buffer,"-1\n")) {
  988. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss5_name);
  989. result=STATE_CRITICAL;
  990. } else {
  991. nss5_value=strtoul(recv_buffer,NULL,10);
  992. if (check_critical_value==TRUE && nss5_value >= critical_value)
  993. result=STATE_CRITICAL;
  994. else if (check_warning_value==TRUE && nss5_value >= warning_value)
  995. result=STATE_WARNING;
  996. xasprintf (&output_message,
  997. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  998. nss5_name,
  999. nss5_value,
  1000. nss5_name,
  1001. nss5_value,
  1002. warning_value,
  1003. critical_value);
  1004. }
  1005. } else if (vars_to_check==NSS6) {
  1006. xasprintf (&send_buffer,"NSS6:%s\r\n",nss6_name);
  1007. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  1008. if (result!=STATE_OK)
  1009. return result;
  1010. if (!strcmp(recv_buffer,"-1\n")) {
  1011. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss6_name);
  1012. result=STATE_CRITICAL;
  1013. } else {
  1014. nss6_value=strtoul(recv_buffer,NULL,10);
  1015. if (check_critical_value==TRUE && nss6_value >= critical_value)
  1016. result=STATE_CRITICAL;
  1017. else if (check_warning_value==TRUE && nss6_value >= warning_value)
  1018. result=STATE_WARNING;
  1019. xasprintf (&output_message,
  1020. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  1021. nss6_name,
  1022. nss6_value,
  1023. nss6_name,
  1024. nss6_value,
  1025. warning_value,
  1026. critical_value);
  1027. }
  1028. } else if (vars_to_check==NSS7) {
  1029. xasprintf (&send_buffer,"NSS7:%s\r\n",nss7_name);
  1030. result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
  1031. if (result!=STATE_OK)
  1032. return result;
  1033. if (!strcmp(recv_buffer,"-1\n")) {
  1034. xasprintf (&output_message,_("CRITICAL - Value '%s' does not exist!"),nss7_name);
  1035. result=STATE_CRITICAL;
  1036. } else {
  1037. nss7_value=strtoul(recv_buffer,NULL,10);
  1038. if (check_critical_value==TRUE && nss7_value >= critical_value)
  1039. result=STATE_CRITICAL;
  1040. else if (check_warning_value==TRUE && nss7_value >= warning_value)
  1041. result=STATE_WARNING;
  1042. xasprintf (&output_message,
  1043. _("%s is %lu|%s=%lu;%lu;%lu;;"),
  1044. nss7_name,
  1045. nss7_value,
  1046. nss7_name,
  1047. nss7_value,
  1048. warning_value,
  1049. critical_value);
  1050. }
  1051. }
  1052. else {
  1053. output_message = strdup (_("Nothing to check!\n"));
  1054. result=STATE_UNKNOWN;
  1055. }
  1056. close (sd);
  1057. /* reset timeout */
  1058. alarm(0);
  1059. printf("%s%s\n",netware_version,output_message);
  1060. return result;
  1061. }
  1062. /* process command-line arguments */
  1063. int process_arguments(int argc, char **argv) {
  1064. int c;
  1065. int option = 0;
  1066. static struct option longopts[] =
  1067. {
  1068. {"port", required_argument,0,'p'},
  1069. {"timeout", required_argument,0,'t'},
  1070. {"critical", required_argument,0,'c'},
  1071. {"warning", required_argument,0,'w'},
  1072. {"variable", required_argument,0,'v'},
  1073. {"hostname", required_argument,0,'H'},
  1074. {"osversion",no_argument, 0,'o'},
  1075. {"version", no_argument, 0,'V'},
  1076. {"help", no_argument, 0,'h'},
  1077. {0,0,0,0}
  1078. };
  1079. /* no options were supplied */
  1080. if (argc<2) return ERROR;
  1081. /* backwards compatibility */
  1082. if (! is_option(argv[1])) {
  1083. server_address=argv[1];
  1084. argv[1]=argv[0];
  1085. argv=&argv[1];
  1086. argc--;
  1087. }
  1088. for (c=1;c<argc;c++) {
  1089. if (strcmp("-to",argv[c])==0)
  1090. strcpy(argv[c],"-t");
  1091. else if (strcmp("-wv",argv[c])==0)
  1092. strcpy(argv[c],"-w");
  1093. else if (strcmp("-cv",argv[c])==0)
  1094. strcpy(argv[c],"-c");
  1095. }
  1096. while (1) {
  1097. c = getopt_long(argc,argv,"+hoVH:t:c:w:p:v:",longopts,&option);
  1098. if (c==-1||c==EOF||c==1)
  1099. break;
  1100. switch (c)
  1101. {
  1102. case '?': /* print short usage statement if args not parsable */
  1103. usage5 ();
  1104. case 'h': /* help */
  1105. print_help();
  1106. exit(STATE_OK);
  1107. case 'V': /* version */
  1108. print_revision(progname, NP_VERSION);
  1109. exit(STATE_OK);
  1110. case 'H': /* hostname */
  1111. server_address=optarg;
  1112. break;
  1113. case 'o': /* display nos version */
  1114. check_netware_version=TRUE;
  1115. break;
  1116. case 'p': /* port */
  1117. if (is_intnonneg(optarg))
  1118. server_port=atoi(optarg);
  1119. else
  1120. die(STATE_UNKNOWN,_("Server port an integer\n"));
  1121. break;
  1122. case 'v':
  1123. if (strlen(optarg)<3)
  1124. return ERROR;
  1125. if (!strcmp(optarg,"LOAD1"))
  1126. vars_to_check=LOAD1;
  1127. else if (!strcmp(optarg,"LOAD5"))
  1128. vars_to_check=LOAD5;
  1129. else if (!strcmp(optarg,"LOAD15"))
  1130. vars_to_check=LOAD15;
  1131. else if (!strcmp(optarg,"CONNS"))
  1132. vars_to_check=CONNS;
  1133. else if (!strcmp(optarg,"LTCH"))
  1134. vars_to_check=LTCH;
  1135. else if (!strcmp(optarg,"DCB"))
  1136. vars_to_check=DCB;
  1137. else if (!strcmp(optarg,"TCB"))
  1138. vars_to_check=TCB;
  1139. else if (!strcmp(optarg,"CBUFF"))
  1140. vars_to_check=CBUFF;
  1141. else if (!strcmp(optarg,"CDBUFF"))
  1142. vars_to_check=CDBUFF;
  1143. else if (!strcmp(optarg,"LRUM"))
  1144. vars_to_check=LRUM;
  1145. else if (!strcmp(optarg,"LRUS"))
  1146. vars_to_check=LRUS;
  1147. else if (strncmp(optarg,"VPF",3)==0) {
  1148. vars_to_check=VPF;
  1149. volume_name = strdup (optarg+3);
  1150. if (!strcmp(volume_name,""))
  1151. volume_name = strdup ("SYS");
  1152. }
  1153. else if (strncmp(optarg,"VKF",3)==0) {
  1154. vars_to_check=VKF;
  1155. volume_name = strdup (optarg+3);
  1156. if (!strcmp(volume_name,""))
  1157. volume_name = strdup ("SYS");
  1158. }
  1159. else if (strncmp(optarg,"VMF",3)==0) {
  1160. vars_to_check=VMF;
  1161. volume_name = strdup (optarg+3);
  1162. if (!strcmp(volume_name,""))
  1163. volume_name = strdup ("SYS");
  1164. }
  1165. else if (!strcmp(optarg,"DSDB"))
  1166. vars_to_check=DSDB;
  1167. else if (!strcmp(optarg,"LOGINS"))
  1168. vars_to_check=LOGINS;
  1169. else if (!strcmp(optarg,"NRMH"))
  1170. vars_to_check=NRMH;
  1171. else if (!strcmp(optarg,"UPRB"))
  1172. vars_to_check=UPRB;
  1173. else if (!strcmp(optarg,"PUPRB"))
  1174. vars_to_check=PUPRB;
  1175. else if (!strncmp(optarg,"SAPENTRIES",10)) {
  1176. vars_to_check=SAPENTRIES;
  1177. if (strlen(optarg)>10)
  1178. sap_number=atoi(optarg+10);
  1179. else
  1180. sap_number=-1;
  1181. }
  1182. else if (!strcmp(optarg,"OFILES"))
  1183. vars_to_check=OFILES;
  1184. else if (strncmp(optarg,"VKP",3)==0) {
  1185. vars_to_check=VKP;
  1186. volume_name = strdup (optarg+3);
  1187. if (!strcmp(volume_name,""))
  1188. volume_name = strdup ("SYS");
  1189. }
  1190. else if (strncmp(optarg,"VMP",3)==0) {
  1191. vars_to_check=VMP;
  1192. volume_name = strdup (optarg+3);
  1193. if (!strcmp(volume_name,""))
  1194. volume_name = strdup ("SYS");
  1195. }
  1196. else if (strncmp(optarg,"VMU",3)==0) {
  1197. vars_to_check=VMU;
  1198. volume_name = strdup (optarg+3);
  1199. if (!strcmp(volume_name,""))
  1200. volume_name = strdup ("SYS");
  1201. }
  1202. else if (strncmp(optarg,"VPP",3)==0) {
  1203. vars_to_check=VPP;
  1204. volume_name = strdup (optarg+3);
  1205. if (!strcmp(volume_name,""))
  1206. volume_name = strdup ("SYS");
  1207. }
  1208. else if (strncmp(optarg,"VKNP",4)==0) {
  1209. vars_to_check=VKNP;
  1210. volume_name = strdup (optarg+4);
  1211. if (!strcmp(volume_name,""))
  1212. volume_name = strdup ("SYS");
  1213. }
  1214. else if (strncmp(optarg,"VPNP",4)==0) {
  1215. vars_to_check=VPNP;
  1216. volume_name = strdup (optarg+4);
  1217. if (!strcmp(volume_name,""))
  1218. volume_name = strdup("SYS");
  1219. }
  1220. else if (!strcmp(optarg,"ABENDS"))
  1221. vars_to_check=ABENDS;
  1222. else if (!strcmp(optarg,"CSPROCS"))
  1223. vars_to_check=CSPROCS;
  1224. else if (!strcmp(optarg,"TSYNC"))
  1225. vars_to_check=TSYNC;
  1226. else if (!strcmp(optarg,"DSVER"))
  1227. vars_to_check=DSVER;
  1228. else if (!strcmp(optarg,"UPTIME")) {
  1229. vars_to_check=UPTIME;
  1230. }
  1231. else if (strncmp(optarg,"NLM:",4)==0) {
  1232. vars_to_check=NLM;
  1233. nlm_name=strdup (optarg+4);
  1234. }
  1235. else if (strncmp(optarg,"NRMP",4)==0) {
  1236. vars_to_check=NRMP;
  1237. nrmp_name = strdup (optarg+4);
  1238. if (!strcmp(nrmp_name,""))
  1239. nrmp_name = strdup ("AVAILABLE_MEMORY");
  1240. }
  1241. else if (strncmp(optarg,"NRMM",4)==0) {
  1242. vars_to_check=NRMM;
  1243. nrmm_name = strdup (optarg+4);
  1244. if (!strcmp(nrmm_name,""))
  1245. nrmm_name = strdup ("AVAILABLE_CACHE_MEMORY");
  1246. }
  1247. else if (strncmp(optarg,"NRMS",4)==0) {
  1248. vars_to_check=NRMS;
  1249. nrms_name = strdup (optarg+4);
  1250. if (!strcmp(nrms_name,""))
  1251. nrms_name = strdup ("USED_SWAP_SPACE");
  1252. }
  1253. else if (strncmp(optarg,"NSS1",4)==0) {
  1254. vars_to_check=NSS1;
  1255. nss1_name = strdup (optarg+4);
  1256. if (!strcmp(nss1_name,""))
  1257. nss1_name = strdup ("CURRENTBUFFERCACHESIZE");
  1258. }
  1259. else if (strncmp(optarg,"NSS2",4)==0) {
  1260. vars_to_check=NSS2;
  1261. nss2_name = strdup (optarg+4);
  1262. if (!strcmp(nss2_name,""))
  1263. nss2_name = strdup ("CACHEHITS");
  1264. }
  1265. else if (strncmp(optarg,"NSS3",4)==0) {
  1266. vars_to_check=NSS3;
  1267. nss3_name = strdup (optarg+4);
  1268. if (!strcmp(nss3_name,""))
  1269. nss3_name = strdup ("CACHEGITPERCENT");
  1270. }
  1271. else if (strncmp(optarg,"NSS4",4)==0) {
  1272. vars_to_check=NSS4;
  1273. nss4_name = strdup (optarg+4);
  1274. if (!strcmp(nss4_name,""))
  1275. nss4_name = strdup ("CURRENTOPENCOUNT");
  1276. }
  1277. else if (strncmp(optarg,"NSS5",4)==0) {
  1278. vars_to_check=NSS5;
  1279. nss5_name = strdup (optarg+4);
  1280. if (!strcmp(nss5_name,""))
  1281. nss5_name = strdup ("CACHEMISSES");
  1282. }
  1283. else if (strncmp(optarg,"NSS6",4)==0) {
  1284. vars_to_check=NSS6;
  1285. nss6_name = strdup (optarg+4);
  1286. if (!strcmp(nss6_name,""))
  1287. nss6_name = strdup ("PENDINGWORKSCOUNT");
  1288. }
  1289. else if (strncmp(optarg,"NSS7",4)==0) {
  1290. vars_to_check=NSS7;
  1291. nss7_name = strdup (optarg+4);
  1292. if (!strcmp(nss7_name,""))
  1293. nss7_name = strdup ("CACHESIZE");
  1294. }
  1295. else
  1296. return ERROR;
  1297. break;
  1298. case 'w': /* warning threshold */
  1299. warning_value=strtoul(optarg,NULL,10);
  1300. check_warning_value=TRUE;
  1301. break;
  1302. case 'c': /* critical threshold */
  1303. critical_value=strtoul(optarg,NULL,10);
  1304. check_critical_value=TRUE;
  1305. break;
  1306. case 't': /* timeout */
  1307. timeout_interval = parse_timeout_string(optarg);
  1308. }
  1309. }
  1310. return OK;
  1311. }
  1312. void print_help(void)
  1313. {
  1314. char *myport;
  1315. xasprintf (&myport, "%d", PORT);
  1316. print_revision (progname, NP_VERSION);
  1317. printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
  1318. printf (COPYRIGHT, copyright, email);
  1319. printf ("%s\n", _("This plugin attempts to contact the MRTGEXT NLM running on a"));
  1320. printf ("%s\n", _("Novell server to gather the requested system information."));
  1321. printf ("\n\n");
  1322. print_usage();
  1323. printf (UT_HELP_VRSN);
  1324. printf (UT_EXTRA_OPTS);
  1325. printf (UT_HOST_PORT, 'p', myport);
  1326. printf (" %s\n", "-v, --variable=STRING");
  1327. printf (" %s\n", _("Variable to check. Valid variables include:"));
  1328. printf (" %s\n", _("LOAD1 = 1 minute average CPU load"));
  1329. printf (" %s\n", _("LOAD5 = 5 minute average CPU load"));
  1330. printf (" %s\n", _("LOAD15 = 15 minute average CPU load"));
  1331. printf (" %s\n", _("CSPROCS = number of current service processes (NW 5.x only)"));
  1332. printf (" %s\n", _("ABENDS = number of abended threads (NW 5.x only)"));
  1333. printf (" %s\n", _("UPTIME = server uptime"));
  1334. printf (" %s\n", _("LTCH = percent long term cache hits"));
  1335. printf (" %s\n", _("CBUFF = current number of cache buffers"));
  1336. printf (" %s\n", _("CDBUFF = current number of dirty cache buffers"));
  1337. printf (" %s\n", _("DCB = dirty cache buffers as a percentage of the total"));
  1338. printf (" %s\n", _("TCB = dirty cache buffers as a percentage of the original"));
  1339. printf (" %s\n", _("OFILES = number of open files"));
  1340. printf (" %s\n", _(" VMF<vol> = MB of free space on Volume <vol>"));
  1341. printf (" %s\n", _(" VMU<vol> = MB used space on Volume <vol>"));
  1342. printf (" %s\n", _(" VMP<vol> = MB of purgeable space on Volume <vol>"));
  1343. printf (" %s\n", _(" VPF<vol> = percent free space on volume <vol>"));
  1344. printf (" %s\n", _(" VKF<vol> = KB of free space on volume <vol>"));
  1345. printf (" %s\n", _(" VPP<vol> = percent purgeable space on volume <vol>"));
  1346. printf (" %s\n", _(" VKP<vol> = KB of purgeable space on volume <vol>"));
  1347. printf (" %s\n", _(" VPNP<vol> = percent not yet purgeable space on volume <vol>"));
  1348. printf (" %s\n", _(" VKNP<vol> = KB of not yet purgeable space on volume <vol>"));
  1349. printf (" %s\n", _(" LRUM = LRU sitting time in minutes"));
  1350. printf (" %s\n", _(" LRUS = LRU sitting time in seconds"));
  1351. printf (" %s\n", _(" DSDB = check to see if DS Database is open"));
  1352. printf (" %s\n", _(" DSVER = NDS version"));
  1353. printf (" %s\n", _(" UPRB = used packet receive buffers"));
  1354. printf (" %s\n", _(" PUPRB = percent (of max) used packet receive buffers"));
  1355. printf (" %s\n", _(" SAPENTRIES = number of entries in the SAP table"));
  1356. printf (" %s\n", _(" SAPENTRIES<n> = number of entries in the SAP table for SAP type <n>"));
  1357. printf (" %s\n", _(" TSYNC = timesync status"));
  1358. printf (" %s\n", _(" LOGINS = check to see if logins are enabled"));
  1359. printf (" %s\n", _(" CONNS = number of currently licensed connections"));
  1360. printf (" %s\n", _(" NRMH = NRM Summary Status"));
  1361. printf (" %s\n", _(" NRMP<stat> = Returns the current value for a NRM health item"));
  1362. printf (" %s\n", _(" NRMM<stat> = Returns the current memory stats from NRM"));
  1363. printf (" %s\n", _(" NRMS<stat> = Returns the current Swapfile stats from NRM"));
  1364. printf (" %s\n", _(" NSS1<stat> = Statistics from _Admin:Manage_NSS\\GeneralStats.xml"));
  1365. printf (" %s\n", _(" NSS3<stat> = Statistics from _Admin:Manage_NSS\\NameCache.xml"));
  1366. printf (" %s\n", _(" NSS4<stat> = Statistics from _Admin:Manage_NSS\\FileStats.xml"));
  1367. printf (" %s\n", _(" NSS5<stat> = Statistics from _Admin:Manage_NSS\\ObjectCache.xml"));
  1368. printf (" %s\n", _(" NSS6<stat> = Statistics from _Admin:Manage_NSS\\Thread.xml"));
  1369. printf (" %s\n", _(" NSS7<stat> = Statistics from _Admin:Manage_NSS\\AuthorizationCache.xml"));
  1370. printf (" %s\n", _(" NLM:<nlm> = check if NLM is loaded and report version"));
  1371. printf (" %s\n", _(" (e.g. NLM:TSANDS.NLM)"));
  1372. printf ("\n");
  1373. printf (" %s\n", "-w, --warning=INTEGER");
  1374. printf (" %s\n", _("Threshold which will result in a warning status"));
  1375. printf (" %s\n", "-c, --critical=INTEGER");
  1376. printf (" %s\n", _("Threshold which will result in a critical status"));
  1377. printf (" %s\n", "-o, --osversion");
  1378. printf (" %s\n", _("Include server version string in results"));
  1379. printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
  1380. printf ("\n");
  1381. printf ("%s\n", _("Notes:"));
  1382. printf (" %s\n", _("- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"));
  1383. printf (" %s\n", _(" extension for NetWare be loaded on the Novell servers you wish to check."));
  1384. printf (" %s\n", _(" (available from http://www.engr.wisc.edu/~drews/mrtg/)"));
  1385. printf (" %s\n", _("- Values for critical thresholds should be lower than warning thresholds"));
  1386. printf (" %s\n", _(" when the following variables are checked: VPF, VKF, LTCH, CBUFF, DCB, "));
  1387. printf (" %s\n", _(" TCB, LRUS and LRUM."));
  1388. printf (UT_SUPPORT);
  1389. }
  1390. void print_usage(void)
  1391. {
  1392. printf ("%s\n", _("Usage:"));
  1393. printf ("%s -H host [-p port] [-v variable] [-w warning] [-c critical] [-t timeout]\n",progname);
  1394. }