Skip to content
Snippets Groups Projects
WardenReg.pm 6.89 KiB
Newer Older
Tomáš Plesník's avatar
Tomáš Plesník committed
#!/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
Tomáš Plesník's avatar
Tomáš Plesník committed
# 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(
Tomáš Plesník's avatar
Tomáš Plesník committed
    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);
Tomáš Plesník's avatar
Tomáš Plesník committed
  $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(
Tomáš Plesník's avatar
Tomáš Plesník committed
    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);
Tomáš Plesník's avatar
Tomáš Plesník committed
  $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(
Tomáš Plesník's avatar
Tomáš Plesník committed
    SOAP::Data->name(CLIENT_ID => $client_id)
  ));

  my $result = c2s($uri, $ssl_key_file, $ssl_cert_file, $ssl_ca_file, "unregisterClient", $request_data);
Tomáš Plesník's avatar
Tomáš Plesník committed
  $result ? return 1 : return 0;

} # End of unregisterClient

1;