| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- ################################################################################
- # $Id: Fluxinet.pm 3151 2007-07-04 20:26:57Z munk $
- # $Date: 2007-07-04 15:26:57 -0500 (Wed, 04 Jul 2007) $
- # $Revision: 3151 $
- ################################################################################
- # #
- # LICENSE #
- # #
- # This program is free software; you can redistribute it and/or #
- # modify it under the terms of the GNU General Public License (GPL) #
- # as published by the Free Software Foundation; either version 2 #
- # of the License, or (at your option) any later version. #
- # #
- # This program is distributed in the hope that it will be useful, #
- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
- # GNU General Public License for more details. #
- # #
- # To read the license please visit http://www.gnu.org/copyleft/gpl.html #
- # #
- # #
- ################################################################################
- # #
- # Requirements : #
- # * IO::Select ( perl -MCPAN -e "install IO::Select" ) #
- # * IO::Socket::INET ( perl -MCPAN -e "install IO::Socket::INET" ) #
- # #
- ################################################################################
- package Fluxinet;
- use strict;
- use warnings;
- ################################################################################
- ################################################################################
- # fields #
- ################################################################################
- # version in a var
- my $VERSION = do {
- my @r = (q$Revision: 3151 $ =~ /\d+/g); sprintf "%d"."%02d" x $#r, @r };
- # state
- my $state = Fluxd::MOD_STATE_NULL;
- # message, error etc. keep it in one string for simplicity atm.
- my $message = "";
- # loglevel
- my $loglevel = 0;
- # port
- my $port = 3150;
- # server-socket
- my ($server, $select);
- # modules loaded
- my $modsLoaded = 0;
- ################################################################################
- # constructor + destructor #
- ################################################################################
- #------------------------------------------------------------------------------#
- # Sub: new #
- # Arguments: Null #
- # Returns: Info String #
- #------------------------------------------------------------------------------#
- sub new {
- my $class = shift;
- my $self = bless ({}, ref ($class) || $class);
- return $self;
- }
- #------------------------------------------------------------------------------#
- # Sub: destroy #
- # Arguments: Null #
- # Returns: Info String #
- #------------------------------------------------------------------------------#
- sub destroy {
- # set state
- $state = Fluxd::MOD_STATE_NULL;
- # log
- Fluxd::printMessage("Fluxinet", "shutdown\n");
- # remove
- foreach my $handle ($select->handles) {
- $select->remove($handle);
- $handle->close;
- }
- }
- ################################################################################
- # public methods #
- ################################################################################
- #------------------------------------------------------------------------------#
- # Sub: initialize. this is separated from constructor to call it independent #
- # from object-creation. #
- # Arguments: null #
- # Returns: 0|1 #
- #------------------------------------------------------------------------------#
- sub initialize {
- shift; # class
- # loglevel
- $loglevel = Fluxd::getLoglevel();
- if (!(defined $loglevel)) {
- # message
- $message = "loglevel not defined";
- # set state
- $state = Fluxd::MOD_STATE_ERROR;
- # return
- return 0;
- }
- # $port
- $port = FluxDB->getFluxConfig("fluxd_Fluxinet_port");
- if (!(defined $port)) {
- # message
- $message = "port not defined";
- # set state
- $state = Fluxd::MOD_STATE_ERROR;
- # return
- return 0;
- }
- Fluxd::printMessage("Fluxinet", "initializing (loglevel: ".$loglevel." ; port: ".$port.")\n");
- # load modules
- if ($modsLoaded == 0) {
- if (loadModules() != 1) {
- return 0;
- }
- }
- # Create the read set
- $select = new IO::Select();
- # Create the server socket
- $server = IO::Socket::INET->new(
- LocalPort => $port,
- Proto => 'tcp',
- Listen => 16,
- Reuse => 1);
- if (!(defined $server)) {
- # message
- $message = "could not create server socket";
- # set state
- $state = Fluxd::MOD_STATE_ERROR;
- # return
- return 0;
- }
- $select->add($server);
- # log
- if ($loglevel > 1) {
- Fluxd::printMessage("Fluxinet", "tcp-server-socket setup on port ".$port."\n");
- }
- # set state
- $state = Fluxd::MOD_STATE_OK;
- # return
- return 1;
- }
- #------------------------------------------------------------------------------#
- # Sub: loadModules #
- # Arguments: null #
- # Returns: 0|1 #
- #------------------------------------------------------------------------------#
- sub loadModules {
- # load IO::Select
- if ($loglevel > 2) {
- Fluxd::printMessage("Fluxinet", "loading Perl-module IO::Select\n");
- }
- if (eval "require IO::Select") {
- IO::Select->import();
- } else {
- # message
- $message = "cant load perl-module IO::Socket::INET : ".$@;;
- # set state
- $state = Fluxd::MOD_STATE_ERROR;
- # return
- return 0;
- }
- # load IO::Socket::INET
- if ($loglevel > 2) {
- Fluxd::printMessage("Fluxinet", "loading Perl-module IO::Socket\n");
- }
- if (eval "require IO::Socket::INET") {
- IO::Socket::INET->import();
- } else {
- # message
- $message = "cant load perl-module IO::Socket::INET : ".$@;;
- # set state
- $state = Fluxd::MOD_STATE_ERROR;
- # return
- return 0;
- }
- # set flag
- $modsLoaded = 1;
- # return
- return 1;
- }
- #------------------------------------------------------------------------------#
- # Sub: getVersion #
- # Arguments: null #
- # Returns: VERSION #
- #------------------------------------------------------------------------------#
- sub getVersion {
- return $VERSION;
- }
- #------------------------------------------------------------------------------#
- # Sub: getState #
- # Arguments: null #
- # Returns: state #
- #------------------------------------------------------------------------------#
- sub getState {
- return $state;
- }
- #------------------------------------------------------------------------------#
- # Sub: getMessage #
- # Arguments: null #
- # Returns: message #
- #------------------------------------------------------------------------------#
- sub getMessage {
- return $message;
- }
- #------------------------------------------------------------------------------#
- # Sub: set #
- # Arguments: Variable [value] #
- # Returns: #
- #------------------------------------------------------------------------------#
- sub set {
- }
- #------------------------------------------------------------------------------#
- # Sub: main #
- # Arguments: Null #
- # Returns: Null #
- #------------------------------------------------------------------------------#
- sub main {
- # Get the readable handles. timeout is 0, only process stuff that can be
- # read NOW.
- my $return = "";
- my @ready = $select->can_read(0);
- foreach my $socket (@ready) {
- if ($socket == $server) {
- my $new = $socket->accept();
- $select->add($new);
- } else {
- my $buf = "";
- my $char = getc($socket);
- while (defined($char) && $char ne "\n") {
- $buf .= $char;
- $char = getc($socket);
- }
- $return = Fluxd::processRequest($buf);
- $socket->send($return);
- $select->remove($socket);
- close($socket);
- }
- }
- }
- #------------------------------------------------------------------------------#
- # Sub: command #
- # Arguments: command-string #
- # Returns: result-string #
- #------------------------------------------------------------------------------#
- sub command {
- shift; # class
- my $command = shift;
- # TODO
- return "";
- }
- #------------------------------------------------------------------------------#
- # Sub: status #
- # Arguments: Null #
- # Returns: Status information #
- #------------------------------------------------------------------------------#
- sub status {
- my $return = "";
- $return .= "\n-= Fluxinet Revision ".$VERSION." =-\n";
- $return .= "port : ".$port."\n";
- return $return;
- }
- ################################################################################
- # make perl happy #
- ################################################################################
- 1;
|