pepite Posté(e) le 9 avril 2017 Signaler Posté(e) le 9 avril 2017 T as mis un end?:-)Envoyé de mon Nexus 5X en utilisant Tapatalk
lamparo Posté(e) le 9 avril 2017 Signaler Posté(e) le 9 avril 2017 Salut Pepite, j'ai rien trouvé sur Google, je suis allé poser la question sur le site de labomatik, je verrai bien si j'arrive à me dépatouiller. j'ai mis des débug pour voir ou il va, il ne rentre pas dans la boucle: if (xmlTable.QDocRoot ~= nil) then qsidstr = xmlTable.QDocRoot.authSid:value() Je ne comprends pas cette fonction, alors je bloque grave.
lamparo Posté(e) le 11 avril 2017 Signaler Posté(e) le 11 avril 2017 (modifié) Bonsoir à vous, je suis toujours sur ma tentative d'arret de mon QNAP par un VD. J'ai mis des debug pour voir un peu ou va le programme. Lorsque je fais un débogue, je lis le 1 et le 7. ça saute donc dès le if (xmlTable.QDocRoot ~= nil) then . Je ne comprends pas bien ce code un peu abscons. Qu'est ce qui empêche de satisfaire la condition? Si un cador peu me dépanner, que je me couche, ou meurs moins bête JP Modifié le 5 mai 2017 par lamparo
nigao Posté(e) le 6 mai 2017 Signaler Posté(e) le 6 mai 2017 Idem que lamparo, impossible d'arrêter le QNAP, il n'entre pas dans la boucle non plus... Je suis preneur de toute informations ^^ Ps : sinon existe-il en LUA une façon d'executer des commande shell ? j'ai trouvé sur le net os.execute() mais ça n'a pas l'air de fonctionner sur fibaro
lamparo Posté(e) le 8 mai 2017 Signaler Posté(e) le 8 mai 2017 J'ai réussi en supprimant les variables du début du code et entrant directement l'adresse IP et le port. Recopie dans ton VD le code ci-dessous (en renseignant ton IP, port, login et password, ça devrait fonctionner. if (not QNAP) then QNAP = {} QNAP.globalvariable = "" -- -------------------------------------------------------------------------------------------------------------- -- Obtient le XML et le retourne sous forme de table LUA -- -------------------------------------------------------------------------------------------------------------- QNAP.getTokenFromXml = function() --local QNAP2URL = Net.FHttp(ip,port); local QNAP2URL = Net.FHttp("xxx.xxx.x.x", xxxx); response = QNAP2URL:GET("/cgi-bin/authLogin.cgi?user=login&plain_pwd=password&remme=1"); xmlTable = QNAP.iif(response ~= nil, QNAP.newParser().ParseXmlText(response), ""); if (xmlTable.QDocRoot ~= nil) then qsidstr = xmlTable.QDocRoot.authSid:value(); if (string.len(qsidstr)>0) then fibaro:debug("Qtoken founded"); qsidstr = qsidstr:gsub("[".."<![CDATA[".."]", ''); qsidstr = qsidstr:gsub("[".."]".."]", ''); qsidstr = qsidstr:gsub("["..">".."]", ''); fibaro:debug(qsidstr); response = QNAP2URL:GET("/cgi-bin/sys/sysRequest.cgi?subfunc=power_mgmt&count=0.1234&sid="..qsidstr.."&apply=shutdown"); if (string.find(response, "OK")) then fibaro:log("Power Off Server") else fibaro:log("ERROR") end end end end -- ------------------------------------------------------------------------------------------------------------- -- Teste la condition et retourne la valeur true ou false -- ------------------------------------------------------------------------------------------------------------- QNAP.iif = function(condition, iftrue, iffalse) if (condition) then return iftrue end return iffalse end -- ------------------------------------------------------------------------------------------------------------- -- Ceci est une version modifiée par Steven de Corona-XML-Module par Jonathan Beebe qui a son tour -- est basée sur Alexander Makeev's Lua-only XML parser . -- see https://github.com/Cluain/Lua-Simple-XML-Parser -- ------------------------------------------------------------------------------------------------------------- QNAP.newParser = function() parseXml = {} parseXml.FromXmlString = function(value) value = string.gsub(value, "([%x]+)%;", function(h) return string.char(tonumber(h, 16)) end); value = string.gsub(value, "([0-9]+)%;", function(h) return string.char(tonumber(h, 10)) end); value = string.gsub(value, "'", "'"); value = string.gsub(value, ">", ">"); value = string.gsub(value, "<", "<"); value = string.gsub(value, "&", "&"); return value; end parseXml.ParseArgs = function(node, s) string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a) node:addProperty(w, parseXml.FromXmlString(a)) end) end parseXml.ParseXmlText = function(xmlText) local stack = {} local top = parseXml.newNode() table.insert(stack, top) local ni, c, label, xarg, empty local i, j = 1, 1 while true do ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i) if not ni then break end local text = string.sub(xmlText, i, ni - 1); if not string.find(text, "^%s*$") then local lVal = (top:value() or "") .. parseXml.FromXmlString(text) stack[#stack]:setValue(lVal) end if empty == "/" then -- empty element tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) top:addChild(lNode) elseif c == "" then -- start tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) table.insert(stack, lNode) top = lNode else -- end tag local toclose = table.remove(stack) -- remove top top = stack[#stack] if #stack < 1 then error("XmlParser: nothing to close with " .. label) end if toclose:name() ~= label then error("XmlParser: trying to close " .. toclose.name .. " with " .. label) end top:addChild(toclose) end i = j + 1 end local text = string.sub(xmlText, i); if #stack > 1 then error("XmlParser: unclosed " .. stack[#stack]:name()) end return top end parseXml.newNode = function(name) local node = {} node.___value = nil node.___name = name node.___children = {} node.___props = {} function node:value() return self.___value end function node:setValue(val) self.___value = val end function node:name() return self.___name end function node:setName(name) self.___name = name end function node:children() return self.___children end function node:numChildren() return #self.___children end function node:addChild(child) if self[child:name()] ~= nil then if type(self[child:name()].name) == "function" then local tempTable = {} table.insert(tempTable, self[child:name()]) self[child:name()] = tempTable end table.insert(self[child:name()], child) else self[child:name()] = child end table.insert(self.___children, child) end function node:properties() return self.___props end function node:numProperties() return #self.___props end function node:addProperty(name, value) local lName = "@" .. name if self[lName] ~= nil then if type(self[lName]) == "string" then local tempTable = {} table.insert(tempTable, self[lName]) self[lName] = tempTable end table.insert(self[lName], value) else self[lName] = value end table.insert(self.___props, { name = name, value = self[name] }) end return node end return parseXml; end end QNAP.getTokenFromXml(); @+ JP 1
pepite Posté(e) le 9 mai 2017 Signaler Posté(e) le 9 mai 2017 @lamparo, Maintenant tu arrives donc a demarrer et arreter ton QNAP ? Super
nigao Posté(e) le 9 mai 2017 Signaler Posté(e) le 9 mai 2017 @lamparo perfecto ^^ ça marche aussi pour moi dorénavant. Bon allez maintenant vous faites la même chose pour éteindre un Mac et je pourrais l'extinction automatique en cas de coupure électrique (j'ai pas d'onduleur snmp et le ups agent oSX n'est pas a jour depuis depuis osxLion )
lamparo Posté(e) le 9 mai 2017 Signaler Posté(e) le 9 mai 2017 Il y a 9 heures, pepite a dit : @lamparo, Maintenant tu arrives donc a demarrer et arreter ton QNAP ? Super Salut Pépite, oui j'arrive à le démarrer, l'arrêter et envoyer un ping dessus pour voir son état J'ai passé du temps à fouiller sur le forum, c'est grâce à tous les béberts du site que j'y suis arrivé, un grand merci à vous tous. JP
pepite Posté(e) le 9 mai 2017 Signaler Posté(e) le 9 mai 2017 Excellent, tu n'as plus qu'à faire un petit tuto ;-) merci
lamparo Posté(e) le 14 mai 2017 Signaler Posté(e) le 14 mai 2017 (modifié) Salut Pépite, un tuto, je peux mettre les codes relatifs aux boutons du VD, comme ça tout sera centralisé sur ce post, je tiens encore à signaler que j'ai tout glané sur le forum. Pour démarrer le QNAP --[[ %% properties %% globals --]] -- Wake On Lan v 1.0.0 [02-2013] -- Copyright © 2013 Jean-christophe Vermandé -- convert MAC adress, every 2 Chars (7-bit ASCII), to one Byte Char (8-bits) function convertMacAddress(address) local s = string.gsub(address, ":", ""); local x = ""; -- will contain converted MAC for i=1, 12, 2 do x = x .. string.char(tonumber(string.sub(s, i, i+1), 16)); end return x; end fibaro:log("Start process"); local _selfId = fibaro:getSelfId(); -- MAC adress local _macAddress = convertMacAddress(":xx:xx:xx:xx:xx:xx"); -- Create Magic Packet 6 x FF local _magicPacket = string.char(0xff, 0xff, 0xff, 0xff, 0xff, 0xff); -- Broadcast Address local _broadcastAddress = "255.255.255.255"; -- Default port used local _wakeOnLanPort = 9; fibaro:sleep(750); for i = 1, 16 do _magicPacket = _magicPacket .. _macAddress; end fibaro:log("Magic packet successfully created"); fibaro:sleep(1000); socket = Net.FUdpSocket(); socket:setBroadcast(true); local bytes, errorCode = socket:write(_magicPacket, _broadcastAddress, _wakeOnLanPort); --check for error if errorCode == 0 then fibaro:log("Successfully sent"); else fibaro:log("Transfer failed"); end -- clean up memory socket = nil; fibaro:sleep(1000); fibaro:log("Please wait for the server startup."); Pour le ping --[[ %% properties %% globals --]] -- Ping v 1.0.1 [05-2013] -- Copyright © 2013 Jean-christophe Vermandé fibaro:log("Start process"); local _deviceIp = "xxx.xxx.x.x"; local _devicePort = xxxx; local _maxRetryProcess = 5; -- recursive function to ping device local function _ping(retry) retry = retry or 0; --open the socket local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort); --set the read timeout tcpSocket:setReadTimeout(250); --notify user fibaro:log("Search on the local network, try #" .. retry .. " please wait..."); fibaro:sleep(250); --send packet local bytes, errorCode = tcpSocket:write("test"); --check for error if errorCode == 0 then return true; else if retry < _maxRetryProcess then fibaro:log("Retry process, please wait..."); fibaro:sleep(1000); return _ping(retry + 1); end return false; end end --ping device, secure with pcall to catch errors. local f, result = pcall(_ping); if (f) then if (result == true) then fibaro:call(4, "sendPush", "QnaP On") --fibaro:log("Device has been found, is awake and listening."); else fibaro:call(4, "sendPush", "QnaP Off") --fibaro:log("Device was not found!"); end else fibaro:log("Error: " .. result); end Et le VD Modifié le 23 septembre 2017 par lamparo 1
cybersquat Posté(e) le 15 mai 2017 Signaler Posté(e) le 15 mai 2017 (modifié) Hello, merci et super pour le VD du Qnap, tout ceux qu'il me fallait Par contre moi je rencontre un petit soucis dans le OFF [ERROR] 15:02:36: line 26: attempt to index field 'authSid' (a nil value) Le ping fonctionne bien cependant Merci ----- C'est bon, j'ai rectifié La par contre il le QNAP ne veut pas s'allumé :/ Modifié le 15 mai 2017 par cybersquat progres
cybersquat Posté(e) le 15 mai 2017 Signaler Posté(e) le 15 mai 2017 Alors alors, tout est fonctionnel @lamparo le tient met-il du temps pour s'allumé ? Je trouve que le mien oui, merci beaucoup pour ce VD
lamparo Posté(e) le 15 mai 2017 Signaler Posté(e) le 15 mai 2017 Salut Cybersquat, super si tout fonctionne Le miens met, mini, 3 bonnes minutes avant d'être opérationnel, par contre, il s'éteint relativement vite, une petite minute. Jp 1
ASTECH44 Posté(e) le 6 juin 2017 Signaler Posté(e) le 6 juin 2017 @ Cybersquat, Merci pour ce VD et Beau boulot. Bien que équipé d’un NAS QNAP entrée de gamme TS210, donc sans le Wake On Lan, je peux « pinguer » le NAS et aussi l’arrêter (environ 4 minutes), comme mon onduleur tient les 10 mn, c’est nickel. J’ai simplement lors du shutdown le log « ERROR » qui s’affiche dans le VD, ce doit être dû au fait que le NAS ne renvoît pas le message OK lors du test : (if (string.find(response, "OK")) then ou un pb dans la ligne précédente : response = QNAP2URL:GET("/cgi-bin/sys/sysRequest.cgi?subfunc=power_mgmt&count=0.1234&sid="..qsidstr.."&apply=shutdown"); Quel est l'action du count=0.1234 ,
Gandalf Posté(e) le 23 septembre 2017 Signaler Posté(e) le 23 septembre 2017 Le 14/05/2017 à 20:07, lamparo a dit : Salut Pépite, un tuto, je peux mettre les codes relatifs aux boutons du VD, comme ça tout sera centralisé sur ce post, je tiens encore à signaler que j'ai tout glané sur le forum. Pour démarrer le QNAP Et le VD ATTENTION ton fichier vfib est bourré d'info perso @Mac, Login password, IP Range etc.... Je susi entrain d'installer le système pour gérer mon QNAP et j'ai vue rouge
Messages recommandés