#!/usr/bin/perl -w # # WardenReg.pm # # Copyright (C) 2011 Cesnet z.s.p.o # Author(s): Tomas PLESNIK <plesnik@ics.muni.cz> # Jan SOUKAL <soukal@ics.muni.cz> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # 3. Neither the name of the Cesnet z.s.p.o nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # This software is provided ``as is'', and any express or implied # warranties, including, but not limited to, the implied warranties of # merchantability and fitness for a particular purpose are disclaimed. # In no event shall the Cesnet z.s.p.o or contributors be liable for # any direct, indirect, incidental, special, exemplary, or consequential # damages (including, but not limited to, procurement of substitute # goods or services; loss of use, data, or profits; or business # interruption) however caused and on any theory of liability, whether # in contract, strict liability, or tort (including negligence or # otherwise) arising in any way out of the use of this software, even # if advised of the possibility of such damage. package WardenReg; use strict; use SOAP::Lite; use IO::Socket::SSL qw(debug1); use SOAP::Transport::TCP; our $VERSION = 100; #------------------------------------------------------------------------------- # 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::TCP::Client->new( PeerAddr => $server, PeerPort => $port, Proto => 'tcp', 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, ))) {errMsg("Sorry, unable to create socket: " . &SOAP::Transport::TCP::Client::errstr)} # setting of URI and serialize SOAP envelope and data object my $soap = SOAP::Lite->uri($uri); my $envelope = $soap->serializer->envelope(method => $method, $data); # setting of TCP URI and send serialized SOAP envelope and data my $tcp_uri = "tcp://$server:$port/$service"; my $result = $client->send_receive(envelope => $envelope, endpoint => $tcp_uri); # check server response if (!defined $result) { errMsg("Error: server returned empty response. Probably problem with used SSL ceritificates."); } 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 1; } } #------------------------------------------------------------------------------- # registerSender - register new warden sender #------------------------------------------------------------------------------- sub registerSender { my $warden_path = shift; my $hostname = shift; my $requestor = shift; my $service = shift; my $description_tags = shift; my $ip_net_client = 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); # create SOAP data obejct my $request_data = SOAP::Data->name(client => \SOAP::Data->value( SOAP::Data->name(HOSTNAME => $hostname), SOAP::Data->name(REQUESTOR => $requestor), SOAP::Data->name(SERVICE => $service), SOAP::Data->name(DESCRIPTION_TAGS => $description_tags), SOAP::Data->name(IP_NET_CLIENT => $ip_net_client) )); my $result = c2s($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file, "registerSender", $request_data); $result ? return 1 : return 0; } # End of registerSender #------------------------------------------------------------------------------- # registerReceiver - register new warden receiver #------------------------------------------------------------------------------- sub registerReceiver { my $warden_path = shift; my $hostname = shift; my $requestor = shift; my $type = shift; my $receive_own_events = shift; my $ip_net_client = 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); # create SOAP data obejct my $request_data = SOAP::Data->name(client => \SOAP::Data->value( SOAP::Data->name(HOSTNAME => $hostname), SOAP::Data->name(REQUESTOR => $requestor), SOAP::Data->name(TYPE => $type), SOAP::Data->name(RECEIVE_OWN_EVENTS => $receive_own_events), SOAP::Data->name(IP_NET_CLIENT => $ip_net_client) )); my $result = c2s($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file, "registerReceiver", $request_data); $result ? return 1 : return 0; } # End of registerReceiver #------------------------------------------------------------------------------- # unregisterClient - unregister client from warden server #------------------------------------------------------------------------------- sub unregisterClient { my $warden_path = shift; my $client_id = 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); # create SOAP data obejct my $request_data = SOAP::Data->name(client => \SOAP::Data->value( SOAP::Data->name(CLIENT_ID => $client_id) )); my $result = c2s($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file, "unregisterClient", $request_data); $result ? return 1 : return 0; } # End of unregisterClient 1;