#!/usr/bin/perl -w # # WardenStatus.pm # # Copyright (C) 2011-2012 Cesnet z.s.p.o # # Use of this source is governed by a BSD-style license, see LICENSE file. package WardenStatus; use strict; use SOAP::Lite; use IO::Socket::SSL qw(debug1); use SOAP::Transport::HTTP; our $VERSION = "2.0"; #------------------------------------------------------------------------------- # 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; 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); 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); # 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."); } 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 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); my @status; 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); 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); push(@status, \@client_status); } return @status; } # End of getStatus 1;