Motdbot
Un article de Wiki GeekNode.
Role du motdbot:
Définir un motd dynamique en fournissant les informations suivantes:
- nom du serveur
- nom de son admin
- nicknames des opers du serveur
- localisation du serveur
- uptime du serveur
- charge du serveur
- listing des canaux où le nombre d'utilisateurs est supérieur à une valeur donnée (10 pour cet exemple)
+ rehash de l'ircd pour prendre en compte le motd.file crée
[modifier] Mettons nous d'accord sur le style du motd !
Voici un modèle de base:
Bonjour et bienvenue sur
..|'''.| '|| '|. '|' '||
.|' ' .... .... || .. |'| | ... .. || ....
|| .... .|...|| .|...|| || .' | '|. | .| '|. .' '|| .|...||
'|. || || || ||'|. | ||| || || |. || ||
''|...'| '|...' '|...' .||. ||. .|. '| '|..|' '|..'||. '|...'
``````
name: ****.geeknode.org
netadmin: xxxx
opers: yyyyy, zzzz
location: ville, region, pays
uptime: 4 days, 6:25
loadavg: 0.04, 0.13, 0.12
``````
Le but de ce réseau est de réunir des personnes ayant un goût particulier
(voire une passion) pour l'informatique, et notamment pour les OS de type
Unix ou GNU/Linux. En favorisant l'échange de connaissances, nous espérons
contribuer à l'épanouissement intellectuel de chacun.
``````
Liste actualisée des plus gros canaux du réseau:
#geekerie (12)
#espix (19)
#linux (26)
#defouloir (11)
#calvix (14)
#staff (12)
#Troll (47)
#gentoofr (15)
#globenet (17)
#fdn (36)
#esigetel (14)
#SoH (18)
#tribugentoo (12)
#wireless-fr (17)
#tremulous-fr (14)
``````
Pour plus d'informations, rendez-vous sur http://www.geeknode.org
N'oubliez pas de lire les règles d'usage de l'irc en tapant /rules
Le motdbot est codé en perl
ci-joint le code
#!/usr/bin/perl
# motdbot for unrealircd by linkz
# Inspired from O'Reilly irc hacks #32.
# Visit http://hacks.oreilly.com/pub/h/1964 for more details.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
use strict;
use IO::Socket;
# déclaration des variables
my $slogan = " Le but de ce réseau est de réunir des personnes ayant un goût particulier
(voire une passion) pour l'informatique, et notamment pour les OS de type
Unix ou GNU/Linux. En favorisant l'échange de connaissances, nous espérons
contribuer à l'épanouissement intellectuel de chacun.\n";
my $logo = "\n Bonjour et bienvenue sur \n\n
..|'''.| '|| '|. '|' '||
.|' ' .... .... || .. |'| | ... .. || ....
|| .... .|...|| .|...|| || .' | '|. | .| '|. .' '|| .|...||
'|. || || || ||'|. | ||| || || |. || ||
''|...'| '|...' '|...' .||. ||. .|. '| '|..|' '|..'||. '|...'\n";
my $separator = "\n\n\t\t\t\t ``````\n\n";
my $motdfile = "/path/ircd.motd"; # path de votre fichier .motd
my $minusers = 10; # nombre minimum d'users pour afficher le canal dans le motd
my $server = "****.geeknode.org"; # host de votre serveur
my $adminname = "xxxx"; # nom du netadmin
my $staff = "yyyyyy, zzzzz"; # noms des opers du serveur
my $location = "ville, région, pays";
my $monsuperuptime = `uptime`; $monsuperuptime =~ /.+up (.+),.+user.+/;
my $uptime = $1;
my $loadavg = `awk '{ print \$1",", \$2",", \$3}' /proc/loadavg`;
my $ident = "----------";
my $realname = "i'm a Message Of The Day bot, leave me alone";
my @letters = ('A' .. 'Z', 'a' .. 'z', '0' .. '9');
my $nick = $letters[rand@letters].$letters[rand@letters].$letters[rand@letters].$letters[rand@letters].$letters[rand@letters].$letters[rand@letters].$letters[rand@letters]; # random nick
my $sock = new IO::Socket::INET(PeerAddr => $server,PeerPort => 6667,Proto => 'tcp') or die "I can't connect to $server, sorry dude.\n"; # paramètres de la connexion irc
chomp($uptime,$loadavg,$monsuperuptime);
# début du code
# connexion sur l'ircd avec IO::Socket
print $sock "NICK $nick\r\n";
print $sock "USER $ident 8 * :$realname\r\n";
# monitoring du socket
while (my $input = <$sock>) {
if ($input =~ /004/) {
last;
}
# si le nickname est déjà utilisé on tue le script (fort improbable)
elsif ($input =~ /433/) {
die "Nickname is already in use.";
}
}
# demande d'un /list à l'ircd
print $sock "LIST\r\n";
# ouverture du fichier contenant le texte du MOTD
open(FILE,">$motdfile");
# on écrit dans le fichier les infos statiques
print FILE "$logo";
print FILE "$separator";
print FILE " name: $server\n";
print FILE " netadmin: $adminname\n";
print FILE " opers: $staff\n";
print FILE " location: $location\n";
print FILE " uptime: $uptime\n";
print FILE " loadavg: $loadavg\n";
print FILE "$separator";
print FILE "$slogan";
print FILE "$separator";
print FILE " Liste actualisée des plus gros canaux du réseau:\n\n";
# on écoute le socket en boucle
while (my $input = <$sock>) {
chomp $input;
# si le raw 322 est recu (322 = réponses du /list)
if ($input =~ /^:$server\s322\s.*?\s(\#.*?)\s(\d*?)\s/) {
# on analyse le champ correspondant au nombre d'user du canal listé et s'il est supérieur ou égal à $minusers
# on écrit le nom du canal et le nb d'users de celui ci dans le fichier MOTD
if ($2 >= $minusers) {
print FILE " $1 ($2)\n";
}
}
# mais si on recoit le raw 323 (end of /list) on écrit la fin du texte fixe dans le fichier et on fini
elsif ($input =~ /^:$server\s323\s(.*)/) {
print FILE "$separator";
print FILE " Pour plus d'informations, rendez-vous sur http://www.geeknode.org\n\n";
print FILE " N'oubliez pas de lire les règles d'usage de l'irc en tapant /rules\n\n";
# fermeture du fichier
close(FILE);
# on rehash unrealircd pour prendre en compte le nouveau MOTD crée
#exec('/unreal_path/unreal rehash'); # modifiez cette ligne
# on tue le script
die;
}
}
linkz.
J'ai viré la version kernel.
Le slogan étant d'origine 'geekpower' je crois bien, je l'avais laissé bien qu'il ne me plaise pas des masses non plus. Il est temps d'en trouver un autre, ou de ne pas en avoir...
(+ suppression de la variable $date qui servait à quedalle oO !?)
> 31/10/06
_ reformatage du code
_ ajout de variable 'fixes'
_ ajout de commentaires
_correction du bug uptime + load average (Fox j'ai inclus ton regexp), merci pour le bug report.
N'hésitez pas si vous trouvez des erreurs.
Madx: ok
target0: Parfait, à quelques exceptions près : je déconseille fortement d'afficher la version du kernel, question de sécurité. Ensuite, la phrase "Le t'chat des plus geeks - Le plus geek des t'chats (tm)" est un peu bof.
cadure: ok pour moi aussi
xiu : pas mal, même avis que target0 sur kernel/slogan
FoX : j'adore ! mis à part la version kernel ... c'est useless et pas forcement bon à donner à tout le monde ... pour ce qui est du slogan sincèrement on peut trouver mieux mais sinon celui ci est pas mal quand même.
Zed : ca me va aussi, et pareil pour la version du kernel... c'est pas forcément utile !
bragon: adopté
myster0 : ca me va si on vire le kernel (meme si j'ai pas de serv public) je trouve que c'est une faille de sécu
