Page 1 sur 1

Identification connexion entrante

Publié : 25 mai 2020, 20:04
par pmachat
Bonjour

J'aimerai avoir une alerte (par mail, pushbullet ou autre) quand il y a une connexion sur min Domoticz avec l'adresse IP de la machine qui se connecte
Pour cela, est-il possible de récupérer l'information dans le fichier log des "Incoming connexion" ?
Sinon avez-vous une autre idée ?

D'avance merci

Re: Identification connexion entrante

Publié : 25 mai 2020, 20:35
par vil1driver
Salut,

A adapter
Lecture logs et action conditionnée

https://easydomoticz.com/forum/viewtopi ... 186#p33186

Sinon il existe fail2ban

Re: Identification connexion entrante

Publié : 26 mai 2020, 18:32
par denis_brasseur
vil1driver a écrit : 25 mai 2020, 20:35 Salut,

A adapter
Lecture logs et action conditionnée

https://easydomoticz.com/forum/viewtopi ... 186#p33186

Sinon il existe fail2ban
J'avais récupéré cette fonction dans mes fonctions, jamais utilisé parce que je ne voyais pas comment l'utiliser.

Pas mal, cela me sert déjà...
J'apprend encore des grands, c'est rassurant.

Re: Identification connexion entrante

Publié : 26 mai 2020, 18:59
par Chrominator
vil1driver a écrit : 25 mai 2020, 20:35 ...
Sinon il existe fail2ban
Pour fail2ban c'est par là : https://www.domoticz.com/wiki/Setup_fail2ban

Re: Identification connexion entrante

Publié : 07 juin 2020, 19:54
par pmachat
Bonjour
Merci pour ces infos.
j'ai testé la solution avec le script que j'ai dû adapté un peu en tenant compte de l' évolution de la fonction
/json.htm?type=command&param=getlog&lastlogtime=LASTLOGTIME&loglevel=LOGLEVEL
comme précisé ici
https://easydomoticz.com/forum/viewtopi ... 3&start=10

Il me fallait utiliser le niveau 2 pour LOGLEVEL pour retrouver mon message :)
Par contre, je n'ai pas réussi à utiliser LASTLOGTIME
Je pensais qu'en indiquant lastlogtime=300, j'aurais uniquement les logs des 5 dernières minutes, mais cela ne marche pas.
Je récupère toujours les 100 dernières lignes de log :(
Je voudrais lancer périodiquement le script et traiter uniquement les nouveaux logs pendant cette période .

pouvez-vous m'aider ?

Merci

Re: Identification connexion entrante

Publié : 08 juin 2020, 04:56
par denis_brasseur
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&param=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.

Re: Identification connexion entrante

Publié : 09 juin 2020, 21:51
par pmachat
Bonjour

Parfait !
Je me suis inspiré de tes scripts.
J'ai en fait utilisé aussi l'information LastlogTime = XXXXX retournée par un premier appel de la fonction GetLog pour faire un second appel avec cette valeur comme paramètre /json.htm?type=command&param=getlog&lastlogtime=XXXXX&loglevel=268435455

Cela me permet de récupérer que les derniers logs
Donc pas besoin de rechercher par un boucle sur l'heure du message :D

Merci pour votre aide

Re: Identification connexion entrante

Publié : 10 juin 2020, 05:47
par denis_brasseur
Effectivement, mais l'utilisation de lastlogtime avec sa dernière valeur ne retourne que le dernier log.
Il est possible tout simplement, en soustrayant 60 à os.time() et de passer cette valeur à lastlogtime d'avoir les logs de la dernière minute, ou des 5 dernières minutes en soustrayant 300.

Code : Tout sélectionner

LastLogTime = os.time() - 60
for n, line in ipairs(lastLogEntry('&lastlogtime='..LastLogTime..'&loglevel=268435455')) do
	
end