check_nwstat.c 51 KB

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