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
Répondre Avertir
#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
Répondre
#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
	}
}


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

GM
Répondre Avertir
#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.
Répondre Avertir
#6
Gro_MiNeT a écrit :C'est quoi vos balises pour éditer le tcl que je viens de poster, sinon ça va ronchonner ?! Wink

GM

Code :
TCL
ton script ... blabla

CrazyCat a écrit :La prochaine fois, essaye d'imaginer que j'ai un cerveau ...
Répondre Avertir
#7
Merwin a écrit :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.
Répondre
#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
Répondre Avertir
#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.
Répondre
#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.
Répondre Avertir
#11
d'accord, que signifie le "\n" je l'ai déjà vu à plusieurs reprises dans des codes ?
Répondre Avertir
#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
putlog ok
return


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 Wink
Répondre Avertir
#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 Wink
Répondre Avertir
#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 Wink

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
Répondre Avertir
#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 Wink
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté