#!/usr/bin/perl -w # Versione use IPC::Open3; use Getopt::Long; use Time::Local; use strict; my $VERSION = '1.0'; my $netfile = "nets.dat"; my $startday = 1; my $startmonth = 1; my $interval = 6; my $version = 0; my $starthour = 9; my $startmin = 0; my $startsec = 0; my ( $record, $vlan, $net, $DATE ); my ( $output, $error, $command ); my ( $ScheduleName, $TargetName, $TargetNet, $TaskName ); my $status = GetOptions ("netfile=s" => \$netfile, "startday=i" => \$startday, "startmonth=i" => \$startmonth, "interval=i" => \$interval, "version" => \$version ); if ( !$status || $startday < 1 || $startday > 31 || $startmonth < 1 || $startmonth > 12 || $interval < 1 || $interval > 12) { print "Errore negli argomenti della linea di comando!\n"; print "Gli argomenti consentiti sono:\n"; print " --netfile= (default = nets.dat)\n"; print " --startday= (integer: 1-31, default = 1)\n"; print " --startmonth= (integer: 1-12, default = 1)\n"; print " --interval= (integer: 1-12, default = 6)\n"; print " --version\n"; exit; } #print "$netfile\n"; #print "$startday\n"; #print "$startmonth\n"; #print "$interval\n\n"; #print "$version\n\n"; if ( $version == 1) { print "init-gce-config.pl version is $VERSION\n"; exit; } my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(); my $now = timelocal( $sec, $min, $hour, $mday, $mon, $year ); my $StartDate = timelocal( $startsec, $startmin, $starthour, $startday, $startmonth-1, $year ); if ( $StartDate < $now ) { # Se la data di start e' precedente a oggi, aggiunge un anno $StartDate = timelocal( $startsec, $startmin, $starthour, $startday, $startmonth-1, $year+1 ); } # Ottiene l'id della port_list che contiene la parola INFN # (questa deve essere gia' definita e configurata a mano su Greenbone, # inoltre deve esistere una sola port_list che contiene nel nome la stringa INFN) $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \"\""; ( $output, $error ) = &ExecCommand( $command ); my $PortlistId = &GetId ( "port_list id", $output ); if ( $PortlistId eq "Error" ) { print "Errore: non trovata la port_list dell'INFN definita in Greenbone\n\n"; exit; } #print "$PortlistId\n\n"; # Ottiene l'id della scan config che contiene la parola INFN # (questa deve essere gia' definita e configurata a mano su Greenbone, # inoltre deve esistere una sola Scan Config che contiene nel nome la stringa INFN) $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \"\""; ( $output, $error ) = &ExecCommand( $command ); my $ScanConfigId = &GetId ( "config id", $output ); if ( $ScanConfigId eq "Error" ) { print "Errore: non trovata la Scan Config dell'INFN definita in Greenbone\n\n"; exit; } #print "$ScanConfigId\n\n"; my $counter = 0; open ( NETS, "<$netfile" ) or die( "Error: file $netfile not found" ); while ( $net = ) { chomp( $net ); next if ( $net =~ /^\s*$/ ); if ( $net =~ /^\s*#\s*skipday\s*$/ ) { $counter++; next; } next if ( $net =~ /^\s*#/ ); $TargetName = ""; $TargetNet = ""; $net =~ /^(.*),(.*)$/; $TargetName = $1; $TargetNet = $2; $TargetName =~ s/(^\s+|\s+$)//g; $TargetNet =~ s/(^\s+|\s+$)//g; next if ( $TargetName eq "" || $TargetNet eq "" ); $TaskName = "$TargetName scan"; #print "$TargetName\n"; #print "$TargetNet\n\n"; #print "$TaskName\n\n"; ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( $StartDate + $counter*86400 ); # salta il giorno bisestile if ( $mday == 29 && $mon == 1 ) { $counter++; ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( $StartDate + $counter*86400 ); } $mon++; $year = $year + 1900; $counter++; $DATE = sprintf( "%04d%02d%02dT%02d%02d%02d", $year, $mon, $mday, $starthour, $startmin, $startsec ); $ScheduleName = sprintf( "%02d-%02d +%d mesi", $mday, $mon, $interval ); # print "$DATE\n"; # print "$ScheduleName\n"; # Verifica se gia' esiste la schedula ed eventualmente la crea my $ScheduleX = " (gia' esistente)"; $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \"\""; ( $output, $error ) = &ExecCommand( $command ); #print "$command\n\n$output\n\n$error\n\n"; my $ScheduleId = &GetId ( "schedule id", $output ); if ( $ScheduleId eq "Error" ) { # Schedula non trovata, va creata nuova $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \\ \"$ScheduleName Europe/Rome BEGIN:VEVENT; DTSTART;TZID=/freeassociation.sourceforge.net/Europe/Rome:$DATE DURATION:PT0S RRULE:FREQ=MONTHLY;INTERVAL=$interval;BYMONTHDAY=$mday END:VEVENT \""; #print "CMD: $command\n\n\n"; ( $output, $error ) = &ExecCommand( $command ); #print "O: $output\n"; #print "E: $error\n\n"; if ( $error ne "" ) { print "Errore durante la creazione della schedula \"$ScheduleName\"\n\n"; print "$error\n\n"; exit; } $ScheduleId = &GetId ( " id", $output ); if ( $ScheduleId eq "Error" ) { print "Errore: non ottenuto l'id della schedula \"$ScheduleName\"\n\n"; print "$output\n\n"; exit; } $ScheduleX = ""; } # Verifica se gia' esiste il target ed eventualmente lo crea my $TargetX = " (gia' esistente)"; $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \"\""; ( $output, $error ) = &ExecCommand( $command ); #print "$command\n\n$output\n\n$error\n\n"; my $TargetId = &GetId ( "target id", $output ); if ( $TargetId eq "Error" ) { # Target non trovato, va creato nuovo $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \\ \" $TargetName $TargetNet 0 0 Consider Alive 1 \""; #print "CMD: $command\n\n\n"; ( $output, $error ) = &ExecCommand( $command ); #print "O: $output\n"; #print "E: $error\n"; if ( $error ne "" ) { print "Errore durante la creazione del target \"$TargetName\"\n\n"; print "$error\n\n"; exit; } $TargetId = &GetId ( " id", $output ); if ( $TargetId eq "Error" ) { print "Errore: non ottenuto l'id del target \"$TargetName\"\n\n"; print "$output\n\n"; exit; } #print "$TargetId\n\n"; $TargetX = ""; } # Verifica se gia' esiste il task ed eventualmente lo crea $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \"\""; ( $output, $error ) = &ExecCommand( $command ); #print "$command\n\n$output\n\n$error\n\n"; my $TaskId = &GetId ( "task id", $output ); if ( $TaskId eq "Error" ) { # Task non trovato, va creato nuovo $command = "gvm-cli socket --socketpath /GVM/GVMD/gvmd.sock --pretty --xml \\ \" $TaskName 1 \""; #print "CMD: $command\n\n\n"; ( $output, $error ) = &ExecCommand( $command ); #print "O: $output\n"; #print "E: $error\n"; if ( $error ne "" ) { print "Errore durante la creazione del task \"$TaskName\"\n\n"; print "$error\n\n"; exit; } $TaskId = &GetId ( " id", $output ); if ( $TaskId eq "Error" ) { print "Errore: non ottenuto l'id del task \"$TaskName\"\n\n"; print "$output\n\n"; exit; } print "Creato task \"$TaskName\" avente target \"$TargetName\"$TargetX con schedula \"$ScheduleName\"$ScheduleX\n"; } else { print "Il task \"$TaskName\" e' gia' esistente\n"; } } exit; sub ExecCommand { my ( $cmd ) = @_; my ( $rec, $out, $err ); # print "CMD: $cmd\n"; my $pid = open3( \*IN, \*OUT, \*ERR, $cmd ); close( IN ); $out = ""; while ( $rec = ) { $out .= $rec; } $err = ""; while ( $rec = ) { $err .= $rec; } close( OUT ); close( ERR ); return ( $out, $err ); #print "$out\n-\n"; #print "$err\n+\n"; } sub GetId { my ( $keyid, $output ) = @_; my $rec=""; my $id=""; #print "$keyid\n$output\n\n"; foreach $rec ( split(/\n/, $output) ) { #print "$rec\n"; if ( $rec =~ /$keyid="(.+)"/ ) { $id = $1; #print "$id:$1\n\n"; return $id; } } return "Error"; }