#!/usr/bin/perl -w use Config::IniFiles; use IO::Socket; use Data::Dumper; require $ENV{HOME}."/bin/FileInfo.pm"; # Sera bueno poner esto en el archivo de configuracion? my @ArgTypes = qw(CMD CAT SUB PARAM SUBPARAM VAL); my $CmdValues = "LEE|MODIFICA|BORRA"; # Abre archivo de configuracion my $NomArchivoCfg = $ENV{MONICACTEINIFILE}; die "Error variable de ambiente MONICACTEINIFILE no contiene nombre de archivo" unless defined $NomArchivoCfg; my $CfgFileOb = new Config::IniFiles( -file => $NomArchivoCfg ); die "Error al abrir $NomArchivoCfg: $!" unless defined $CfgFileOb; my $SrvMonicaAddr = $CfgFileOb->val("MONICACTE", "MONICASRVADDR1"); die "Error en parametro SrvMonicaAddr: $!" unless defined $SrvMonicaAddr; my $SrvSaraPort = $CfgFileOb->val("SRVSARACFG", "SRVSARAPORT"); die "Error en parametro SrvMonicaPort: $!" unless defined $SrvSaraPort; my $Debug = $CfgFileOb->val("SRVSARACFG", "DEPURACION"); die "Error en parametro Debug: $!" unless defined $Debug; # Determina el archivo de log a usar y redirecciona stdout y stderr my $LogFile = $CfgFileOb->val("SRVSARACFG", "LOGFILE"); die "Error en parametro LogFile: $!" unless defined $LogFile; open(STDOUT, ">>$LogFile") || die "No se pudo redirigir stdout: $!"; open(STDERR, ">&STDOUT") || die "No se pudo redirigir stderr: $!"; select(STDOUT); $| = 1; select(STDERR); $| = 1; my $PidFile = $CfgFileOb->val("SRVSARACFG", "PIDFILE"); die "Error en parametro PidFile: $!" unless defined $PidFile; open(PIDFILE, ">$PidFile") || die "Error al abrir $PidFile: $!"; print PIDFILE $$; close PIDFILE; $server = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $SrvSaraPort, Listen => SOMAXCONN, Reuse => 1); die "Error al iniciar socket: $!" unless $server; select((select($server), $| = 1)[0]); $fecha_hora = `date '+%a %d/%m/%y %H:%M:%S'`; chomp($fecha_hora); print "[Servidor Sara $0 aceptando clientes $fecha_hora]\n"; while($client = $server->accept()) { $client->autoflush(1); $fecha_hora = `date '+%a %d/%m/%y %H:%M:%S'`; chomp($fecha_hora); # Checa que el mensaje venga desde el servidor donde corre Monica next unless $client->peerhost eq $SrvMonicaAddr; my $CadenaRecibida = <$client>; chomp $CadenaRecibida; my @ElementosRecibidos = split(/\s+/, $CadenaRecibida); print $fecha_hora." Desde [".$client->peerhost."] llego [".$CadenaRecibida."]\n" if $Debug eq "SI"; my %cmdline = (); my $ndx = 0; my ($ArgType, $ArgVal); # Valida el formato del mansaje recibido foreach my $Cadena(@ElementosRecibidos) { last unless $Cadena =~ /(\w+)=([\w\/\*]+)/; ($ArgType, $ArgVal) = split(/=/, $Cadena); if ($ndx == 0) { last unless $Cadena =~ /(CMD)=(\w+)/ && index($CmdValues, $ArgVal) > -1; last if ($ArgVal eq "MODIFICAR" || $ArgVal eq "BORRAR") && $#ElementosRecibidos < 5; } else { last unless $ArgType eq $ArgTypes[$ndx] && defined $ArgVal; } $cmdline{$ArgTypes[$ndx++]} = $ArgVal; } if ($ndx < $#ElementosRecibidos) { print $client "ERROR $ArgTypes[$ndx]\n"; next; } my %FileInfo = %{ FileInfo::ObtenerInfoArchivo($NomArchivoCfg) }; if ($cmdline{CMD} eq "LEE" && $cmdline{CAT} eq "*") { my %Host = (); my %Seccionesespeciales = (); my %Categorias = (); my @SeccionesEspeciales = qw(MONICACTE SRVSARACFG); foreach my $SeccionEspecial (@SeccionesEspeciales) { my %Seccionespecial = (); my @SeccionEspecialParams = $CfgFileOb->Parameters($SeccionEspecial); foreach my $SeccionEspecialParam (@SeccionEspecialParams) { $Seccionespecial{$SeccionEspecialParam} = $CfgFileOb->val($SeccionEspecial, $SeccionEspecialParam); } $Seccionesespeciales{$SeccionEspecial} = \%Seccionespecial; } $Host{CONFIGURACION} = \%Seccionesespeciales; my @CategoriasValidas = $CfgFileOb->Groups(); foreach my $Categoria (@CategoriasValidas) { my %Subcategorias = (); @SubCategorias = $CfgFileOb->GroupMembers( $Categoria ); foreach my $SubCategoria (@SubCategorias) { my %Monitoreo; my @Monitoreos = $CfgFileOb->val($SubCategoria, 'MONITOREOS'); foreach my $monitoreo (@Monitoreos) { my %ParamsMonitoreo; my @SubParams = $CfgFileOb->Parameters($monitoreo) if $CfgFileOb->SectionExists($monitoreo); foreach my $SubParam(@SubParams) { my @ListaSubParametros = $CfgFileOb->val($monitoreo, $SubParam); $ParamsMonitoreo{$SubParam} = \@ListaSubParametros; } $Monitoreo{$monitoreo} = \%ParamsMonitoreo; } my ($categoria, $subcategoria) = split(/\s+/, $SubCategoria, 2); my @LineasCronTab = EncuentraLineaCrontab($Categoria, $subcategoria); $Monitoreo{CRONTAB} = \@LineasCronTab; $Subcategorias{$subcategoria} = \%Monitoreo; } $Categorias{$Categoria} = \%Subcategorias; } $Host{CATEGORIAS} = \%Categorias; $Host{CFGFILEINFO} = \%FileInfo; $Data::Dumper::Indent = 0; $Data::Dumper::Purity = 1; # my $strHostHash = Data::Dumper->Dump([ \%Host ], [ qw(*Host) ]); my $strHostHash = Dumper( \%Host ); print $client "OK $strHostHash\n"; } else # SI EL COMANDO NO ES LECTURA..... { my @CategoriasValidas = $CfgFileOb->Groups(); if (grep(/$cmdline{CAT}/, @CategoriasValidas) < 1) { print $client "ERROR CAT\n"; next; } my @SubCategoriasValidas = $CfgFileOb->GroupMembers( $cmdline{CAT} ); if (grep(/$cmdline{SUB}/, @SubCategoriasValidas) < 1) { print $client "ERROR SUB\n"; next; } my @MonitoreosValidos = $CfgFileOb->val("$cmdline{CAT} $cmdline{SUB}", 'MONITOREOS'); if (grep(/$cmdline{PARAM}/, @MonitoreosValidos)<1) { print $client "ERROR PARAM\n"; next; } my @SubParams = $CfgFileOb->Parameters($cmdline{PARAM}) if $CfgFileOb->SectionExists($cmdline{PARAM}); unless (@SubParams && $#SubParams == 1) { print $client "ERROR PARAM\n"; next; } } # elsif ($cmdline{CMD} eq "MODIFICA") # { # @SubCategorias = $CfgFileOb->GroupMembers( $Categoria ); # } # elsif ($cmdline{CMD} eq "BORRA") # { # SubCategorias = $CfgFileOb->GroupMembers( $Categoria ); # } } close $client; # ################################################################# # EncuentraLineaCrontab # # # ################################################################# sub EncuentraLineaCrontab { my @CrontabLines = (); my $Cat = $_[0]; my $SubCat = $_[1]; my $CronCmd = "crontab -l | grep clntMonica | grep CAT=".$Cat." | grep SUB=".$SubCat; my @crontablines = `$CronCmd`; if ($#crontablines == -1) { push @CrontabLines, "NO HAY LINEA CORRESPONDIENTE EN CRON"; } else { while(@crontablines) { my $linea = shift @crontablines; chomp $linea; push @CrontabLines, $linea; } } return @CrontabLines; }