Skip to content
Snippets Groups Projects
WardenClientReceive.pm 4.74 KiB
Newer Older
Tomáš Plesník's avatar
Tomáš Plesník committed
#!/usr/bin/perl -w
Tomáš Plesník's avatar
Tomáš Plesník committed
# WardenClientReceive.pm
#
Tomáš Plesník's avatar
Tomáš Plesník committed
# Copyright (C) 2011-2012 Cesnet z.s.p.o
Tomáš Plesník's avatar
Tomáš Plesník committed
#
# Use of this source is governed by a BSD-style license, see LICENSE file.  
Tomáš Plesník's avatar
Tomáš Plesník committed

package WardenClientReceive;

use strict;
use SOAP::Lite;
use IO::Socket::SSL qw(debug1);
use SOAP::Transport::HTTP;
Tomáš Plesník's avatar
Tomáš Plesník committed
use FindBin;
Tomáš Plesník's avatar
Tomáš Plesník committed

Tomáš Plesník's avatar
Tomáš Plesník committed
#-------------------------------------------------------------------------------
# getNewEvents - get new events from warden server greater than last received ID
#-------------------------------------------------------------------------------
sub getNewEvents
{
  my @events;  

  eval {

    my $warden_path = shift;
    my $requested_type = shift;

    my $vardir = $warden_path . "/var/";
    my $etcdir = $warden_path . "/etc/";
    my $libdir = $warden_path . "/lib/";

    # use lib "/asdf/aasdf"; # cesta do lib/ adresare wardenu
    # use WardenClientConf qw($URI $SSL_KEY_FILE $SSL_CERT_FILE $SSL_CA_FILE $MAX_RCV_EVENTS_LIMIT $LOG_STDERR $LOG_SYSLOG $LOG_SYSLOG_FACILITY $LOG_VERBOSE);
    require $libdir . "WardenClientConf.pm";
    # use WardenClientCommon qw (errMsg c2s);
    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;
    my $id_file = $vardir . $caller_name . ".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") || errMsg("Cannot open ID file $id_file: $!");
      foreach(<ID>) {
        $last_id = $_;
      }
      close ID;
    } else {
      my $response = c2s($URI, $SSL_KEY_FILE, $SSL_CERT_FILE, $SSL_CA_FILE, "getLastId");
      $last_id = $response->result;
      open(ID, "> $id_file") || errMsg("Cannot open ID file $id_file: $!");
      print ID $last_id;
      close ID;
Tomáš Plesník's avatar
Tomáš Plesník committed
    }

    #-----------------------------------------------------------------------------
    # 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 	        => $MAX_RCV_EVENTS_LIMIT)
    # call server method getNewEvents 
    my $response = c2s($URI, $SSL_KEY_FILE, $SSL_CERT_FILE, $SSL_CA_FILE, "getNewEvents", $request_data);

    # 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'};
      $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);
 
      # 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") || errMsg("Cannot open ID file $id_file: $!");
      print ID $last_id;
      close ID;
Tomáš Plesník's avatar
Tomáš Plesník committed
    }
  } # End of eval block
  or do {
      print STDERR "Warden-client unexpected end in eval block.\n" . $@ . "\n";
      openlog("Warden:", "pid", "$LOG_SYSLOG_FACILITY");
      syslog("err|$LOG_SYSLOG_FACILITY", "Warden-client unexpected end in eval block.\n" . $@ . "\n");
      closelog();
Tomáš Plesník's avatar
Tomáš Plesník committed

  return @events;
Tomáš Plesník's avatar
Tomáš Plesník committed
} # End of getNewEvents

1;