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


[Résolu] Json log unrealircd et eggdrop
#1
Bonjour,

UnrealIRCD a une nouvelle fonctionnalité le json log ( https://www.unrealircd.org/docs/JSON_logging ) qui permet de récupérer à la connection de l'utilisateur (ou autres events) toutes ces données sans devoir faire obligatoirement un /who pour récupérer le realname etc, dans notre cas on va prendre celle de la connexion, je vous montre un exemple sur les raw brut de HexChat quand il y a une nouvelle connexion entrante:

Quote:>> @unrealircd.org/json-log={"timestamp":"2023-04-03T14:30:03.210Z","level":"info","subsystem":"connect","event_id":"LOCAL_CLIENT_CONNECT","log_source":"irc.localhost.com","msg":"Client\sconnecting:\sluibrun\s(7Qdf5jAyc@pop.92-184-112-10.mobile.abo.orange.fr)\s[92.184.112.10]\s[vhost:\s8EDCD52A.395051F4.1762A978.IP]\s[class:\sclients]\s[secure:\sTLSv1.3-TLS_CHACHA20_POLY1305_SHA256]\s[country:\sFR]\s[reputation:\s670]\s[security-groups:\sknown-users,webirc-users,tls-and-known-users,tls-users]","client":{"name":"luibrun","id":"007RKC9QJ","hostname":"pop.92-184-112-10.mobile.abo.orange.fr","ip":"92.184.112.10","server_port":6697,"client_port":35106,"details":"luibrun!7Qdf5jAyc@pop.92-184-112-10.mobile.abo.orange.fr","connected_since":"2023-04-03T14:30:02.000Z","idle_since":"2023-04-03T14:30:02.000Z","user":{"username":"7Qdf5jAyc","realname":"50\sF\sVILLEFRANCHE\sSUR\sSAONE","vhost":"8EDCD52A.395051F4.1762A978.IP","cloakedhost":"8EDCD52A.395051F4.1762A978.IP","servername":"irc.localhost.com","reputation":670,"security-groups":["known-users","webirc-users","tls-and-known-users","tls-users"],"modes":"iwxzG"},"tls":{"cipher":"TLSv1.3-TLS_CHACHA20_POLY1305_SHA256"},"geoip":{"country_code":"FR"}},"extended_client_info":"[vhost:\s8EDCD52A.395051F4.1762A978.IP]\s[class:\sclients]\s[secure:\sTLSv1.3-TLS_CHACHA20_POLY1305_SHA256]\s[country:\sFR]\s[reputation:\s670]\s[security-groups:\sknown-users,webirc-users,tls-and-known-users,tls-users]"};time=2023-04-03T14:30:03.210Z :irc.localost.com NOTICE Amand :03[info] Client connecting: luibrun (7Qdf5jAyc@pop.92-184-112-10.mobile.abo.orange.fr) [92.184.112.10] [vhost: 8EDCD52A.395051F4.1762A978.IP] [class: clients] [secure: TLSv1.3-TLS_CHACHA20_POLY1305_SHA256] [country: FR] [reputation: 670] [security-groups: known-users,webirc-users,tls-and-known-users,tls-users]

Pour activer cette capacité, il faut être IRCop , en tapant /oper ensuite il faut activer le cap en tapant /CAP REQ :unrealircd.org/json-log et ensuite vous mettez le snomask que vous voulez pour voir le retour du json, pour nous ça sera le +c ( pour voir la snotice de connexion )

Pour afficher le json, il faudra ouvrir votre fenêtre de debug (sur mIRC /debug -pt @debug), pour HexChat vous avez les "Raw log" disponible dans le menu du haut.

Avant je travaillais directement sur la snotice de connexion en capturant les données que je voulais avec une regexp et je complétais ça avec un /who pour avoir le realname :

Quote:<Eggdrop> [08:36:08] -NOTICE- 03[info] Client connecting: Salut8 (test@5-51-144-231.abo.bbox.fr) [5.51.144.231] [vhost: 28E5D75.78E39FB6.C70996E9.IP] [class: clients] [secure: TLSv1.3-TLS_CHACHA20_POLY1305_SHA256] [country: FR] [reputation: 999] [security-groups: known-users,webirc-users,tls-and-known-users,tls-users]

Et ensuite je fesais le who pour avoir le realname.

Aujourd'hui avec le json log, je peux avoir les données centralisées sans aller chercher à droite et à gauche pour les rassembler mais je ne sais pas comment voir le json et le traiter avec eggdrop, il doit y avoir une façon de faire, je l'avais aperçu quelque part , et je n'arrive plus à mettre la main dessus.

@ZarTek je pense que tu avais déjà tenté un truc du style ( je ne sais pas si je me trompe ).

Si vous avez besoin de complément d'information, n'hésitez pas.
  Reply
#2
Du coup il faut binder le raw (ou rawt ?)
Un exemple de la mise en oeuvre serait bienvenu
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
Je peux fournir mon script pour traiter la snotice de connexion avec une regexp mais pour le json , je ne sais pas, je ne vois pas le retour en partyline, je n'ai encore rien fait je ne sais pas par où commencer.


tcl
if {[::tcl::info::commands ::checkpays::uninstall] eq "::checkpays::uninstall"} { ::checkpays::uninstall }
 
namespace eval ::checkpays {
 
############
# VARIABLE #
############
 
# Procédure de désinstallation : le script se désinstalle totalement avant
# chaque rehash ou à chaque relecture au moyen de la commande "source" ou
# autre.
 
proc ::checkpays::uninstall {args} {
putlog "Désallocation des ressources de \002checkpays\002..."
# Suppression des binds.
foreach binding [lsearch -inline -all -regexp [binds *[set ns [::tcl::string::range [namespace current] 2 end]]*] " \{?(::)?$ns"] {
unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
}
 
namespace delete ::checkpays
}
}
 
############################################
#        PROC TRAITEMENT CONNECTING        #
############################################
 
proc ::checkpays::who:co {from keyword text} {
 
if {![string match -nocase "*Client connecting*" $text]} {
return;
}
 
}
 
############
#  BIND  #
############
 
bind raw - NOTICE ::checkpays::who:co
 
bind evnt - prerehash ::checkpays::uninstall

  Reply
#4
Les étapes pour commencer (à mon avis):
1. activer le cap json-log sur le serveur
2. dans la PL, faire un cap req unrealircd.org/json-log
3. se mettre en console +d (debug) et/ou +r (raw) pour voir tout ce qui est bindé et/ou tout ce que voit l'eggdrop
Je pense que c'est bel et bien un bind rawt qu'il faut utiliser, le plus dur est de trouver le bon masque
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#5
Oh super , avec .console +r , maintenant je vois le retour du json en partyline , ça avance ..
  Reply
#6
Après quelques tests, ça semble difficilement exploitable via un eggdrop.
Il faut créer un bind log - * et dans la proc associée, vérifier que le texte contient @unrealircd.org/json-log et CLIENT_CONNECT.
Si oui, il faut traiter le json pour avoir toutes les données et en extraire ce qu'on veut.

La difficulté est surtout que le bind va se déclencher sur quasiment tout ce qui transite sur le serveur, ce qui peut vite devenir gourmand en ressources.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#7
Ce raw ne possède pas de key, je peux éventuellement faire une demande à unrealircd pour voir si il est possible d'ajouter une key sous la même forme que pour une fin de who par exemple :

Quote:[15:47:41] [@] :irc.localhost.fr 315 Eggdrop relaktest :End of /WHO list.


dans le cas du json log, l'idéal serait qu'il nous retourne un truc du style :

Quote:[15:47:41] [@] :irc.localhost.fr XXX @unrealircd.org/json-log={...}

Je ne sais pas si cela est possible, je vais poser la question.
  Reply
#8
Quote:16:19:02 <%Amand> je te laisse me répondre pour me corriger
Habituellement, on me propose plutôt d'utiliser une cravache :)

Le souci est que ce n'est pas bindé par un raw, il n'y a que sur le bind log qu'on peut l'attraper et j'ai de forts doutes sur les masques de filtrages possibles.
Je vais faire des essais mais je ne suis sûr de rien.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#9
Bon on avance, on a réussi à isoler la notice du json log pour la connection de l'utilisateur :


tcl
bind log - "*@unrealircd.org/json-log*CLIENT_CONNECT*" ::checkpays::log:gestion
 
proc ::checkpays::log:gestion {level channel message} {
 
putlog "$message"
 
}


Maintenant il faut traiter le json pour récupérer nos variables.
  Reply
#10
Ca se fait bien :)
Exemple à https://tools.eggdrop.fr/privatebin/?83a...7xAp62Cmwc

