diff --git a/src/warden-server/bin/getClients.pl b/src/warden-server/bin/getClients.pl index 1bfbf098fdd510136e661fccf4083c515d394c15..5709e003472655c2c098400adc270f9893a5c763 100755 --- a/src/warden-server/bin/getClients.pl +++ b/src/warden-server/bin/getClients.pl @@ -2,7 +2,7 @@ # # getClients.pl # -# Copyright (C) 2011-2012 Cesnet z.s.p.o +# Copyright (C) 2011-2013 Cesnet z.s.p.o # # Use of this source is governed by a BSD-style license, see LICENSE file. @@ -13,6 +13,7 @@ use DBI; use DBD::mysql; + ################################################################################ # GLOBAL VARIABLES ################################################################################ @@ -91,7 +92,7 @@ our $DBH = DBI->connect("DBI:mysql:database=$DB_NAME;host=$DB_HOST", $DB_USER, $ # obtain data from DB my $sth = $DBH->prepare("SELECT * FROM clients ORDER BY client_id ASC;") or die "Cannot prepare statement: " . $DBH->errstr; -$sth->execute or die "Couldn't execute statement: " . $sth->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; my @clients = $sth->fetchall_arrayref(); # print table of clients diff --git a/src/warden-server/bin/getStatus.pl b/src/warden-server/bin/getStatus.pl index bcd6adf6d09286fab51f5ea3a15ff14465437402..6f5c0b6ab47f7a202938c9b0df9f7d336dcc9ade 100755 --- a/src/warden-server/bin/getStatus.pl +++ b/src/warden-server/bin/getStatus.pl @@ -2,23 +2,29 @@ # # getStatus.pl # -# Copyright (C) 2011-2012 Cesnet z.s.p.o +# Copyright (C) 2011-2013 Cesnet z.s.p.o # # Use of this source is governed by a BSD-style license, see LICENSE file. use strict; use Getopt::Std; use File::Basename; +use DBI; +use DBD::mysql; +use Format::Human::Bytes; +use Data::Dumper; + +################################################################################ +# GLOBAL VARIABLES +################################################################################ +our $VERSION = "2.2"; +my $filename = basename($0); -our $VERSION = "2.1"; -my $warden_path = '/opt/warden-server'; -require $warden_path . '/lib/WardenStatus.pm'; -my $filename = basename($0); -#------------------------------------------------------------------------------- +################################################################################ # Functions -#------------------------------------------------------------------------------- +################################################################################ sub usage { print "Usage: $filename [without parameters]\n"; exit 1; @@ -49,9 +55,10 @@ sub trim } # End of trim -#------------------------------------------------------------------------------- + +################################################################################ # MAIN -#------------------------------------------------------------------------------- +################################################################################ our ($opt_h); die usage unless getopts("h"); @@ -68,66 +75,137 @@ if ($UID != 0) { die errMsg("You must be root for running this script!") } -my @status = WardenStatus::getStatus($warden_path); - -# take and remove first element of array @status and save it into $server_status_ref -my $server_status_ref = shift(@status); -my @server_status = @$server_status_ref; - -my $syslog; -my $syslog_verbose; +# read config file +my $conf_file = "/opt/warden-server/etc/warden-server.conf"; # path is updated by install.sh +our $BASEDIR = undef +our $SYSLOG = undef; +our $SYSLOG_VERBOSE = undef; +our $SYSLOG_FACILITY = undef; +our $DB_NAME = undef; +our $DB_USER = undef; +our $DB_PASS = undef; +our $DB_HOST = undef; +our $MAX_EVENTS_LIMIT = undef; +unless (do $conf_file) { + die("Errors in config file '$conf_file': $@") if $@; + die("Can't read config file '$conf_file': $!") unless defined $_; + # if $_ defined, it's retvalue of last statement of conf, for which we don't care +} -if ($server_status[7] == 1) { +# connect to DB +our $DBH = DBI->connect("DBI:mysql:database=$DB_NAME;host=$DB_HOST", $DB_USER, $DB_PASS, {RaiseError => 1, mysql_auto_reconnect => 1}) || die "Could not connect to database: $DBH->errstr"; + +#----------------------------------------------------------------------------- +# Warden server variables +my $package_version = trim(`cat /opt/warden-server/etc/package_version`); +my $version = substr($package_version, 14); +my $hostname = trim(`hostname -f`); +my $ip_address = trim(`hostname -i`); +my $port = trim(`netstat -pln | grep apache | cut -f 4 -d ":"`); +my ($syslog, $syslog_verbose); +if ($SYSLOG == 1) { $syslog = "enabled"; } else { $syslog = "disabled"; } - -if ($server_status[8] == 1) { +if ($SYSLOG_VERBOSE == 1) { $syslog_verbose = "enabled"; } else { $syslog_verbose = "disabled"; } +#------------------------------------------------------------------------------- +# Warden server status +my $sth; + +# size of database events +$sth = $DBH->prepare("SELECT data_length + index_length FROM information_schema.TABLES WHERE table_schema = ? AND TABLE_NAME = ?") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute('warden', 'events') or die "Cannot execute statement: " . $sth->errstr; +my $size = $sth->fetchrow(); +my $db_size = defined $size ? Format::Human::Bytes::base10($size) : "none"; + +# sum of records in table events +$sth = $DBH->prepare("SELECT count(*) FROM events WHERE valid = 't';") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; +my $events_sum = $sth->fetchrow(); +if (!defined $events_sum) { $events_sum = "none" } + +# id of last record in table events +$sth = $DBH->prepare("SELECT max(id) FROM events;") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; +my $events_last_id = $sth->fetchrow(); +if (!defined $events_last_id) { $events_last_id = "none" } + +# timestamp of first record in table events +$sth = $DBH->prepare("SELECT received FROM events WHERE id = (SELECT min(id) FROM events);") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; +my $events_first_timestamp = $sth->fetchrow(); +if (!defined $events_first_timestamp) { $events_first_timestamp = "none" } + +# timestamp of last record in table events +$sth = $DBH->prepare("SELECT received FROM events WHERE id = (SELECT max(id) FROM events);") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; +my $events_last_timestamp = $sth->fetchrow(); +if (!defined $events_last_timestamp) { $events_last_timestamp = "none" } + +# sum of records in table clients +$sth = $DBH->prepare("SELECT count(*) FROM clients;") or die "Cannot prepare statement: " . $DBH->errstr; +$sth->execute or die "Cannot execute statement: " . $sth->errstr; +my $clients_sum = $sth->fetchrow(); +if (!defined $clients_sum) { $clients_sum = "none" } + +#------------------------------------------------------------------------------- +# Statistics of active registered senders +my $hash_ref; +if ($clients_sum != 0) { + $sth = $DBH->prepare("SELECT clients.client_id, clients.hostname, clients.service, count(*), max(received) FROM events LEFT JOIN clients ON (events.hostname=clients.hostname AND events.service=clients.service) GROUP BY hostname, service;") or die "Cannot prepare statement: " . $DBH->errstr; + $sth->execute or die "Cannot execute statement: " . $sth->errstr; + my ($client_id, $hostname, $service, $count, $timestamp, $client_status); + $hash_ref = $sth->fetchall_hashref("client_id"); +} + +#------------------------------------------------------------------------------- +# Print status info output + print "Warden server variables:\n"; print "========================\n"; -print "SERVER_VERSION:\t\t$server_status[0]\n"; -print "HOSTNAME:\t\t$server_status[1]\n"; -print "IP_ADDRESS:\t\t$server_status[2]\n"; -print "PORT:\t\t\t$server_status[3]\n"; -print "DB_NAME:\t\t$server_status[4]\n"; -print "DB_USER:\t\t$server_status[5]\n"; -print "DB_HOST:\t\t$server_status[6]\n"; +print "SERVER_VERSION:\t\t$version\n"; +print "HOSTNAME:\t\t$hostname\n"; +print "IP_ADDRESS:\t\t$ip_address\n"; +print "PORT:\t\t\t$port\n"; +print "BASEDIR:\t\t$BASEDIR\n"; +print "DB_NAME:\t\t$DB_NAME\n"; +print "DB_USER:\t\t$DB_USER\n"; +print "DB_HOST:\t\t$DB_HOST\n"; print "SYSLOG:\t\t\t$syslog\n"; print "SYSLOG_VERBOSE:\t\t$syslog_verbose\n"; -print "SYSLOG_FACILITY:\t$server_status[9]\n"; +print "SYSLOG_FACILITY:\t$SYSLOG_FACILITY\n"; +print "MAX_EVENTS_LIMIT:\t$MAX_EVENTS_LIMIT\n"; print "\n"; print "Warden server status:\n"; print "=====================\n"; -print "Database size:\t\t\t$server_status[10]\n"; -print "Count of saved events:\t\t$server_status[11]\n"; -print "Last ID in events table:\t$server_status[12]\n"; -print "Time of first inserted event:\t$server_status[13] (UTC)\n"; -print "Time of latest inserted event:\t$server_status[14] (UTC)\n"; -print "Count of registered clients:\t$server_status[15]\n"; +print "Database size:\t\t\t$db_size\n"; +print "Count of saved events:\t\t$events_sum\n"; +print "Last ID in events table:\t$events_last_id\n"; +print "Time of first inserted event:\t$events_first_timestamp (UTC)\n"; +print "Time of latest inserted event:\t$events_last_timestamp (UTC)\n"; +print "Count of registered clients:\t$clients_sum\n"; print "\n"; -# check if sum of registered client isn't 0 -if ($server_status[15] != 0) { +if ($clients_sum != 0) { print "Statistics of active registered senders:\n"; print "========================================\n"; print "+----------------------------------------------------------------------------------------------------------------+\n"; print "| Client ID | Hostname | Service | Stored events | Last insertion (UTC) |\n"; print "+----------------------------------------------------------------------------------------------------------------+\n"; - foreach my $client_status_ref (@status){ - my @client_status = @$client_status_ref; - printf("| %-10s ", $client_status[0] || "unknown"); - printf("| %-30s ", $client_status[1] || "unknown"); - printf("| %-25s ", $client_status[2] || "unknown"); - printf("| %-13s ", $client_status[3] || "unknown"); - printf("| %-20s |\n", $client_status[4] || "unknown"); - } + foreach my $key (sort {$a<=>$b} keys %$hash_ref) { + printf("| %-10s ", $hash_ref->{$key}->{client_id} || "unknown"); + printf("| %-30s ", $hash_ref->{$key}->{hostname}|| "unknown"); + printf("| %-25s ", $hash_ref->{$key}->{service} || "unknown"); + printf("| %-13s ", $hash_ref->{$key}->{"count(*)"} || "unknown"); + printf("| %-20s |\n", $hash_ref->{$key}->{"max(received)"} || "unknown"); + } print "+----------------------------------------------------------------------------------------------------------------+\n"; print "\n"; } diff --git a/src/warden-server/lib/Warden.pm b/src/warden-server/lib/Warden.pm index 5df2b889b4ee7de12148f63615664e6b52fd74ee..2b064d3eafe864adf79bd88b02b0f9c6a22d3c38 100755 --- a/src/warden-server/lib/Warden.pm +++ b/src/warden-server/lib/Warden.pm @@ -2,7 +2,7 @@ # # Warden.pm # -# Copyright (C) 2011-2012 Cesnet z.s.p.o +# Copyright (C) 2011-2013 Cesnet z.s.p.o # # Use of this source is governed by a BSD-style license, see LICENSE file. @@ -11,7 +11,6 @@ package Warden; use strict; use DBI; use DBD::mysql; -use Format::Human::Bytes; use Sys::Syslog qw(:DEFAULT setlogsock); Sys::Syslog::setlogsock('unix'); use File::Basename; @@ -22,7 +21,7 @@ use Crypt::X509; use SOAP::Lite; use Carp; -our $VERSION = "2.2-devel"; +our $VERSION = "2.2"; ################################################################################ @@ -631,152 +630,6 @@ sub unregisterClient } # END of unregisterClient -#----------------------------------------------------------------------------- -# getStatus - get list of status items of warden server -#----------------------------------------------------------------------------- -sub getStatus -{ - my ($class, $arg) = @_; - - # client network information - my $cn = $ENV{'SSL_CLIENT_S_DN_CN'}; - my $ip = $ENV{'REMOTE_ADDR'}; - my $local_ip = $ENV{'SERVER_ADDR'}; - - my $function_name = 'getStatus'; - - #----------------------------------------------------------------------------- - # Warden server stats - - if ($local_ip ne $ip) { - sendMsg("err", - "Unauthorized access to function '$function_name' from: '$ip' ('$cn') - access allowed only from localhost", - "Access denied - access allowed only from localhost"); - } else { - my ($sth, @status); - - # Warden server hostname - my $hostname = $ENV{'SERVER_NAME'}; - - # IP address of Warden server - my $ip_address = $ENV{'REMOTE_ADDR'}; - - # used port - my $port = $ENV{'SERVER_PORT'}; - - # size of database events - $sth = $DBH->prepare("SELECT data_length + index_length FROM information_schema.TABLES WHERE table_schema = ? AND TABLE_NAME = ?"); - $sth->execute('warden', 'events'); - my $size = $sth->fetchrow(); - my $db_size = (defined $size ? Format::Human::Bytes::base10($size) : "none"); - - # sum of records in table events - $sth = $DBH->prepare("SELECT count(*) FROM events WHERE valid = 't';"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my $events_sum = $sth->fetchrow(); - if (!defined $events_sum) { $events_sum = "none" } - - # id of last record in table events - $sth = $DBH->prepare("SELECT max(id) FROM events;"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my $events_last_id = $sth->fetchrow(); - if (!defined $events_last_id) { $events_last_id = "none" } - - # timestamp of first record in table events - $sth = $DBH->prepare("SELECT received FROM events WHERE id = (SELECT min(id) FROM events);"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my $events_first_timestamp = $sth->fetchrow(); - if (!defined $events_first_timestamp) { $events_first_timestamp = "none" } - - # timestamp of last record in table events - $sth = $DBH->prepare("SELECT received FROM events WHERE id = (SELECT max(id) FROM events);"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my $events_last_timestamp = $sth->fetchrow(); - if (!defined $events_last_timestamp) { $events_last_timestamp = "none" } - - # sum of records in table clients - $sth = $DBH->prepare("SELECT count(*) FROM clients;"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my $clients_sum = $sth->fetchrow(); - if (!defined $clients_sum) { $clients_sum = "none" } - - my $server_status = SOAP::Data->name(server_status => \SOAP::Data->value( - SOAP::Data->name(VERSION => $VERSION), - SOAP::Data->name(HOSTNAME => $hostname), - SOAP::Data->name(IP_ADDRESS => $ip_address), - SOAP::Data->name(PORT => $port), - SOAP::Data->name(SYSLOG => $SYSLOG), - SOAP::Data->name(SYSLOG_VERBOSE => $SYSLOG_VERBOSE), - SOAP::Data->name(SYSLOG_FACILITY => $SYSLOG_FACILITY), - SOAP::Data->name(DB_NAME => $DB_NAME), - SOAP::Data->name(DB_USER => $DB_USER), - SOAP::Data->name(DB_HOST => $DB_HOST), - SOAP::Data->name(DB_SIZE => $db_size), - SOAP::Data->name(EVENTS_SUM => $events_sum), - SOAP::Data->name(EVENTS_LAST_ID => $events_last_id), - SOAP::Data->name(EVENTS_FIRST_TIMESTAMP => $events_first_timestamp), - SOAP::Data->name(EVENTS_LAST_TIMESTAMP => $events_last_timestamp), - SOAP::Data->name(CLIENTS_SUM => $clients_sum) - )); - push(@status, $server_status); - - #--------------------------------------------------------------------------- - # Statistics table of senders - - if ($clients_sum != 0) { - $sth = $DBH->prepare("SELECT clients.client_id, clients.hostname, clients.service, count(*), max(received) FROM events LEFT JOIN clients ON (events.hostname=clients.hostname AND events.service=clients.service) GROUP BY hostname, service;"); - if (!defined $sth) { - sendMsg("err", - "Cannot prepare statement in function '$function_name': $DBH->errstr", - "Internal 'prepare' server error"); - } - $sth->execute; - my ($hash_ref, $client_id, $hostname, $service, $count, $timestamp, $client_status); - $hash_ref = $sth->fetchall_hashref("client_id"); - foreach my $key (sort {$a<=>$b} keys %$hash_ref) { - $client_status = SOAP::Data->name(client_status => \SOAP::Data->value( - SOAP::Data->name(CLIENT_ID => $hash_ref->{$key}->{client_id}), - SOAP::Data->name(HOSTNAME => $hash_ref->{$key}->{hostname}), - SOAP::Data->name(SERVICE => $hash_ref->{$key}->{service}), - SOAP::Data->name(COUNT => $hash_ref->{$key}->{"count(*)"}), - SOAP::Data->name(TIMESTAMP => $hash_ref->{$key}->{"max(received)"}), - )); - push(@status, $client_status); - } - } - sendMsg("info", - "Sent warden server status info from $ENV{'SERVER_NAME'}", - undef); - return @status; - } -} # END of getStatus - - #------------------------------------------------------------------------------- # getClientInfo - get list of registered clients on Warden server # by Warden client diff --git a/src/warden-server/lib/WardenStatus.pm b/src/warden-server/lib/WardenStatus.pm deleted file mode 100755 index 537aea1def6b3c37dce4a820b7bfac11141651ae..0000000000000000000000000000000000000000 --- a/src/warden-server/lib/WardenStatus.pm +++ /dev/null @@ -1,138 +0,0 @@ -#!/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;