#!/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; } #### [MONICACTE] DEPURACION=SI LOGFILE=/home/cisic_mty/big_oper/monica/log/clntMonica.log MONICASRVADDR1=10.192.3.14 MONICASRVADDR2=10.192.4.205 CONNECTIONTIMEOUT=10 MONICASRVPORT=9000 [SRVSARACFG] SRVSARAPORT=9001 DEPURACION=SI LOGFILE=/home/cisic_mty/big_oper/monica/log/srvSara.log PIDFILE=/home/cisic_mty/big_oper/monica/bin/srvSara.pid [INFORMIX FINANZAS_TCP] MONITOREOS=<## package FileInfo; use File::stat; use User::grent; use User::pwent; use POSIX qw(strftime); sub ObtenerInfoArchivo { my %Datos = (); my $st = stat(shift @_) or die "No se pudo abrir archivo"; my $ActTime = strftime "%a %d/%m/%y %H:%M:%S", localtime($st->atime); my $ModTime = strftime "%a %d/%m/%y %H:%M:%S", localtime($st->mtime); my $CreTime = strftime "%a %d/%m/%y %H:%M:%S", localtime($st->ctime); my $grupo = getgrgid($st->gid); my $ident = getpwuid($st->uid); $Datos{UNAME} = $ident->[0]; $Datos{UID} = $st->uid; $Datos{GNAME} = $grupo->[0]; $Datos{GID} = $st->gid; $Datos{ATIME} = $ActTime; $Datos{MTIME} = $ModTime; $Datos{CTIME} = $CreTime; return \%Datos; } 1; #### #!/usr/local/ActivePerl-5.6/bin/perl -w use IO::Select; use IO::Socket; use Tk; use Tk::IO; use Tk::HList; use Config::IniFiles; use vars qw/$IMG_PARAMHOST $IMG_CAT $IMG_SUBCAT $IMG_PARAM $IMG_SUBPARAM/; use subs qw/lee_socket muestra_datos_host cierra_socket/; use strict; # use clntSara; my $SocketHandler; my $Socket_; my $ArchivoCfg = $ENV{MONICASRVINIFILE2}; my $cfgfile = new Config::IniFiles( -file => $ArchivoCfg ); die "Error al abrir $ArchivoCfg: $!" unless defined $cfgfile; my @Hosts = $cfgfile->Parameters("SRVMONICACFG"); my $NumHosts = $#Hosts; my $VentanaPrincipal = MainWindow->new; $VentanaPrincipal->configure(-title => "Configuracion de Servidor Monica", -background => 'blue'); my $FrameSup = $VentanaPrincipal->Frame(-relief => 'groove', -borderwidth => 3, -background => 'seagreen2', )->pack(-side => 'top', -fill => 'x'); my $Etiqueta = $FrameSup->Label(-text => $ArchivoCfg)->pack(-side => 'left'); $Etiqueta->pack; $Etiqueta->bind('' => sub { $VentanaPrincipal-> destroy }); my $FrameInt = $VentanaPrincipal->Frame(-relief => 'groove', -borderwidth => 3, -background => 'seagreen2', )->pack(-side => 'top', -fill => 'x'); my $Lista = $FrameInt->Scrolled(qw/Listbox -setgrid 1 -height 10 -scrollbars e/)->pack(qw/-side left -expand yes -fill both/); $Lista->focus; $Lista->bind('' => sub{ muestra_datos_host($_[0]->get('active')) }); $Lista->insert(0, @Hosts); $Lista->activate(0); my $FrameInf = $VentanaPrincipal->Frame(-relief => 'groove', -borderwidth => 3, -background => 'seagreen2', )->pack(-side => 'top', -fill => 'x'); my $ConfigDisplay = $FrameInf->Scrolled(qw\HList -separator | -selectmode extended -width 55 -height 20 -indent 35 -scrollbars se -itemtype imagetext\ )->grid(qw/-sticky nsew/); # $IMG_CAT = $VentanaPrincipal->Bitmap(-file => Tk->findINC('folder.xbm')); # $IMG_SUBCAT = $VentanaPrincipal->Bitmap(-file => Tk->findINC('file.xbm')); # $IMG_PARAMHOST = $VentanaPrincipal->Bitmap(-file => 'parametrohost.xbm'); $IMG_PARAMHOST = $VentanaPrincipal->Bitmap(-file => 'subparametro.xbm'); $IMG_CAT = $VentanaPrincipal->Bitmap(-file => 'categoria.xbm'); $IMG_SUBCAT = $VentanaPrincipal->Bitmap(-file => 'subcategoria.xbm'); $IMG_PARAM = $VentanaPrincipal->Bitmap(-file => 'parametro.xbm'); $IMG_SUBPARAM = $VentanaPrincipal->Bitmap(-file => 'subparametro.xbm'); MainLoop; sub muestra_datos_host { $ConfigDisplay->delete('all'); my $HostIniFileName = $cfgfile->val('SRVMONICACFG', $_[0]); my $HostIni = new Config::IniFiles( -file => $HostIniFileName ); die "Error al abrir $ArchivoCfg: $!" unless defined $HostIni; my @ParametrosHost = $HostIni->Parameters($_[0]); foreach my $ParametroHost(@ParametrosHost) { next if $ParametroHost eq 'CATEGORIAS'; my $Valor = $HostIni->val($_[0], $ParametroHost); $ConfigDisplay->add($ParametroHost, -text => $ParametroHost."=".$Valor, -image => $IMG_PARAMHOST, -data => $ParametroHost); } my @Categorias = $HostIni->val($_[0], 'CATEGORIAS'); foreach my $Categoria(@Categorias) { $ConfigDisplay->add($Categoria, -text => "$Categoria", -image => $IMG_CAT, -data => "CAT=$Categoria"); my @SubCategorias = $HostIni->val($Categoria, 'SUBCATEGORIAS'); foreach my $SubCategoria(@SubCategorias) { $ConfigDisplay->add("$Categoria|$SubCategoria", -text => "$SubCategoria", -image => $IMG_SUBCAT, -data => "CAT=$Categoria|SUB=$SubCategoria"); my @Parametros = $HostIni->Parameters($SubCategoria); foreach my $Parametro(@Parametros) { $ConfigDisplay->add("$Categoria|$SubCategoria|$Parametro", -text => "$Parametro", -image => $IMG_PARAM, -data => "CAT=$Categoria|SUB=$SubCategoria|PARAM=$Parametro"); my @SubParametros = $HostIni->val($SubCategoria, $Parametro); foreach my $SubParametro(@SubParametros) { $ConfigDisplay->add("$Categoria|$SubCategoria|$Parametro|$SubParametro", -text => "$SubParametro", -image => $IMG_SUBPARAM, -data => "CAT=$Categoria|SUB=$SubCategoria|PARAM=$Parametro|SUBPARAM=$SubParametro"); } } } } my $Mensaje = "CMD=LEE CAT=*"; # my $ProgramaClntSara = $cfgfile->val("CLNTSARA CONFIGURACION", 'PROGRAMACLIENTE'); my $SrvSaraIPAddress = gethostbyname(lc($_[0])); my $SrvSaraPort = $cfgfile->val("CLNTSARA CONFIGURACION", 'PUERTO'); $Socket_ = IO::Socket::INET->new(Proto => 'tcp', PeerAddr => inet_ntoa($SrvSaraIPAddress), PeerPort => $SrvSaraPort, # Listen => 10, Reuse => 'yes', # Type => SOCK_STREAM, Timeout => 10) or die "No se pudo crear conexion con $SrvSaraIPAddress: $!"; select((select($Socket_), $| = 1)[0]); print $Socket_ $Mensaje; $VentanaPrincipal->fileevent($Socket_, 'readable', [ \&lee_socket ]); # MainLoop; # $ConfigDisplay->add("CATEGORIA|SUBCATEGORIA", # -text => "cual", # -image => $IMG_SUBCAT, # -data => 'SUB'); # $VentanaPrincipal->fileevent(\*DELSOCKET, 'readable', [\&despliega_rmtsrv_conf]); # $SocketHandler = Tk::IO->new(-linecommand => \&lee_socket, # -childcommand => \&cierra_socket); # $SocketHandler->exec(sub { perl ./clntSara.pl excubitor \"CMD=LEE CAT=*\" }); } sub lee_socket { print "lee_socket\n"; my $conexion = $Socket_->accept(); my $mensaje; while( defined( my $buffer = <$Socket_> ) ) # read from the socket { print "From client: $buffer" ; $mensaje = $mensaje . $buffer ; } close($Socket_); } sub cierra_socket { print "cierra_socket\n"; } #### [SRVMONICACFG] EXCUBITOR=/home/cisic_mty/big_oper/monica-nora/monica/test/clntSara/ini/excubitor.ini FINANZAS=/home/cisic_mty/big_oper/monica-nora/monica/test/clntSara/ini/finanzas.ini NXDEV0=/home/cisic_mty/big_oper/monica-nora/monica/test/clntSara/ini/nxdev0.ini [SRVNORACFG] PROGRAMASRVNORA=/home/cisic_mty/big_oper/monica-nora/monica/bin/SrvNora.pl DEPURACION=SI PROGRAMAENVIO=/home/cisic_mty/big_oper/monica-nora/monica/bin/noraClntSocketAlarmas.pl PUERTO=9000 HOSTS_VALIDOS=<## #################################################### # FINANZAS #################################################### [FINANZAS] ENVIARALARMA=SI LOGFILE=/home/cisic_mty/big_oper/monica-nora/monica/log/finanzas.log CATEGORIAS=<