Aller au contenu

Recommended Posts

bonne chance à tout le monde, j'ai lu loin et loin le post mais je ne peux pas comprendre comment créer ou mieux quel code insère dans le VD pour éteindre le qnap.
Je ne suis pas bon avec le LUA mais j'aimerais le faire.
Pouvez-vous m'aider?

Partager ce message


Lien à poster
Partager sur d’autres sites
Merci beaucoup Lamparo, j'avais vu ce forum mais bêtement je n'avais pas regardé les pages suivantes, 
j'ai eu ton code mais je n'arrive pas à le faire fonctionner et je ne comprends pas ce que je me trompe?
À ce stade, je me demande si je mettre au bon endroit ip, username e password:
je les mets dans cette partie du code - Voir les parties en vert- (où je mets username-manu et password-manu)

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("MY IP", 13131);
        
        
    response = QNAP2URL:GET("/cgi-bin/authLogin.cgi?user=user-manu_pwd=password-manu");
    
    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();

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites
QNAP.getTokenFromXml = function() 
    --local QNAP2URL = Net.FHttp(ip,port);
    local QNAP2URL = Net.FHttp("xxx.xxx.x.x", xxxx);

En rouge l'IP, en vert le port

 

 

 response = QNAP2URL:GET("/cgi-bin/authLogin.cgi?user=login&plain_pwd=password&remme=1");

En rouge le login et en vert le PW

 

Par contre il manque  &remme=1"  à la fin de ta ligne.

 

l'erreur vient de là.

 

 

Modifié par lamparo

Partager ce message


Lien à poster
Partager sur d’autres sites

×