#!/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 ] } ); }