rendered paste body#!/usr/bin/perl
package CCMS::Server;
use constant DATAGRAM_MAXLEN => 8192;
use warnings;
use strict;
use Benchmark;
use POE qw(Component::EasyDBI);
use DBI;
use Config::XMLPerl qw(config_load) ;
use IO::Socket;
use IO::Select;
use vars qw( $config );
use Log::Log4perl qw(:easy);
use XML::Twig;
use Data::Dumper;
# Load configuration file first.
$config->{op}->{configfile} = "config.xml";
my $xmlconfig = config_load($config->{configfile}) ;
# Override defaults from config file
if($config->{port}) { $config->{recv_port} = $config->{port}; } else { $config->{recv_port} = "4445"; }
if($config->{DB}{type}) { $config->{DB}->{type} = $config->{DB}{type}; } else { $config->{DB}->{type} = "mysql"; }
if($config->{DB}{host}) { $config->{DB}->{host} = $config->{DB}{host}; } else { $config->{DB}->{host} = "localhost"; }
if($config->{DB}{port}) { $config->{DB}->{port} = $config->{DB}{port}; } else { $config->{DB}->{port} = "3306"; }
if($config->{DB}{name}) { $config->{DB}->{name} = $config->{DB}{name}; } else { $config->{DB}->{name} = "ccms"; }
if($config->{DB}{user}) { $config->{DB}->{user} = $config->{DB}{user}; } else { $config->{DB}->{user} = "ccms"; }
if($config->{DB}{pass}) { $config->{DB}->{pass} = $config->{DB}{pass}; } else { $config->{DB}->{pass} = "ccms"; }
# Create Logger
Log::Log4perl->easy_init(
{
level => $DEBUG,
file => ">> ccms_server.log",
}
);
# Create DBI Session
POE::Component::EasyDBI->spawn( # or new(), witch returns an obj
alias => 'EasyDBI',
dsn => 'DBI:'.$config->{DB}->{type}.':'.$config->{DB}->{name}.':'.$config->{DB}->{host}.':'.$config->{DB}->{port},
username => $config->{DB}->{user},
password => $config->{DB}->{pass},
options => {
AutoCommit => 1,
},
);
# Create Receiver Session
POE::Session->create(
inline_states => {
_start => \&receiver_start,
recv_datagram => \&receiver_read,
}
);
POE::Kernel->run();
exit;
################################################################################
# Functions
################################################################################
sub receiver_start {
my ($kernel, $heap) = @_[ KERNEL, HEAP ];
$kernel->alias_set( 'receiver' );
# Open UDP Port for receiving
my $socket = IO::Socket::INET->new(
Proto => 'udp',
LocalPort => $config->{recv_port},
) or die "Couldn't create server socket: $!";
INFO("UDP Receiver Active on Port ".$config->{recv_port});
# Create an XML Handler
$_[HEAP]->{xmlhandler} = XML::Twig->new( twig_handlers =>
{ # Define handlers here.
'ping' => \&twig_ping,
'ping/drive' => \&twig_drive,
'ping/urlstatus' => \&twig_urlstatus,
}
);
# Add datagram listener
$kernel->select_read( $socket, "recv_datagram" );
}
sub receiver_read {
my ( $socket ) = $_[ ARG0 ];
my $remote_address = recv( $socket, my $message = "", DATAGRAM_MAXLEN, 0 ) or return;
# return unless defined $remote_address;
my ( $peer_port, $peer_addr ) = unpack_sockaddr_in($remote_address);
my $human_addr = inet_ntoa($peer_addr);
$_[HEAP]->{peer_addr} = $human_addr;
$_[HEAP]->{twig_root} = $_[HEAP]->{xmlhandler}->safe_parse($message);
if($_[HEAP]->{twig_root}==0) { WARN( "$human_addr:$peer_port sent errored message:\n $message\n due to $@"); } else {
DEBUG("$human_addr:$peer_port sent valid message:\n $message"); }
}
################################################################################
# Twig XML Handlers
################################################################################
sub twig_ping { # Ping test
my( $twig, $element)= @_;
my $heap = $poe_kernel->alias_resolve( 'receiver' )->get_heap();
$heap->{peer_orgid} = $element->att('orgid') or return;
$heap->{peer_nodeid} = $element->att('nodeid') or return;
$poe_kernel->post( 'EasyDBI',
insert => {
sql => 'INSERT INTO test_pings (orgid,nodeid,timestamp,ipaddress) VALUES (?,?,now(),?)',
event => sub{},
placeholders => [ $heap->{peer_orgid}, $heap->{peer_nodeid}, $heap->{peer_addr} ]
}
);
}
sub twig_drive {
my( $twig, $element)= @_;
my $heap = $poe_kernel->alias_resolve( 'receiver' )->get_heap();
my $driveid = $element->att('id') or return;
my $free = $element->att('free') or return;
my $total = $element->att('total') or return;
print("debug: I get into twig_drive");
$poe_kernel->post( 'EasyDBI',
insert => {
sql => 'INSERT INTO test_drives (orgid,nodeid,timestamp,driveid,free,total) VALUES (?,?,now(),?,?,?)',
event => sub{},
placeholders => [ $heap->{peer_orgid}, $heap->{peer_nodeid}, $driveid, $free, $total ]
}
);
}
sub twig_urlstatus {
my( $twig, $element)= @_;
my $heap = $poe_kernel->alias_resolve( 'receiver' )->get_heap();
my $url = $element->att('url') or return;
my $status = $element->att('url') or return;
print("debug: I get into twig_urlstatus");
$poe_kernel->post( 'EasyDBI',
insert => {
sql => 'INSERT INTO test_urlstatus (orgid,nodeid,timestamp,url,status) VALUES (?,?,now(),?,?,?)',
event => sub{},
placeholders => [ $heap->{peer_orgid}, $heap->{peer_nodeid}, $url, $status ]
}
);
}