nagios.pm 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package Rstat::nagios;
  2. #use v5.28;
  3. use utf8;
  4. use open ":encoding(utf8)";
  5. use strict;
  6. use English;
  7. use FindBin '$Bin';
  8. use lib "$Bin";
  9. use base 'Exporter';
  10. use vars qw(@EXPORT @ISA);
  11. use Rstat::config;
  12. use Rstat::main;
  13. use Rstat::mfi;
  14. use Time::Local;
  15. use Data::Dumper;
  16. @ISA = qw(Exporter);
  17. @EXPORT = qw(
  18. $nag_cmd
  19. nagios_send_command
  20. nagios_host_svc_disable
  21. nagios_host_svc_enable
  22. print_nagios_cfg
  23. );
  24. BEGIN
  25. {
  26. our $nag_cmd = "/var/spool/nagios/cmd/nagios.cmd";
  27. #---------------------------------------------------------------------------------
  28. sub nagios_send_command {
  29. my $command = shift;
  30. next if (!$command);
  31. if (!-e $nag_cmd) { die("Command socket $nag_cmd not found!"); }
  32. log_info("Send command: $command to $nag_cmd");
  33. open(FH, ">> $nag_cmd");
  34. print FH "$command\n";
  35. close(FH);
  36. }
  37. #---------------------------------------------------------------------------------
  38. sub nagios_host_svc_disable {
  39. my $hostname = shift;
  40. my $full = shift || 0;
  41. my $utime = timelocal(localtime());
  42. my $cmd = "[$utime] DISABLE_HOST_SVC_CHECKS;$hostname";
  43. #dont run!!!
  44. #check nagios option work?
  45. #nagios_send_command($cmd);
  46. if ($full) {
  47. $cmd = "[$utime] DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST;$hostname";
  48. nagios_send_command($cmd);
  49. }
  50. $cmd = "[$utime] DISABLE_HOST_SVC_NOTIFICATIONS;$hostname";
  51. nagios_send_command($cmd);
  52. }
  53. #---------------------------------------------------------------------------------
  54. sub nagios_host_svc_enable {
  55. my $hostname = shift;
  56. my $full = shift || 0;
  57. my $utime = timelocal(localtime());
  58. my $cmd = "[$utime] ENABLE_HOST_SVC_CHECKS;$hostname";
  59. nagios_send_command($cmd);
  60. if ($full) {
  61. $cmd = "[$utime] ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST;$hostname";
  62. nagios_send_command($cmd);
  63. }
  64. $cmd = "[$utime] ENABLE_HOST_SVC_NOTIFICATIONS;$hostname";
  65. nagios_send_command($cmd);
  66. }
  67. #---------------------------------------------------------------------------------
  68. sub read_host_template {
  69. my $device = shift;
  70. my $template_file = shift;
  71. my $result;
  72. my @custom_cfg=();
  73. if (-e $template_file) { @custom_cfg = read_file($template_file); }
  74. if (@custom_cfg and scalar(@custom_cfg)) {
  75. foreach my $row (@custom_cfg) {
  76. next if (!$row);
  77. $row=~s/\%HOSTNAME\%/$device->{name}/;
  78. $row=~s/\%HOST\%/$device->{name}/;
  79. $row=~s/\%HOSTIP\%/$device->{ip}/;
  80. push(@{$result->{template}},$row);
  81. if ($row=~/\s+service_description\s+(.*)$/i) { $result->{services}->{$1}=1; }
  82. }
  83. }
  84. return $result;
  85. }
  86. sub print_single_host {
  87. my $device = shift;
  88. my $ping_enable = shift || 0;
  89. my $group = 'any';
  90. my $template = 'generic-host';
  91. my $default_service="local-service";
  92. if ($device->{ou_id} ~~ [4,5,6,8,9,12,15,22,23,24,25,26,27]) {
  93. #12 - WiFi AP
  94. if ($device->{ou_id} eq 12 ) { $group = 'ap'; $template='ap'; }
  95. #4 - VOIP
  96. if ($device->{ou_id} eq 4 ) { $group = 'voip'; $template='voip'; }
  97. #23 - IPAD
  98. if ($device->{ou_id} eq 23 ) { $group = 'KW-GLOBAL/ipads'; $template='ipads'; }
  99. #5 - IPCAM
  100. if ($device->{ou_id} eq 5 ) { $group = 'videocam'; $template='ip-cam'; }
  101. #26 - LAMPS
  102. if ($device->{ou_id} eq 26 ) { $group = 'KW-GLOBAL/lamps'; $template='lamps'; }
  103. #6 - Printers
  104. if ($device->{ou_id} eq 6 ) { $group = 'printers'; $template='printers'; $default_service='printer-service'; }
  105. #27 - PROJECTORS
  106. if ($device->{ou_id} eq 27 ) { $group = 'KW-GLOBAL/proj'; $template='proj'; }
  107. #22 - SGVR
  108. if ($device->{ou_id} eq 22 ) { $group = 'KW-GLOBAL/sgvr'; $template='sgvr'; }
  109. #24 - SPAV
  110. if ($device->{ou_id} eq 24 ) { $group = 'KW-GLOBAL/spav'; $template='ipads2'; }
  111. #25 - STE
  112. if ($device->{ou_id} eq 25 ) { $group = 'KW-GLOBAL/sensors'; $template='ste'; }
  113. #8 - UPS
  114. if ($device->{ou_id} eq 8 ) { $group = 'ups'; $template='ups'; }
  115. #9 - Охрана
  116. if ($device->{ou_id} eq 9 ) { $group = 'security'; $template='security'; }
  117. #15 - mfi
  118. if ($device->{ou_id} eq 15 ) { $group = 'mfi'; $template='mfi'; }
  119. }
  120. my $cfg_file = "/etc/nagios/".$group."/".$device->{name}.".cfg";
  121. open(FH, "> $cfg_file");
  122. print(FH "define host{\n");
  123. print(FH " use $template\n");
  124. print(FH " host_name $device->{name}\n");
  125. print(FH " alias $device->{name}\n");
  126. print(FH " address $device->{ip}\n");
  127. print(FH " _ID $device->{auth_id}\n");
  128. print(FH " _TYPE user\n");
  129. if ($device->{device_model}) {
  130. print(FH " notes $device->{device_model}\n");
  131. }
  132. if ($device->{parent_name}) {
  133. print(FH " parents $device->{parent_name}\n");
  134. }
  135. print(FH " notes_url http://stat.lan.local/admin/users/editauth.php?id=$device->{auth_id}\n");
  136. print(FH " }\n\n");
  137. if ($ping_enable) {
  138. print(FH "define service{\n");
  139. print(FH " use ping-service\n");
  140. print(FH " host_name $device->{name}\n");
  141. print(FH " service_description ping $device->{name}\n");
  142. print(FH " check_command check_ping_icmp!100.0,20%!500.0,60%\n");
  143. print(FH " }\n");
  144. print(FH "\n");
  145. }
  146. if ($device->{parent_name} and $device->{link_check} and $device->{parent_snmp_version}) {
  147. print(FH "define service{\n");
  148. print(FH " use $default_service\n");
  149. print(FH " host_name $device->{parent_name}\n");
  150. print(FH " service_description port $device->{parent_port} - $device->{name}\n");
  151. print(FH " check_command check_ifoperstatus!$device->{parent_port_snmp_index}!$device->{parent_community}\n");
  152. print(FH " }\n");
  153. print(FH "\n");
  154. #src
  155. print(FH "define service{\n");
  156. print(FH " use service-snmp-crc\n");
  157. print(FH " host_name $device->{parent_name}\n");
  158. print(FH " service_description port $device->{parent_port} - $device->{name} CRC Errors\n");
  159. print(FH " check_command check_snmp_switch_crc!$device->{parent_community}!$device->{parent_port_snmp_index}\n");
  160. print(FH " }\n\n");
  161. }
  162. close(FH);
  163. return $cfg_file;
  164. }
  165. #---------------------------------------------------------------------------------
  166. sub print_nagios_cfg {
  167. my $device = shift;
  168. return if (!$device);
  169. my $device_id = $device->{device_id};
  170. my $custom_cfg;
  171. my $device_custom_cfg = "/etc/nagios/custom-cfg/".$device->{name}.".cfg";
  172. if (-e $device_custom_cfg) { $custom_cfg = read_host_template($device,$device_custom_cfg); }
  173. $device_custom_cfg = "/etc/nagios/custom-cfg/".$device_id.".cfg";
  174. if (-e $device_custom_cfg) { $custom_cfg = read_host_template($device,$device_custom_cfg); }
  175. my $default_service="local-service";
  176. #switch | router
  177. if ($device->{type} ~~ [1,2]) {
  178. my $cfg_file = "/etc/nagios/switches/".$device->{name}.".cfg";
  179. my $device_template = 'switches';
  180. if ($device->{type} eq 1) { $cfg_file = "/etc/nagios/routers/".$device->{name}.".cfg"; $device_template='routers'; }
  181. open(FH, "> $cfg_file");
  182. print(FH "define host {\n");
  183. print(FH " use $device_template\n");
  184. print(FH " host_name $device->{name}\n");
  185. print(FH " alias $device->{name}\n");
  186. print(FH " address $device->{ip}\n");
  187. print(FH " _ID $device->{device_id}\n");
  188. print(FH " _TYPE device\n");
  189. if ($device->{device_model}) {
  190. print(FH " notes $device->{device_model}\n");
  191. }
  192. if ($device->{parent_name}) {
  193. print(FH " parents $device->{parent_name}\n");
  194. }
  195. print(FH " notes_url http://stat.lan.local/admin/devices/editswitches.php?id=$device->{device_id}\n");
  196. print(FH " }\n\n");
  197. #ping
  198. print(FH "define service{\n");
  199. print(FH " use ping-service ; Name of service template to use\n");
  200. print(FH " host_name $device->{name}\n");
  201. print(FH " service_description ping $device->{name}\n");
  202. print(FH " check_command check_ping_icmp!100.0,20%!500.0,60%\n");
  203. print(FH " }\n");
  204. #uptime
  205. if ($device->{snmp_version}) {
  206. print(FH "define service{\n");
  207. print(FH " use $default_service\n");
  208. print(FH " host_name $device->{name}\n");
  209. print(FH " service_description Uptime\n");
  210. print(FH " check_command check_snmp_uptime!$device->{community}!161!$device->{snmp_version}\n");
  211. print(FH " }\n");
  212. print(FH "\n");
  213. #uplink
  214. if (exists $device->{uplink}) {
  215. print(FH "define service{\n");
  216. print(FH " use service-snmp-crc\n");
  217. print(FH " host_name $device->{name}\n");
  218. my $port_description = $device->{parent_name};
  219. my $conn = $device->{uplink};
  220. print(FH " service_description port $conn->{port} - $port_description CRC Errors\n");
  221. print(FH " check_command check_snmp_switch_crc!$device->{community}!$conn->{snmp_index}\n");
  222. print(FH " }\n\n");
  223. }
  224. foreach my $conn (@{$device->{downlinks}}) {
  225. #id,port,snmp_index,comment
  226. print(FH "define service{\n");
  227. print(FH " use $default_service\n");
  228. print(FH " host_name $device->{name}\n");
  229. my $port_description=translit($conn->{comment});
  230. if ($conn->{target_port_id}) { $port_description = $conn->{downlink_name}; }
  231. print(FH " service_description port $conn->{port} - $port_description \n");
  232. print(FH " check_command check_ifoperstatus!$conn->{snmp_index}!$device->{community}\n");
  233. print(FH " }\n\n");
  234. #src
  235. print(FH "define service{\n");
  236. print(FH " use service-snmp-crc\n");
  237. print(FH " host_name $device->{name}\n");
  238. my $port_description=translit($conn->{comment});
  239. if ($conn->{target_port_id}) { $port_description = $conn->{downlink_name}; }
  240. print(FH " service_description port $conn->{port} - $port_description CRC Errors\n");
  241. print(FH " check_command check_snmp_switch_crc!$device->{community}!$conn->{snmp_index}\n");
  242. print(FH " }\n\n");
  243. #band
  244. print(FH "define service{\n");
  245. print(FH " use service-snmp-bandwidth\n");
  246. print(FH " host_name $device->{name}\n");
  247. my $port_description=translit($conn->{comment});
  248. if ($conn->{target_port_id}) { $port_description = $conn->{downlink_name}; }
  249. print(FH " service_description port $conn->{port} - $port_description bandwidth usage\n");
  250. print(FH " check_command check_snmp_bandwidth!$device->{community}!$conn->{snmp_index}\n");
  251. print(FH " }\n\n");
  252. }
  253. }
  254. }
  255. #auth record
  256. if ($device->{type} eq 3) {
  257. my $add_ping = 1;
  258. if ($device->{ou_id} ~~ [5,22,23,24]) { $add_ping = 0; }
  259. my $cfg_file = print_single_host($device,$add_ping);
  260. open(FH, ">> $cfg_file");
  261. #IPAD
  262. if ($device->{ou_id} eq 23) {
  263. print(FH "define service{\n");
  264. print(FH " use ipad-service\n");
  265. print(FH " host_name $device->{name}\n");
  266. print(FH " service_description ping $device->{name}\n");
  267. print(FH " check_command check_ping_icmp!1000.0,20%!5000.0,60%\n");
  268. print(FH " }\n");
  269. }
  270. #IPCAM
  271. if ($device->{ou_id} eq 5) {
  272. print(FH "define service {\n");
  273. print(FH " use $default_service\n");
  274. print(FH " host_name $device->{name}\n");
  275. print(FH " service_description Snmp Model\n");
  276. print(FH " contact_groups admins\n");
  277. print(FH " check_command check_snmp_hikvision\n");
  278. print(FH " }\n");
  279. print(FH "\n");
  280. }
  281. #Printers
  282. if ($device->{ou_id} eq 6) {
  283. my $printer_cfg;
  284. if ($device->{device_model}=~/^OKI\s+/i) { $printer_cfg = read_host_template($device,'/etc/nagios/gen_template/oki.cfg'); }
  285. if ($device->{device_model}=~/^HP\s+/i) { $printer_cfg = read_host_template($device,'/etc/nagios/gen_template/hp.cfg'); }
  286. if ($device->{device_model}=~/^Panasonic\s+/i) { $printer_cfg = read_host_template($device,'/etc/nagios/gen_template/panasonic.cfg'); }
  287. if ($device->{device_model}=~/^Epson\s+/i) { $printer_cfg = read_host_template($device,'/etc/nagios/gen_template/epson.cfg'); }
  288. if ($printer_cfg->{template}) {
  289. my @printer_cfg = @{$printer_cfg->{template}};
  290. if (@printer_cfg and scalar(@printer_cfg)) {
  291. foreach my $row (@printer_cfg) {
  292. next if (!$row);
  293. print(FH $row."\n");
  294. }
  295. }
  296. }
  297. }
  298. # PROJECTORS
  299. if ($device->{ou_id} eq 27) {
  300. print(FH "define service{\n");
  301. print(FH " use proj-service\n");
  302. print(FH " host_name $device->{name}\n");
  303. print(FH " service_description Status\n");
  304. print(FH " check_command check_projector_simple\n");
  305. print(FH " }\n");
  306. print(FH "\n");
  307. }
  308. #SGVR
  309. if ($device->{ou_id} eq 22) {
  310. print(FH "define service{\n");
  311. print(FH " use fast-check-mute-service\n");
  312. # print(FH " use ipad-service\n");
  313. print(FH " host_name $device->{name}\n");
  314. print(FH " service_description ping $device->{name}\n");
  315. print(FH " check_command check_ping_icmp!1000.0,20%!5000.0,60%\n");
  316. print(FH " }\n");
  317. }
  318. # SPAV
  319. if ($device->{ou_id} eq 24) {
  320. print(FH "define service{\n");
  321. # print(FH " use fast-check-service\n");
  322. print(FH " use ipad-service\n");
  323. print(FH " host_name $device->{name}\n");
  324. print(FH " service_description ping $device->{name}\n");
  325. print(FH " check_command check_ping_icmp!1000.0,20%!5000.0,60%\n");
  326. print(FH " }\n");
  327. }
  328. # STE
  329. if ($device->{ou_id} eq 25) {
  330. my @sensors = split(/\|/,$device->{device_model});
  331. my $s_count =0;
  332. foreach my $sens (@sensors) {
  333. $s_count++;
  334. my $s_id = 214+$s_count;
  335. $sens=~s/_/ /g;
  336. print(FH "define service{\n");
  337. print(FH " use ste-service\n");
  338. print(FH " host_name $device->{name}\n");
  339. print(FH " service_description $sens\n");
  340. print(FH " check_command check_ste-hwg!public!$s_id\n");
  341. print(FH " }\n");
  342. print(FH "\n");
  343. }
  344. }
  345. # UPS
  346. if ($device->{ou_id} eq 8) {
  347. my $ups_cfg = read_host_template($device,'/etc/nagios/gen_template/ups.cfg');
  348. if ($ups_cfg->{template}) {
  349. my @ups_cfg = @{$ups_cfg->{template}};
  350. if (@ups_cfg and scalar(@ups_cfg)) {
  351. foreach my $row (@ups_cfg) {
  352. next if (!$row);
  353. print(FH $row."\n");
  354. }
  355. }
  356. }
  357. }
  358. # MFI
  359. if ($device->{ou_id} eq 15) {
  360. my $sensors = get_mfi_config($device->{ip});
  361. if ($sensors) {
  362. foreach my $sensor (keys %$sensors) {
  363. print(FH "define service{\n");
  364. print(FH " use mfi-service\n");
  365. print(FH " host_name $device->{name}\n");
  366. print(FH " service_description $sensor\n");
  367. print(FH " check_command check_mfi!$sensors->{$sensor}->{index}!$sensors->{$sensor}->{type}\n");
  368. print(FH " }\n");
  369. }
  370. }
  371. }
  372. }
  373. if ($custom_cfg->{template}) {
  374. my @custom_cfg = @{$custom_cfg->{template}};
  375. if (@custom_cfg and scalar(@custom_cfg)) {
  376. foreach my $row (@custom_cfg) {
  377. next if (!$row);
  378. print(FH $row."\n");
  379. }
  380. }
  381. }
  382. close(FH);
  383. }
  384. #---------------------------------------------------------------------------------
  385. 1;
  386. }