diff --git a/src/warden-client/lib/WardenClientCommon.pm b/src/warden-client/lib/WardenClientCommon.pm index 901588d0d2f4ad57835b05a32de8045fe1a9f011..673980d2aed441f42fe1aa893db64c5625542c1d 100755 --- a/src/warden-client/lib/WardenClientCommon.pm +++ b/src/warden-client/lib/WardenClientCommon.pm @@ -14,20 +14,33 @@ use SOAP::Lite; use IO::Socket::SSL qw(debug1); use SOAP::Transport::HTTP; -our $VERSION = "2.1"; +our $VERSION = "2.2"; #------------------------------------------------------------------------------- -# errMsg - print error message and die +# errMsg - print error message and returns undef #------------------------------------------------------------------------------- sub errMsg { my $msg = shift; - + + # is Verbose logging mode enabled? if ($WardenClientConf::LOG_VERBOSE) { # user wants to log debug information $msg .= "\nStack info: " . Carp::longmess(); } - die($msg . "\n"); + # log into STDERR? + if ($WardenClientConf::LOG_STDERR) { + print STDERR $msg . "\n"; + } + + # log into Syslog? + if ($WardenClientConf::LOG_SYSLOG) { + openlog("Warden-client:", "pid", "$WardenClientConf::LOG_SYSLOG_FACILITY"); + syslog("err|$WardenClientConf::LOG_SYSLOG_FACILITY", $msg . "\n"); + closelog(); + } + + return; } # End of errMsg @@ -45,42 +58,61 @@ sub c2s my $client; my ($server, $port, $service) = $uri =~ /https:\/\/(.+)\:(\d+)\/(.+)/; - if (!($client = SOAP::Transport::HTTP::Client->new())) { - errMsg("Unable to create socket: " . &SOAP::Transport::HTTP::Client::errstr) - } - $client->timeout(10); - $client->ssl_opts(verify_hostname => 1, + eval { + $client = SOAP::Transport::HTTP::Client->new(); + } or return errMsg('Unknown error in c2s() when creating socket, SOAP::Transport::HTTP::Client->new(), ' . $@); + + eval {$client->timeout(10);} + or return errMsg('Unknown error in c2s() when setting socket timeout, ' . $@); + + eval { + $client->ssl_opts(verify_hostname => 1, SSL_use_cert => 1, SSL_verify_mode => 0x02, SSL_key_file => $ssl_key_file, SSL_cert_file => $ssl_cert_file, SSL_ca_file => $ssl_ca_file); + return 1; # fix of eval triggering 'or' statement + } or return errMsg('Unknown error in c2s() when setting socket SSL options, ' . $@); # setting of URI and serialize SOAP envelope and data object - my $soap = SOAP::Lite->uri($service)->proxy($uri); + + my $soap; + eval { + $soap = SOAP::Lite->uri($service)->proxy($uri); + } or return errMsg('Unknown error in c2s() when serializing SOAP object, ' . $@); + my $envelope; if (!defined $data) { - $envelope = $soap->serializer->envelope(method => $method); + eval { + $envelope = $soap->serializer->envelope(method => $method); + } or return errMsg('Unknown error in c2s() when setting enevelope, ' . $@); } else { - $envelope = $soap->serializer->envelope(method => $method, $data); + eval { + $envelope = $soap->serializer->envelope(method => $method, $data); + } or return errMsg('Unknown error in c2s() when setting envelope, ' . $@); } # setting of TCP URI and send serialized SOAP envelope and data my $server_uri = "https://$server:$port/$service"; - my $result = $client->send_receive(envelope => $envelope, endpoint => $server_uri); + my $result; + eval { + $result = $client->send_receive(envelope => $envelope, endpoint => $server_uri); + } or return errMsg('Unknown error in c2s() sending SOAP data, ' . $@); # check server response if (!defined $result) { errMsg("Server returned empty response. Problem with used SSL ceritificates or Warden server at $server:$port is down."); } else { # deserialized response from server -> create SOAP envelope and data object + my $response; eval { $response = $soap->deserializer->deserialize($result); - } or errMsg($@ . "Received data: " . $result); + } or return errMsg('Unknown error in SOAP data deserialization. Received data: ' . $result . ', ' . $@); # check SOAP fault status - $response->fault ? errMsg("Server sent error message:: " . $response->faultstring) : return $response; + $response->fault ? return errMsg("Server sent error message:: " . $response->faultstring) : return $response; } } diff --git a/src/warden-client/lib/WardenClientReceive.pm b/src/warden-client/lib/WardenClientReceive.pm index dc52f622693600c7b41c21f79b77ad2120e4e62f..de274d826db7b381463a89034a0a9bde73004381 100755 --- a/src/warden-client/lib/WardenClientReceive.pm +++ b/src/warden-client/lib/WardenClientReceive.pm @@ -15,7 +15,7 @@ use SOAP::Transport::HTTP; use FindBin; use Sys::Syslog; -our $VERSION = "2.1"; +our $VERSION = "2.2"; #------------------------------------------------------------------------------- # getNewEvents - get new events from warden server greater than last received ID @@ -24,8 +24,6 @@ sub getNewEvents { my @events; - eval { - my $warden_path = shift; my $requested_type = shift; @@ -49,15 +47,18 @@ sub getNewEvents # get last ID from warden server DB and save it into ID file my $last_id; if (-e $id_file) { - open(ID, "< $id_file") || WardenClientCommon::errMsg("Cannot open ID file $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") || WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); print ID $last_id; close ID; } @@ -65,27 +66,33 @@ sub getNewEvents #----------------------------------------------------------------------------- # get new events from warden server DB based on gathered last ID - # create SOAP data obejct - my $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) + 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) + ) ) - ); + } or return errMsg('Unknown error when creating SOAP data object, ' . $@); - # call server method getNewEvents + # 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); + 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'}; + $id = $response_data->{'ID'}; $hostname = $response_data->{'HOSTNAME'}; $service = $response_data->{'SERVICE'}; $detected = $response_data->{'DETECTED'}; @@ -111,24 +118,10 @@ sub getNewEvents # write last return ID if (defined $last_id) { # must be defined for first check ID - open(ID, "> $id_file") || WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); print ID $last_id; close ID; } - } # End of eval block - or do { - - if ($WardenClientConf::LOG_STDERR) { - print STDERR $@ . "\n"; - } - - if ($WardenClientConf::LOG_SYSLOG) { - openlog("Warden:", "pid", "WardenClientConf::LOG_SYSLOG_FACILITY"); - syslog("err|WardenClientConf::LOG_SYSLOG_FACILITY", $@ . "\n"); - closelog(); - } - return; - }; return @events; diff --git a/src/warden-client/lib/WardenClientSend.pm b/src/warden-client/lib/WardenClientSend.pm index 2e20210f1683984f123159f60d9f56e66e3642af..4e05cabdbae4376893c45ac791a8f4b1c682b577 100755 --- a/src/warden-client/lib/WardenClientSend.pm +++ b/src/warden-client/lib/WardenClientSend.pm @@ -14,7 +14,7 @@ use IO::Socket::SSL qw(debug1); use SOAP::Transport::HTTP; use Sys::Syslog; -our $VERSION = "2.1"; +our $VERSION = "2.2"; #------------------------------------------------------------------------------- # saveNewEvent - send new event from detection scripts to warden server @@ -23,7 +23,6 @@ sub saveNewEvent { my $result; - eval { my $warden_path = shift; my $event_ref = shift; @@ -51,8 +50,10 @@ sub saveNewEvent my $priority = $event[9]; my $timeout = $event[10]; + my $event; + eval { # create SOAP data object - my $event = SOAP::Data->name( + $event = SOAP::Data->name( event => \SOAP::Data->value( SOAP::Data->name(SERVICE => $service), SOAP::Data->name(DETECTED => $detected), @@ -67,26 +68,14 @@ sub saveNewEvent SOAP::Data->name(TIMEOUT => $timeout) ) ); + } # end of eval + or WardenClientCommon::errMsg('Unknown error when creating SOAP data object, ' . $@); - $result = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "saveNewEvent", $event); - } # End of eval block - or do { - - if ($WardenClientConf::LOG_STDERR) { - print STDERR $@ . "\n"; - } - - if ($WardenClientConf::LOG_SYSLOG) { - openlog("Warden-client:", "pid", "$WardenClientConf::LOG_SYSLOG_FACILITY"); - syslog("err|$WardenClientConf::LOG_SYSLOG_FACILITY", $@ . "\n"); - closelog(); - } + # c2s() returns undef on fail. + $result = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "saveNewEvent", $event); - return 0; - }; - - $result ? return 1 : return 0; - + defined $result ? return 1 : return 0; + } # End of saveNewEvent 1;