Voici la méthode que j'utilise afin de lire les logs et mener les actions nécessaires à mon besoin :
J'ai modifier la fonction lastLogEntry afin de lui passer le paramètre loglevel.
Dans un script de type time, toutes les 5 minutes, je boucle sur les logs.
Je recherche ensuite les valeurs "Incoming connection from" et "Failed authentication attempt".
"Incoming connection from" correspond à une connexion acceptée, "Failed authentication attempt" une connexion refusée.
"Incoming connection from" est visible dans l'onglet Statut (loglevel=2) et "Failed authentication attempt" dans l'onglet Erreur (loglevel=4).
Afin de pouvoir récupérer ces 2 valeurs, j'utilise loglevel=268435455.
Mon script s’exécutant toutes les 5 mn, je teste l'horodatage des messges dans les logs afin de n'exploiter que ceux datant de moins de 300 (5 mn).
Un extrait de mon script
La fonction lastLogEntry modifiée :
Code : Tout sélectionner
-- retourne la table des derniers log (première ligne = dernier log)
function lastLogEntry(loglevel)
local rid = assert(io.popen(curl..'-u '..domoticzUSER..':'..domoticzPSWD..' "'..domoticzURL..'/json.htm? type=command¶m=getlog'..loglevel..'"'))
local list = rid:read('*all')
rid:close()
local tableau = json:decode(list).result
return ReverseTable(tableau)
end
La méthode pour boucler sur les logs envoie la valeur loglevel, 268435455 pour avoir Statut et Erreur, 2 pour Statut et 4 pour Erreur uniquement :
Code : Tout sélectionner
for n, line in ipairs(lastLogEntry('&loglevel=268435455')) do
end
Récupération de l'horodatage des logs, et le calcul permettant de déterminer le nombre de seconde d'ancienneté de la ligne en le comparant à l'heure courante :
Code : Tout sélectionner
heure_log = string.sub(line['message'], 1, 19)
y, m, d, H, M, S = heure_log:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
La boucle complete :
Code : Tout sélectionner
for n, line in ipairs(lastLogEntry('&loglevel=268435455')) do
if line['message'] ~= '' then --pour eviter un message d'erreur si logs vides
heure_log = string.sub(line['message'], 1, 19) --2020-05-29 06:13:19
y, m, d, H, M, S = heure_log:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
if difference <= 300 then
--2020-05-29 06:13:19.672 Status: Incoming connection from: 192.168.1.117
if string.match(line['message'], "Incoming connection from") then
print('Incoming connection '..heure_log..' il y a '..difference..' s')
--action à mener dans le script
--2020-05-29 15:44:29.440 Error: [web:8060] Failed authentication attempt, ignoring client request (remote address: xx.xxx.xxx.xxx)
elseif string.match(line['message'], "Failed authentication attempt") then
print('Failed authentication attempt '..heure_log..' il y a '..difference..' s')
--action à mener dans le script
end
else
break
end
end
end
La commande break permet de sortir de la boucle dés que l'horodatage des événements est supérieur à 300 s (5 mn), si plusieurs événements dans la boucle correspondent aux conditions, ils seront tous exploités.