Aller au contenu
labomatik

Pilotez Votre Qnap Avec La Hc2

Recommended Posts

T as mis un end?:-)

Envoyé de mon Nexus 5X en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

@lamparo,

 

Maintenant tu arrives donc a demarrer et arreter ton QNAP ? Super

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent, tu n'as plus qu'à faire un petit tuto ;-) :60:

merci 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites
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 :(

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×