Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e) (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é par lamparo
  • 4 semaines après...
Posté(e)

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

Posté(e)

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

  • Upvote 1
Posté(e)

@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 :(

Posté(e)
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

Posté(e) (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é par lamparo
  • Upvote 1
Posté(e) (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é par cybersquat
progres
Posté(e)

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

Posté(e)

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

  • Upvote 1
  • 3 semaines après...
Posté(e)

@ 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  ,

  • 3 mois après...
Posté(e)
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 :(

 

 

×
×
  • Créer...