All pastes #825739 Raw Edit

Mine

public text v1 · immutable
#825739 ·published 2007-12-20 19:46 UTC
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 ]
        }
    );
}