ioBroker / ioBroker.javascript

Script engine for JavaScript and Blockly
MIT License
320 stars 119 forks source link

[Bug]: exec mit iobroker commands doesn't work #1615

Closed Diginix closed 2 weeks ago

Diginix commented 2 weeks ago

I'm sure that

Script type

Blockly & Javascript

The problem

Weder mit JS noch mit Blockly lassen sich Adapter stopen/starten/restarten. EXEC ist in der JS Instanz aktiviert und funktioniert mit anderen Kommandos auch fehlerfrei.

exec('iobroker restart proxmox.0');

<block xmlns="https://developers.google.com/blockly/xml" type="exec" id="dg^z!9-Q7wb3VoXq@2kD" x="1262.160146484375" y="4087.000029296875">
  <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="true"></mutation>
  <field name="WITH_STATEMENT">TRUE</field>
  <field name="LOG">info</field>
  <value name="COMMAND">
    <shadow type="text" id="UWjhID!]a[DQo850zfFz">
      <field name="TEXT">iobroker restart proxmox.0</field>
    </shadow>
  </value>
</block>

iobroker.current.log (in debug mode!)

No response

Version of nodejs

20.14.0

Version of ioBroker js-controller

6.0.4

Version of adapter

8.6.0

Mit JS 8.5.2 funktioniert es problemlos.

klein0r commented 2 weeks ago
  1. Warum sollte man das so umständlich über exec lösen?!
  2. Ist /usr/bin/ denn in der $PATH-Variablen vom ioBroker-Nutzer?
  3. Werden die Befehle dann von /usr/bin/iobroker (meistens) mit sudo ausgeführt, was der iobroker Linux-Nutzer (hoffentlich) eh nicht darf.

Insgesamt also 100% ein Linux-Thema und Blockly unabhängig.

Was kommt denn auf stderr zurück? Da sollte eigentlich stehen, warum etwas nicht geht.

Diginix commented 2 weeks ago

Wenn es ein Linux Thema wäre, warum funktioniert es dann mit Downgrade auf js 8.5.2 sofort wieder? Wie kann man Adapter in Blockly besser stoppen/starten/restarten? In der CLI funktionieren alle "iobroker ..." commands mit sauberer stdout Antwort. Nur in js 8.6.0 geht es aktuell nicht.

Über die Objekte hatte ich früher schon Adapter restarts probiert, aber irgendwas passte da nicht oder fehlte. Meine Skripte sind zT Jahr alt, aber funktionieren perfekt. Speziell der Proxmox Adapter muss aktuell per Skript überwacht und neugestartet werden. Bug ist bekannt, aber seit mehreren Vers. nicht gelöst.

klein0r commented 2 weeks ago

Bei mir funktioniert es auch mit 8.6.0 (gerade getestet).

Generell ist es halt umständlich, Dinge über einen CLI-Prozess zu tun, welche am Ende auch nur Objekte im ioBroker setzen. Du nutzt ja auch setState als Funktion mit Blockly und nicht exec('iobroker state set 0_userdata.0.example_state true');

Der Admin-Adapter macht einfach nur eine exendObjekt auf system.adapter.${namespace}. Das trigger dann den Neustart. Ginge also nur, wenn setObject in JavaScript erlaubt wird und (aktuell) nur mit einem Funktions-Baustein. Ich teste das mal gerade.

klein0r commented 2 weeks ago

So geht es:

Screenshot 2024-06-16 at 12 58 21
<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="YHi]XwL|x-OQRu6XJ!,w">instance</variable>
  </variables>
  <block type="procedures_defcustomnoreturn" id="^(d~V_hm.^xis(f6DkUY" x="88" y="188">
    <mutation statements="false">
      <arg name="instance" varid="YHi]XwL|x-OQRu6XJ!,w"></arg>
    </mutation>
    <field name="NAME">restart</field>
    <field name="SCRIPT">Y29uc3Qgb2JqSWQgPSBgc3lzdGVtLmFkYXB0ZXIuJHtpbnN0YW5jZX1gOwpjb25zdCBvYmogPSBhd2FpdCBnZXRPYmplY3RBc3luYyhvYmpJZCk7CgppZiAob2JqLnR5cGUgPT09ICdpbnN0YW5jZScpIHsKICAgIGF3YWl0IGV4dGVuZE9iamVjdEFzeW5jKG9iaklkLCB7fSk7Cn0=</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="comment" id="S`L$;Z92RKG*rn{pA{Ri" x="88" y="263">
    <field name="COMMENT">Instanz neustarten</field>
    <next>
      <block type="procedures_callcustomnoreturn" id="UPGM$-A]ah)?Z{+6hvcJ">
        <mutation name="restart">
          <arg name="instance"></arg>
        </mutation>
        <value name="ARG0">
          <block type="text" id="YfX|iFP*{WdIs}e)Zxah">
            <field name="TEXT">discovery.0</field>
          </block>
        </value>
      </block>
    </next>
  </block>
</xml>
Diginix commented 2 weeks ago

Schau ich mir mal an. Aber das Überwachungsskript hat recht viele restart exc und in anderen Skripten gibt es das wahrs auch noch. Mal eben alles umbauen ist immer Aufwand. Komisch, dass es bei mir mit 8.6.0 nicht geht. Damit das System 100% läuft, muss ich aber erstmal auf 8.5.2 bleiben.

klein0r commented 2 weeks ago

Wäre aber auch ein gutes Feature für eigene Blöcke...

Diginix commented 2 weeks ago

Wollte es nicht schreiben, aber den Gedanken hatte ich auch schon. Block in dem man per Dropdown wählt ob Stop, Start oder Restart und in einem Textfeld trägt man die Instanz ein.

klein0r commented 2 weeks ago
Screenshot 2024-06-16 at 20 57 19