#!/usr/local/bin/perl -w # # $version="0.0"; # # (c) 1997 Emmanuel PIERRE # epierre@e-nef.com # http://www.e-nef.com/users/Emmanuel.PIERRE # require 5.002; #use strict; use strict 'subs'; BEGIN { $ENV{PATH} = '/usr/bin:/bin' } use Socket; sub spawn; # forward declaration sub logmsg { #print "$0 $$: @_ at ", scalar localtime, "\n" } my $waitedpid = 0; my $paddr; my $serv_port=12345; my $server_name = "http://e-nef.com:2001"; my $pere_pid=$$; &Init_Server; &Sig_Intercept; &Wait_Connection; exit; sub Wait_Connection { # # Boucle d'attente de connection # for ( $waitedpid = 0; ($paddr = accept(Client,Server)) || $waitedpid; $waitedpid = 0, close Client) { next if $waitedpid; my($port,$iaddr) = sockaddr_in($paddr); my $name = gethostbyaddr($iaddr,AF_INET); logmsg "connection from $name [", inet_ntoa($iaddr), "] at port $port"; spawn sub { &gere_connection(*Client); }; } } sub gere_connection { # # Routine de gestion d'une connection # local(*Client) = $_[0]; my $counter=0; my $buffer=""; my ($res,$serv,$port); my $charger=`/usr/bin/uptime`; my ($charge)=($charger=~/average:\s(\d*\.\d+)/); syswrite(Client, "[$charge][$hostname] MoXWorld Agent Server v$version (C)Emmanuel PIERRE 1997\n", length("[$charge][$hostname] MoXWorld Agent Server v$version (C)Emmanuel PIERRE 1997\n")); my $code_ret=0; while (1) { # last if (sysread(Client, $buffer, 512)<=0); if (sysread(Client, $buffer, 512)<=0) { &close_all; } #code_ret = recv(Client, $buffer, 512,0); print STDOUT "Recu : >", $buffer, "<\n"; } #print "Closing connection.\n"; close(Client); } sub close_all { shutdown(Client, 2); shutdown(Server, 2); #print "Server shutdown... Goodbye.\n"; exit(0); } sub close_cli { shutdown(Server, 2); #print "Server shutdown... Goodbye.\n"; exit(0); } sub timeout { $SIG{ALRM} = \&timeout; print "Socket Timeout\n"; close(S); } sub spawn { # # Spawning de base # my $coderef = shift; unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') { warn "usage: spawn CODEREF"; } my $pid; if (!defined($pid = fork)) { logmsg "cannot fork: $!"; return; } elsif ($pid) { logmsg "begat $pid"; return; # i'm the parent } # else i'm the child -- go spawn exit &$coderef(); } sub REAPER { $SIG{CHLD} = \&REAPER; # loathe sysV $waitedpid = wait; logmsg "reaped $waitedpid" . ($? ? " with exit $?" : ''); } sub Sig_Intercept { # # Traitement des signaux # $SIG{'INT'} = 'close_all'; $SIG{'QUIT'} = 'close_all'; $SIG{'USR2'} = 'close_all'; $SIG{'PIPE'} = 'close_cli'; $SIG{'TERM'} = 'close_cli'; $SIG{CHLD} = \&REAPER; } sub log_pid { open(FICA,">./srv.pid"); print FICA "$$\n"; close(FICA); } sub Init_Server { # # Initialisation du serveur # &log_pid; $hostname=`/bin/hostname`; chomp($hostname); $serv_port = shift || 12345; my $proto = getprotobyname('tcp'); socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!"; bind(Server, sockaddr_in($serv_port, INADDR_ANY)) || die "bind: $!" ; listen(Server,SOMAXCONN) || die "listen: $!"; logmsg "server started on port $serv_port"; } sub Connect_server { # # Connecion à un autre serveur # my $server = $_[0]; my $port = $_[1]; my $cmd = $_[2]; return if not (pingecho($server,10)); print "Connecting to $server:$port for $cmd\n"; $cmd .= "\r\n"; my $res = ""; my ($name,$aliases,$proto,$len,$thisadr,$thatadr,$this,$that,$sockaddr,$result); $sockaddr = 'S n a4 x8'; chomp($hostname = `/bin/hostname`); ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\d+$/; ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname); ($name, $aliases, $type, $len, $thataddr) = gethostbyname($server); $this = pack($sockaddr, &AF_INET, 0, $thisaddr); $that = pack($sockaddr, &AF_INET, $port, $thataddr); if (!(socket(S, &PF_INET, &SOCK_STREAM, $proto))) { warn "socket: $!\n"; return "socket: $!\n"; } if (!(bind(S, $this))) { warn "bind: $!\n"; return "bind: $!\n"; } if (!(connect(S, $that))) { warn "connect: $!\n"; return "connect: $!\n"; } select(S); $| = 1; select(STDOUT); # $SIG{ALRM} =\&timeout; # alarm 10; syswrite(S,$cmd,length($cmd)); last if (sysread(S, $buffer, 512)<=0); while ($buffer ne "") { print $buffer; $res.= $buffer; last if ($buffer=~/\r\n\r\n/); last if (sysread(S, $buffer, 512)<=0); # syswrite(S, "BYE\r\n", 5); } shutdown(S,2); # alarm 0; #print "---------------\n$res\n---------------\n"; #my @tab=split(/\r\n/,$res); #pop @tab; #pop @tab; ($result)=($res =~ m/IDENT= (.*)\r\n/m); #print "---------------\n$result\n---------------\n"; return($result); }