Aller au contenu
Lazer

Quick App - Network Monitor

Recommended Posts

Network Monitor

Version 2.0

 

 

Voici un Quick App pour HC3 permettant de surveiller des équipements sur le réseau (local et Internet), et d'envoyer des notifications en cas de problème détecté.

Cela va bien au-delà du simple ping réseau, car ce QuickApp permet de vérifier le bon fonctionnement des services (envoi d'une requête, vérification de la réponse)

 

Il s'agit de la v2, car il fait suite au Module Virtuel Network Monitor v1.x initialement développé pour HC2.

 

Screenshot peu esthétique, en espérant que Fibaro propose rapidement de personnaliser l'apparence visuelle des QA. Cependant, ce n'est pas son rôle premier, l'objectif est bien de recevoir des notifications instantanées en cas de souci détecté :

 

Screenshot-QA-Network-Monitor.png.0b992da220dab872c83ac2ad21e4e652.png

 

 

Configuration :

 

Après téléchargement et import du QuickApp, modifier la variable QuickApp.config dans la section "User Variables" au début du code LUA.

Exemple :

--
-- User variables
--
QuickApp.config = {

	notifications = {
		email = {                        -- Email notification
			users = {                      -- /api/users
				"Lazer"
			},
			title = "HC3 Network Monitor",
		},
		push = {                         -- Push notification
			mobiles = {                    -- /api/iosDevices
				"Pixel 2 XL",
				"Google Pixel C",
			},
		},
		sms = {                          -- SMS notification
			quickapp = {                   -- /devices?interface=quickApp
				id     = "SMS",
				method = "sendSMS",
			},
		},
		vg = {                           -- Global Variable notification
			names = {                      -- /api/globalVariables/
				"Notification"
			}
		}
	},

	devices = {
		{name = "Serveur SSH"                   , address = "192.168.1.1"  , port =   22, protocol = "tcp"  , timeout =  1, senddata = nil , retdata = "OpenSSH", retry = 1, interval =   30, notification = {"push", "email"       }, vg = nil, conditions = nil},
		{name = "Ubiquiti Unifi AP-AC-Pro"      , address = "192.168.1.2"  , port =   22, protocol = "tcp"  , timeout =  1, senddata = nil , retdata = "SSH"    , retry = 1, interval =   60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Ubiquiti Unifi Switch"         , address = "192.168.1.3"  , port =   22, protocol = "tcp"  , timeout =  1, senddata = nil , retdata = "SSH"    , retry = 1, interval =   60, notification = {"push", "email"       }, vg = nil, conditions = nil},

		{name = "Ubiquiti Unifi Controller"     , address = "192.168.1.4"  , port = 8443, protocol = "https", timeout =  2, url = "/manage/account/login" , retcode = 200, retdata = "UniFi Network"          , retry = 1, interval = 60, notification = {"push", "email",      }, vg = nil, conditions = nil},
		{name = "Ubiquiti EdgeRouter"           , address = "192.168.1.5"  , port =  443, protocol = "https", timeout =  1, url = "/"                     , retcode = 200, retdata = "EdgeRouter"             , retry = 1, interval = 30, notification = {                 "sms"}, vg = nil, conditions = nil},
		{name = "Switch Cisco"                  , address = "192.168.1.6"  , port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "cisco"                  , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Switch Netgear GS105Ev2"       , address = "192.168.1.7"  , port =   80, protocol = "http" , timeout =  1, url = "/login.cgi"            , retcode = 200, retdata = "NETGEAR"                , retry = 1, interval = 60, notification = {"push", "email"       }, vg = nil, conditions = nil},
		{name = "Switch Netgear GS108Tv2"       , address = "192.168.1.8"  , port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "NETGEAR"                , retry = 1, interval = 60, notification = {"push", "email"       }, vg = nil, conditions = nil},
		{name = "HP ProLiant Remote Access Card", address = "192.168.1.9"  , port =   80, protocol = "http" , timeout =  1, url = "/login.html"           , retcode = 200, retdata = "Remote Access Card"     , retry = 1, interval = 60, notification = {        "email"       }, vg = nil, conditions = nil},
		{name = "HP ProLiant Gen8 ILO"          , address = "192.168.1.10" , port =  443, protocol = "https", timeout =  1, url = "/"                     , retcode = 200, retdata = "iLO"                    , retry = 1, interval = 60, notification = {        "email"       }, vg = nil, conditions = nil},
		{name = "VMware ESXi"                   , address = "192.168.1.11" , port =  443, protocol = "https", timeout =  1, url = "/"                     , retcode = 200, retdata = "VMware ESXi"            , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Onduleur Eaton 5P"             , address = "192.168.1.12" , port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "Network Management Card", retry = 1, interval = 60, notification = {"push", "email"       }, vg = nil, conditions = nil},
		{name = "Synology DiskStation"          , address = "192.168.1.13" , port = 5000, protocol = "http" , timeout =  5, url = "/"                     , retcode = 200, retdata = "DiskStation"            , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Serveur Web Apache"            , address = "192.168.1.14" , port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "Apache"                 , retry = 1, interval = 60, notification = {        "email"       }, vg = nil, conditions = nil},
		{name = "GCE Eco-Devices"               , address = "192.168.1.15" , port =   80, protocol = "http" , timeout =  1, url = "/index1.htm"           , retcode = 200, retdata = "Eco Devices"            , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "GCE IPX800 v4"                 , address = "192.168.1.16" , port =   80, protocol = "http" , timeout =  1, url = "/user/index2.htm"      , retcode = 200, retdata = "IPX800"                 , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Caméra Hikvision"              , address = "192.168.1.17" , port =   80, protocol = "http" , timeout =  1, url = "/doc/page/login.asp"   , retcode = 200, retdata = "login"                  , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "Caméra Foscam"                 , address = "192.168.1.18" , port =   88, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "IPCam Client"           , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil,
																							conditions = {	vg = "Vacances" , operator = "==", value = "0"},
																						},
		{name = "JPI SMS Gateway"               , address = "192.168.1.19" , port = 8080, protocol = "http" , timeout = 10, url = "/JPI/"                 , retcode = 200, retdata = "JPI"                    , retry = 6, interval = 30, notification = {"push", "email"       }, vg = nil,
																							conditions = {	vg = "Monitor_JPI" , operator = "==", value = "0"},
																						},
		{name = "FHEM"                          , address = "192.168.1.20" , port = 8083, protocol = "http" , timeout =  1, url = "/fhem"                 , retcode = 401, retdata = ""                       , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil},
		{name = "HA Bridge"                     , address = "192.168.1.21" , port =   80, protocol = "http" , timeout =  1, url = "/#!/"                  , retcode = 200, retdata = "HA Bridge"              , retry = 1, interval = 60, notification = {"push", "email"       }, vg = nil, conditions = nil},
		{name = "Google"                        , address = "www.google.fr", port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 200, retdata = "Recherche Google"       , retry = 1, interval =  1, notification = {                 "sms"}, vg = nil, conditions = nil},
		{name = "Yamaha MusicCast"              , address = "192.168.1.22" , port =   80, protocol = "http" , timeout =  1, url = "/YamahaExtendedControl", retcode = 200, retdata = "response_code"          , retry = 1, interval = 60, notification = {        "email"       }, vg = nil, conditions = nil},
		{name = "Projecteur Epson EH-TW9300"    , address = "192.168.1.23" , port =   80, protocol = "http" , timeout =  1, url = "/"                     , retcode = 404, retdata = "Not Found"              , retry = 1, interval = 60, notification = {        "email"       }, vg = nil,
																							conditions = {	vg = "Vacances" , operator = "==", value = "1"},
																						},
		{name = "Nvidia Shield TV"              , address = "192.168.1.24" , port = 8008, protocol = "http" , timeout =  1, url = "/"                     , retcode = 404, retdata = ""                       , retry = 1, interval = 60, notification = {        "email"       }, vg = nil,
																							conditions = {	operator = "any", conditions = {
																									{	vg = "Vacances" , operator = "==", value = "1"},
																									{	operator = "all", conditions = {
																											{	vg = "Saison", operator = "==", value = "Eté"},
																											{	operator = "any", conditions = {
																													{	vg = "Nuit"     , operator = "==", value = "1"},
																													{	vg = "Absence"  , operator = "==", value = "1"}
																												}
																											}
																										}
																									}
																								}
																							}
																						},
	},

}

Cela risque d'être peu lisible sur votre écran, dans ce cas il faut utiliser l'ascenseur horizontal pour faire défiler, ou alors insérer des sauts de lignes)

Cependant j'aime bien cette présentation qui se rapproche d'un tableau et est parfaitement lisible sur un grand écran.

 

Ce QuickApp est relativement complexe à paramétrer, car les options sont nombreuses :

 

  • notifications
    • email :
      • users : integer | string : liste séparée par des virgules des utilisateurs à qui envoyer un email. Il faut renseigner soit l'ID de l'utilisateur, soit son nom, informations accessibles via /api/users
    • push :
      • mobiles : integer | string : liste séparée par des virgules des mobiles à qui envoyer une notification Push. Il faut renseigner soit l'ID du mobile, soit son nom, informations accessibles via /api/iosDevices
    • sms :
      • quickapp : QuickApp qui sera appelé pour éxecuter un code LUA externe, par exemple envoyer un SMS, ou un mesage via Telegram, ou autre service de notification.
        • id : integer | string : ID ou nom du QuickApp, informations accessibles via /api/devices?interface=quickApp
        • method : string : nom de la fonction à appeler dans le QuickApp
    • vg :
      • names : string : liste séparée par des virgules des variables globales qui contiendront le message de notification, informations accessibles via /api/globalVariables

 

  • devices
    • name : obligatoire : string : Nom de l'équipement qui apparaitra dans la notification
    • address : obligatoire : string : Adresse IP ou nom DNS de l'équipement à monitorer
    • port : facultatif si protocole http/https | obligatoire si protocole tcp : Port TCP. Dans le cas des connexions HTTP et HTTPS, si ce n'est pas spécifié, le port par défaut sera utilisé (80 pour HTTP, et 443 pour HTTPS)
    • protocol : obligatoire : string : "http" | "https" | "tcp" : ces 3 protocoles sont supportés. Le mode tcp est un mode raw, c'est à dire que les données sont lues/écrites telles quelles sur la socket.
    • timeout : facultatif : integer : Valeur par défaut = 1 seconde : Durée autorisée de la connexion en secondes avant réponse du client. Doit être augmenté si le client met trop de temps à répondre.
    • url : obligatoire si protocole http/https | inutile si protocole tcp : string : URL de la page Web à charger
    • retcode : obligatoire si protocole http/https | inutile si protocole tcp : integer : code de retour HTTP attendu (200 la plupart du temps)
    • senddata : inutile si protocole http/https | facultatif si protocole tcp : string : chaine de caractère à envoyer lors de l'établissement de la connexion TCP. Cela peut être nécessaire pour certains équipements qui n'envoient pas de réponse avant d'avoir reçu une instruction.
    • retdata : facultatif : string : chaine de caractère recherchée dans la réponse
    • retry : facultatif : integer : valeur par défaut = 1 : nombre de tentatives de connexion à effectuer. Augmenter cette valeur peut être utile pour certains équipements dont la connexion est instable, notamment via Wi-Fi.
    • interval : facultatif : integer : valeur par défaut = 1 minute : intervalle en minutes entre 2 vérifications. J'ai testé jusqu'à 1440 minutes, soit 24 heures.
    • notification : obligatoire : table : "push" | "email" | "sms" | "vg" | "service" : type de notification à envoyer, configurée préalablement.
    • vg : facultatif : string : nom facultatif d'une variable globale à incrémenter, celle-ci sera automatiquement créée si nécessaire. Elle est remise à 0 dès que l'appareil surveillé est de nouveau disponible.
    • conditions : facultatif : table : permet d'annuler le monitoring d'un équipement particulier en fonction de conditions sur des variables globales. Les conditions sont combinables avec des instructions booléennes "any" (= or) et "all" (= and). La syntaxe est inspirée du moteur de triggers des scènes sur HC3.

 

Téléchargement :

 

 

  • Like 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Et un QA de moins à faire la liste diminue doucement
Comme le passage sur hc3 n'est pas pour demain je pense que l'on aura juste à faire la migration des devices zwave le jour où on fera la migration

Envoyé de mon BLA-L29 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

@lazer

J'ai essayé ton quickapp car j'utilisais la version Hc2, et c'est aussi un exemple pour apprendre les QA

Il fonctionne parfaitement sauf que dans la version HC2 on avait la possibilité de mettre le user/passwd pour certain device 

Dans mon cas cela me gène pour le test d'anciennes caméra dlink et pour un serveur.

Pour le moment j'ai mis 401 comme code retour ( Unauthorized ) qu'en penses tu ?

Partager ce message


Lien à poster
Partager sur d’autres sites

L'utilisateur et le mot de passe ?
Euh... J'ai pas souvenir de ça... tu es certain que tu n'utilisais pas une version que tu avais customisé ?

 

Cela dit, l'idée n'est pas bête, je l'ajouterai dans une prochaine version :)


En attendant, oui tu peux tester le code de retour... 401 est le code qu'on reçoit le plus souvent quand le login est incorrect/manquant. C'est ce que j'utilise en tout cas chez moi.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok  tu as raison ( évidement)

je tourne sur la version 1.10 de Novembre 2015 et j'ai modifié 

 -- ["Service Name"]         = { IP Address   ,  Port, Protocol, Data to send,     Expected Rc,     Expected data,             Retry,    {Notification methods},  user,      pwd    },

 

Comme j'ai démarré en Novembre 2015 avec la HC2  j'ai du me sentir un peu novice pour proposer une modification mais j'ai ajouté dans l'en-tête 

--------------------------------------------------
-- Sur le travail de :
-- Module  : Network Monitor
-- Author  : Lazer with contribution of JM13
-- Version : 1.10
-- Date    : November 2015
--------------------------------------------------

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

Superbe outils, et compliqué pour un vieux :) 

 

J'ai beaucoup d'alerte sur Google, ça me dit que je n'ai pas de connexion mais j'en ai vraiment une.

Du coup pas mal de notifs en ce sens alors que je suis sur The Internet :D 

 

Je ne sais pas trop quoi faire...

Pareil sur les 2 NAS, j'en ai un chez qui tout va bien et l'autre de notifs.

Je ne comprends pas toutes les commandes aussi :D 

{name = "Google", address = "www.google.fr", port = 80, protocol = "http", timeout = 1, url = "/", retcode = 200, retdata = "Recherche Google", retry = 1, interval = 1, notification = {"push","email"}, vg = nil, conditions = nil},

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est ta connexion Internet qui est trop lente ou instable, ça m'a fait le coup quand je suis passé d'Orange à Free (et là tu comprends la différence de prix....)

 

Il faut que tu augmentes le timeout et le nombre de retry, par exemple pour Google tu mets :

- timeout = 10

- retry = 10

Et là tu seras tranquille, si Networrk Monitor t'avertit que Google est injoignable, c'est que tu as une vraie panne Internet depuis 10*10 = 100 secondes

 

Idem pour ton second NAS, s'il est trop vieux / trop lent, il faut augmenter les valeurs pour rendre Network Monitor moins sensible.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

humm tu veux dire que mon ping de 1ms et mes 898 mb/s c'est de la daube ? :lol:

Pour le nas j'ai trouvé la panne, lol j'avais oublié qu'il était éteint de 00h00 à 4h30 mouarf !

 

Bon, je vais essayer les réglages que tu me conseil.

 

EDIT : je pense qu'il y a de l'instabilité, 3 pannes déjà dans tous le quartier. Maintenant la fibre tient le coup mais certainement avec des instabilités en effet !

C'est la nuit, rien dans la journée.

Modifié par Domodial

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi aussi chez Free j'ai un bon ping et de bons débits, comme chez Orange, mais ça c'est en apparence.

Ou plus précisément en situation de benchmark, sur un serveur Speedtest qui a été sélectionné car étant proche de chez toi, sur le même réseau (le réseau de Free)

 

En pratique, session de surf, j'ai régulièrement des latences, notamment quand je consulte un nouveau site.

Cela peut avoir plusieurs origines, des serveurs DNS qui sont lents à aller chercher l'adresse, des routeurs qui sont lents à calculer une nouvelle route, de mauvais accords de peering avec les réseaux des autres opérateurs. Et sur ce dernier points, Free est connu pour être très mauvais.... les problèmes avec Youtube par exemple, n'ont jamais été résolu. Même si en général ça fonctionne bien, il arrive régulièrement que je n'arrive pas à charger une vidéo, surtout aux heures de pointes, genre début de soirée. Et 1 heure après, comme par hasard, ça marche, chargement instantané même en 2160p.

Chez Orange, je n'avais aucun de ces problèmes, mais l'abonnement était 2 fois plus cher... alors forcément, le réseau derrière n'est pas le même.

 

Bref, Network Monitor a été conçu, avec tous ses paramètres, pour être adaptés à chaque cas d'usage.

En ce qui concerne un serveur éteint la nuit, ou pendant les vacances, tu peux aussi utiliser les conditions dans le dernier champ pour exclure temporairement un appareil du monitoring grâce aux variables globales. J'ai donné des exemples dans le tuto.

Partager ce message


Lien à poster
Partager sur d’autres sites

×