Version eggdrop:

tcl
package require json
proc ::checkpays::log:gestion {level channel message} {
   set text [string range $message [string first "json-log" $message]+8 end] 
   set text [string range $text 0 [string first ";msgid" $text]-1]
   set datas [::json::json2dict $text]
   set user [dict get $datas client user]
   foreach key [dict keys $user] {
      putlog "$key is [dict get $user $key]"
   }
}

zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#11
La procédure me retourne une erreur :

Quote:[16:49:34] #Amand# set errorInfo
Currently: unexpected token ""Client\sconnecting:\sAnn-Lyn\s(Yt1h950wz@anancy-653-1-94-147.w86-204.abo.wanadoo.fr)\s[86.204.204.147]\s[vhost:\sE6938F31.82AB1A98.675454A5.IP]\s[class:\sclients]\s[secure:\sTLSv1.3-TLS_CHACHA20_POLY1305_SHA256]\s[country:\sFR]\s[reputation:\s147]\s[security-groups:\sknown-users,webirc-users,tls-and-known-users,tls-users]"" at position 23; expecting STRING
Currently:    while executing
Currently: "unexpected $tokenCursor $token STRING"
Currently:    (procedure "unquoteUnescapeString" line 6)
Currently:    invoked from within
Currently: "unquoteUnescapeString $tc $token"
Currently:    (""" arm line 3)
Currently:    invoked from within
Currently: "switch -exact -- $leadingChar {
Currently:            "\{" {
Currently:                return [parseObject $tokens $nrTokens tokenCursor]
Currently:            }
Currently:            "\[" {..."
Currently:    (procedure "parseValue" line 12)
Currently:    invoked from within
Currently: "parseValue $tokens $nrTokens tokenCursor"
Currently:    (procedure "parseObjectMember" line 20)
Currently:    invoked from within
Currently: "parseObjectMember $tokens $nrTokens tokenCursor objectDict"
Currently:    (procedure "parseObjectMembers" line 6)
Currently:    invoked from within
Currently: "parseObjectMembers $tokens $nrTokens tokenCursor result"
Currently:    (procedure "parseObject" line 15)
Currently:    invoked from within
Currently: "parseObject $tokens $nrTokens tokenCursor"
Currently:    ("{" arm line 2)
Currently:    invoked from within
Currently: "switch -exact -- $leadingChar {
Currently:            "\{" {
Currently:                return [parseObject $tokens $nrTokens tokenCursor]
Currently:            }
Currently:            "\[" {..."
Currently:    (procedure "parseValue" line 12)
Currently:    invoked from within
Currently: "parseValue $tokens $nrTokens tokenCursor"
Currently:    (procedure "::json::json2dict" line 10)
Currently:    invoked from within
Currently: "::json::json2dict $text"
Currently:    (procedure "::checkpays::log:gestion" line 4)
Currently:    invoked from within
Currently: "::checkpays::log:gestion $::_log1 $::_log2 $::_log3"
  Reply
#12
Bon, json est très sensible et n'aime pas les [ et ] même dans une chaîne encapsulée par des guillemets.
La solution (assez moche) est de remplacer ces caractères -lorsque c'est adéquat- par d'autres qui ne bloqueront pas le json2dict.

Voici la procédure, j'explique les transformations après.

tcl
package require json
proc logtest {level channel message} {
   set fo [open json.log a]
   puts $fo "** $message\n"
   set text [string map {\]\\\s\[ %_# \\\s\[ _# \]\\\s %_} $message]
   set text [string map {\\\s _ \"\[ \"# \]\" %\"} $text]
   set text [string range $text [string first "json-log" $message]+9 end] 
   set text [string range $text 0 [string first ";msgid" $text]-1]
   putlog "*** To file"
   puts $fo "--> $text"
   close $fo
   putlog "JSON 1.1: $text"
   set datas [::json::json2dict $text]
   set user [dict get $datas client user]
   foreach key [dict keys $user] {
      putlog "$key is [string map {_ " " # \\\[ % \\\]} [dict get $user $key]]"
   }
}
 
bind log - "*@unrealircd.org/json-log*CLIENT_CONNECT*" logtest


J'ai choisi de remplacer [ par # et ] par %, et les \s par des _
Je transforme d'abord les ensembles ]\s[, \s[ et ]\s, ce qui prend la majorité des [ et ] qui sont dans une chaîne (et pas des éléments utiles du json).
Ensuite, je transforme les caractères restants: les \s seuls, les [ directement précédés d'une guillemet et les ] directement suivis d'une guillemet, ceci permet de nettoyer les cas particuliers d'une chaîne commençant par [ ou finissant par ]

Il ne reste plus qu'à extraire ce qui est réellement la partie intéressante du message, donc ce qui est compris entre json-log= et ;msgid.

Dans le putlog des valeurs, je fais l'opération inverse sur les caractères que j'ai modifiés (sauf les \s)
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#13
Nickel merci ça fonctionne parfaitement !
  Reply
#14
J'ai réalisé un test en mettant dans mon realname 32 F ; dans le json log, le ; était modifié en \: ce qui provoquait une erreur :

Quote:Tcl error [::checkpays::log:gestion]: unexpected token ""30_M_\:"" at position 73; expecting STRING

La réponse du lead de UnrealIRCd :

Quote:Syzop> ah found the bug, it was only over IRC, in json log files on disk it was OK
Syzop> it's in the message tags code apparently. funny.
Syzop> thanks for brining it up :)
Syzop> oh sorry i got confused as well
Syzop> apparently it is not a bug, but is meant to be that way https://ircv3.net/specs/extensions/messa...ing-values so ; becomes \:
Syzop> weird :D
Syzop> but it's on purpose and not a typo, as they say "semicolon" becomes "backslash and colon"
Syzop> (ah i understand why, it is because ; is used for separating message tags, and they thought let's be lazy and avoid that character completely)
Syzop> ;D
Syzop> still weird, but yeah. it's that :)

En clair, c'est un comportement normal de l'ircv3, il change le ; en \:

Pour corriger ce problème, il faut qu'on transforme le \: en ; avec notre variable :


tcl
set text [string map {\]\\\s\[ %_# \\\s\[ _# \]\\\s %_ \\: ;} $message]

  Reply
#15
Correction :

(03/04/2023, 16:52)Amand Wrote: @ZarTek, je pense que tu avais déjà essayé quelque chose de similaire (je ne suis pas sûr si je me trompe).
Oui, je t'avais fait un début de gestion pour "unrealircd.org/json-log" qui récupérait les informations au fur et à mesure que le JSON était transmis par UnrealIRCd. J'ai consommé ces données en les stockant dans un dictionnaire et en les mettant à jour régulièrement. De ce que je me souviens, tu pouvais utiliser la commande [ujson getrealname $user] pour obtenir le nom réel de l'utilisateur. Cette information était disponible car UnrealIRCd incluait cette information dans le JSON lors de la connexion de l'utilisateur.

EDIT:
(03/04/2023, 16:52)Amand Wrote: Bonjour,

UnrealIRCD a une nouvelle fonctionnalité le json log ( https://www.unrealircd.org/docs/JSON_logging ) qui permet de récupérer à la connexion de l'utilisateur (ou autres événements)

C'était il y a plus de 10 mois, car j'ai retrouvé mon dépôt et la date de création remonte à 10 mois : https://github.com/ZarTek-Creole/TCL-UJL

Malheureusement, il semble que je n'ai jamais poussé ma version sur mon dépôt. Je vais faire une recherche dans mes données à l'occasion.
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Demande] API JSON compteur utilisateurs bodtx 11 3,890 30/05/2019, 19:14
Last Post: bodtx
  [Résolu] Commande /plainte pseudo raison gérer par un eggdrop avec un alias Unrealircd Alucard`68 3 4,128 01/02/2017, 03:39
Last Post: Alucard`68

Forum Jump:


Users browsing this thread: 1 Guest(s)