Skip to content
Snippets Groups Projects
WardenClientCommon.pm 2.64 KiB
Newer Older
#!/usr/bin/perl -w

package WardenClientCommon;

require Exporter;

use strict;
use Carp;

use WardenClientConf qw($LOG_VERBOSE);

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(errMsg c2s);

#-------------------------------------------------------------------------------
# errMsg - print error message and die
#-------------------------------------------------------------------------------
sub errMsg
{
  my $msg = "Error message: " . shift;

  if ($LOG_VERBOSE) { # user wants to log debug information
    $msg .= "\nStack info: " . Carp::longmess();
  }

  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);

  # setting of URI and serialize SOAP envelope and data object
  my $soap     = SOAP::Lite->uri($service)->proxy($uri);
  my $envelope;
  if (!defined $data) {
    $envelope = $soap->serializer->envelope(method => $method);
  } else {
    $envelope = $soap->serializer->envelope(method => $method, $data);
  }

  # 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;

    eval {
      $response = $soap->deserializer->deserialize($result);
    } or errMsg($@ . "Received data: " . $result);
    # check SOAP fault status
    $response->fault ? errMsg("Server sent error message:: " . $response->faultstring) : return $response;
  }
}