#!/usr/bin/perl use strict; use File::Tail; ######################################################### #----------------| constantes |--------------------- ######################################################### my $conf = 'xWall.conf'; my $debug = 1; my @sect = ( 'mod', 'sys', 'mon', 'par', 'rule' ); ######################################################### #---------------| declaraciones |---------------------- ######################################################### my ( %x, %mod, %sys, @mods, @tmp, $buf, $opt, $val, $ret); ######################################################### # MAIN load_conf(); #CARGAMOS LA CONFIGURACION INICIAL DE xWall.conf #foreach(sort keys %x) { print("\$x\{$_\} => $x{$_}\n"); } #modprobe(@mods); #iptables('-nL'); exit 1; sub load_conf() { open(File, "<$conf"); #SE LEE EL FICHERO DE CONFIGURACION @tmp = ; close(File); @tmp = grep (!/^(\#|\s+\#|\s+$)/, @tmp); #SE ELIMINAN LINEAS COMENTADAS TOTALES Y VACIAS @tmp = map (uncomment($_), @tmp); #SE ELIMINAN LINEAS COMENTADAS SOBRE CODIGO foreach(@tmp) { $buf .= $_; } #LLENAMOS $BUF CON TODA LA CONFIGURACION foreach(@sect) { parse($buf, $_); } #PARSEAMOS CADA SECCION DE CONFIGURACION } sub parse() { my ($sDat, $flag) = @_; #OBTENEMOS EL BUFER Y LA BANDERA DE SECCION MOD, SYSCTL ETC $sDat =~ s/\n/::/g; #SUBSTITUIMOS LOS RETORNOS POR DOBLE DOS PUNTOS :: PARA TRATAR TODO COMO UN UNICO TEXTO EN UNA LINEA $sDat =~ s/[\'\"]//g; #ELIMINAMOS COMILLAS DOBLES Y SIMPLES DEL TEXTO for($flag) #SELECCIONAMOS LA BANDERA PARA TRATAR CADA SECCION POR SEPARADO { /^mod$/ && do { $sDat =~ /section_mod::(.*)end_mod::/g; #QUE CONCUERDE LO QUE ESTA ENTRE CADA DELIMITADOR DE SECCION my $xa = $1; $xa =~ s/[\s*]//g; #ELIMINAMOS ESPACIOS EN EL TEXTO RESULTANTE $xa =~ s/::/\n/g; #SUSTITUIMOS LOS :: POR RETORNOS DENUEVO print($xa); }; /^sys$/ && do { $sDat =~ /section_sysctl::(.*)end_sysctl::/g; #QUE CONCUERDE LO QUE ESTA ENTRE CADA DELIMITADOR DE SECCION my $xa = $1; $xa =~ s/[\s*]//g; #ELIMINAMOS ESPACIOS EN EL TEXTO RESULTANTE $xa =~ s/::/\n/g; #SUSTITUIMOS LOS :: POR RETORNOS DENUEVO print($xa); }; /^mon$/ && do { $sDat =~ /section_monitor::(.*)end_monitor::/g; #QUE CONCUERDE LO QUE ESTA ENTRE CADA DELIMITADOR DE SECCION my $xa = $1; $xa =~ s/[\s*]//g; #ELIMINAMOS ESPACIOS EN EL TEXTO RESULTANTE $xa =~ s/::/\n/g; #SUSTITUIMOS LOS :: POR RETORNOS DENUEVO print($xa) }; /^par$/ && do { $sDat =~ /section_par::(.*)end_par::/g; #QUE CONCUERDE LO QUE ESTA ENTRE CADA DELIMITADOR DE SECCION my $xa = $1; $xa =~ s/[\s*]//g; #ELIMINAMOS ESPACIOS EN EL TEXTO RESULTANTE $xa =~ s/::/\n/g; #SUSTITUIMOS LOS :: POR RETORNOS DENUEVO print($xa) }; /^rule$/ && do { $sDat =~ /section_rules::(.*)end_rules::/g; my $xa; my @unz = split(/::/, $1); foreach(@unz) { $_ =~ /^(\s*)(\S.*)/; $xa .= "$2\n" if defined $2; } $xa =~ s/::/\n/g; print($xa) }; } } #foreach my $shit (@pars) # { # chomp($shit); #SACAR EL RETORNO # next if ($shit =~ /^\#/ or $shit eq '' or $shit =~ /^(\s*$|\s*\#)/); #ELIMINAR SI ES UN COMENTARIO O LINEA VACIA # $shit =~ /(.+\S)(|\S|\s|\s+)\=(\S|\s|\s+)(.*)/; ($opt, $val) = ($1, $4); #PARSEAR LA OPCION Y EL VALOR, OPCION EN $1 VALOR EN $4 # if ($val =~ /^(.+|\'.*\'|\".*\")(\s+\#)/) { $val = $1;} #SI HAY COMENTARIOS EN LA LINEA DE CONFIG # $val =~ s/(\'|\"|\s+)//ig; #SI TIENE COMILLAS EL VALOR # $x{$opt} = $val; # #print("opcion $opt \t=> $val\n"); #DEBUG # } sub uncomment { chomp($_); next if ($_ =~ /^(\#|\s*$|\s*\#)/); if ($_ =~ /^(.+|'.*'|".*")(\s*\#)/) { $_ = $1;} return("$_\n"); } sub iptables { my $regla = shift; print "$x{ipt} $regla > /dev/null\n" if ($debug); #$result = system("$iptables $line > /dev/null"); #if ($result != 0) { # print "X: ($result) iptables $line\n"; #} } sub modprobe() { @mods = @_; foreach my $shit (@mods) { print("AƱadiendo modulo: $shit\n") if($debug); $ret = `/sbin/modprobe $shit 2>&1 3>&1`; if ($ret != 0) { print("X: ($ret) modprobe $shit $!\n"); } } } #my $fichero = File::Tail->new ( # name => 'help', # maxinterval => 0.7 ); #my $fichero2 = File::Tail->new ( # name => 'log', # maxinterval => 0.7, # interval => 1, # adjustafter => 7 ); #while ( my $linea = $fichero->read ) { print $linea; } my @arch = ('help', 'log'); my @files; my $debug = 1; my $timeout; foreach (@arch) { push(@files, File::Tail->new( name => "$_", debug => $debug, maxinterval => 0.7 )); } while (1) { my ($nfound, $timeleft, @pending)= File::Tail::select(undef, undef, undef, $timeout, @files); unless ($nfound) { # timeout - do something else here, if you need to } else { foreach (@pending) { print $_->{"input"}." (".localtime(time).") ".$_->read; } } }