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