26/09/2024, 17:57
Hello à tous,
j'ai besoin d'optimiser un script pour le rendre plus performant :
Il manque des variables/fonctions, j'ai mis les lignes essentiels pour faire un focus sur la problématique et de la partie qui doit être optimiser.
Il est fonctionnel, mais je pense qu'on peut faire largement mieux pour le rendre plus fluide , si vous avez des idées, welcome.
j'ai besoin d'optimiser un script pour le rendre plus performant :
tcl
# Regexp connection user
set ::checkpays::regexpclientco {:\ (.*)\ \((.*?)@(.*?)\) \[(.*?)\] \[vhost: (.*?)\] (.*)\ \[country: (.*?)\] \[asn: (.*?)\] \[asname: (.*?)\] \[reputation: (.*?)\] (.+)}
# Realname age sexe
set ::checkpays::regexpagesex {^\d{1,2} [HFM]( .+)?}
# regexp pour match les ados de 12 à 17ans
set ::checkpays::regexpado {(1[2-7]) (H|F|M)}
############################################
# PROC TRAITEMENT CONNECTING #
############################################
proc ::checkpays::who:co {from keyword text} {
if {![string match -nocase "*Client connecting*" $text]} {
return;
}
set sslco 0
set webirc 0
set websocket 0
set unknow 0
set account 0
regexp $::checkpays::regexpclientco $text - nick username ip ipdns vhost csa codepays asn asname reputation other
# IP Except
if {$ip eq "127.0.0.1" || [isbotnick $nick]} {
return
}
set SESSION [md5 "${username}@${vhost}"]
if {[string match -nocase "*tls-users*" $other]} {
set sslco 1
}
if {[string match -nocase "*webirc-users*" $other]} {
set webirc 1
}
if {[string match -nocase "*websocket-users*" $other]} {
set websocket 1
}
if {[string match -nocase "*unknown-users*" $other]} {
set unknow 1
}
if {[string match -nocase "*account:*" $csa]} {
set account 1
}
# On met en mémoire les valeurs qu'on ne récupère pas dans le who
set ::checkpays::DB($SESSION,IP) $ip
set ::checkpays::DB($SESSION,IPDNS) $ipdns
set ::checkpays::DB($SESSION,CODEPAYS) $codepays
set ::checkpays::DB($SESSION,ASN) $asn
set ::checkpays::DB($SESSION,ASNAME) $asname
set ::checkpays::DB($SESSION,REPUTATION) $reputation
set ::checkpays::DB($SESSION,SSLCO) $sslco
set ::checkpays::DB($SESSION,WEBIRC) $webirc
set ::checkpays::DB($SESSION,WEBSOCKET) $websocket
set ::checkpays::DB($SESSION,UNKNOW) $unknow
set ::checkpays::DB($SESSION,ACCOUNT) $account
putnow "WHO $nick %unhr"
}
proc ::checkpays::who:gestion {from key text} {
set text [split [string trim $text]]
lassign $text {} username vhost nick
set SESSION [md5 "${username}@${vhost}"]
set realname [join [lrange [split $text {:}] 1 end]]
## On recupere les variables en mémoire
set ip $::checkpays::DB($SESSION,IP)
set ipdns $::checkpays::DB($SESSION,IPDNS)
set sslco $::checkpays::DB($SESSION,SSLCO)
set webirc $::checkpays::DB($SESSION,WEBIRC)
set websocket $::checkpays::DB($SESSION,WEBSOCKET)
set reputation $::checkpays::DB($SESSION,REPUTATION)
set codepays $::checkpays::DB($SESSION,CODEPAYS)
set asn $::checkpays::DB($SESSION,ASN)
set asname $::checkpays::DB($SESSION,ASNAME)
set unknow $::checkpays::DB($SESSION,UNKNOW)
set account $::checkpays::DB($SESSION,ACCOUNT)
# Nick/Ip/Ident EXCEPTION
if {[::toolsAmand::verify:b $::checkpays::fichier(ident) $username]} {
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,3EXCEPTION - IDENT\003\002 \002\[\002$codepays\002\]\002 - $nick ($username@$ip) (Réputation: $reputation) (Sslco: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
::checkpays::monitoring $nick $username $ip $vhost $codepays $reputation $sslco $webirc $websocket $realname $asn $asname
::checkpays::CountIRC $ip $username $codepays $webirc $websocket
return
} elseif {[::toolsAmand::verify:b $::checkpays::fichier(pseudo) $nick]} {
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,3EXCEPTION - PSEUDO\003\002 \002\[\002$codepays\002\]\002 - $nick ($username@$ip) (Réputation: $reputation) (Sslco: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
::checkpays::monitoring $nick $username $ip $vhost $codepays $reputation $sslco $webirc $websocket $realname $asn $asname
::checkpays::CountIRC $ip $username $codepays $webirc $websocket
return
} elseif {[::toolsAmand::verify:b $::checkpays::fichier(ip) $ip]} {
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,3EXCEPTION - IP\003\002 \002\[\002$codepays\002\]\002 - $nick ($username@$ip) (Réputation: $reputation) (Sslco: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
::checkpays::monitoring $nick $username $ip $vhost $codepays $reputation $sslco $webirc $websocket $realname $asn $asname
::checkpays::CountIRC $ip $username $codepays $webirc $websocket
return
} else {
}
# On envoie à la proc de traitement
::checkpays::traitement $nick $username $ip $ipdns $vhost $codepays $asn $asname $reputation $sslco $webirc $websocket $unknow $realname $account
# Changement du realname en ASV / Redirection ados
if {[regexp $::checkpays::regexpagesex $realname] != 1} {
putnow "CHGNAME $nick [expr 18 + int(rand()*72)] M"
putnow "PRIVMSG $::checkpays::backpaysredirect :\002\00300,02REALNAME\003\002 - \002$nick\002 \[$codepays\] ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Account: $account) (Asn: $asn) (Asname: $asname) vient d'être changé. Realname: $realname"
} elseif {[regexp $::checkpays::regexpado $realname] == 1} {
putnow "PRIVMSG OperServ :SVSJOIN $nick $::checkpays::salonado"
putnow "SAUMODE $nick +R"
#putnow "PRIVMSG $::checkpays::backpaysredirect :\002\0030,6ADO\002\003 - \002$nick\002 ($username@$ip) a été redirigé sur \002$::checkpays::salonado\002 - \002Realname:\002 $realname"
} else {
}
}
proc ::checkpays::traitement {nick username ip ipdns vhost codepays asn asname reputation sslco webirc websocket unknow realname account} {
set SESSION [md5 "${username}@${vhost}"]
set ALLEXCEPTIONS [list {*}$::checkpays::PAYSINTERDIT {*}$::checkpays::PAYSINTERDITNWSI {*}$::checkpays::PAYSINTERDITNW {*}$::checkpays::PAYSIPAPI {*}$::checkpays::PAYSEXCEPTION]
set sanction 0
# IP-API
# Bloquer IPAPI Proxy/Hosting - IPABUSEIPDB
if {[lsearch $::checkpays::PAYSIPAPI $codepays]!=-1} {
::checkpays::infoAPI $nick $username $ip $ipdns $unknow $reputation $realname $webirc $websocket $account
}
# Traitement
if {[lsearch $::checkpays::PAYSINTERDIT $codepays] != -1} {
set sanction 1
putnow "GLINE *@$ip $::checkpays::timeBans $::checkpays::motifpaysbl"
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,4PAYS BLOQUÉ\003\002 \[\002$codepays\002\] - \002$nick\002 ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
} elseif {([lsearch $::checkpays::PAYSINTERDITNWSI $codepays] != -1) && ($webirc == 0) && ($websocket == 0) && ($reputation < 200)} {
set sanction 1
putnow "GLINE *@$ip $::checkpays::timeBans $::checkpays::motifpaysbl"
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,12PAYS BLOQUÉ - HORS WEB|RÉPUTATION\003\002 \[\002$codepays\002\] - \002$nick\002 ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
} elseif {([lsearch $::checkpays::PAYSINTERDITNW $codepays] != -1) && ($webirc == 0) && ($websocket == 0)} {
set sanction 1
putnow "GLINE *@$ip $::checkpays::timeBans $::checkpays::motifpaysbl"
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,6PAYS BLOQUÉ - HORS WEB\003\002 \[\002$codepays\002\] - \002$nick\002 ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
} elseif {($codepays eq "US") || ([string match "*.irccloud.com" $ip])} {
set sanction 1
putnow "GLINE $username@$ip $::checkpays::timeBans $::checkpays::motifpaysbl"
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,10IRCCloud|US\003\002 \[\002$codepays\002\] - \002$nick\002 ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
} else {
# Si on entre pas dans une condition blacklisté on envoie à la proc du monitoring
::checkpays::monitoring $nick $username $ip $vhost $codepays $reputation $sslco $webirc $websocket $realname $asn $asname
::checkpays::CountIRC $ip $username $codepays $webirc $websocket
}
# Vérification si le codepays est hors liste interdit/protégé
if {[lsearch $ALLEXCEPTIONS $codepays]==-1} {
putnow "PRIVMSG $::checkpays::backpaysbl :\002\0030,14USER SUSPECT\003\002 \[\002$codepays\002\] - \002$nick\002 ($username@$ip) (Réputation: $reputation) (Ssl: $sslco) (Webirc: $webirc) (Websocket: $websocket) (Asn: $asn) (Asname: $asname) - Realname: $realname"
::checkpays::infoAPI $nick $username $ip $ipdns $unknow $reputation $realname $webirc $websocket $account
::checkpays::infoABUSEIPDB $nick $username $ipdns
}
# Suppression des valeurs en mémoire.
# https://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/unset.n.html
unset ::checkpays::DB($SESSION,IP)
unset ::checkpays::DB($SESSION,IPDNS)
unset ::checkpays::DB($SESSION,REPUTATION)
unset ::checkpays::DB($SESSION,SSLCO)
unset ::checkpays::DB($SESSION,WEBIRC)
unset ::checkpays::DB($SESSION,CODEPAYS)
unset ::checkpays::DB($SESSION,WEBSOCKET)
unset ::checkpays::DB($SESSION,ASN)
unset ::checkpays::DB($SESSION,ASNAME)
unset ::checkpays::DB($SESSION,UNKNOW)
unset ::checkpays::DB($SESSION,ACCOUNT)
if {$sanction == 1} {
return
}
}
Il manque des variables/fonctions, j'ai mis les lignes essentiels pour faire un focus sur la problématique et de la partie qui doit être optimiser.
Il est fonctionnel, mais je pense qu'on peut faire largement mieux pour le rendre plus fluide , si vous avez des idées, welcome.