1#!/usr/bin/perl 2 3# 4# 5# ################################################################### 6# boggia : Creation : 25/03/08 7# boggia : Modification : 28/04/08 8# ajout des routines de creation des sondes nbassocwifi et 9# nbauthwifi pour la supervision des associations sur le 10# reseau sans fil 11# boggia : Modification : 15/05/08 12# simplification des messages d'erreur envoy�s par mails 13# 14# Script lanc� de maniere p�riodique par Cron. 15# Permet de mettre � jour les bases et les sondes RRDTool de 16# l'application Metro 17# 18# 19 20use SNMP_util; 21use Socket; 22use Sys::Syslog; # Misses setlogsock. 23use Sys::Syslog qw(:DEFAULT setlogsock); # Also gets setlogsock 24use DBI; 25use warnings; 26use strict; 27 28require "%NMLIBDIR%/libmetro.pl"; 29 30# tunning du module SNMP pour ne pas afficher les erreurs sur la sortie 31# standard en cas d'echec d'interrogation 32$SNMP_Session::suppress_warnings = 2; 33$SNMP_util::Debug = 0; 34 35# lecture du fichier de configuration general 36our $conf_file = "%CONFFILE%"; 37our %global_conf = read_global_conf_file($conf_file); 38 39our %sensor_types = ( 40 'trafic' => { 'graph'=>'trafic','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 41 'trafic1min' => { 'graph'=>'trafic','rrd'=>'1','period'=>'* * * * *','enabled'=>'1' }, 42 'ifNom-snmp32' => { 'graph'=>'trafic','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 43 'ifNom-snmp64' => { 'graph'=>'trafic','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 44 'nbauthwifi' => { 'graph'=>'nbauthwifi','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 45 'nbassocwifi' => { 'graph'=>'nbassocwifi','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 46 'broadcast' => { 'graph'=>'broadcast','rrd'=>'1','period'=>'* * * * *','enabled'=>'1' }, 47 'multicast' => { 'graph'=>'multicast','rrd'=>'1','period'=>'* * * * *','enabled'=>'1' }, 48 'ipmac' => { 'graph'=>'ipmac','rrd'=>'1','period'=>'*/5 * * * *','enabled'=>'1' }, 49 'portmac.cisco' => { 'graph'=>'portmac','rrd'=>'0','period'=>'3,8,13,18,23,28,33,38,43,48,53,58 * * * *','enabled'=>'1' }, 50 'portmac.juniper' => { 'graph'=>'portmac','rrd'=>'0','period'=>'3,8,13,18,23,28,33,38,43,48,53,58 * * * *','enabled'=>'1' }, 51 'portmac.hp' => { 'graph'=>'portmac','rrd'=>'0','period'=>'3,8,13,18,23,28,33,38,43,48,53,58 * * * *','enabled'=>'1' }, 52); 53 54# For special tunning for sensor types. 55# To alter values of %sensor_type variable, you must create the following file 56# and set %sensor_type fields. 57if(-e "%NMLIBDIR%/sensors-options.pl") 58{ 59 require "%NMLIBDIR%/sensors-options.pl"; 60} 61 62 63 64# fichier de configuration principal et chargement des fonctions de base 65our $datadir = $global_conf{metrodatadir}; 66our $sensorfile = $datadir . "/poller/metro.sensor"; 67our $quarantinefile = $datadir . "/poller/metro.quarantine"; 68our $lockdir = $datadir . "/lock"; 69our $cachedir = $datadir . "/cache"; 70 71# liste eq en supervision 72our %sonde_sup_prod; 73# liste eq integres dans appli TOPO 74our %sonde_sup_new; 75# liste des sondes de metrologie integree dans la supervision 76our %sonde_majMETRO; 77# liste des sondes de metrologie a integrer dans la supervision 78our %sonde_maj_sonde; 79# liste des sondes dont l'integration dans la supervision a echouee 80our %sursis_maj_sondes; 81# liste de quanrantaine pour les sondes suprimees 82our %quarantaine; 83# messages d'erreurs pour sortie mail 84our %error_msg; 85# fichier de cache pour les oids des equipements 86our %oid_cache; 87 88# heure de lancement du programme 89our $timet = time; 90 91# message envoye par mail 92our $message_mail = 0; 93our $entete_mail = "Mise � jour des POINTS de METROLOGIE\n 94 ------------------------------------\n\n"; 95 96#creation d'une socket syslog unix 97setlogsock("unix"); 98 99writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 100 "\t #######################################"); 101writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 102 "\t Demarrage du programme de creation des bases RRD"); 103 104#opendir(REPLOCK,$lockdir); 105#my @file_processing = grep(/update_metro/,readdir REPLOCK); 106#closedir(REPLOCK); 107 108# si la base n'est pas lock�e 109if(check_lock_file($lockdir,"update_metro.lock","metrocreatedb") == 0) 110{ 111 # on locke tant que l'appli tourne 112 create_lock_file($lockdir,"update_metro.lock","metrocreatedb"); 113 114 # create poller directory if not exists 115 if(not -d "$datadir/poller") 116 { 117 create_directory("$datadir/poller","metrocreatedb",$global_conf{majdblogfacility}); 118 } 119 120 # create rrd files directory if not exists 121 if(not -d "$datadir/rrddb") 122 { 123 create_directory("$global_conf{'metrodatadir'}/rrddb","metrocreatedb",$global_conf{majdblogfacility}); 124 } 125 126 # create cache directory 127 if(not -d $cachedir) 128 { 129 create_directory($cachedir,"metrocreatedb",$global_conf{majdblogfacility}); 130 } 131 132 # chargement du cache des SysOid des equipements 133 load_oid_cache(); 134 135 # chargement de la liste des sondes de metrologie en place 136 charger_liste_majMETRO(); 137 138 # FIXME : INACTIVE 139 # chargement de la liste des equipements supervises dans la plateforme de supervision 140 # charger_liste_sup_prod(); 141 142 # chargement de la liste des nouvelles sondes 143 #my $lecture_maj_sondes = charger_liste_maj_sondes(); 144 145 # chargement de la liste des nouvelles sondes via la base DNS 146 my $lecture_maj_sondes = load_dns_sql_sensors(); 147 148 # si le chargement de la liste des nouvelles sondes echoue. 149 if($lecture_maj_sondes == -1) 150 { 151 message_erreur("ERREUR : Liste des sondes envoy�e par TOPO vide => Aucune mise � jour."); 152 153 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 154 "\t ERREUR : sensor update file empty"); 155 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 156 "\t Fin du programme ######################"); 157 158 # suppression du verrou 159 delete_lock_file("$lockdir/update_metro.lock"); 160 161 # end of program 162 exit(0); 163 } 164 165 # FIXME : INACTIF 166 ## SUPERVISION 167 # installations des hotes supervises a partir de TOPO 168 # cmp_listes_hotes_supervises(); 169 # ecriture du fichier des hostes supervises 170 # ecrit_liste_sup_eq(); 171 172 ## METROLOGIE 173 # suppression des sondes de metrologie perimees 174 test_bases_expirees(); 175 176 # create plugins portmac and ipmac for mac database 177 enable_plugin_ipmac_portmac(); 178 179 # creation ou suppression de sondes de metrologie 180 creeSupprSonde(); 181 182 read_tab_asso(%sonde_majMETRO); 183 184 print "creeSupprSonde\n"; 185 186 ecrit_fichier_graph(); 187 188 print "ecrit_fichier_graph\n"; 189 190 write_oid_cache(); 191 192 print "write_oid_cache\n"; 193 194 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 195 "\t Fin du programme ######################"); 196 197 # suppression du verrou 198 delete_lock_file("$lockdir/update_metro.lock"); 199} 200else 201{ 202 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 203 "\t Fichier lock dans $lockdir"); 204} 205 206if($message_mail == 1) 207{ 208 print "$entete_mail\n"; 209 foreach my $key (keys %error_msg) 210 { 211 print "$key\n"; 212 } 213} 214 215 216################################################################################## 217# FONCTIONS ASSOCIEES 218################################################################################## 219 220################################################################################## 221# creation suppression des sondes de metrologie 222sub creeSupprSonde 223{ 224 my $key; 225 my $compteur_keys; 226 my %sensor_disabled; 227 my $sdis = 0; 228 229 # liste toute les sondes envoyees par TOPO 230 foreach $key (keys %sonde_maj_sonde) 231 { 232 # if sensor type not enabled 233 if($sensor_types{$sonde_maj_sonde{$key}{type}}{enabled} == 0) 234 { 235 if(not exists $sensor_disabled{$sonde_maj_sonde{$key}{type}}) 236 { 237 $sensor_disabled{$sonde_maj_sonde{$key}{type}} = 0; 238 $sdis = 1; 239 } 240 241 $sensor_disabled{$sonde_maj_sonde{$key}{type}} ++; 242 243 next; 244 } 245 246 $compteur_keys ++; 247 # teste si la sonde existe d�j� dans la table majMETRO (mise a jour des sondes) 248 if(defined($sonde_majMETRO{$key})) 249 { 250 # remplacement des : dans les arguments par des espaces 251 if($sonde_majMETRO{$key}{params} =~/:/) 252 { 253 $sonde_majMETRO{$key}{params} =~tr/:/ /; 254 } 255 256 # ajustement de l'echantillonage en fonction 257 if($sensor_types{$sonde_maj_sonde{$key}{type}}{period} ne $sonde_majMETRO{$key}{period}) 258 { 259 if(defined $sensor_types{$sonde_maj_sonde{$key}{type}}{period}) 260 { 261 $sonde_majMETRO{$key}{period} = $sensor_types{$sonde_maj_sonde{$key}{type}}{period}; 262 } 263 } 264 265 # la sonde existe deja. On regarde si les parametres ont change. 266 if($sonde_majMETRO{$key}{params} ne $sonde_maj_sonde{$key}{params} 267 || $sonde_majMETRO{$key}{ip} ne $sonde_maj_sonde{$key}{ip} 268 || $sonde_majMETRO{$key}{community} ne $sonde_maj_sonde{$key}{community}) 269 { 270 # les parametres de la sonde ont change, on met a jour. 271 my $p1 = "$sonde_majMETRO{$key}{ip} $sonde_majMETRO{$key}{community} $sonde_majMETRO{$key}{params}"; 272 my $p2 = "$sonde_maj_sonde{$key}{ip} $sonde_maj_sonde{$key}{community} $sonde_maj_sonde{$key}{params}"; 273 274 if($p2!~/undef/) 275 { 276 my $nom_pt_metro = get_nom_pt_metro($key); 277 message_erreur("MODIFICATION : point de metrologie \"$nom_pt_metro\". Nouveaux parametres ($p1) => ($p2)"); 278 } 279 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 280 "\t WARNING : sonde $compteur_keys, changement des parametres ($p1 != $p2)"); 281 282 ajouter_sonde($key,$sonde_maj_sonde{$key}{type}, 283 $sonde_maj_sonde{$key}{ip}, 284 $sonde_maj_sonde{$key}{community}, 285 $sonde_maj_sonde{$key}{params}); 286 } 287 else 288 { 289 # les parametres n'ont pas change 290 # on teste l'existance de la base rrd 291 if(-e $key) 292 { 293 # operations specifiques aux sondes de trafic 294 if($sonde_maj_sonde{$key}{type} eq "trafic" || $sonde_maj_sonde{$key}{type} eq "trafic1min") 295 { 296 # controle de la vitesse de l'interface par rapport a la sonde 297 if(check_if_speed($sonde_majMETRO{$key}{type}, 298 $sonde_maj_sonde{$key}{ip}, 299 $sonde_maj_sonde{$key}{community}, 300 $sonde_maj_sonde{$key}{params}) == 1) 301 { 302 # la vitesse est ok, pas de mise a jour a effectuer. 303 delete $sonde_maj_sonde{$key}; 304 } 305 else 306 { 307 # la vitesse n'est pas bonne, il faut mettre la sonde a jour 308 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 309 "\t WARNING : sonde $compteur_keys, changement du type de sonde pour $key"); 310 311 ajouter_sonde($key,$sonde_maj_sonde{$key}{type}, 312 $sonde_maj_sonde{$key}{ip}, 313 $sonde_maj_sonde{$key}{community}, 314 $sonde_maj_sonde{$key}{params}); 315 } 316 } 317 else 318 { 319 # la sonde existe deja avec les bons parametres. Pas de mise a jour a effectuer. 320 delete $sonde_maj_sonde{$key}; 321 } 322 } 323 elsif($sensor_types{$sonde_maj_sonde{$key}{type}}{rrd} == 0) 324 { 325 # pas de base rrd associee. 326 # la sonde existe deja avec les bons parametres. Pas de mise a jour. 327 delete $sonde_maj_sonde{$key}; 328 } 329 else 330 { 331 # la sonde n'existe pas, il faut la creer. 332 my $nom_pt_metro = get_nom_pt_metro($key); 333 334 message_erreur("NOUVEAU point de metrologie : \"$nom_pt_metro\". Parametres ($sonde_maj_sonde{$key}{ip}, 335 $sonde_maj_sonde{$key}{community},$sonde_maj_sonde{$key}{params})"); 336 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 337 "\t WARNING : sonde $compteur_keys, la base $key n'existe pas, procedure d'ajout de sonde"); 338 339 ajouter_sonde($key,$sonde_maj_sonde{$key}{type}, 340 $sonde_maj_sonde{$key}{ip}, 341 $sonde_maj_sonde{$key}{community}, 342 $sonde_maj_sonde{$key}{params}); 343 } 344 } 345 } 346 # new sensor 347 else 348 { 349 my $nom_pt_metro = get_nom_pt_metro($key); 350 351 message_erreur("NOUVEAU point de metrologie : \"$nom_pt_metro\". Parametres ($sonde_maj_sonde{$key}{ip}, 352 $sonde_maj_sonde{$key}{community},$sonde_maj_sonde{$key}{params}), sonde $compteur_keys"); 353 354 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 355 "\t INFO : NOUVEAU point de metrologie : \"$nom_pt_metro\". Parametres ($sonde_maj_sonde{$key}{ip}, 356 $sonde_maj_sonde{$key}{community},$sonde_maj_sonde{$key}{params}), sonde $compteur_keys"); 357 358 ajouter_sonde($key,$sonde_maj_sonde{$key}{type}, 359 $sonde_maj_sonde{$key}{ip}, 360 $sonde_maj_sonde{$key}{community}, 361 $sonde_maj_sonde{$key}{params}); 362 } 363 } 364 365 # if some sensor type are disabled, write warning log message. 366 if($sdis == 1) 367 { 368 my $list = ""; 369 foreach my $s (%sensor_disabled) 370 { 371 $list = "$list (type = $s, $sensor_disabled{$s} sensors)"; 372 } 373 374 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 375 "\t WARNING : The following sensors types are disabled :$list. 376 Set the global variable %sensor_type to enable them."); 377 } 378 379 380 # tentatives d'�criture des fichiers mis � jour 381 my $essais = 5; 382 my $ok = 0; 383 while($essais > 0) 384 { 385 if(check_lock_file("$lockdir","update_sensors.lock","metrocreatedb") == 0) 386 { 387 # on locke le fichier pour le mettre � jour 388 create_lock_file("$lockdir","update_sensors.lock","metrocreatedb"); 389 390 # ecriture du fichier majMETRO mis � jour 391 ecrit_liste_majMETRO(); 392 393 # ecriture du fichier metro.maj_sondes 394 #ecrit_liste_maj_sondes(); 395 396 # suppression du verrou 397 delete_lock_file("$lockdir/update_sensors.lock"); 398 399 $essais = 0; 400 $ok = 1; 401 } 402 else 403 { 404 sleep(5); 405 $essais --; 406 } 407 } 408 409 if($ok == 0) 410 { 411 message_erreur("ERREUR : Probl�mes d'ecriture (lock) du fichier majMETRO. Mises � jour perdues."); 412 413 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 414 "\t ERREUR : Probl�mes d'ecriture (lock) du fichier majMETRO. Mises � jour perdues"); 415 } 416} 417 418 419########################################################### 420# chargement des lignes du fichier des equipements 421# supervises 422# FIXME 423sub charger_liste_sup_prod 424{ 425 if(open(LISTE,$global_conf{SUP_EQ})) 426 { 427 my $compteur = 0; 428 while(<LISTE>) 429 { 430 chomp; 431 my @l = split(/,/,$_); 432 433 if(ctrl_ip($l[1]) == 1 && $l[2] ne "") 434 { 435 # supprime les doublons 436 if(!defined($sonde_sup_prod{$l[0]})) 437 { 438 $sonde_sup_prod{$l[0]}{'ip'} = $l[1]; 439 $sonde_sup_prod{$l[0]}{'snmp_com'} = $l[2]; 440 $sonde_sup_prod{$l[0]}{'host_tmpl'} = $l[3]; 441 $sonde_sup_prod{$l[0]}{'topo_enabled'} = $l[4]; 442 $sonde_sup_prod{$l[0]}{'quarantine'} = $l[5]; 443 444 $compteur ++; 445 } 446 } 447 } 448 close(LISTE); 449 450 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 451 "\t INFO : chargement de la liste des equipemements supervises : $compteur equipements"); 452 } 453 else 454 { 455 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 456 "\t WARNING : echec ouverture du fichier $global_conf{SUP_EQ}"); 457 } 458} 459 460 461########################################################### 462# chargement des lignes du fichier majMETRO 463sub charger_liste_majMETRO 464{ 465 my $i; 466 if(open(LISTE,$sensorfile)) 467 { 468 my $compteur = 0; 469 my $line; 470 471 while($line = <LISTE>) 472 { 473 my $period = ""; 474 if($line =~/(.+);(.+) (.+)/) 475 { 476 ($period,$line) = (split(/;/,$line))[0,1]; 477 } 478 479 chomp $line; 480 my @liste = split(/\s+/,$line); 481 482 # Traitement METRO 483 # if($liste[1]=~/(.+).rrd$/) 484 # { 485 $sonde_majMETRO{$liste[1]}{type} = $liste[0]; 486 $sonde_majMETRO{$liste[1]}{ip} = $liste[2]; 487 $sonde_majMETRO{$liste[1]}{community} = $liste[3]; 488 $sonde_majMETRO{$liste[1]}{params} = $liste[4]; 489 $sonde_majMETRO{$liste[1]}{period} = $period; 490 491 if($sensor_types{$sonde_majMETRO{$liste[1]}{type}}{rrd} == 1) 492 { 493 $sonde_majMETRO{$liste[1]}{graph} = $sensor_types{$sonde_majMETRO{$liste[1]}{type}}{graph}; 494 } 495 else 496 { 497 $sonde_majMETRO{$liste[1]}{graph} = "none"; 498 } 499 500 my $t_liste = @liste; 501 for(my $i=5;$i<$t_liste;$i++) 502 { 503 $sonde_majMETRO{$liste[1]}{params} = "$sonde_majMETRO{$liste[1]}{params} $liste[$i]"; 504 } 505 if($sonde_majMETRO{$liste[1]}{params} =~/:/) 506 { 507 $sonde_majMETRO{$liste[1]}{params} =~tr/:/ /; 508 } 509 $compteur ++; 510 # } 511 } 512 close(LISTE); 513 514 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 515 "\t INFO : chargement des sondes de metrologie existantes : $compteur sondes"); 516 } 517 else 518 { 519 message_erreur("WARNING : ouverture du fichier $sensorfile echouee"); 520 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 521 "\t WARNING : ouverture du fichier $sensorfile echouee"); 522 } 523 524 # DEBUG 525 #read_tab_asso(%sonde_majMETRO); 526} 527 528 529 530########################################################### 531# chargement des nouvelles sondes en activite dans la base 532# SQL de l'appli TOPO 533sub load_dns_sql_sensors 534{ 535 my ($sql,$cursor,$sensor,$type,$eq,$ip,$comm,$param1,$param2,$lastmod,$lastseen); 536 537 my $compteur = -1; 538 539 #ouverture de la base PSQL 540 my $db = DBI->connect("dbi:Pg:dbname=$global_conf{dnsdbname};host=$global_conf{'dnsdbhost'}", 541 $global_conf{'dnsdbuser'}, $global_conf{'dnsdbpassword'}); 542 543 if($db) 544 { 545 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 546 "\t -> INFO : Connexion a la base $global_conf{dnsdbname}"); 547 548 $sql = "SELECT * from topo.sensor 549 WHERE now() - lastseen < interval '7d'"; 550 551 $cursor = $db->prepare($sql); 552 $cursor->execute; 553 554 while( ($sensor,$type,$eq,$comm,$param1,$param2,$lastmod,$lastseen) = $cursor->fetchrow ) 555 { 556 # |id | type | eq | comm | iface | param | lastmod | lastseen | 557 # |---------------------+--------+---------+-------+-----------+------------+---------------------+---------------------| 558 # |Mefs-ce1.crih-efs | trafic | efs-ce1 | o2get | ge-0/0/2 | | 2010-11-09 22:35:06 | 2010-11-16 16:47:53 | 559 my $ctrl_sensor = 1; 560 561 ### DEBUG 562 if($eq =~ /\.fr$/ || $eq =~ /\.eu$/ || $eq =~ /\.net$/ || $eq =~ /\.com$/) 563 { 564 $ip = getaddrbyhostname($eq); 565 } 566 elsif(ctrl_ip($eq) != 1) 567 { 568 $eq = "$eq\.$global_conf{'defaultdomain'}"; 569 $ip = getaddrbyhostname($eq); 570 571 if(ctrl_ip($ip) != 1) 572 { 573 $ctrl_sensor = 0; 574 575 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 576 "\t -> ERROR : Liste eq dans la base DNS 577 ($sensor,$type,$eq,$comm,$param1,$param2,$lastmod,$lastseen) Arguments invalides."); 578 } 579 } 580 else 581 { 582 $ip = $eq; 583 } 584 585 if($ctrl_sensor == 1) 586 { 587 if($sensor_types{$type}{rrd} == 1) 588 { 589 $sensor = "$global_conf{'metrodatadir'}/rrddb/$sensor.rrd"; 590 } 591 592 $sonde_maj_sonde{$sensor}{type} = $type; 593 $sonde_maj_sonde{$sensor}{ip} = $ip; 594 $sonde_maj_sonde{$sensor}{community} = $comm; 595 if($param2 ne "") 596 { 597 $sonde_maj_sonde{$sensor}{params} = "$param1 $param2"; 598 } 599 else 600 { 601 $sonde_maj_sonde{$sensor}{params} = $param1; 602 } 603 604 # equipements a superviser 605 $sonde_sup_new{$ip}=$comm; 606 607 $compteur ++; 608 } 609 } 610 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 611 "\t -> INFO : $compteur equipements dans la base $global_conf{dnsdbname}"); 612 } 613 else 614 { 615 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 616 "\t -> ERROR : Probleme de connexion a la base $global_conf{dnsdbname}"); 617 return $compteur; 618 } 619 620 return $compteur; 621} 622 623 624############################################################# 625# synchronisation de la liste des host integres dans TOPO 626# et ceux integres dans la plateforme de supervision 627sub cmp_listes_hotes_supervises 628{ 629 # controle des hosts a partir de la liste des hosts en supervision 630 foreach my $key (keys %sonde_sup_prod) 631 { 632 # teste si l'equipement est integre a TOPO 633 if(defined($sonde_sup_new{$sonde_sup_prod{$key}{'ip'}})) 634 { 635 # si dans la liste de TOPO on controle les infos et on les met a jour 636 update_sup_host($key,$sonde_sup_new{$sonde_sup_prod{$key}{'ip'}}); 637 } 638 # si l'equipement n'est plus integre dans TOPO 639 else 640 { 641 del_sup_host($key); 642 } 643 } 644 645 # controle des hosts a partir du reste de la liste envoy�e par TOPO 646 # il ne s'agit plus que de nouvelles machines non supervisees 647 foreach my $key (keys %sonde_sup_new) 648 { 649 my $oid = check_host($key,$sonde_sup_new{$key}); 650 # le host repond 651 if($oid != -1) 652 { 653 my $hostname = gethostnamebyaddr($key); 654 655 # si la resolution dns fonctionne 656 if($hostname ne "") 657 { 658 $oid_cache{$hostname} = $oid; 659 # ecriture dans la liste des machines a superviser 660 $sonde_sup_prod{$hostname}{'ip'} = $key; 661 $sonde_sup_prod{$hostname}{'topo_enabled'} = 1; 662 $sonde_sup_prod{$hostname}{'quarantine'} = 0; 663 $sonde_sup_prod{$hostname}{'snmp_com'} = $sonde_sup_new{$key}; 664 $sonde_sup_prod{$hostname}{'oid'} = $oid; 665 666 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 667 "\t INFO SUP : Intergration en supervision de ($key,$sonde_sup_new{$key})"); 668 } 669 # sinon message d'erreur 670 else 671 { 672 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 673 "\t ERREUR SUP : Integration en supervision de ($key,$sonde_sup_new{$key}), echec resolution DNS"); 674 } 675 } 676 # le host ne repond pas en snmp 677 else 678 { 679 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 680 "\t ERREUR SUP : Impossible d'integrer en supervision l'equipement ($key,$sonde_sup_new{$key})"); 681 } 682 } 683} 684 685 686########################################################### 687# traitement des bases qui n'existent plus dans topo 688sub test_bases_expirees 689{ 690 if(check_lock_file($lockdir,"quarantaine.lock","metrocreatedb") == 0) 691 { 692 # on locke le fichier pour le lire 693 create_lock_file($lockdir,"quarantaine.lock","metrocreatedb"); 694 695 # lecture des bases recement supprim�es de topo 696 open(QUA,$quarantinefile); 697 while(<QUA>) 698 { 699 chomp; 700 my ($base,$temps) = (split(/;/,$_))[0,1]; 701 $quarantaine{$base} = $temps; 702 } 703 close(QUA); 704 705 my $key; 706 foreach $key (keys %sonde_majMETRO) 707 { 708 # teste si la sonde existe toujours dans topo 709 if(defined($sonde_maj_sonde{$key})) 710 { 711 if(defined($quarantaine{$key})) 712 { 713 # la sonde existe dans topo et est en quarantaine. On la supprime de la quarantaine. 714 my $nom_pt_metro = get_nom_pt_metro($key); 715 message_erreur("REMISE en SERVICE : point de m�trologie \"$nom_pt_metro\"."); 716 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 717 "\t INFO : retrait de $key du fichier de quarantaine"); 718 719 delete $quarantaine{$key}; 720 } 721 } 722 # la sonde n'existe plus dans topo 723 else 724 { 725 my $seuil = $global_conf{sensorsurvival} * 24 * 3600; 726 727 # si la sonde n'est pas encore en quarentaine 728 if(!defined($quarantaine{$key})) 729 { 730 # on l'insert 731 $quarantaine{$key} = $timet; 732 } 733 734 if($quarantaine{$key} == $timet) 735 { 736 my $nom_pt_metro = get_nom_pt_metro($key); 737 message_erreur("SUPPRESSION dans TOPO : point de m�trologie \"$nom_pt_metro\"."); 738 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 739 "\t WARNING : La sonde sur la base $key n'existe plus dans Topo. Mise en quarantaine"); 740 } 741 elsif($quarantaine{$key} + $seuil <= $timet) 742 { 743 my $nom_pt_metro = get_nom_pt_metro($key); 744 message_erreur("SUPPRESSION DEFINITIVE : point de m�trologie \"$nom_pt_metro\"."); 745 writelog("cree-base-metro","","info", 746 "\t WARNING : suppression d�finitive de $key"); 747 748 supprimer_base($key); 749 delete $quarantaine{$key}; 750 } 751 } 752 } 753 754 # nettoyage du fichier de quarantaine 755 foreach $key (keys %quarantaine) 756 { 757 if(!defined($sonde_majMETRO{$key})) 758 { 759 delete $quarantaine{$key}; 760 } 761 } 762 763 # reecriture du fichier de quarantaine 764 open(QUA,">$quarantinefile"); 765 foreach $key (keys %quarantaine) 766 { 767 print QUA "$key;$quarantaine{$key}\n"; 768 } 769 close(QUA); 770 771 # suppression du verrou 772 delete_lock_file("$lockdir/quarantaine.lock"); 773 } 774 else 775 { 776 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 777 "\t WARNING : file $quarantinefile locked"); 778 } 779} 780 781 782########################################################### 783# suppression du parametre communaute snmp pour les mails 784sub supprimer_com_snmp 785{ 786 my ($params) = @_; 787 my $i; 788 789 my @tab_params = split(/\s+/,$params); 790 my $t_tab = @tab_params; 791 my $p = ""; 792 793 for($i=0;$i<$t_tab;$i++) 794 { 795 if($i != 1) 796 { 797 $p = "$p $tab_params[$i]"; 798 } 799 } 800 801 return $p; 802} 803 804 805########################################################### 806# extrait le nom du point de metrologie 807sub get_nom_pt_metro 808{ 809 my ($rrd_db) = @_; 810 811 my @liste_dir = split(/\//,$rrd_db); 812 my $t_liste_dir = @liste_dir; 813 814 $rrd_db = $liste_dir[$t_liste_dir -1]; 815 816 ($rrd_db) = (split(/\.rrd/,$rrd_db))[0]; 817 818 return $rrd_db; 819} 820 821 822########################################################### 823# ecriture du fichier FILE_SUP_EQ 824# FIXME corriger fonction pour adapation netmagis 825sub ecrit_liste_sup_eq 826{ 827 my $key; 828 829 # ecriture des sondes qui n'ont pas pu etre installees 830 if(open(LISTE,">$global_conf{SUP_EQ}")) 831 { 832 #print LISTE "HOSTNAME,HOST_IP_ADDRESS,SNMP_COMMUNITY,HOST_TEMPLATE,TOPO_ENABLED,QUARANTINE\n"; 833 834 foreach $key (keys %sonde_sup_prod) 835 { 836 if($sonde_sup_prod{$key}{'ip'} ne "" && $sonde_sup_prod{$key}{'snmp_com'} ne "") 837 { 838 print LISTE "$key,$sonde_sup_prod{$key}{'ip'},$sonde_sup_prod{$key}{'snmp_com'},$sonde_sup_prod{$key}{'host_tmpl'},$sonde_sup_prod{$key}{'topo_enabled'},$sonde_sup_prod{$key}{'quarantine'}\n"; 839 } 840 } 841 842 close(LISTE); 843 844 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 845 "\t INFO SUP : Ecriture du fichier $global_conf{SUP_EQ}"); 846 } 847 else 848 { 849 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 850 "\t ERREUR SUP : ouverture du fichier $global_conf{SUP_EQ} en ecriture impossible"); 851 } 852} 853 854 855############################################################## 856# suppression d'un host de la plateforme de supervision 857sub del_sup_host 858{ 859 my ($key) = @_; 860 861 # si le host n'a pas depasse la periode de max de quarantaine ... 862 if(($timet - ($global_conf{sensorsurvival} * 84600)) < $sonde_sup_prod{$key}{'quarantine'}) 863 { 864 $sonde_sup_prod{$key}{'topo_enabled'} = 0; 865 866 if($sonde_sup_prod{$key}{'quarantine'} != 0) 867 { 868 my %t = get_time($sonde_sup_prod{$key}{'quarantine'}); 869 870 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 871 "\t INFO SUP : Host en quarantaine : $key, depuis le $t{MDAY}-$t{MON}-$t{YEAR}"); 872 } 873 } 874 # sinon, on supprime le host de la supervision 875 else 876 { 877 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 878 "\t INFO SUP : suppression definitive de $key,$sonde_sup_prod{$key}"); 879 delete $sonde_sup_prod{$key}; 880 } 881} 882 883 884############################################################# 885# ecriture des messages d'erreurs dans un tableau associatif 886sub message_erreur 887{ my ($msg_err) = @_; 888 889 $message_mail = 1; 890 $error_msg{$msg_err} = 1; 891} 892 893 894############################################################# 895# Mise a jour des parametres d'un host dans la plateforme de 896# supervision 897sub update_sup_host 898{ 899 my ($host,$snmp_com) = @_; 900 901 my $quarantine = 0; 902 903 my $hostname = gethostnamebyaddr($sonde_sup_prod{$host}{'ip'}); 904 905 my $oid = check_host($sonde_sup_prod{$host}{'ip'},$snmp_com); 906 907 # si la machine est declaree dans le DNS 908 if($hostname ne "") 909 { 910 if($host eq $hostname) 911 { 912 $sonde_sup_prod{$hostname}{'topo_enabled'} = 1; 913 $sonde_sup_prod{$hostname}{'snmp_com'} = $snmp_com; 914 } 915 else 916 # si le nom du host a change 917 { 918 $sonde_sup_prod{$hostname}{'ip'} = $sonde_sup_prod{$host}{'ip'}; 919 $sonde_sup_prod{$hostname}{'snmp_com'} = $snmp_com; 920 $sonde_sup_prod{$hostname}{'topo_enabled'} = 1; 921 delete $sonde_sup_prod{$host}; 922 923 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 924 "\t WARNING SUP : le nom du host a change $host -> $hostname : suppression de $host"); 925 } 926 } 927 # si la machine n'est pas declaree ou que le DNS ne repond pas 928 else 929 { 930 $sonde_sup_prod{$hostname}{'snmp_com'} = $snmp_com; 931 $sonde_sup_prod{$hostname}{'topo_enabled'} = 1; 932 $quarantine = 1; 933 } 934 935 if($oid != -1) 936 { 937 $sonde_sup_prod{$hostname}{'oid'} = $oid; 938 } 939 else 940 { 941 writelog("metrocreatedb","$global_conf{majdblogfacility}","info", 942 "\t ERREUR SUP : echec SNMP get sysOID ($sonde_sup_prod{$hostname}{'ip'},$snmp_com), on laisse en supervision"); 943 $quarantine = 1; 944 } 945 946 # mise en quarantaine 947 if($quarantine == 1 && $sonde_sup_prod{$host}{'quarantine'} == 0) 948 { 949 $sonde_sup_prod{$host}{'quarantine'} = $timet; 950 } 951 952 # si l'hote est en quarantaine on lance la fonction de suppression 953 if($quarantine == 1) 954 { 955 del_sup_host($host); 956 } 957 # sinon on le sort de la quarantaine 958 else 959 { 960 $sonde_sup_prod{$host}{'quarantine'} = 0; 961 } 962 963 # nettoyage de sonde_sup_new 964 delete $sonde_sup_new{$sonde_sup_prod{$host}{'ip'}}; 965} 966 967 968########################################################### 969# ajouter une sonde 970# - trafic 971# - nbauthwifi 972# - nbassocwifi 973# - broadcast 974# - multicast 975# - trafficError 976# - ipmac 977# - portmac 978sub ajouter_sonde 979{ 980 my ($base,$type,$ip,$com,$params) = @_; 981 982 if($type eq "trafic" || $type eq "aggreg_trafic" || $type eq "trafic1min") 983 { 984 if($ip=~/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) 985 { 986 #les param�tres sont justes 987 my $result = trafic($ip,$com,$params,$base,$type); 988 989 # si l'interface n'existe pas, on supprime l'entree 990 if($result == 2) 991 { 992 delete $sonde_maj_sonde{$base}; 993 } 994 } 995 else 996 { 997 if("$ip $com $params" !~/undef/) 998 { 999 my $nom_pt_metro = get_nom_pt_metro($base); 1000 message_erreur("ERREUR : Parametres ERRONES pour le point de METRO \"$nom_pt_metro\": 1001 ($ip,$com,$params)"); 1002 } 1003 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1004 "\t ERREUR Parametres de sonde ($base, $type) errones : ($ip $com $params)"); 1005 1006 delete $sonde_maj_sonde{$base}; 1007 } 1008 } 1009 elsif($type eq "broadcast" || $type eq "multicast" || $type eq "trafficError" || $type eq "broadcast1min") 1010 { 1011 if($ip=~/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) 1012 { 1013 #les param�tres sont justes 1014 my $result = traficPaquets($type,$ip,$com,$params,$base); 1015 1016 # si l'interface n'existe pas, on supprime l'entree 1017 if($result == 2) 1018 { 1019 delete $sonde_maj_sonde{$base}; 1020 } 1021 } 1022 else 1023 { 1024 if("$ip $com $params" !~/undef/) 1025 { 1026 my $nom_pt_metro = get_nom_pt_metro($base); 1027 message_erreur("ERREUR : Parametres ERRONES pour le point de METRO \"$nom_pt_metro\": 1028 ($ip,$com,$params)"); 1029 } 1030 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1031 "\t ERREUR Parametres de sonde ($base, $type) errones : ($ip $com $params)"); 1032 1033 delete $sonde_maj_sonde{$base}; 1034 } 1035 } 1036 elsif($type eq "nbassocwifi" || $type eq "nbauthwifi") 1037 { 1038 if("$ip $com $params" =~/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) (.+) (.+) (.+)$/) 1039 { 1040 #les param�tres sont justes 1041 my $result = authassocwifi($type,$1,$2,$3,$4,$base); 1042 } 1043 else 1044 { 1045 if("$ip $com $params"!~/undef/) 1046 { 1047 my $nom_pt_metro = get_nom_pt_metro($base); 1048 message_erreur("ERREUR : Param�tres ERRONES pour le point de METRO \"$nom_pt_metro\". Parametres : ($ip $com $params)"); 1049 } 1050 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1051 "\t ERREUR Param�tres de sonde ($base,$type) errones : ($ip $com $params)"); 1052 1053 delete $sonde_maj_sonde{$base}; 1054 } 1055 } 1056 # check and install new ipmac probe 1057 elsif($type eq "ipmac") 1058 { 1059 if("$ip $com" =~/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) (.+)$/) 1060 { 1061 print "ipmac($type,$1,$2,$base)\n"; 1062 my $result = ipmac($type,$1,$2,$base); 1063 } 1064 else 1065 { 1066 if("$ip $com"!~/undef/) 1067 { 1068 my $nom_pt_metro = get_nom_pt_metro($base); 1069 message_erreur("ERREUR : Param�tres ERRONES pour le point de METRO \"$nom_pt_metro\". Parametres : ($ip $com)"); 1070 } 1071 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1072 "\t ERREUR Param�tres de sonde ($base,$type) errones : ($ip $com)"); 1073 1074 delete $sonde_maj_sonde{$base}; 1075 } 1076 } 1077 elsif($type =~ /^portmac.*/) 1078 { 1079 if("$ip $com $params" =~/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) (.+) (.+) (.+)$/) 1080 { 1081 my $result = portmac($type,$1,$2,$3,$4,$base); 1082 } 1083 else 1084 { 1085 if("$ip $com $params"!~/undef/) 1086 { 1087 my $nom_pt_metro = get_nom_pt_metro($base); 1088 message_erreur("ERREUR : Param�tres ERRONES pour le point de METRO \"$nom_pt_metro\". Parametres : ($ip $com)"); 1089 } 1090 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1091 "\t ERREUR Param�tres de sonde ($base,$type) errones : ($ip $com)"); 1092 1093 delete $sonde_maj_sonde{$base}; 1094 } 1095 } 1096} 1097 1098########################################################### 1099# create plugin probe 1100# error codes : 1101# 0 ok 1102sub enable_plugin_ipmac_portmac 1103{ 1104 #select value from global.config where key='macactive' 1105 my $db = DBI->connect("dbi:Pg:dbname=$global_conf{dnsdbname};host=$global_conf{'dnsdbhost'}", 1106 $global_conf{'dnsdbuser'}, $global_conf{'dnsdbpassword'}); 1107 1108 if($db) 1109 { 1110 1111 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1112 "\t -> INFO : Connect to $global_conf{dnsdbname} database. Read global.conf table."); 1113 1114 my $sql = "SELECT value from global.config 1115 WHERE key='macactive'"; 1116 1117 my $cursor = $db->prepare($sql); 1118 $cursor->execute; 1119 1120 my $value = $cursor->fetchrow; 1121 1122 if($value == 1) 1123 { 1124 # write portmac-plugin 1125 $sonde_majMETRO{'plugin-portmac'}{type} = "plugin"; 1126 $sonde_majMETRO{'plugin-portmac'}{ip} = "x"; 1127 $sonde_majMETRO{'plugin-portmac'}{community} = "x"; 1128 $sonde_majMETRO{'plugin-portmac'}{params} = ""; 1129 $sonde_majMETRO{'plugin-portmac'}{period} = "*/5 * * * *"; 1130 $sonde_majMETRO{'plugin-portmac'}{graph} = "none"; 1131 # write ipmac-plugin 1132 $sonde_majMETRO{'plugin-ipmac'}{type} = "plugin"; 1133 $sonde_majMETRO{'plugin-ipmac'}{ip} = "x"; 1134 $sonde_majMETRO{'plugin-ipmac'}{community} = "x"; 1135 $sonde_majMETRO{'plugin-ipmac'}{params} = ""; 1136 $sonde_majMETRO{'plugin-ipmac'}{period} = "*/5 * * * *"; 1137 $sonde_majMETRO{'plugin-ipmac'}{graph} = "none"; 1138 1139 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1140 "\t -> INFO : Active the sessions data storage to mac database"); 1141 } 1142 1143 return 0; 1144 } 1145 else 1146 { 1147 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1148 "\t -> ERROR : Connect to $global_conf{dnsdbname} failed."); 1149 } 1150 1151 return 1; 1152} 1153 1154 1155########################################################### 1156# create probe to get portmac/mac associations on switches 1157# error codes : 1158# 0 ok 1159# 1 equipment down 1160sub portmac 1161{ 1162 my ($sonde,$ip,$com,$iflist,$vlanlist,$base) = @_; 1163 1164 my $param = $com."@".$ip; 1165 1166 # get snmp sysoid of the equipement 1167 my $oid = get_snmp_oid($param); 1168 1169 # if equipment responds 1170 if($oid ne -1) 1171 { 1172 # write new line 1173 $sonde_majMETRO{$base}{type} = $sonde; 1174 $sonde_majMETRO{$base}{ip} = $ip; 1175 $sonde_majMETRO{$base}{community} = $com; 1176 $sonde_majMETRO{$base}{params} = "$iflist:$vlanlist"; 1177 $sonde_majMETRO{$base}{period} = $sensor_types{$sonde}{period}; 1178 1179 # delete entry in table %sonde_maj_sonde 1180 delete $sonde_maj_sonde{$base}; 1181 } 1182 else 1183 { 1184 my $nom_pt_metro = get_nom_pt_metro($base); 1185 message_erreur("ERREUR : Point de m�trologie \"$nom_pt_metro\". L'�quipement $ip ne repond pas."); 1186 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1187 "\t ERREUR : L'�quipement $ip ne repond pas"); 1188 return 1; 1189 } 1190 1191 return 0; 1192} 1193 1194########################################################### 1195# create probe to get ip/mac associations in arp 1196# database 1197# error codes : 1198# 0 ok 1199# 1 equipment down 1200sub ipmac 1201{ 1202 my ($sonde,$ip,$com,$base) = @_; 1203 1204 my $param = $com."@".$ip; 1205 1206 # get snmp sysoid of the equipement 1207 my $oid = get_snmp_oid($param); 1208 1209 # if equipment responds 1210 if($oid ne -1) 1211 { 1212 # write new line 1213 $sonde_majMETRO{$base}{type} = $sonde; 1214 $sonde_majMETRO{$base}{ip} = $ip; 1215 $sonde_majMETRO{$base}{community} = $com; 1216 $sonde_majMETRO{$base}{params} = "none"; 1217 $sonde_majMETRO{$base}{period} = "*/5 * * * *"; 1218 1219 # delete entry in table %sonde_maj_sonde 1220 delete $sonde_maj_sonde{$base}; 1221 1222 if(-e $base) 1223 { 1224 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1225 "\t INFO : La base $base existe deja, on continue a s'en servir"); 1226 } 1227 else 1228 { 1229 creeBaseNbGeneric($base,"*/5"); 1230 1231 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1232 "\t INFO : Creation de $base"); 1233 } 1234 } 1235 else 1236 { 1237 my $nom_pt_metro = get_nom_pt_metro($base); 1238 message_erreur("ERREUR : Point de m�trologie \"$nom_pt_metro\". L'�quipement $ip ne repond pas."); 1239 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1240 "\t ERREUR : L'�quipement $ip ne repond pas"); 1241 return 1; 1242 } 1243 1244 return 0; 1245} 1246 1247 1248########################################################### 1249# cree une sonde pour compter les authentifications et les 1250# associations sur le resau WiFi 1251# codes erreur 1252# 0 ok 1253# 1 equipement down 1254sub authassocwifi 1255{ 1256 my ($sonde,$ip,$com,$if,$ssid,$base) = @_; 1257 1258 my $param = $com."@".$ip; 1259 1260 # recup�ration de l'oid de l'equipement 1261 my $oid = get_snmp_oid($param); 1262 1263 # si l'�quipement r�pond 1264 if($oid != -1) 1265 { 1266 # ecriture de la nouvelle ligne 1267 $sonde_majMETRO{$base}{type} = $sonde; 1268 $sonde_majMETRO{$base}{ip} = $ip; 1269 $sonde_majMETRO{$base}{community} = $com; 1270 $sonde_majMETRO{$base}{params} = "$if:$ssid"; 1271 1272 # suppression de l'enr�e du tableau $sonde_maj_sonde 1273 delete $sonde_maj_sonde{$base}; 1274 1275 # v�rifier existance d'une base 1276 # elle n'existe pas : on la cr�e 1277 if(-e $base) 1278 { 1279 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1280 "\t INFO : La base $base existe deja, on continue a s'en servir"); 1281 } 1282 else 1283 { 1284 creeBaseAuthassocwifi($base,$ssid); 1285 1286 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1287 "\t INFO : Creation de $base"); 1288 } 1289 1290 } 1291 else 1292 { 1293 my $nom_pt_metro = get_nom_pt_metro($base); 1294 message_erreur("ERREUR : Point de m�trologie \"$nom_pt_metro\". L'�quipement $ip ne repond pas."); 1295 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1296 "\t ERREUR : L'�quipement $ip ne repond pas"); 1297 return 1; 1298 } 1299 1300 return 0; 1301} 1302 1303 1304 1305 1306########################################################### 1307# controle le type de sonde de trafic 1308# compteur 32 bits ou compteur 64 bits 1309# 1 la sonde est ok 1310# 0 la vitesse de l'interface a change il faut modifier le 1311# compteur, il y a une erreur 1312sub check_if_speed 1313{ 1314 my ($sonde,$ip,$com,$if) = @_; 1315 1316 if($sonde eq "ifNom-snmp32" || $sonde eq "ifNom-snmp64") 1317 { 1318 my $snmp_param = $com."@".$ip; 1319 1320 # recuperation de la vitesse de l'interface 1321 my $speed = get_snmp_ifspeed($snmp_param,"",$if,$global_conf{majdblogfacility}); 1322 1323 if($sonde eq "ifNom-snmp32") 1324 { 1325 if($speed > 100000000) 1326 { 1327 return 0; 1328 # la vitesse n'est pas bonne, il faut mettre la sonde a jour 1329 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1330 "\t WARNING : $sonde inadapte a $speed"); 1331 } 1332 else 1333 { 1334 return 1; 1335 } 1336 } 1337 elsif($sonde eq "ifNom-snmp64") 1338 { 1339 if($speed > 100000000) 1340 { 1341 return 1; 1342 } 1343 else 1344 { 1345 return 0; 1346 # la vitesse n'est pas bonne, il faut mettre la sonde a jour 1347 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1348 "\t WARNING : $sonde inadapte a $speed"); 1349 } 1350 } 1351 return 0; 1352 } 1353 return 0; 1354} 1355 1356 1357########################################################### 1358# cree une sonde de trafic 1359# codes erreur 1360# 0 ok 1361# 1 equipement down 1362# 2 interface inexistanet 1363sub trafic 1364{ 1365 my ($ip,$com,$if,$base,$graph) = @_; 1366 1367 my $inverse = 0; 1368 my ($i,$speed,$sonde_polling); 1369 my $param = $com."@".$ip; 1370 1371 chomp $if; 1372 my $interf = $if; 1373 1374 #print "$ip,$com,$if\n"; 1375 # interroger l'equipement 1376 if($if=~/^-/) 1377 { 1378 $inverse = 1; 1379 $if =~s/^-//; 1380 } 1381 1382 # recup�ration de l'oid de l'equipement 1383 my $oid = get_snmp_oid($param); 1384 1385 # si l'�quipement r�pond 1386 if($oid ne -1) 1387 { 1388 # recuperation de l'oid de l'interface 1389 my $index = get_snmp_ifindex($param,$if); 1390 1391 if($index != -1) 1392 { 1393 # recuperation de la vitesse de l'interface 1394 $speed = get_snmp_ifspeed($param,$index,$interf,$global_conf{majdblogfacility}); 1395 1396 if($speed <= 100000000) 1397 { 1398 $speed = 100000000; 1399 $sonde_polling = "ifNom-snmp32"; 1400 } 1401 else 1402 { 1403 $sonde_polling = "ifNom-snmp64"; 1404 } 1405 1406 # ecriture de la nouvelle ligne 1407 $sonde_majMETRO{$base}{ip} = $ip; 1408 $sonde_majMETRO{$base}{community} = $com; 1409 $sonde_majMETRO{$base}{params} = $interf; 1410 $sonde_majMETRO{$base}{type} = $sonde_polling; 1411 1412 if($graph eq "trafic1min") 1413 { 1414 $sonde_majMETRO{$base}{period} = "* * * * *"; 1415 1416 writelog("cree-base-metro","","info", 1417 "\t INFO : Base $base, �chantillonage * * * * *"); 1418 } 1419 else 1420 { 1421 $sonde_majMETRO{$base}{period} = "*/5 * * * *"; 1422 } 1423 1424 # suppression de l'en du tableau $sonde_maj_sonde 1425 delete $sonde_maj_sonde{$base}; 1426 1427 # v�rifier existance d'une base 1428 # elle n'existe pas : on la cr�e 1429 if(-e $base) 1430 { 1431 my $nom_pt_metro = get_nom_pt_metro($base); 1432 message_erreur("MODIFICATION : point de metrologie \"$nom_pt_metro\". Vitesse de l'interface ($ip,$interf) passse a $speed"); 1433 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1434 "\t INFO : La base $base existe deja"); 1435 1436 setBaseMaxSpeed($base,$speed); 1437 } 1438 else 1439 { 1440 creeBaseTrafic($base,$speed,$global_conf{majdblogfacility},$sonde_majMETRO{$base}{period}); 1441 1442 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1443 "\t INFO : Creation de $base"); 1444 } 1445 } 1446 else 1447 { 1448 my $nom_pt_metro = get_nom_pt_metro($base); 1449 message_erreur("ERREUR : point de m�trologie \"$nom_pt_metro\". L'interface $if de $ip n'existe pas, suppression de l'entree."); 1450 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1451 "\t ERREUR : L'interface $if de $ip n'existe pas, suppression de l'entree"); 1452 return 2; 1453 } 1454 } 1455 else 1456 { 1457 my $nom_pt_metro = get_nom_pt_metro($base); 1458 message_erreur("ERREUR : point de m�trologie \"$nom_pt_metro\". L'equipement $ip ne repond pas"); 1459 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1460 "\t ERREUR : L'equipement $ip ne repond pas"); 1461 return 1; 1462 } 1463 1464 return 0; 1465} 1466 1467 1468########################################################### 1469# cree une sonde qui compte les paquets 1470# - Broadcast 1471# - Multicast 1472# - Erreurs sur l'interface 1473# codes erreur 1474# 0 ok 1475# 1 equipement down 1476# 2 interface inexistanet 1477sub traficPaquets 1478{ 1479 1480 my ($typeSonde,$ip,$com,$if,$base) = @_; 1481 1482 my $inverse = 0; 1483 my ($i,$speed,$sonde_polling); 1484 my $param = $com."@".$ip; 1485 1486 chomp $if; 1487 my $interf = $if; 1488 1489 if($if=~/^-/) 1490 { 1491 $inverse = 1; 1492 $if =~s/^-//; 1493 } 1494 1495 # recup�ration de l'oid de l'equipement 1496 my $oid = get_snmp_oid($param); 1497 1498 # si l'�quipement r�pond 1499 if($oid ne -1) 1500 { 1501 # recuperation de l'oid de l'interface 1502 my $index = get_snmp_ifindex($param,$if); 1503 1504 if($index != -1) 1505 { 1506 # ecriture de la nouvelle ligne 1507 $sonde_majMETRO{$base}{ip} = $ip; 1508 $sonde_majMETRO{$base}{community} = $com; 1509 $sonde_majMETRO{$base}{params} = $interf; 1510 $sonde_majMETRO{$base}{type} = $typeSonde; 1511 $sonde_majMETRO{$base}{graph} = $typeSonde; 1512 $sonde_majMETRO{$base}{period} = "*/5 * * * *"; 1513 1514 writelog("cree-base-metro","","info", 1515 "\t INFO : Base $base, type = $sonde_majMETRO{$base}{type}"); 1516 if($typeSonde =~/(.*)1min$/) 1517 { 1518 $sonde_majMETRO{$base}{period} = "* * * * *"; 1519 $sonde_majMETRO{$base}{type} = $1; 1520 1521 writelog("cree-base-metro","","info", 1522 "\t INFO : Base $base, �chantillonage * * * * *"); 1523 } 1524 1525 # suppression de l'en du tableau $sonde_maj_sonde 1526 delete $sonde_maj_sonde{$base}; 1527 1528 # v�rifier existance d'une base 1529 # elle n'existe pas : on la cr�e 1530 if(-e $base) 1531 { 1532 my $nom_pt_metro = get_nom_pt_metro($base); 1533 message_erreur("MODIFICATION : point de metrologie \"$nom_pt_metro\". Vitesse de l'interface ($ip,$interf) passse a $speed"); 1534 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1535 "\t INFO : La base $base existe deja"); 1536 } 1537 else 1538 { 1539 # creation de la base avec une limitation a 200.000.000 de paquets par seconde 1540 creeBaseBroadcast($base,"200000000",$sonde_majMETRO{$base}{period}); 1541 1542 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1543 "\t INFO : Creation de $base"); 1544 } 1545 } 1546 else 1547 { 1548 my $nom_pt_metro = get_nom_pt_metro($base); 1549 message_erreur("ERREUR : point de m�trologie \"$nom_pt_metro\". L'interface $if de $ip n'existe pas, suppression de l'entree."); 1550 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1551 "\t ERREUR : L'interface $if de $ip n'existe pas, suppression de l'entree"); 1552 return 2; 1553 } 1554 } 1555 else 1556 { 1557 my $nom_pt_metro = get_nom_pt_metro($base); 1558 message_erreur("ERREUR : point de m�trologie \"$nom_pt_metro\". L'equipement $ip ne repond pas"); 1559 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1560 "\t ERREUR : L'equipement $ip ne repond pas"); 1561 return 1; 1562 } 1563 1564 return 0; 1565} 1566 1567########################################################### 1568# retourne le sysoid d'un �quipement 1569sub get_snmp_oid 1570{ 1571 my ($param) = @_; 1572 1573 my @sys_oid = (); 1574 &snmpmapOID("oid","1.3.6.1.2.1.1.2.0"); 1575 @sys_oid = &snmpget($param,"oid"); 1576 if($sys_oid[0] ne "") 1577 { 1578 return $sys_oid[0]; 1579 } 1580 else 1581 { 1582 return -1; 1583 } 1584} 1585 1586 1587 1588########################################################### 1589# ecriture du fichier majMETRO mis � jour 1590sub ecrit_liste_majMETRO 1591{ 1592 my $key; 1593 1594 if(open(LISTE,">$sensorfile")) 1595 { 1596 foreach $key (keys %sonde_majMETRO) 1597 { 1598 if($sonde_majMETRO{$key}{params} =~/\s+/) 1599 { 1600 $sonde_majMETRO{$key}{params} =~ tr/ /:/; 1601 } 1602 if($sonde_majMETRO{$key}{params} eq "none") 1603 { 1604 $sonde_majMETRO{$key}{params} = " "; 1605 } 1606 if(exists $sonde_majMETRO{$key}{period}) 1607 { 1608 if($sonde_majMETRO{$key}{period} ne "") 1609 { 1610 print LISTE "$sonde_majMETRO{$key}{period};$sonde_majMETRO{$key}{type} $key $sonde_majMETRO{$key}{ip} $sonde_majMETRO{$key}{community} $sonde_majMETRO{$key}{params}\n"; 1611 } 1612 else 1613 { 1614 print LISTE "$sonde_majMETRO{$key}{type} $key $sonde_majMETRO{$key}{ip} $sonde_majMETRO{$key}{community} $sonde_majMETRO{$key}{params}\n"; 1615 } 1616 } 1617 } 1618 close(LISTE); 1619 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1620 "\t INFO : Ecriture du fichier $sensorfile"); 1621 } 1622 else 1623 { 1624 writelog("metrocreatedb",$global_conf{majdblogfacility},"info", 1625 "\t ERREUR : ouverture du fichier $sensorfile en ecriture impossible"); 1626 } 1627} 1628 1629########################################################### 1630# chargement du fichier de cache des sysoid des equipements 1631# supervises 1632sub load_oid_cache 1633{ 1634 if(open(LISTE,"$cachedir/sysoid.cache")) 1635 { 1636 while(<LISTE>) 1637 { 1638 chomp; 1639 my($host,$sysoid) = (split(/,/,$_))[0,1]; 1640 $oid_cache{$host} = $sysoid; 1641 } 1642 close(LISTE); 1643 } 1644 else 1645 { 1646 writelog("cree-base-metro","","info", 1647 "\t ERREUR : echec ouverture du fichier $global_conf{majdblogfacility}/sysoid.cache"); 1648 } 1649} 1650 1651########################################################### 1652# ecriture du fichier de cache des sysoid des equipements 1653sub write_oid_cache 1654{ 1655 my $key; 1656 1657 if(open(LISTE,">$cachedir/sysoid.cache")) 1658 { 1659 foreach $key (keys %oid_cache) 1660 { 1661 print LISTE "$key,$oid_cache{$key}\n"; 1662 } 1663 close(LISTE); 1664 1665 writelog("cree-base-metro","","info", 1666 "\t INFO SUP : Ecriture du fichier $global_conf{majdblogfacility}/sysoid.cache"); 1667 } 1668 else 1669 { 1670 writelog("cree-base-metro","","info", 1671 "\t ERREUR SUP : ouverture du fichier $global_conf{majdblogfacility}/sysoid.cache en ecriture impossible"); 1672 } 1673} 1674 1675 1676################################################################ 1677# write file metro.grah for graph descriptions 1678sub ecrit_fichier_graph 1679{ 1680 my $file_graph = "$datadir/graph/metro.graph"; 1681 my $file_graph_tmp = "/tmp/metro.graph"; 1682 1683 open(LISTE,">$file_graph_tmp.temp"); 1684 foreach my $key (keys %sonde_majMETRO) 1685 { 1686 my $nom_pt_metro = get_nom_pt_metro($key); 1687 1688 print LISTE "$nom_pt_metro;$sonde_majMETRO{$key}{graph};1;$key;\n"; 1689 } 1690 close(LISTE); 1691 1692 system("cp $file_graph $file_graph_tmp.old"); 1693 system("cp $file_graph_tmp.temp $file_graph"); 1694 unlink "$file_graph_tmp.temp"; 1695} 1696 1697 1698########################################################### 1699# FIXME 1700# chargement des nouvelles sondes 1701sub charger_liste_maj_sondes 1702{ 1703 # chargement de la liste des sondes de TOPO a partir su spool 1704 if(open(LISTE,$global_conf{FILE_METRO_UPDATE_PROBES})) 1705 { 1706 my $compteur = 0; 1707 1708 while(<LISTE>) 1709 { 1710 chomp; 1711 if(/^(.+?);(.+?);(.+?);(.+?);(.+?)$/ && !/echec$/) 1712 { 1713 # traitement supervision 1714 if(ctrl_ip($3) == 1 && $4 ne "") 1715 { 1716 $sonde_sup_new{$3}=$4; 1717 } 1718 1719 # traitement appli METRO 1720 my $param = clean_var($5); 1721 # supprime les doublons 1722 # si la sonde n'existe pas alors on la cree 1723 if(!defined($sonde_maj_sonde{$2})) 1724 { 1725 # traitement appli METRO 1726 $sonde_maj_sonde{$2}{type} = $1; 1727 $sonde_maj_sonde{$2}{ip} = $3; 1728 $sonde_maj_sonde{$2}{community} = $4; 1729 $sonde_maj_sonde{$2}{params} = $param; 1730 $compteur ++; 1731 } 1732 # si elle existe deja dans la nouvelle liste ... 1733 else 1734 { 1735 if(!defined($sursis_maj_sondes{$2})) 1736 { 1737 # il y a un doublon dans les nouvelles sondes 1738 1739 if( ($sonde_maj_sonde{$2}{ip} eq $3) 1740 && ($sonde_maj_sonde{$2}{community} eq $4) 1741 && ($sonde_maj_sonde{$2}{params} eq "$param") 1742 ) 1743 { 1744 # la sonde en doublon a exactement les memes parametres. 1745 # on ignore 1746 } 1747 elsif(($sonde_maj_sonde{$2}{ip} !~/undef/) && ($3 !~/undef/)) 1748 { 1749 # sinon, on alerte pour une intervention humaine 1750 # a condition que l'@ ip de l'equipement ait ete trouvee 1751 1752 # suppression par securite de la communaute snmp pour ne pas l'afficher dans le mail 1753 my $nom_pt_metro = get_nom_pt_metro($2); 1754 message_erreur("ERREUR DOUBLON : point de m�trologie \"$nom_pt_metro\". 1755 Sonde pr�sente sur ($3 $param) et ($sonde_maj_sonde{$2}{ip} $sonde_maj_sonde{$2}{params})"); 1756 writelog("cree-base-metro","","info", 1757 "\t ERREUR : Doublon. $2 : Sonde presente sur ($3 $4 $param) et 1758 ($sonde_maj_sonde{$2}{ip} $sonde_maj_sonde{$2}{community} $sonde_maj_sonde{$2}{params})"); 1759 } 1760 } 1761 else 1762 { 1763 # sinon on verifie s'il n'y a pas un probleme de communaute 1764 # SNMP dans une sonde trouv�e en t�te de fichier. 1765 if( ($sonde_maj_sonde{$2}{ip} eq $3) 1766 && ($sonde_maj_sonde{$2}{params} eq $param) 1767 && ($sonde_maj_sonde{$2}{community} ne $4)) 1768 { 1769 $sonde_maj_sonde{$2}{community} = $4; 1770 1771 } 1772 } 1773 } 1774 } 1775 elsif(/^(.+?);(.+?);(.+?);(.+?);(.+?);echec/) 1776 { 1777 my $param = clean_var($5); 1778 # il s'agit d'une sonde dont l'installation a echoue 1779 # lors du precedant passage 1780 if(!defined($sonde_maj_sonde{$2})) 1781 { 1782 $sonde_maj_sonde{$2}{type} = $1; 1783 $sonde_maj_sonde{$2}{ip} = $3; 1784 $sonde_maj_sonde{$2}{community} = $4; 1785 $sonde_maj_sonde{$2}{params} = $param; 1786 $sursis_maj_sondes{$2} = 1; 1787 } 1788 } 1789 } 1790 close(LISTE); 1791 writelog("cree-base-metro","","info", 1792 "\t INFO : chargement des sondes � mettre � jour, $compteur sondes"); 1793 1794 if($compteur == 0) 1795 { 1796 return -1; 1797 } 1798 } 1799 else 1800 { 1801 writelog("cree-base-metro","","info", 1802 "\t ERREUR : echec ouverture du fichier $global_conf{FILE_METRO_UPDATE_PROBES}"); 1803 1804 return -1; 1805 } 1806 return 0; 1807} 1808 1809 1810 1811########################################################### 1812# suppression d'une base 1813sub supprimer_base 1814{ 1815 my ($base) = @_; 1816 1817 delete $sonde_majMETRO{$base}; 1818} 1819 1820 1821