diff --git a/src/warden-client/lib/WardenClient.pm b/src/warden-client/lib/WardenClient.pm index 74b777be33035c9b9a0562ffbeb1c156b4c4703f..9db7019c33abae8ac033df1f31c16fb692ddec6b 100755 --- a/src/warden-client/lib/WardenClient.pm +++ b/src/warden-client/lib/WardenClient.pm @@ -15,7 +15,25 @@ my $lib = File::Basename::dirname(__FILE__); use lib $lib; use WardenClientCommon; + +################################################################################ +# VARIABLES +################################################################################ our $VERSION = "2.2"; +our $VAR = "$lib/../var"; + +################################################################################ +# READING OF CONFIGURATION FILE +################################################################################ +# load server configuration +my $etc = "$lib/../etc"; +my $conf_file = "$etc/warden-client.conf"; +WardenClientCommon::loadConf($conf_file); + + +################################################################################ +# FUNCTIONS +################################################################################ #------------------------------------------------------------------------------- @@ -42,11 +60,11 @@ sub saveNewEvent # Issue #596 - Should be removed in Warden client 3.0. # check if obsolete event attribute 'Priority' is used if ((defined $priority) && ($priority >= 0)) { - WardenClientCommon::errMsg('Event attribute "Priority" is now obsolete and will be removed in Warden client 3.0', 'warn'); + WardenClientCommon::errMsg("Event attribute 'Priority' is now obsolete and will be removed in Warden client v.3.0", "warn"); } # check if obsolete event attribute 'Timeout' is used if ((defined $timeout) && ($timeout >= 0)) { - WardenClientCommon::errMsg('Event attribute "Timeout" is now obsolete and will be removed in Warden client 3.0', 'warn'); + WardenClientCommon::errMsg("Event attribute 'Timeout' is now obsolete and will be removed in Warden client v.3.0", "warn"); } # end of Issue #596 @@ -68,10 +86,8 @@ sub saveNewEvent SOAP::Data->name(TIMEOUT => $timeout) ) ); - } # end of eval - or WardenClientCommon::errMsg('Unknown error when creating SOAP data object, ' . $@); + } or WardenClientCommon::errMsg("Error when creating SOAP data object: " . $@); - # c2s() returns undef on fail my $result = WardenClientCommon::c2s("saveNewEvent", $event); defined $result ? return 1 : return 0; @@ -84,109 +100,84 @@ sub saveNewEvent #------------------------------------------------------------------------------- sub getNewEvents { - my @events; - - my $warden_path = shift; - my $requested_type = shift; - - my $vardir = $warden_path . "/var/"; - my $etcdir = $warden_path . "/etc/"; - my $libdir = $warden_path . "/lib/"; - - require $libdir . "WardenClientConf.pm"; - require $libdir . "WardenClientCommon.pm"; - - # read the config file - my $conf_file = $etcdir . "warden-client.conf"; - WardenClientConf::loadConf($conf_file); - - # set name of ID file for each client aplication - my ($caller_name) = ($FindBin::Script =~ /^(.*)$/); # untaint - my $id_file = $vardir . $caller_name . "-". ($requested_type || "any") . ".id"; - - #----------------------------------------------------------------------------- - # get last ID from ID file (if exist) or - # get last ID from warden server DB and save it into ID file - my $last_id; - if (-e $id_file) { - open(ID, "< $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); - foreach(<ID>) { - $last_id = $_; - } - close ID; - } else { - # c2s() returns undef on fail - my $response = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "getLastId"); - defined $response or return; # receive data or return undef - - $last_id = $response->result; - open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); - print ID $last_id; - close ID; + my $requested_type = shift; + + # set name of ID file based on caller name (each client application) + my ($caller_name) = ($FindBin::Script =~ /^(.*)$/); # untaint + my $id_file = $VAR . $caller_name . "-". ($requested_type || "any") . ".id"; + + # get last event ID + my $last_id; + if (-e $id_file) { # get ID from ID file + open(FILE, "< $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + foreach(<FILE>) { + $last_id = $_; } + close FILE; + } else { # get ID from Warden server database and print it into the ID file + my $response = WardenClientCommon::c2s("getLastId"); + defined $response or return; + $last_id = $response->result; + open(FILE, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + print FILE $last_id; + close FILE; + } - #----------------------------------------------------------------------------- - # get new events from warden server DB based on gathered last ID - - my $request_data; - eval { - # create SOAP data object - $request_data = SOAP::Data->name( - request => \SOAP::Data->value( - SOAP::Data->name(REQUESTED_TYPE => $requested_type), - SOAP::Data->name(LAST_ID => $last_id), - SOAP::Data->name(MAX_RCV_EVENTS_LIMIT => $WardenClientConf::MAX_RCV_EVENTS_LIMIT) - ) + # prepare SOAP data object for Warden server + my $request_data; + eval { + $request_data = SOAP::Data->name( + request => \SOAP::Data->value( + SOAP::Data->name(REQUESTED_TYPE => $requested_type), + SOAP::Data->name(LAST_ID => $last_id), + SOAP::Data->name(MAX_RCV_EVENTS_LIMIT => $WardenClientCommon::MAX_RCV_EVENTS_LIMIT) ) - } or return errMsg('Unknown error when creating SOAP data object, ' . $@); + ) + } or return WardenClientCommon::errMsg('Unknown error when creating SOAP data object, ' . $@); - # call server method getNewEvents - my $response = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "getNewEvents", $request_data); - defined $response or return; # connect to warden server or return undef - - # parse returned SOAP data object - my ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); + # call server method getNewEvents + my $response = WardenClientCommon::c2s("getNewEvents", $request_data); + defined $response or return; - my @response_list = $response->valueof('/Envelope/Body/getNewEventsResponse/event/'); - - while (scalar @response_list) { - my $response_data = shift(@response_list); - my @event; - - # parse items of one event - $id = $response_data->{'ID'}; - $hostname = $response_data->{'HOSTNAME'}; - $service = $response_data->{'SERVICE'}; - $detected = $response_data->{'DETECTED'}; - $type = $response_data->{'TYPE'}; - $source_type = $response_data->{'SOURCE_TYPE'}; - $source = $response_data->{'SOURCE'}; - $target_proto = $response_data->{'TARGET_PROTO'}; - $target_port = $response_data->{'TARGET_PORT'}; - $attack_scale = $response_data->{'ATTACK_SCALE'}; - $note = $response_data->{'NOTE'}; - $priority = $response_data->{'PRIORITY'}; - $timeout = $response_data->{'TIMEOUT'}; - - # push new event from warden server into @events which is returned - @event = ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); - push (@events, \@event); + # parse server response (SOAP data object) + my @events; + my ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); + my @response_list = $response->valueof('/Envelope/Body/getNewEventsResponse/event/'); + while (scalar @response_list) { + my $response_data = shift(@response_list); + my @event; + + $id = $response_data->{'ID'}; + $hostname = $response_data->{'HOSTNAME'}; + $service = $response_data->{'SERVICE'}; + $detected = $response_data->{'DETECTED'}; + $type = $response_data->{'TYPE'}; + $source_type = $response_data->{'SOURCE_TYPE'}; + $source = $response_data->{'SOURCE'}; + $target_proto = $response_data->{'TARGET_PROTO'}; + $target_port = $response_data->{'TARGET_PORT'}; + $attack_scale = $response_data->{'ATTACK_SCALE'}; + $note = $response_data->{'NOTE'}; + $priority = $response_data->{'PRIORITY'}; + $timeout = $response_data->{'TIMEOUT'}; + + @event = ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); + push (@events, \@event); - # set maximum received ID from current batch - if ($id > $last_id) { - $last_id = $id; - } - } #end of while loop - - # write last return ID - if (defined $last_id) { # must be defined for first check ID - open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); - print ID $last_id; - close ID; + # set maximum received ID from current batch + if ($id > $last_id) { + $last_id = $id; } + } - return @events; + # print last returned event ID into ID file + if (defined $last_id) { + open(FILE, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + print FILE $last_id; + close FILE; + } + return @events; } # End of getNewEvents @@ -202,10 +193,10 @@ sub getClientInfo # parse server response (SOAP data object) my @clients; my @response_list = $response->valueof('/Envelope/Body/getClientInfoResponse/client/'); - while (scalar @response_list) { my $response_data = shift(@response_list); my %client; + $client{'client_id'} = $response_data->{'CLIENT_ID'} ; $client{'hostname'} = $response_data->{'HOSTNAME'}; $client{'registered'} = $response_data->{'REGISTERED'}; @@ -216,6 +207,7 @@ sub getClientInfo $client{'receive_own_events'} = $response_data->{'RECEIVE_OWN_EVENTS'}; $client{'description_tags'} = $response_data->{'DESCRIPTION_TAGS'}; $client{'ip_net_client'} = $response_data->{'IP_NET_CLIENT'}; + push (@clients,\%client); }