Bonjour je fait de la supervision.
Je souhaiterai mettre en place du suivi de logs temps réel avec déclenchement d'alerte sonore sur le client.

le principe un serveur (en perl) follow des logs en cas de détection d'un pattern il broadcast à tous les clients le message.

Ce(s) message(s) étant affichée dans un terminal j'arrive a l'afficher de différente couleur et a le faire biper putty sur le poste windows.

le but étant d’éviter que 15 personnes ne se connectent sur le serveur de logs avec des tail custom

voila je vous montre mon code qui malheureusement ne fonctionne pas

client :
#!/usr/bin/perl

# Client.
use IO::Socket;
use Sys::Hostname;

$| = 1;

# Lecture du nom du serveur.
# my $myself = hostname();
my $myself = 'client';
my $target_port = 3142;
my $target_addr = '10.9.178.25';

print 'Attempt to connect...'.$target_addr.':'.$target_port."\n";

chomp($target_addr);

# Creation du socket.

$socket = IO::Socket::INET->new(
Proto => 'tcp',
Type => SOCK_STREAM,
PeerAddr => $target_addr,
PeerPort => $target_port,
TimeOut => 5) or die 'Unable to connect to server '."\n";

$socket->autoflush(1);

# print ' connection established'."\n";

$pid = fork;
die 'unable to fork client !'."\n" unless defined ($pid);
if ($pid == 0) {
# Le fils envoie les donnees au serveur
# print $myself.'$'."\n";
while ($ligne = <>) {
if ($ligne) {
print $socket $ligne;
}
}
} else {
# Le pere recoit les donnees du serveur
while ($ligne = <$socket>) {
if ($ligne) {
print 'msg from server : '.$ligne;
}
}
}
$socket->close();
while (1) {
print "\a".'connection lost !'."\n";
sleep(5);
print "\a".'connection lost !'."\n";
}
le serveur :

#!/usr/bin/perl
# Serveur.

$| = 1;

use IO::Socket;
use IO::Select;
use Sys::Hostname;
use Term::ANSIColor;

# http://perldoc.perl.org/Term/ANSIColor.html
# http://perldoc.perl.org/IO/Select.html

# Creation du socket.
my $myself = hostname();
my $listening_addr = '10.9.178.25';
my $listening_port = 3142;

$main_socket = IO::Socket::INET->new(
LocalHost => $listening_addr,
LocalPort => $listening_port,
Proto => 'tcp',
Type => SOCK_STREAM,
Reuse => 1,
Listen => 5) or die 'Unable to listen on socket : '.$!."\n";
print 'Server started on : '.$listening_addr.':'.$listening_port."\n";
print 'waiting for clients...'."\n";

$main_socket->autoflush(1);

$readable_handles = new IO::Select();
$readable_handles->add($main_socket);

while (1) { #Infinite loop
# select() blocks until a socket is ready to be read or written
($new_readable) = IO::Select->select($readable_handles, undef, undef, 0);
# If it comes here, there is at least one handle
# to read from or write to. For the moment, worry only about
# the read side.
foreach $sock (@$new_readable) {
$sock->autoflush(1);
if ($sock == $main_socket) {
$new_sock = $sock->accept();
print $new_sock 'msg from server : connection established !';
# Add it to the list, and go back to select because the
# new socket may not be readable yet.
$name = gethostbyaddr($new_sock->peeraddr, AF_INET);
$peer_addr = $new_sock->peerhost();
$peer_port = $new_sock->peerport();
print 'new client : '.$name.'@'.$peer_addr.':'.$peer_port."\n";
$readable_handles->add($new_sock);
} else {
# It is an ordinary client socket, ready for reading.
$sock->autoflush(1);
$pid = fork;
die 'unable to fork client !' unless defined ($pid);
if ($pid ==0) {
# Le fils recoit les donnees du client.
$buf = <$sock>;
if ($buf) {
$name = gethostbyaddr($sock->peeraddr, AF_INET);
$peer_addr = $sock->peerhost();
$peer_port = $sock->peerport();
if ( $name eq 'mschapi-bb' ) {
print color("MAGENTA"),'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf,color("reset");
} elsif ( $name eq 'mschapo-bb' ) {
print color("CYAN") ,'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf,color("reset");
} else {
print 'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf;
}
# print $sock 'koukou';
# print $sock ' connection established !';
} else {
# Client closed socket. We do the same here, and remove
# it from the readable_handles list
$name = gethostbyaddr($sock->peeraddr, AF_INET);
$peer_addr = $sock->peerhost();
$peer_port = $sock->peerport();
# Attention boucle infinie possible ici...
print 'client has gone away : '.$name.'@'.$peer_addr.':'.$peer_port."\n";
$readable_handles->remove($sock);
close($sock);
}
} else {
# Le pere envoie les donnees au client.
while ($ligne = <>) {
if ($ligne) {
foreach $sock (@$new_readable) {
$sock->autoflush(1);
print $sock color("red"),$ligne,color("reset");
# print $sock "\a".$ligne;
# print $sock $ligne;
}
}
}
# ca marche ?
#$readable_handles->remove($sock);
#close($sock);
}
}
}
}
$sock->close();
$main_socket->close();
Actuellement j'arrive depuis les clients a :
- connecter au serveur
- me déconnecter proprement
- envoyer des messages au serveur
- recevoir des messages du serveur

la c'est ok

j'arrive depuis le serveur j'arrive a :
- détecter les nouvelles connections
- détecter les fin de connections (client has gone)
- identifier clairement de qui le message proviens (et le faire apparaitre en couleur)

la seule chose que je maitrise pas c'est que les messages envoyé depuis le serveur arrivent aléatoirement sur les clients
et seulement un seul client recoi les messages du serveur alors que je voudrait que le serveur broadcast sur tout les clients quel qu’en soit leurs nombres


merci de vos remarques