Guest User

Untitled

a guest
Jul 9th, 2010
585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.02 KB | None | 0 0
  1. #! /usr/bin/perl -w
  2. ################################################################################
  3. # Copyright 2004-2010 MERETHIS
  4. # Centreon is developped by : Julien Mathis and Romain Le Merlus under
  5. # GPL Licence 2.0.
  6. #
  7. # This program is free software; you can redistribute it and/or modify it under
  8. # the terms of the GNU General Public License as published by the Free Software
  9. # Foundation ; either version 2 of the License.
  10. #
  11. # This program is distributed in the hope that it will be useful, but WITHOUT ANY
  12. # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  13. # PARTICULAR PURPOSE. See the GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License along with
  16. # this program; if not, see <http://www.gnu.org/licenses>.
  17. #
  18. # Linking this program statically or dynamically with other modules is making a
  19. # combined work based on this program. Thus, the terms and conditions of the GNU
  20. # General Public License cover the whole combination.
  21. #
  22. # As a special exception, the copyright holders of this program give MERETHIS
  23. # permission to link this program with independent modules to produce an executable,
  24. # regardless of the license terms of these independent modules, and to copy and
  25. # distribute the resulting executable under terms of MERETHIS choice, provided that
  26. # MERETHIS also meet, for each linked independent module, the terms and conditions
  27. # of the license of that module. An independent module is a module which is not
  28. # derived from this program. If you modify this program, you may extend this
  29. # exception to your version of the program, but you are not obliged to do so. If you
  30. # do not wish to do so, delete this exception statement from your version.
  31. #
  32. # For more information : [email protected]
  33. #
  34. # SVN : $URL: http://svn.centreon.com/trunk/plugins-2.x/src/check_centreon_snmp_traffic $
  35. # SVN : $Id: check_centreon_snmp_traffic 10176 2010-03-10 09:45:40Z shotamchay $
  36. #
  37. ####################################################################################
  38. #
  39. # Script init
  40. #
  41.  
  42. use strict;
  43. use Net::SNMP qw(:snmp oid_lex_sort);
  44. use FindBin;
  45. use lib "$FindBin::Bin";
  46. use lib "/usr/local/nagios/libexec";
  47. use utils qw($TIMEOUT %ERRORS &print_revision &support);
  48. if (eval "require centreon" ) {
  49. use centreon qw(get_parameters);
  50. use vars qw(%centreon);
  51. %centreon=get_parameters();
  52. } else {
  53. print "Unable to load centreon perl module\n";
  54. exit $ERRORS{'UNKNOWN'};
  55. }
  56. use vars qw($PROGNAME);
  57. use Getopt::Long;
  58. use vars qw($opt_V $opt_h $opt_P $opt_64bits $opt_v $opt_C $opt_b $opt_k $opt_u $opt_p $opt_H $opt_D $opt_i $opt_n $opt_w $opt_c $opt_s $opt_T $opt_a $opt_r);
  59.  
  60. # Plugin var init
  61.  
  62. my($proc, $proc_run, @test, $row, @laste_values, $last_check_time, $last_in_bits, $last_out_bits, @last_values, $update_time, $db_file, $in_traffic, $out_traffic, $in_usage, $out_usage);
  63.  
  64. $PROGNAME = "$0";
  65. sub print_help ();
  66. sub print_usage ();
  67.  
  68. Getopt::Long::Configure('bundling');
  69. GetOptions
  70. ("h" => \$opt_h, "help" => \$opt_h,
  71. "u=s" => \$opt_u, "username=s" => \$opt_u,
  72. "p=s" => \$opt_p, "password=s" => \$opt_p,
  73. "P=s" => \$opt_P, "--snmp-port=s" => \$opt_P,
  74. "k=s" => \$opt_k, "key=s" => \$opt_k,
  75. "s" => \$opt_s, "show" => \$opt_s,
  76. "V" => \$opt_V, "version" => \$opt_V,
  77. "i=s" => \$opt_i, "interface=s" => \$opt_i,
  78. "64-bits" => \$opt_64bits,
  79. "n" => \$opt_n, "name" => \$opt_n,
  80. "v=s" => \$opt_v, "snmp=s" => \$opt_v,
  81. "C=s" => \$opt_C, "community=s" => \$opt_C,
  82. "b=s" => \$opt_b, "bps=s" => \$opt_b,
  83. "w=s" => \$opt_w, "warning=s" => \$opt_w,
  84. "c=s" => \$opt_c, "critical=s" => \$opt_c,
  85. "T=s" => \$opt_T, "r" => \$opt_r,
  86. "a=s" => \$opt_a, "cache=s" => \$opt_a,
  87. "H=s" => \$opt_H, "hostname=s" => \$opt_H);
  88.  
  89. if ($opt_V) {
  90. print_revision($PROGNAME,'$Revision: 1.2 $');
  91. exit $ERRORS{'OK'};
  92. }
  93.  
  94. if ($opt_h) {
  95. print_help();
  96. exit $ERRORS{'OK'};
  97. Getopt::Long::Configure('bundling');
  98. }
  99.  
  100. ##################################################
  101. ##### Verify Options
  102. ##
  103.  
  104. if (!$opt_H) {
  105. print_usage();
  106. exit $ERRORS{'OK'};
  107. }
  108. my $snmp = "1";
  109. if ($opt_v && $opt_v =~ /^[0-9]$/) {
  110. $snmp = $opt_v;
  111. }
  112.  
  113. if ($snmp eq "3") {
  114. if (!$opt_u) {
  115. print "Option -u (--username) is required for snmpV3\n";
  116. exit $ERRORS{'OK'};
  117. }
  118. if (!$opt_p && !$opt_k) {
  119. print "Option -k (--key) or -p (--password) is required for snmpV3\n";
  120. exit $ERRORS{'OK'};
  121. }elsif ($opt_p && $opt_k) {
  122. print "Only option -k (--key) or -p (--password) is needed for snmpV3\n";
  123. exit $ERRORS{'OK'};
  124. }
  125. }
  126.  
  127. if ($opt_n && !$opt_i) {
  128. print "Option -n (--name) need option -i (--interface)\n";
  129. exit $ERRORS{'UNKNOWN'};
  130. }
  131.  
  132. if (!$opt_C) {
  133. $opt_C = "public";
  134. }
  135.  
  136. if (!$opt_i) {
  137. $opt_i = 2;
  138. }
  139.  
  140. $opt_a = 3 if (!$opt_a);
  141.  
  142. if (!$opt_b) {
  143. $opt_b = 95;
  144. }
  145. if (!defined($opt_P)) {
  146. $opt_P = 161;
  147. }
  148. if ($opt_b =~ /([0-9]+)/) {
  149. my $bps = $1;
  150. }
  151. my $critical = 95;
  152. if ($opt_c && $opt_c =~ /[0-9]+/) {
  153. $critical = $opt_c;
  154. }
  155. my $warning = 80;
  156. if ($opt_w && $opt_w =~ /[0-9]+/) {
  157. $warning = $opt_w;
  158. }
  159. my $interface = 0;
  160. if ($opt_i =~ /([0-9]+)/ && !$opt_n){
  161. $interface = $1;
  162. } elsif (!$opt_n) {
  163. print "Unknown -i number expected... or it doesn't exist, try another interface - number\n";
  164. exit $ERRORS{'UNKNOWN'};
  165. }
  166.  
  167. if ($critical <= $warning){
  168. print "(--crit) must be superior to (--warn)";
  169. print_usage();
  170. exit $ERRORS{'OK'};
  171. }
  172. if ($opt_64bits && $snmp !~ /2/) {
  173. print "Error : Usage : SNMP v2 is required with option --64-bits\n";
  174. exit $ERRORS{'UNKNOWN'};
  175. }
  176. if (defined ($opt_64bits)) {
  177. if (eval "require bigint") {
  178. use bigint;
  179. } else { print "ERROR : Need bigint module for 64 bit counters\n"; exit $ERRORS{"UNKNOWN"}}
  180. }
  181.  
  182. #################################################
  183. ##### Plugin snmp requests
  184. ##
  185.  
  186. my $OID_DESC =$centreon{MIB2}{IF_DESC};
  187. my $OID_OPERSTATUS =$centreon{MIB2}{IF_OPERSTATUS};
  188. my @operstatus = ("up","down","testing", "unknown", "dormant", "notPresent", "lowerLayerDown");
  189.  
  190. # create a SNMP session
  191. my ($session, $error);
  192. if ($snmp eq "1" || $snmp =~ /2/) {
  193. ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp, -port => $opt_P);
  194. if (!defined($session)) {
  195. print("UNKNOWN: SNMP Session : $error\n");
  196. exit $ERRORS{'UNKNOWN'};
  197. }
  198. }elsif ($opt_k) {
  199. ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k, -port => $opt_P);
  200. if (!defined($session)) {
  201. print("UNKNOWN: SNMP Session : $error\n");
  202. exit $ERRORS{'UNKNOWN'};
  203. }
  204. }elsif ($opt_p) {
  205. ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p, -port => $opt_P);
  206. if (!defined($session)) {
  207. print("UNKNOWN: SNMP Session : $error\n");
  208. exit $ERRORS{'UNKNOWN'};
  209. }
  210. }
  211. $session->translate(Net::SNMP->TRANSLATE_NONE) if (defined($session));
  212.  
  213.  
  214. my $cacheFile = "/var/lib/centreon/centplugins/traffic_cache_".$opt_H;
  215. my $result;
  216. my $mustCreateFile = 0;
  217. #my $row;
  218. my $countLine;
  219.  
  220. #
  221. # Cache File exists, lets read it
  222. #
  223. if (-e $cacheFile) {
  224. open(FILE,"<".$cacheFile);
  225. $countLine = 0;
  226. while ($row = <FILE>){
  227. if (!$countLine) {
  228. my $deltaTime = time() - $row;
  229. if ($deltaTime > ($opt_a * 3600)) {
  230. $mustCreateFile = 1;
  231. }
  232. }
  233. $countLine++;
  234. }
  235. close(FILE);
  236. }
  237. else {
  238. $mustCreateFile = 1;
  239. }
  240.  
  241. if ($mustCreateFile) {
  242. $result = $session->get_table(Baseoid => $OID_DESC);
  243. if (defined($result)) {
  244. unless (open(FILE,">".$cacheFile)){
  245. print "Check mod for temporary file : ".$cacheFile."...\n";
  246. exit $ERRORS{"UNKNOWN"};
  247. }
  248. my $currentTime = time();
  249. print FILE $currentTime."\n";
  250. foreach my $key (oid_lex_sort(keys %$result)) {
  251. my @oid_list = split (/\./,$key);
  252. my $interfaceIndex = pop (@oid_list);
  253. print FILE $interfaceIndex.";".$result->{$key}."\n";
  254. }
  255. close(FILE);
  256. }
  257. }
  258.  
  259.  
  260. #getting interface using its name instead of its oid index
  261. if ($opt_n) {
  262. if ($opt_r){
  263. if (!-e $cacheFile) {
  264. printf("ERROR: Could not open " . $cacheFile);
  265. exit $ERRORS{'UNKNOWN'};
  266. }
  267.  
  268. open(FILE,"<".$cacheFile);
  269. $countLine = 0;
  270. while ($row = <FILE>){
  271. if ($countLine) {
  272. my @resLine = split(/\;/, $row);
  273. if ($resLine[1] =~ m/$opt_i/) {
  274. $interface = $resLine[0];
  275. }
  276. }
  277. $countLine++;
  278. }
  279. close(FILE);
  280. }
  281. else {
  282. if (!-e $cacheFile) {
  283. printf("ERROR: Could not open " . $cacheFile);
  284. exit $ERRORS{'UNKNOWN'};
  285. }
  286.  
  287. open(FILE,"<".$cacheFile);
  288. $countLine = 0;
  289. while ($row = <FILE>){
  290. if ($countLine) {
  291. my @resLine = split(/\;/, $row);
  292. $resLine[1] =~ s/\x00//g;
  293. if ($resLine[1] =~ $opt_i) {
  294. $interface = $resLine[0];
  295. }
  296. }
  297. $countLine++;
  298. }
  299. close(FILE);
  300. }
  301. }
  302.  
  303. my ($OID_IN, $OID_OUT, $OID_SPEED);
  304. if ($opt_64bits) {
  305. $OID_IN =$centreon{MIB2}{IF_IN_OCTET_64_BITS}.".".$interface;
  306. $OID_OUT = $centreon{MIB2}{IF_OUT_OCTET_64_BITS}.".".$interface;
  307. $OID_SPEED = $centreon{MIB2}{IF_SPEED_64_BITS}.".".$interface;
  308. }else {
  309. $OID_IN =$centreon{MIB2}{IF_IN_OCTET}.".".$interface;
  310. $OID_OUT = $centreon{MIB2}{IF_OUT_OCTET}.".".$interface;
  311. $OID_SPEED = $centreon{MIB2}{IF_SPEED}.".".$interface;
  312. }
  313.  
  314. # Get desctiption table
  315.  
  316. if ($opt_s) {
  317. if (!-e $cacheFile) {
  318. printf("ERROR: Could not open " . $cacheFile);
  319. exit $ERRORS{'UNKNOWN'};
  320. }
  321.  
  322. open(FILE,"<".$cacheFile);
  323. $countLine = 0;
  324. while ($row = <FILE>){
  325. if ($countLine) {
  326. my @resLine = split(/\;/, $row);
  327. my $index = $resLine[0];
  328. my $interface_status = $session->get_request(-varbindlist => [$OID_OPERSTATUS.".".$index]);
  329. $resLine[1] =~ s/\x00//g;
  330. print "Interface ". $index . " :: " . $resLine[1] . " :: ".$operstatus[$interface_status->{$OID_OPERSTATUS.".".$index} - 1]."\n";
  331. }
  332. $countLine++;
  333. }
  334. close(FILE);
  335. exit $ERRORS{'OK'};
  336. }
  337.  
  338. my $interface_status = $session->get_request(-varbindlist => [$OID_OPERSTATUS.".".$interface]);
  339. if (!$interface_status) {
  340. printf("ERROR: Interface Status Request : %s", $session->error);
  341. exit $ERRORS{'UNKNOWN'};
  342. }
  343. if ($operstatus[$interface_status->{$OID_OPERSTATUS.".".$interface} - 1] ne "up") {
  344. print "Error : interface is not ready - status : ".$operstatus[$interface_status->{$OID_OPERSTATUS.".".$interface} - 1]."\n";
  345. exit $ERRORS{'CRITICAL'};
  346. }
  347.  
  348.  
  349. ####### Get IN bytes
  350.  
  351. my $in_bits;
  352. $result = $session->get_request(-varbindlist => [$OID_IN]);
  353. if (!defined($result)) {
  354. printf("ERROR: IN Bits : %s", $session->error);
  355. if ($opt_n) { print " - You must specify interface name when option -n is used";}
  356. print ".\n";
  357. $session->close;
  358. exit $ERRORS{'UNKNOWN'};
  359. }
  360. $in_bits = $result->{$OID_IN} * 8;
  361.  
  362.  
  363. ####### Get OUT bytes
  364.  
  365. my $out_bits;
  366. $result = $session->get_request(-varbindlist => [$OID_OUT]);
  367. if (!$result) {
  368. printf("ERROR: Out Bits : %s", $session->error);
  369. if ($opt_n) { print " - You must specify interface name when option -n is used";}
  370. print ".\n";
  371. $session->close;
  372. exit $ERRORS{'UNKNOWN'};
  373. }
  374. $out_bits = $result->{$OID_OUT} * 8;
  375.  
  376.  
  377. ####### Get SPEED of interface
  378.  
  379. my $speed_card;
  380. $result = $session->get_request(-varbindlist => [$OID_SPEED]);
  381. if (!$result) {
  382. printf("ERROR: Interface Speed : %s", $session->error);
  383. if ($opt_n) { print " - You must specify interface name when option -n is used";}
  384. print ".\n";
  385. $session->close;
  386. exit $ERRORS{'UNKNOWN'};
  387. }
  388.  
  389. if (defined($opt_T)){
  390. $speed_card = $opt_T * 1000000;
  391. } else {
  392. $speed_card = $result->{$OID_SPEED};
  393. if (!$speed_card && !defined($opt_T)) {
  394. print "Error : Card speed is null, check command options\n";
  395. exit $ERRORS{'UNKNOWN'};
  396. }
  397. }
  398.  
  399. #############################################
  400. ##### Plugin return code
  401. ##
  402.  
  403. $last_in_bits = 0;
  404. $last_out_bits = 0;
  405.  
  406. my $flg_created = 0;
  407.  
  408. if (-e "/var/lib/centreon/centplugins/traffic_if".$interface."_".$opt_H) {
  409. open(FILE,"<"."/var/lib/centreon/centplugins/traffic_if".$interface."_".$opt_H);
  410. while($row = <FILE>){
  411. @last_values = split(":",$row);
  412. $last_check_time = $last_values[0];
  413. $last_in_bits = $last_values[1];
  414. $last_out_bits = $last_values[2];
  415. $flg_created = 1;
  416. }
  417. close(FILE);
  418. } else {
  419. $flg_created = 0;
  420. }
  421.  
  422. $update_time = time();
  423.  
  424. unless (open(FILE,">"."/var/lib/centreon/centplugins/traffic_if".$interface."_".$opt_H)){
  425. print "Check mod for temporary file : /var/lib/centreon/centplugins/traffic_if".$interface."_".$opt_H. " !\n";
  426. exit $ERRORS{"UNKNOWN"};
  427. }
  428. print FILE "$update_time:$in_bits:$out_bits";
  429. close(FILE);
  430.  
  431. if ($flg_created == 0){
  432. print "First execution : Buffer in creation.... \n";
  433. exit($ERRORS{"UNKNOWN"});
  434. }
  435.  
  436.  
  437. ## Bandwith = IN + OUT / Delta(T) = 6 Mb/s
  438. ## (100 * Bandwith) / (2(si full duplex) * Ispeed)
  439. ## Count must round at 4294967296
  440. ##
  441.  
  442. if (($in_bits - $last_in_bits != 0) && defined($last_in_bits)) {
  443. my $total = 0;
  444. if ($in_bits - $last_in_bits < 0){
  445. $total = 4294967296 * 8 - $last_in_bits + $in_bits;
  446. } else {
  447. $total = $in_bits - $last_in_bits;
  448. }
  449. my $diff = time() - $last_check_time;
  450. if ($diff == 0){$diff = 1;}
  451. my $pct_in_traffic = $in_traffic = abs($total / $diff);
  452. } else {
  453. $in_traffic = 0;
  454. }
  455.  
  456. if ($out_bits - $last_out_bits != 0 && defined($last_out_bits)) {
  457. my $total = 0;
  458. if ($out_bits - $last_out_bits < 0){
  459. $total = 4294967296 * 8 - $last_out_bits + $out_bits;
  460. } else {
  461. $total = $out_bits - $last_out_bits;
  462. }
  463. my $diff = time() - $last_check_time;
  464. if ($diff == 0){$diff = 1;}
  465. my $pct_out_traffic = $out_traffic = abs($total / $diff);
  466. } else {
  467. $out_traffic = 0;
  468. }
  469.  
  470. if ( $speed_card != 0 ) {
  471. $in_usage = sprintf("%.1f",($in_traffic * 100) / $speed_card);
  472. $out_usage = sprintf("%.1f",($out_traffic * 100) / $speed_card);
  473. }
  474.  
  475. my $in_prefix = "";
  476. my $out_prefix = "";
  477.  
  478. my $in_perfparse_traffic = $in_traffic;
  479. my $out_perfparse_traffic = $out_traffic;
  480.  
  481. if ($in_traffic > 1000) {
  482. $in_traffic = $in_traffic / 1000;
  483. $in_prefix = "k";
  484. if($in_traffic > 1000){
  485. $in_traffic = $in_traffic / 1000;
  486. $in_prefix = "M";
  487. }
  488. if($in_traffic > 1000){
  489. $in_traffic = $in_traffic / 1000;
  490. $in_prefix = "G";
  491. }
  492. }
  493.  
  494. if ($out_traffic > 1000){
  495. $out_traffic = $out_traffic / 1000;
  496. $out_prefix = "k";
  497. if ($out_traffic > 1000){
  498. $out_traffic = $out_traffic / 1000;
  499. $out_prefix = "M";
  500. }
  501. if ($out_traffic > 1000){
  502. $out_traffic = $out_traffic / 1000;
  503. $out_prefix = "G";
  504. }
  505. }
  506.  
  507. my $in_bits_unit = "";
  508. $in_bits = $in_bits/1048576;
  509. if ($in_bits > 1000){
  510. $in_bits = $in_bits / 1000;
  511. $in_bits_unit = "G";
  512. } else {
  513. $in_bits_unit = "M";
  514. }
  515.  
  516. my $out_bits_unit = "";
  517. $out_bits = $out_bits/1048576;
  518. if ($out_bits > 1000){
  519. $out_bits = $out_bits / 1000;
  520. $out_bits_unit = "G";
  521. } else {
  522. $out_bits_unit = "M";
  523. }
  524.  
  525.  
  526. if ( $speed_card == 0 ) {
  527. print "CRITICAL: Interface speed equal 0! Interface must be down.|traffic_in=0B/s traffic_out=0B/s\n";
  528. exit($ERRORS{"CRITICAL"});
  529. }
  530.  
  531. #####################################
  532. ##### Display result
  533. ##
  534.  
  535.  
  536. my $in_perfparse_traffic_str = sprintf("%.1f",abs($in_perfparse_traffic));
  537. my $out_perfparse_traffic_str = sprintf("%.1f",abs($out_perfparse_traffic));
  538.  
  539. $in_perfparse_traffic_str =~ s/\./,/g;
  540. $out_perfparse_traffic_str =~ s/\./,/g;
  541.  
  542. my $status = "OK";
  543.  
  544. if(($in_usage > $warning) or ($out_usage > $warning)){
  545. $status = "WARNING";
  546. }
  547. if (($in_usage > $critical) or ($out_usage > $critical)){
  548. $status = "CRITICAL";
  549. }
  550.  
  551. my $warningBit = $warning * $speed_card / 100;
  552. my $criticalBit = $critical * $speed_card / 100;
  553.  
  554. printf("Traffic In : %.2f ".$in_prefix."b/s (".$in_usage." %%), Out : %.2f ".$out_prefix."b/s (".$out_usage." %%) - ", $in_traffic, $out_traffic);
  555. printf("Total RX Bits In : %.2f ".$in_bits_unit."B, Out : %.2f ".$out_bits_unit."b", $in_bits, $out_bits);
  556. printf("|traffic_in=".$in_perfparse_traffic_str."Bits/s;$warningBit;$criticalBit;0;$speed_card traffic_out=".$out_perfparse_traffic_str."Bits/s;$warningBit;$criticalBit;0;$speed_card\n");
  557. exit($ERRORS{$status});
  558.  
  559. sub print_usage () {
  560. print "\nUsage:\n";
  561. print "$PROGNAME\n";
  562. print " -H (--hostname) Hostname to query - (required)\n";
  563. print " -C (--community) SNMP read community (defaults to public,\n";
  564. print " used with SNMP v1 and v2c\n";
  565. print " -v (--snmp_version) 1 for SNMP v1 (default)\n";
  566. print " 2 for SNMP v2c\n";
  567. print " -s (--show) Describes all interfaces number (debug mode)\n";
  568. print " -i (--interface) Set the interface number (2 by default)\n";
  569. print " -n (--name) Allows to use interface name with option -d instead of interface oid index\n";
  570. print " (ex: -i \"eth0\" -n, -i \"VMware Virtual Ethernet Adapter for VMnet8\" -n\n";
  571. print " (choose an unique expression for each interface)\n";
  572. print " -w (--warn) Signal strength at which a warning message will be generated\n";
  573. print " (default 80)\n";
  574. print " -c (--crit) Signal strength at which a critical message will be generated\n";
  575. print " -T Max Banwidth\n";
  576. print " -V (--version) Plugin version\n";
  577. print " -r Regexp Match Mode\n";
  578. print " -a (--cache) Updates cache file every n hours instead of doing snmpwalk for every check (default: 3)\n";
  579. print " -h (--help) usage help\n";
  580. }
  581.  
  582. sub print_help () {
  583. print "##############################################\n";
  584. print "# Copyright (c) 2004-2010 Centreon #\n";
  585. print "# Bugs to http://trac.centreon.com #\n";
  586. print "##############################################\n";
  587. print_usage();
  588. print "\n";
  589. }
Advertisement
Add Comment
Please, Sign In to add comment