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

package WardenStatus;

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


#-------------------------------------------------------------------------------
# errMsg - print error message and die
#-------------------------------------------------------------------------------
sub errMsg
{
  my $msg = shift;
  die($msg . "\n");
} # End of errMsg


#-------------------------------------------------------------------------------
# c2s - connect to server, send request and receive response
#-------------------------------------------------------------------------------
sub c2s 
{
  my $uri               = shift;
  my $ssl_key_file      = shift;
  my $ssl_cert_file     = shift;
  my $ssl_ca_file       = shift;
  my $method            = shift;
  my $data              = shift;
Tomáš Plesník's avatar
Tomáš Plesník committed
  my $client;

  my ($server, $port, $service) = $uri =~ /https:\/\/(.+)\:(\d+)\/(.+)/;
  if (!($client = SOAP::Transport::HTTP::Client->new())) {
    errMsg("Sorry, unable to create socket: " . &SOAP::Transport::HTTP::Client::errstr)
  }
  $client->timeout(10);
  $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);

  # set URI and serialize SOAP envelope and data object
  my $soap     = SOAP::Lite->uri($service)->proxy($uri);
Tomáš Plesník's avatar
Tomáš Plesník committed
  my $envelope = $soap->serializer->envelope(method => $method);

  # 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);
Tomáš Plesník's avatar
Tomáš Plesník committed

  # check server response
  if (!defined $result) {
    errMsg("Error: server returned empty response." . "\n" . "Problem with used SSL ceritificates or Warden server at $server:$port is down.");
Tomáš Plesník's avatar
Tomáš Plesník committed
  } else {
    # deserialized response from server -> create SOAP envelope and data object
    my $response = $soap->deserializer->deserialize($result);
    # check SOAP fault status
    $response->fault ? errMsg("Server sent error message:: " . $response->faultstring) : return $response;
  }
}


#-------------------------------------------------------------------------------
# getStatus - get warden server status
#-------------------------------------------------------------------------------
sub getStatus
{
  my $warden_path = shift;

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

  # read the config file
  require $libdir .  "WardenConf.pm";
  my $conf_file = $etcdir . "warden-client.conf";
  my ($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file) = WardenConf::loadConf($conf_file);

  # call method getStatus on Warden server
Tomáš Plesník's avatar
Tomáš Plesník committed
  my $response = c2s($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file, "getStatus");

  #-----------------------------------------------------------------------------
  # parse returned SOAP object with server status
  my @response_list = $response->valueof('/Envelope/Body/getStatusResponse/server_status/');
  my $response_data = shift(@response_list);
  my $version			= $response_data->{'VERSION'};
  my $server_hostname		= $response_data->{'HOSTNAME'};
  my $ip_address		= $response_data->{'IP_ADDRESS'};
  my $port			= $response_data->{'PORT'};
  my $db_name			= $response_data->{'DB_NAME'};
  my $db_user			= $response_data->{'DB_USER'};
  my $db_host			= $response_data->{'DB_HOST'};
  my $syslog			= $response_data->{'SYSLOG'};
  my $syslog_verbose		= $response_data->{'SYSLOG_VERBOSE'};
  my $syslog_facility		= $response_data->{'SYSLOG_FACILITY'};
  my $db_size			= $response_data->{'DB_SIZE'};
  my $events_sum		= $response_data->{'EVENTS_SUM'};
  my $events_last_id		= $response_data->{'EVENTS_LAST_ID'};
  my $events_first_timestamp	= $response_data->{'EVENTS_FIRST_TIMESTAMP'};
  my $events_last_timestamp	= $response_data->{'EVENTS_LAST_TIMESTAMP'};
  my $clients_sum	 	= $response_data->{'CLIENTS_SUM'};
  my @server_status = ($version, $server_hostname, $ip_address, $port, $db_name, $db_user, $db_host, $syslog, $syslog_verbose, $syslog_facility, $db_size, $events_sum, $events_last_id, $events_first_timestamp, $events_last_timestamp, $clients_sum);
Tomáš Plesník's avatar
Tomáš Plesník committed
  push(@status, \@server_status);

  #-----------------------------------------------------------------------------
  # parse returned SOAP object with client status 
  @response_list = $response->valueof('/Envelope/Body/getStatusResponse/client_status/');
  my ($client_id, $hostname, $service, $count, $timestamp);
  while (scalar @response_list) {
    my $response_data = shift(@response_list);
Tomáš Plesník's avatar
Tomáš Plesník committed
    my @client_status;
    my $client_id	= $response_data->{'CLIENT_ID'};
    my $hostname	= $response_data->{'HOSTNAME'};
    my $service 	= $response_data->{'SERVICE'};
    my $count		= $response_data->{'COUNT'};
    my $timestamp	= $response_data->{'TIMESTAMP'};

    @client_status = ($client_id, $hostname, $service, $count, $timestamp);
Tomáš Plesník's avatar
Tomáš Plesník committed
    push(@status, \@client_status);
  }
  return @status;
} # End of getStatus

1;