Identification connexion entrante

Posez ici vos questions d'utilisation, de configuration de DomoticZ, de bugs, de conseils sur le logiciel lui même dans son utilisation et son paramétrage.
Des forums spécifiques sont ouverts ci-dessous pour regrouper les différents sujets.
pmachat
Messages : 84
Inscription : 13 oct. 2017, 13:37

Identification connexion entrante

Message 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
Domoticz + Rflink + Xiaomi Gateway +Zigbee2Mqtt + Wemos + Dahua+ Alhau + Monitor:
- gestion vmc / hygrométrie
- pilotage ampli Denon Ceol
- surveillance piscine
- commande thermostat chauffage central
- gestion portail + garage automatique
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Identification connexion entrante

Message par vil1driver »

Salut,

A adapter
Lecture logs et action conditionnée

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

Sinon il existe fail2ban
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Identification connexion entrante

Message 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.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: Identification connexion entrante

Message 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
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
pmachat
Messages : 84
Inscription : 13 oct. 2017, 13:37

Re: Identification connexion entrante

Message 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
Domoticz + Rflink + Xiaomi Gateway +Zigbee2Mqtt + Wemos + Dahua+ Alhau + Monitor:
- gestion vmc / hygrométrie
- pilotage ampli Denon Ceol
- surveillance piscine
- commande thermostat chauffage central
- gestion portail + garage automatique
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Identification connexion entrante

Message 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.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
pmachat
Messages : 84
Inscription : 13 oct. 2017, 13:37

Re: Identification connexion entrante

Message 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
Domoticz + Rflink + Xiaomi Gateway +Zigbee2Mqtt + Wemos + Dahua+ Alhau + Monitor:
- gestion vmc / hygrométrie
- pilotage ampli Denon Ceol
- surveillance piscine
- commande thermostat chauffage central
- gestion portail + garage automatique
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Identification connexion entrante

Message 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
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Répondre