jjacques68 Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Hello ! Est ce quelqu'un s'est déjàamusé àécrire un script pour activer/désactiver le wifi sur des points d'accès ? J'ai 3 access point de chez netgear WN203 POE. Je souhaiterai éteindre le wifi par programmation. J'ai fouillé partout sur les forum netgear mais rien. Dans la notice, y a la liste des commande CLI, mais je ne sais absolument pas quoi en faire, surtout que visiblement elles doivent être passées par une console telnet. J'imaginais trouver des commandes du style http://admin:pass@ip:port/command... Mais non. Si quelqu'un a une piste ??!! Ce serait super !
pepite Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Salut, Tes points d'accès sont sur un switch PoE ou tu utilises un injecteur ? si injetcuer, le plus simple, un petit WP ;-)
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Ils sont sur un switch POE. De chez netgear aussi.
Lazer Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Dans le monde du réseau, il n'y a jamais d'API http Rest. C'est traditionnellement en ligne de commande telnet/SSH. Déjà , estime toi heureux d'avoir du telnet sur des produits grand publics comme Netgear, perso mon switch Netgear n'a pas de CLI, il a uniquement une interface Web. Donc il te reste à écrire une classe en LUA pour faire du telnet vers un équipement réseau... exercice intéressant
pepite Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Malheureusement, comme dit @LAzer, tu es parti pour un peu de code en LUA. On en avait déjà paré avec @Lazer pour nos onduleurs Eaton, mais il y a un peu de boulot. Et faut avoir le niveau des experts en LUA ce qui est loin d'etre mon cas, mais n'hesite pas à partager ;-)
kiwi Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Ou dans le monde réseau il y a aussi snmp write. Très pratique dans ce cas particulier.
Lazer Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 D'ailleurs faudrait que je partage ma classe SNMP écrite en LUA pour la HC2, ça pourrait être utile. Et c'était autrement difficile àécrire qu'une classe LUA pour du simple Telnet.... car en telnet on envoie et reçoit le texte tel quel, il n'y a pas plus simple comme protocole. Tandis que le SNMP il faut se farcir l'encodage en hexa des paquets àla main....
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Mouai ok... Euuuh Ok 😠En français ça donne quoi ? 😬 Ben la il le faut des pistes de travail alors. Parce que tout c'est totalement inconnu pour moi. Mais ca m'intéresse avec plaisir !
pepite Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 @kiwi, tu t'en sers comment avant que j'aille fair eun tour sur google lol
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 j'ai fait quelques recherches de mon côté sur le net, sur les vos propositions, et ... ... suis largué total.
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 hum je crois qu'avec toute la liste de commande Telnet de mes access point, AUCUNE ne permet de désactiver le wifi !!! je peux presque tout faire sauf ça !!!!!!!!!!!
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 alors si en fait ça marche très bien ! j'ai trouver toutes les commandes Telnet. Par contre faudrait trouver un moyen de les envoyer depuis HC2...
pepite Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 essaie sur le net : telnet lua
Lazer Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 Si tu as les commandes, dans les grandes lignes c'est facile depuis la HC2, car le telnet a l'avantage d'être un protocole en texte clair : ce que tu vois à l'écran, c'est ce qui est envoyé littéralement dans la trame TCP. Dans les grandes lignes, il faut que tu utilises les fonctions : Net.FTcpSocket() tcpSocket:setReadTimeout tcpSocket:write() tcpSocket:read() tcpSocket:disconnect() Il y a plusieurs exemples de cette fonction sur le forum (mon Network Monitor, certains modules de Krikroff (Sonos, Freebox, etc...)) Pour la logique, dans les grandes lignes : - lire le prompt - écrire le login - lire la demande de password - écrire le password - attendre le prompt - écrire la commande que tu as identifié pour activer et désactiver la Wifi - se déconnecter 1
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Oui j'ai vu ces tutos, Le soucis est que je ne peux pas l'activer/désactiver en une seule commande. Il faut dans l'ordre que je connais : Se connecter avec Login et pass Entrer dans la "section" configuration Activer/désactiver le wifi Revenir dans la section précédente Exécuter une commande pour enregistrer (save-and-activate) Fermer la session Il faudrait enchaîner ces opérations plus les tiennes... Read et prompt... Que je découvre...
Lazer Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 ah ce n'est pas du CLI, ce sont des menus..... ils sont nuls chez Netgear Bon c'est pas grave, le principe est le même, il suffit d'enchainer les séquence de menu et tu arriveras au résultat voulu
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Oui c'est comme des menus, j'ai galèré àcomprendre comment ça marchait... Mais je pense avoir de bonnes pistes de départ. Y a cette histoire de réponse qui le derange encore mais je vai voir... Pas ce soir car par chez moi... Je tiens au jus sur l'avancement... Merci tous !
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 bon je viens de rentrer, et première essai qui bien sur ne marche pas et j'ai aucune erreur retournée... : local deviceIp = "192.168.xxx.xxx" local devicePort = 23 --ouvre la connexion tcpSocket = Net.FTcpSocket(deviceIp, devicePort) --set the read timeout tcpSocket:setReadTimeout(2000) bytes, errorCode = tcpSocket:write("admin".."\n") --login fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok1") else fibaro:debug("error1") end bytes, errorCode = tcpSocket:write("xxxxxx".."\n") --pass fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok2") else fibaro:debug("error2") end bytes, errorCode = tcpSocket:write("configure terminal".."\n") --menu configure fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok3") else fibaro:debug("error3") end bytes, errorCode = tcpSocket:write("radio 2.4 off".."\n") --coupe le wifi fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok4") else fibaro:debug("error4") end bytes, errorCode = tcpSocket:write("exit".."\n") --retour en arrière dans le menu fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok5") else fibaro:debug("error5") end bytes, errorCode = tcpSocket:write("save-and-activate".."\n") --enregistre les modifs fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok6") else fibaro:debug("error6") end le debug affiche tous les ok de 1 à 6... bon en même temps ça aurait été trop simple... mais fallait que j'essaye mais j'ai aucun moyen de savoir si la connexion se passe bien et si les commandes sont bien envoyées !! le log de l'access point reste vierge (même si je fait un telnet depuis windows d’ailleurs...)
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 OOOHHHHHH PUNAISE !!!! siiiiii !!!!! ça marche !!!!!! (je m’étais trompé dans la commande d'activation/desactivation du wifi ) et j'ai un aperçu dans le debug !! local deviceIp = "192.168.xxx.xxx" local devicePort = 23 --ouvre la connexion tcpSocket = Net.FTcpSocket(deviceIp, devicePort) --set the read timeout tcpSocket:setReadTimeout(2000) bytes, errorCode = tcpSocket:write("admin".."\n") --login fibaro:sleep(1000) if errorCode == 0 then local result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error1") end bytes, errorCode = tcpSocket:write("xxxxxxx".."\n") --pass fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error2") end bytes, errorCode = tcpSocket:write("configure terminal".."\n") --menu configuration fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error3") end bytes, errorCode = tcpSocket:write("radio 2.4 disable".."\n") --coupe le wifi fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error4") end bytes, errorCode = tcpSocket:write("exit".."\n") --retour menu fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error5") end bytes, errorCode = tcpSocket:write("save-and-activate".."\n") --save modif fibaro:sleep(3000) --doit être plus long ????????? if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error6") end --tcpSocket:disconnect() --si je laisse ça marche pas !!! j'ai du mal avec cette ligne : --set the read timeout tcpSocket:setReadTimeout(2000) combien de temps faut-il laisser entre chaque envoi de commande ? merci pour votre aide ! 1
pepite Posté(e) le 18 octobre 2016 Signaler Posté(e) le 18 octobre 2016 Felicitations, bien bossé !! tu ne fermes pas ta connexion TCP ? Ca te cree une erreur ?
jjacques68 Posté(e) le 18 octobre 2016 Auteur Signaler Posté(e) le 18 octobre 2016 merci, mais je me suis inspirer de quelque tuto bien sur... fermer la connexion TCP me créait une erreur... mais je pense qu'il faut que je mette un sleep avant pour pas fermer trop tôt. c'est pas très clair ces histoires de sleep et de setReadTimeOut. Si j'enchaine trop vite les commandes, j'ai l'impression qu'elles passent pas. doit certainement y avoir une logique, un truc du genre attendre la réponse précédente pour envoyer une nouvelle commande... ??? !!!
Lazer Posté(e) le 18 octobre 2016 Signaler Posté(e) le 18 octobre 2016 Bravo Si tu faisais des read(), tu pourrais attendre d'avoir le retour de ton équipement, et éviter de balancer les write() en aveugle. Donc ça te permettrai aussi de te déconnecter proprement à la fin. Parce que tel quel, même si ça fonctionne, c'est super crade. Et si tu rajoutes des sleep(), tu ne vas faire qu’expirer la "mocheté" du code Ne te prends pas la tête sur le setreadtimout(), laisse la valeur telle quelle ça devrait suffire (sauf si ton équipement est trop long à répondre, auquel cas il faut allonger le timeout)
jjacques68 Posté(e) le 18 octobre 2016 Auteur Signaler Posté(e) le 18 octobre 2016 dans la deuxième version j'ai fait des read() et afficher le resultat dans le debug, mais alors du coup ça veut dire que je peux enlever mes sleep() ? peux pas tester pour le moment...
Lazer Posté(e) le 18 octobre 2016 Signaler Posté(e) le 18 octobre 2016 ah désolé, j'avais pas fait attention à la 2nde version. En effet il y a bien les read(), mais ce qu'il manque c'est un string.match() pour vérifier que tu as bien la réponse attendue avant d'envoyer le write() suivant. Bref, faut que ton programme se comporte exactement de la même façon qu'un humain, qui attend d'avoir le prompt avant de donner une nouvelle instruction. Ca me tenterai bien d'écrire une classe LUA pour faire toute cela proprement (et surtout de façon générique, afin de faire du telnet sur n'importe quel équipement), mais je manque un peu de temps....
jjacques68 Posté(e) le 18 octobre 2016 Auteur Signaler Posté(e) le 18 octobre 2016 string.match() permet de faire une recherche de chaine dans une chaine ? c'est bien ça ? et le prompt c'est le nom du périphérique (en Telnet) suivi de ":", si je me trompe pas ! donc si je comprends bien, - je fais un read() dans une variable, - je fais un string.match(variable, prompt:) - si je trouve, c'est que la commande est terminée - je peux donc passer à la suivante. mais si la commande se passe mal, ou mauvaise valeur saisie, j'ai quand même le prompt qui revient. et les autres commandes ne passeront pas. Il faudrait alors analyser chaque réponse en détail, pas que attendre le prompt ! Et les réponses sont jamais identiques d'une commande à l'autre !
Messages recommandés