Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # NOTA : quando si usa l'esacape \0... per il colore va staccato dalla variabile locale (dichiarata)
- # con set. Questo invece non vale per i parametri che vengono passati alla funzione all'interno
- # della stessa.
- #Binds
- # ===================================== COMANDI PUBBLICI ========================================
- bind pub -|- !splits pub:pubsplits
- bind pub -|- !splitswhy pub:pubreason
- ###########################################################
- # lista dei canali su cui mostrare gli splits in pubblico #
- ###########################################################
- array set canali {
- "#tools"
- "#"
- }
- proc pub:pubreason {nick uhost hand chan txt} {
- global reasonservers reasonsplit
- if {[array size reasonservers] != 0} {
- # putchan $chan "..:.:.. Motivi NETsplit ..:.:.."
- foreach reasonsplit [array names reasonservers] {
- putchan $chan "$reasonsplit "
- }
- } else {
- putchan $chan "$nick: No netsplit detected"
- }
- }
- proc pub:pubsplits {nick uhost hand chan txt} {
- # canale per la notifica degli split
- # set canale "#hack.it"
- global sdservers sd_criticaltime canali
- # putchan $chan "..:.:.. NETsplit Status ..:.:.."
- # putchan $chan " "
- if {[array size sdservers] == 0} {
- putchan $chan "\[Netsplit] No netsplit detected"
- } else {
- foreach server [array names sdservers] {
- # questi sono i minuti calcolati se lo split dura meno di un ora !
- set splittime [expr [expr [unixtime] - $sdservers($server)] / 60]
- # Aggiunto da me #
- set splitseconds [expr [expr [expr ([unixtime]+0.0) - ($sdservers($server)+0.0)] / 60 ] - $splittime]
- set secondi [expr round([expr $splitseconds * 60]) ]
- # nel caso lo split si prolunghi per piu' di un ora definisco ore minuti && secondi
- set ore [expr $splittime / 60]
- set mindouble [expr $splittime + 0.0 ]
- set minutidouble [expr fmod($mindouble,60.0) ]
- # questi sono i minuti calcolati nel caso di piu' di un'ora di split !
- set minuti [expr int($minutidouble) ]
- # Se lo split e' critico . . .
- if {$splittime > $sd_criticaltime} { if {$splittime >= 60} { if {$ore == 1 && $minuti == 1 && $secondi == 1} { putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL" }
- if {$ore == 1 && $minuti == 1 && $secondi != 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore == 1 && $minuti != 1 && $secondi == 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore == 1 && $minuti != 1 && $secondi != 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore != 1 && $minuti == 1 && $secondi == 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore != 1 && $minuti == 1 && $secondi != 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore != 1 && $minuti != 1 && $secondi == 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- if {$ore != 1 && $minuti != 1 && $secondi != 1} {putchan $chan "${server} ($ore hrs $minuti mins $secondi secs) <= CRITICAL"}
- }
- if { $splittime < 60 } {
- if {$secondi == 1} {putchan $chan "${server} (${splittime} mins $secondi secs) <= CRITICAL"}
- if {$secondi != 1} {putchan $chan "${server} (${splittime} mins $secondi secs) <= CRITICAL"}
- # Se non e' critico (non c'e' bisogno del calcoro delle ore ) . . .
- } } else { if {$splittime == 1 && $secondi != 1} {putchan $chan "${server} (${splittime} mins $secondi secs)"}
- if {$splittime == 1 && $secondi == 1} {putchan $chan "${server} (${splittime} mins $secondi secs)"}
- # se i minuti sono > 1 (ma minori di un ora)
- if { $splittime != 0 && $splittime != 1 && $secondi != 1} {putchan $chan "${server} (${splittime} mins $secondi secs)"}
- if { $splittime != 0 && $splittime != 1 && $secondi == 1} {putchan $chan "${server} (${splittime} mins $secondi secs)"}
- # se sono 0 minuti tolgo la scritta minuti. . .
- if {$splittime == 0 && $secondi != 1} {putchan $chan "${server} ($secondi secs)"}
- if {$splittime == 0 && $secondi == 1} {putchan $chan "${server} ($secondi secs)"}
- }
- }
- }
- # putchan $chan "-----------------------------------------------"
- # putchan $chan "Totale : \0034[array size sdservers]\003 server in split."
- return 1
- }
- proc pub:split {server motivo} {
- # canale per la notifica degli split
- # set canale "#hack.it"
- # reasonservers e' un array : e' stato aggiunto da me x il reson degli splits
- global sdservers sd_ignore sd_showall reasonservers reasonsplit canali
- set server [string tolower $server]
- if {[lsearch -exact $sd_ignore $server] > -1} {return 1}
- foreach canale [array get canali] {
- if {$sd_showall} {putchan $canale "\[Netsplit] $motivo"}
- }
- foreach splitserver [array names sdservers] {
- if {[string match $splitserver $server] || [string match $server $splitserver]} {
- putchan $canale "16hmm... Ti ho detto che $server e' gia' in split . . . resetto lo split-time"
- unset sdservers($splitserver)
- unset reasonservers($motivo)
- }
- }
- set sdservers($server) [unixtime]
- # aggiunto da me x il motivo degli splits
- set reasonsplit $motivo
- set reasonservers($reasonsplit) $reasonsplit
- }
- proc pub:rejoin {server} {
- # canale per la notifica degli split
- # set canale "#hack.it"
- global sdservers sd_showall sd_ignore sd_criticaltime reasonservers reasonsplit canali
- set server [string tolower $server]
- if {[lsearch -exact $sd_ignore $server] > -1} {return 1}
- set inarray 0
- foreach splitserver [array names sdservers] {
- if {[string match $splitserver $server] || [string match $server $splitserver]} {
- set inarray 1
- set splittime [expr [expr [unixtime] - $sdservers($splitserver)] / 60]
- # Aggiunto da me #
- set splitseconds [expr [expr [expr ([unixtime]+0.0) - ($sdservers($server)+0.0)] / 60 ] - $splittime]
- set secondi [expr round([expr $splitseconds * 60]) ]
- unset sdservers($splitserver)
- }
- }
- ########## Aggiunto da me x i reason degli splits ##########
- # aggiunto da me la variabile servreason con gli * altrimenti non matcha la stringa . . .
- set servreason "*$server*"
- foreach reasonsplit [array names reasonservers] {
- if {[string match $reasonsplit $servreason] || [string match $servreason $reasonsplit]} {
- #aggiunto da me per gli split reason
- unset reasonservers($reasonsplit)
- }
- }
- ############################################################
- foreach canale [array get canali] {
- if {!$inarray} {
- if {$sd_showall} {putchan $canale "\[Netsplit] $server reconnected"}
- } else {
- ####### MODIFICATO ########
- # Ho aggiunto un return 0 altrimenti al ritorno di chiamata di funzione esegue il controllo anche sugli altri if . . .
- if {$sd_showall} { if {$splittime > $sd_criticaltime} {pub:criticalreconnect $server $splittime $secondi
- return 0}
- if {$splittime == 1 && $secondi != 1} {putchan $canale "\[Netsplit] $server reconnected after ${splittime} mins ${secondi} secs"}
- if {$splittime == 1 && $secondi == 1} {putchan $canale "\[Netsplit] $server reconnected after ${splittime} mins ${secondi} secs"}
- # se i minuti sono > 1 . . .
- if { $splittime != 0 && $splittime != 1 && $secondi != 1} {putchan $canale "\[Netsplit] $server reconnected after ${splittime} mins ${secondi} secs"}
- if { $splittime != 0 && $splittime != 1 && $secondi == 1} {putchan $canale "\[Netsplit] $server reconnected after ${splittime} mins ${secondi} secs"}
- if {$splittime == 0 && $secondi != 1} {putchan $canale "\[Netsplit] $server reconnected after ${secondi} secs"}
- if {$splittime == 0 && $secondi == 1} {putchan $canale "\[Netsplit] $server reconnected after ${secondi} secs"}
- }
- ############################
- }
- }
- }
- #################### TEST ############################
- bind pub -|- !test pub:test
- bind msg -|- !test pub:test
- bind dcc o !test pub:test
- bind pub -|C !test2 pub:test2
- proc pub:test {nick uhost hand chan txt} {
- global reasonsplit reasonservers
- #foreach reasonsplit [array names reasonservers] {
- # if { [string match $reasonsplit $servero] || [string match $servero $reasonsplit ] } {
- #putchan $canale "Cancellato."
- # unset reasonservers($reasonsplit)
- # }
- #}
- #putquick "JOIN #socio l1gn4n0"
- }
- #################### TEST ############################
- proc pub:criticalreconnect {server mins sec} {
- #set canale "#hack.it"
- global canali
- # nel caso lo split si prolunghi per piu' di un ora
- set ore [expr $mins / 60]
- set mindouble [expr ${mins} + 0.0 ]
- set minutidouble [expr fmod($mindouble,60.0) ]
- set minuti [expr int($minutidouble) ]
- foreach canale [array get canali] {
- if {$mins >= 60} { if {$ore == 1 && $minuti == 1 && ${sec} == 1} { putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs" }
- if {$ore == 1 && $minuti == 1 && $sec != 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore == 1 && $minuti != 1 && $sec == 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore == 1 && $minuti != 1 && $sec != 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore != 1 && $minuti == 1 && $sec == 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore != 1 && $minuti == 1 && $sec != 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore != 1 && $minuti != 1 && $sec == 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- if {$ore != 1 && $minuti != 1 && $sec != 1} {putchan $canale "\[Netsplit] $server reconnected after $ore hrs $minuti mins $sec secs"}
- }
- if {$mins < 60} { if {$sec == 1} { putchan $canale "\[Netsplit] $server reconnected after $minuti mins $sec secs" }
- if {$sec != 1} { putchan $canale "\[Netsplit] $server reconnected after $minuti mins $sec secs" }
- }
- }
- putallbots "critrec"
- }
- proc pub:criticalsplit {server} {
- # set canale "#hack.it"
- global canali
- foreach canale [array get canali] {
- putchan $canale "\[Netsplit] $server <= CRITICAL"
- }
- }
- # ===================================== COMANDI PUBBLICI ========================================
- # ===================================== COMANDI PRIVAT ========================================
- proc sd_helpidx {hand chan idx} {
- if {![matchattr $hand m $chan]} {return 0}
- putidx $idx "splitdetect.tcl commands"
- if {[matchattr $hand m]} {
- putidx $idx " For masters:"
- putidx $idx " netsplits"
- }
- putidx $idx " "
- return 1
- }
- proc sd_help {hand chan idx cmd} {
- global sd_criticaltime sd_showall
- if {[matchattr $hand m|m $chan]} {
- switch -exact -- $cmd {
- "netsplits" {
- if {[matchattr $hand m]} {
- putidx $idx "# netsplits"
- if {$sd_showall} {
- putwrap $idx 3 "This command shows all splittet servers. If a splits continues for more then $sd_criticaltime minutes it'll be shown as critical."
- return 1
- } else {
- putwrap $idx 3 "This command shows all critical splittet servers (Servers which are splittet for more then $sd_criticaltime minutes are considered as critical)."
- return 1
- }
- }
- }
- }
- }
- return 0
- }
- lappend nb_helpidx "sd_helpidx"
- set nb_help(netsplits) "sd_help"
- proc utimerid {timerproc} {
- foreach timer [timers] {
- if {[lindex [lindex $timer 1] 0] == $timerproc} {return [lindex $timer 0]}
- }
- return -1
- }
- if {![string match *sd:checkforcriticalservers* [timers]]} {timer 1 sd:checkforcriticalservers}
- proc raw:splitdetect {from keyword rest} {
- global sd_ignore
- # aggiunto da me x gli splitsreason
- set motivo $rest
- set motivo [lrange $motivo 6 end]
- ###################################
- set rest [string tolower $rest]
- set rest [split $rest { }]
- if {[lindex $rest 0] != "&servers" && [lindex $rest 0] != "&services"} {return 0}
- set rest [lrange $rest 1 end]
- set rest [string range $rest 1 end]
- # aggiunto da me
- set servermotivo [lindex $rest 2]
- set servermotivo "\0034$servermotivo\003"
- append servermotivo " $motivo"
- # split &servers
- if {[string match "received squit *" $rest]} {
- # Tolto altrimenti il tempo riconnessione split non funge ! sd:split [lindex $rest 2]
- # String range e' stato aggiunto da me per il reason degli splits
- # MOTIVO (SERVER + MOTIVO) : es. *.de (Connection Reset By Peer)
- pub:split [lindex $rest 2] $servermotivo
- }
- # split &services (aggiunto da me per gli hub splits)
- #if {[string match "received quit map@*" $rest]} {
- # Received QUIT map@TU-Ilmenau.DE from map@TU-Ilmenau.DE (BelWue.DE TU-Ilmenau.DE)
- # Received QUIT NoteServ@fu-berlin.de from NoteServ@fu-berlin.de (BelWue.DE Uni-Erlangen.DE)
- # set serv [lindex $rest 2]
- # set lung [string length $serv]
- # set serv [string range $serv 4 $lung]
- # pub:split $serv "Ping Timeout"
- # putchan "#drepanum" "serv : $serv - reason : Ping Timeout"
- #}
- #if {[string match "received quit noteserv@*" $rest]} {
- # Received QUIT map@TU-Ilmenau.DE from map@TU-Ilmenau.DE (BelWue.DE TU-Ilmenau.DE)
- # Received QUIT NoteServ@fu-berlin.de from NoteServ@fu-berlin.de (BelWue.DE Uni-Erlangen.DE)
- # set serv [lindex $rest 2]
- # set lung [string length $serv]
- # set serv [string range $serv 9 $lung]
- ############ DEBUG #################
- # pub:split "$serv" "Ping Timeout"
- # putchan "#drepanum" "serv : $serv - reason : Ping Timeout"
- #}
- if {[string match "received server *" $rest]} {
- ## Tolto altrimenti il tempo riconnessione split non funge ! sd:rejoin [lindex $rest 2]
- pub:rejoin [lindex $rest 2]
- }
- # split &services (aggiunto da me per gli hub splits al rejoin)
- #if {[string match "received service map@*" $rest]} {
- # set serv [lindex $rest 2]
- # set lung [string length $serv]
- # set serv [string range $serv 4 $lung]
- # pub:rejoin $serv
- # }
- #if {[string match "received service NoteServ@*" $rest]} {
- # set serv [lindex $rest 2]
- # set lung [string length $serv]
- # set serv [string range $serv 9 $lung]
- # pub:rejoin $serv
- #}
- }
- proc sd:split {server} {
- global sdservers sd_ignore sd_showall reasonservers reasonsplit
- set server [string tolower $server]
- if {[lsearch -exact $sd_ignore $server] > -1} {return 1}
- if {$sd_showall} {putlog "Netsplit detected: $server"}
- foreach splitserver [array names sdservers] {
- if {[string match $splitserver $server] || [string match $server $splitserver]} {
- putlog "hmmz... I though $server is already splitted... reseting split-time"
- unset sdservers($splitserver)
- unset reasonservers($reasonsplit)
- }
- }
- set sdservers($server) [unixtime]
- }
- proc sd:rejoin {server} {
- global sdservers sd_showall sd_ignore sd_criticaltime reasonservers reasonsplit
- set server [string tolower $server]
- if {[lsearch -exact $sd_ignore $server] > -1} {return 1}
- set inarray 0
- foreach splitserver [array names sdservers] {
- if {[string match $splitserver $server] || [string match $server $splitserver]} {
- set inarray 1
- set splittime [expr [expr [unixtime] - $sdservers($splitserver)] / 60]
- unset sdservers($splitserver)
- unset reasonservers($reasonsplit)
- }
- }
- if {!$inarray} {
- if {$sd_showall} {putlog "Reconnect detected: $server (unknown splittime)"}
- } else {
- if {$sd_showall} {putlog "Reconnect detected: $server (${splittime}min)"}
- if {$splittime > $sd_criticaltime} {pub:criticalreconnect $server $splittime}
- }
- }
- # DISATTIVATI
- # proc sd:criticalreconnect {server mins} {
- # putlog "$server reconnected after ${mins}min"
- # putallbots "critrec"
- # }
- # proc sd:criticalsplit {server} {
- # putlog "Critical split detected: $server"
- # }
- proc dcc:netsplits {hand idx rest} {
- global sdservers sd_criticaltime
- putdcc $idx "Current Netsplits:"
- putdcc $idx "---"
- if {[array size sdservers] == 0} {
- putdcc $idx "none ^_^"
- } else {
- foreach server [array names sdservers] {
- set splittime [expr [expr [unixtime] - $sdservers($server)] / 60]
- if {$splittime > $sd_criticaltime} {
- putdcc $idx "${server}(${splittime}min) <=== CRITICAL!"
- } else {
- putdcc $idx "${server}(${splittime}min)"
- }
- }
- }
- putdcc $idx "---"
- putdcc $idx "[array size sdservers] servers splitted"
- return 1
- }
- proc sd:checkforcriticalservers {} {
- global sdservers sd_lost sd_criticaltime reasonservers reasonsplit
- foreach server [array names sdservers] {
- set splittime [expr [expr [unixtime] - $sdservers($server)] / 60]
- if {$splittime == $sd_criticaltime} {pub:criticalsplit $server}
- if {$splittime > $sd_lost} {
- putlog "Seems that $server got lost in the netsplit..."
- unset sdservers($server)
- unset reasonservers($reasonsplit)
- }
- }
- if {![string match *sd:checkforcriticalservers* [timers]]} {timer 1 sd:checkforcriticalservers}
- }
- proc bot:critrec {bot command rest} {
- #putlog "$bot told me that there's a reconnect after a critical split."
- }
- proc 001:joinservers {from keyword rest} {
- putquick "JOIN &servers"
- # questo canale mi serve per gli split da notificare sugli hub
- putquick "JOIN &services"
- return 0
- }
- proc JOIN:joinservers {from keyword rest} {
- if {$rest == ":&servers"} {return 1} else {return 0}
- }
- bind dcc m netsplits dcc:netsplits
- bind raw - NOTICE raw:splitdetect
- bind raw - 001 001:joinservers
- bind raw - JOIN JOIN:joinservers
- bind bot - critrec bot:critrec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement