Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Bug TCL sur un bind raw
#1
Ola,

J'ai un bug tcl que je n'arrive pas à résoudre sur un bind raw - notice.

Mon egg est sous une oline, il scan les connexions entrantes.
Il agit sur une blacklist, badidents, badhosts et badnicks.

Le problème, c'est que dès que je load les scripts tcl, il me plante l'identification EOF de la partyline.

c'est à dire, dès que je fais un /CHAT bot ou /CTCP CHAT bot, au niveau de taper le pass, bah plus rien, c'est figé, puis au bout de quelques secondes vient bien sur le 'Timeout of ident' . Alors est ce que ca vient des boucles (while, foreach) que j'utilise dans mes tcl ou du scan des scripts qui fait lager le bots.

J'ai tester sans les tcl , le bot ne plante pas rien que sous sa oline.

Si quelqu'un a déjà rencontrer un problème de ce genre, qu'il m'éclaircisse volontier !

Gro_MiNeT
#2
A mon avis, c'est bien le tcl qui fait foirer l'eggdrop: peut-être qu'il est surchargé par les messages (notices serveur) et ne peut pas tout gérer.

Tu devrais nous mettre ton TCL ici pour vérifier ça
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#3

tcl
#
###########
# FICHIER #
###########
#
 
if {![file exist xbadhost.db]} {
	set db [open xbadhost.db w+]
	close $db
}
if {![file exist xbadhost.tmp]} {
	set db [open xbadhost.tmp w+]
	close $db
}
 
if {![file exist xprotecthost.db]} {
	set db [open xprotecthost.db w+]
	close $db
}
if {![file exist xprotecthost.tmp]} {
	set db [open xprotecthost.tmp w+]
	close $db
}
 
 
#
#########################
# PROCDEDURE SERVEUR +S #
#########################
#
 
 
# Début de la procedure 
 
bind raw - NOTICE xbdhost:notice
proc xbdhost:notice {from key arg} {
 global botnick notc mod
 	set text [split $arg]
 	if ![string equal $from ${::notc:server}] return
 
# Initialisation du filtre connexion 
 
	if {[join [lrange $text 2 5]] == "Notice -- Client connecting"} {
  	set c_nick [lindex $text 9]
   	set c_user [string range [lindex [split [lindex $text 10] "@"] 0] 1 end]
   	set c_host [string range [lindex [split [lindex $text 10] "@"] 1] 0 end-1]
	set c_userhost "$c_nick!$c_user@$c_host"
 
 
# Contrôle des plages d'ip bannies exeptées
 
	set exempt_masks [open xprotecthost.db r]
	while {![eof $exempt_masks]} {
	set exempt_mask [gets $exempt_masks]
	if {$exempt_masks != ""} { 
	if {[string match -nocase [lindex $exempt_mask 0] $c_host]} { 
	putloglev 3 *  "\27°°°1 UserHost Protégé:\2 Pseudo: \002$c_nick\002 - Userhost: \002$c_user@$c_host\002"
	return 0
 
			} 
		} 
	} 
	close $exempt_masks
 
# expulsion de la plage d'ip bannie
 
	set file xbadhost
	set dbr [open $file.db r]
	while {![eof $dbr]} {
	set r [gets $dbr]
	if {$r!=""} {
	if {[string match -nocase [lindex $r 0] $c_host]} {
	putserv "KLINE $c_user@$c_host $mod(proxyy) :$mod(proxy)"	
	putloglev 3 *  "\213°°°1 XBadHost:\2: Connexion -> Pseudo: $c_nick - Userhost: \002$c_user@$c_host\002"	
	putloglev 3 *  "\213°°°1\2 Correspondance avec \2[lindex $r 0]\2"
	return 0
				}	
			}
		}
		close $dbr
	}
}

#4
C'est quoi vos balises pour éditer le tcl que je viens de poster, sinon ça va ronchonner ?! ;)

GM
#5
Ne lis pas le fichier à chaque notice, ouvres le fichier au lancement du script, place sont contenu dans une variable avec [read].
Ensuite analyse ta variable, tu auras un temps d'éxécution 100x meilleur, sans un seul while.
#6
Gro_MiNeT Wrote:C'est quoi vos balises pour éditer le tcl que je viens de poster, sinon ça va ronchonner ?! ;)

GM


Code:

tcl
ton script ... blabla
#7
Merwin Wrote:Ne lis pas le fichier à chaque notice, ouvres le fichier au lancement du script, place sont contenu dans une variable avec [read].
Ensuite analyse ta variable, tu auras un temps d'éxécution 100x meilleur, sans un seul while.
Tout à fait d'accord avec Merwin sur ce coup là. Surtout que dans le cas "normal", tu parcoures les 2 fichiers pour rien.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#8
Oué, mais je dois utiliser une boucle pour rechercher mon premier argument dans le fichier avant de le comparer et surtout ligne par ligne.

GM
#9
Je ne comprends pas ce que tu veux dire...
Au début, tu charges tes fichiers dans des variables de type liste, et ensuite tu peux utiliser [lsearch] par exemple pour savoir si l'host est dans l'une ou l'autre des variables.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#10

tcl
set fileID [open $fileName]
set _globalData [split [read $fileID] \\n]
close $fileID


Et plus loin dans ton code:


tcl
global _globalData
foreach line $_globalData {
  # $line contient la ligne de ton fichier
}


Nb: Le &#92 ; -> Supprime le.
#11
d'accord, que signifie le "\n" je l'ai déjà vu à plusieurs reprises dans des codes ?
#12
Salut Gro_MiNet
comment va depuis le temps??
déjà tu as une erreure a cette ligne (je pense)

tcl
if {$exempt_masks != ""} {

ca ne devrais pas étres plutot sans le S de exempt_masks

tcl
if {$exempt_mask != ""} {

(je ne pense pas que l erreur vienne de la)

ensuite tu devrais close les fichier avant de return 0 sinon au bou de 50 notice il y auras 50 fichiers ouvert ou tu peu remplacer le return 0 par un break (qui a pour effet de stopper la boucle et continue de lire la suite de la procédure)

l'idée de Merwin est pas mal du tout mais cela ne vient pas de la. \n signifie un retour a la ligne ("putlog 1\n2" renvera 2 ligne "1 et 2")

j pense que tu devrais ajouter des putlog et return a chaque condition pour voir ou le tcl se bloque (que tu deplacera au fur et a mesure)

tcl

le return aura pour effet d arreter la proc donc tu le place au debut, tu test et si ca marche tu le deplace dans la contition suivante.
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#13

tcl
set text [split $arg]
# a remplacer par:
set text [string map {"\\" "\\\\" "\{" "\\\{" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]" "\"" "\\\""} $arg]

qui a pour effet de déboguer les "{ [ " ] }"


édit: a parement le forum n aime pas mon code
set text [string map {"\\" "\\\\" "\{" "\\\{" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]" "\"" "\\\""} $arg]
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#14
Oh djkenny ca fait longtemps, ca fait plaisir !!! Moi depuis le temps tout va bien, je me remets au tcl petit à petit à mes heures perdues lol ;)

Oué c'est ca qui fait planter le bot le fait d'ouvrir 50 000 fichiers , je suis d'accord aussi pour 'break', là je viens de finir de modifier la tcl avec l'idée de Merwin et j'attends un moment qu il y est plusieurs connexion serveur pour voir si la PL ne plante pas. Je repasse en soirée.

à+

GM
#15
pour afficher la liste des fichiers ouvert

tcl
.tcl file channels
TCL -> stdin sock5 stdout sock6 stderr sock7

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away


Forum Jump:


Users browsing this thread: 1 Guest(s)