Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Docker Container restart iobroker per script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Docker Container restart iobroker per script

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fastfoot @oFbEQnpoLKKl6mbY5e13 last edited by fastfoot

      @ofbeqnpolkkl6mby5e13 sagte in restart iobroker per script?:

      @fastfoot
      Fantastisch! 👍

      nun ja, von den Infos bin ich nicht soo sehr begeistert, aber immerhin. Ich frage ja aber auch nur die Containerinfos ab. Der Restart funktioniert einwandfrei, bin gespannt ob das auf anderen QNAP-Systemen auch so klappt. Ich habe die in den Dokus genannte curl Methode mit axios umgesetzt, weshalb das in der JS-Instanz eingetragen werden muss. Die Datenpunkte für die Tabelle und den Restart werden automatisch unter 0_userdata.0.QNAP angelegt. Vor dem Start sind User und Passwort sowie die IP Adresse und der Port der QNAP einzutragen. Happy Restart!
      qnap1.PNG

      /**
      * Zweck:           Infos über und Restart von Docker Containern auf QNAP NAS
      * Date:            13.09.2021
      * Author:          fastfoot
      * Forum:           https://forum.iobroker.net/topic/40916/restart-iobroker-per-script/31?_=1610918563284
      * Infos:           https://qnap-dev.github.io/container-station-api/container.html#list-containers
      * myHome
      */
      const axios = require('axios').default; // Muss in JS-Instanz unter NPM-Module eingetragen werden
      const dbg = !true;
      const username = 'admin';               // user mit Adminrechten auf der QNAP
      const password = 'ein_Passwort';        // Passwort für admin oder user der Admingruppe
      const server = 'qnapnas';               // Hostname oder IP der QNAP NAS
      //const server = '192.168.178.3';
      const port = '8080';                    // Port der QNAP NAS
      let fakeId = 'xxx';                     // FakeID, wird später ersetzt
      const containerName = 'iobroker';       //Containername, welcher neugestartet werden soll
      const urlLogin = `http://${server}:${port}/container-station/api/v1/login`;  // Anmelde-URL
      const urlInfo = `http://${server}:${port}/container-station/api/v1/container`; // Container Infos
      const urlRestart = `http://${server}:${port}/container-station/api/v1/container/docker/${fakeId}/restart`;
      const idBase = '0_userdata.0.QNAP';
      const idInfo = `${idBase}.info`;                // Originalantwort der API
      const idRestart = `${idBase}.Restart`;          // DP zum Auslösen des Restart
      const idJson = `${idBase}.json`;                // DP für Infos über Container
      let firstRun = true;
      
      setInterval(main,2000);
      
      on({id: idRestart, change:'any'},async () => {
         if(dbg) log('Restart')
         //restart(containerName);
      })
      
      async function main() {
         let json = [];
         firstRun = await createDatapoints();
         let session = await login(urlLogin, username, password);
         if(dbg) log(session)
         let container = await getInfos(urlInfo, session);
         setState(idInfo,JSON.stringify(container,null,4));
         container.forEach((rec)=>{
             let memory = 0, 
                 cpu = 0;
             if('memory' in rec) memory = Math.round(rec.memory/1024/1024*1000)/1000;
             if('cpu' in rec) cpu = rec.cpu * 100;
             json.push({
                 Name: rec.name,
                 Image: rec.image,
                 Memory:  memory,
                 CPU: cpu,
                 State: rec.state
                 //Id: rec.id,
             })
         })
         setState(idJson, JSON.stringify(json,null,4));
      }
      
      async function login(url,username,password) {
         let session;
         let data = await axios.post(url,{username,password});
         if(data.status == 200){
             session = data.headers['set-cookie'][0].split(';')[0];
         }
         return session;
      }
      
      async function getInfos(url, session) {
         let data = (await axios.get(url, {headers: {Cookie: session}}));
         if(data.status == 200){
             return data.data;
         }
      }
      
      async function restart(containerName) {
         let session = await login(urlLogin, username, password);
         let container = await getInfos(urlInfo, session);
      
         container.forEach(async (rec)=> {
             if(rec.name == containerName) {
                 let url = urlRestart.replace(fakeId,rec.id);
                 if(!firstRun) {
                     let data = await axios.put(url,'',{headers: {Cookie: session}});
                     if(dbg) log(data.data);
                 }
             }
         })
      }
      // create data points if not existing
      async function createDatapoints() {
         let dp,
             idKey,
             firstRun = false;
         
         const stateAttributes = {
             "Restart":{"name":"Container Restart","type":"boolean","role":"button","read":true,"write":true,"desc":"von Skript erstellt","def":false},
             "info":{"name":"Info original","type":"string","role":"state","read":true,"write":true,"desc":"von Skript erstellt","def": ""},
             "json":{"name":"Info Tabelle","type":"string","role":"state","read":true,"write":true,"desc":"von Skript erstellt","def":""}
         }
      
         for(let key in stateAttributes) {
      
             idKey = idBase + '.' + key;
      
             if (!(await existsStateAsync(idKey))) {
                 dp = stateAttributes[key];
                 firstRun = true;
                 await createStateAsync(idKey, dp);
             }
         }
      
         return firstRun;
      
      }
      
      

      O F 2 Replies Last reply Reply Quote 1
      • O
        oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

        @fastfoot
        Wahnsinn! Vielen, vielen Dank!

        2021-01-18 20:09:22.686 - info: host.iobroker-d stopInstance system.adapter.javascript.0 (force=false, process=true)
        2021-01-18 20:09:22.697 - info: host.iobroker-d stopInstance system.adapter.javascript.0 send kill signal
        2021-01-18 20:09:22.698 - info: javascript.0 (5079) Got terminate signal TERMINATE_YOURSELF
        

        Daten sind auch alle da! Da mache ich mir doch glatt auch so eine View.

        Nach dem Start des Skripts wurde sofort neu gestartet. Normal?

        (TS-453 Pro)

        F 1 Reply Last reply Reply Quote 0
        • F
          fastfoot @oFbEQnpoLKKl6mbY5e13 last edited by

          @ofbeqnpolkkl6mby5e13 sagte in restart iobroker per script?:

          Nach dem Start des Skripts wurde sofort neu gestartet. Normal?

          Nein, nicht normal. Das wird eigentlich durch die Variable firstRun verhindert, jedenfalls beim Erstellen der Datenpunkte passierte das und dann habe ich das eingebaut und es hat funktioniert.

          Passiert das bei jedem Neustart des Skripts oder war das eine einmalige Sache? Falls Letzteres passiert es beim Erstellen des Restart-DP und sollte durch die Variable verhindert werden. Gerade getestet und funktioniert wie beschrieben. Falls das bei dir anders ist, kannst du das on() in einen Timeout packen, dann sollte er auch nicht beim Erstellen gleich triggern.

          setTimeout(()=>{
              on({id: idRestart, change:'any'},async () => {
                  if(dbg) log('Restart')
                  restart(containerName);
              })
          },2000)
          
          O 2 Replies Last reply Reply Quote 0
          • O
            oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

            @fastfoot
            War eine einmalige Sache. 👍

            1 Reply Last reply Reply Quote 0
            • O
              oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

              @fastfoot
              Was müsste man tun, wenn man jetzt noch einen anderen Container neu starten möchte?

              F 1 Reply Last reply Reply Quote 0
              • F
                fastfoot @oFbEQnpoLKKl6mbY5e13 last edited by

                @ofbeqnpolkkl6mby5e13 sagte in restart iobroker per script?:

                @fastfoot
                Was müsste man tun, wenn man jetzt noch einen anderen Container neu starten möchte?

                Die Variable containerName aus einem DP auslesen, anstatt fix festzulegen. Dann muss aber auch das const durch let ersetzt werden. Beim Erstellen des DP als default den Standardnamen angeben und die Zuweisung nach Aufruf von createDatapoints(). In der VIS dann setzen mit Buttons oder mit einem Select von MDW oder was es da sonst noch gibt

                O 1 Reply Last reply Reply Quote 1
                • O
                  oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

                  @fastfoot sagte in restart iobroker per script?:

                  Die Variable containerName aus einem DP auslesen, anstatt fix festzulegen.

                  Natürlich! 🤦‍♂️

                  Dann muss aber auch das const durch let ersetzt werden. Beim Erstellen des DP als default den Standardnamen angeben und die Zuweisung nach Aufruf von createDatapoints(). In der VIS dann setzen mit Buttons oder mit einem Select von MDW oder was es da sonst noch gibt

                  Okay, danke!

                  1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @fastfoot last edited by

                    @fastfoot sagte in Docker Container restart iobroker per script:

                    nun ja, von den Infos bin ich nicht soo sehr begeistert, aber immerhin. Ich frage ja aber auch nur die Containerinfos ab. Der Restart funktioniert einwandfrei, bin gespannt ob das auf anderen QNAP-Systemen auch so klappt. Ich habe die in den Dokus genannte curl Methode mit axios umgesetzt, weshalb das in der JS-Instanz eingetragen werden muss. Die Datenpunkte für die Tabelle und den Restart werden automatisch unter 0_userdata.0.QNAP angelegt. Vor dem Start sind User und Passwort sowie die IP Adresse und der Port der QNAP einzutragen. Happy Restart!

                    Mit dem neuesten Update 2.4 der QNAP Containerstation hat es die verwendete REST API zerschossen, wer also das Skript hier nutzt, sollte nicht updaten und auf einen Fix warten, kann mir nicht vorstellen dass es diesen nicht geben wird. Wer ausserdem weiss wie man die Containerstation downgraden kann, bitte mal melden 🙂

                    O F 2 Replies Last reply Reply Quote 0
                    • O
                      oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

                      @fastfoot
                      Danke für die Info.

                      1 Reply Last reply Reply Quote 0
                      • F
                        fastfoot @fastfoot last edited by

                        Das Skript läuft jetzt wieder, die URL hatte sich geändert. Somit kann ich endlich die neueste Container-Station APP nutzten.

                        1 Reply Last reply Reply Quote 1
                        • B
                          bug77 last edited by

                          bei mir funktioniert das Script leider nicht.

                          Nachdem ich den Link im Script geändert habe in

                          http://${server}:${port}/containerstation/api/v1/login
                          

                          funktioniert die Abfrage.

                          Wenn ich aber Restart mache, passiert nichts, auch im Log steht nichts.

                          Habe User / Pass / IP / Containername (name oder Abbbild name?), FakeID bleibt xxx?,

                          F 2 Replies Last reply Reply Quote 0
                          • F
                            fastfoot @bug77 last edited by

                            @bug77 stimmt denn der Containername mit Zeile 17 überein?

                            B 1 Reply Last reply Reply Quote 0
                            • B
                              bug77 @fastfoot last edited by

                              @fastfoot ja habe sowohl den Container Namen, als auch die Container ID probiert.
                              Er liest alles ein, sehe alle Container als html, aber auf restart wird nicht reagiert

                              F 1 Reply Last reply Reply Quote 0
                              • F
                                fastfoot @bug77 last edited by

                                @bug77 sagte in Docker Container restart iobroker per script:

                                Nachdem ich den Link im Script geändert habe in

                                jetzt muss da ein Bindestrich rein

                                1 Reply Last reply Reply Quote 0
                                • F
                                  fastfoot @bug77 last edited by

                                  @bug77 sagte in Docker Container restart iobroker per script:

                                  @fastfoot ja habe sowohl den Container Namen, als auch die Container ID probiert.
                                  Er liest alles ein, sehe alle Container als html, aber auf restart wird nicht reagiert

                                  gerade getestet, läuft. Rufe die Restart Funktion mal ohne Button auf: restart(containerName);

                                  B 1 Reply Last reply Reply Quote 0
                                  • B
                                    bug77 @fastfoot last edited by

                                    @fastfoot wie mach ich das?

                                    F 1 Reply Last reply Reply Quote 0
                                    • F
                                      fastfoot @bug77 last edited by

                                      @bug77 sagte in Docker Container restart iobroker per script:

                                      @fastfoot wie mach ich das?

                                      na zB in der letzten Zeile des Skripts eintragen.
                                      schedule('30 13 * * *', () => restart(containerName)) Das macht den Restart um 13:30Uhr. Wenn erfolgreich auskommentieren, dann liegt es am Button dass es vorher nicht geklappt hat.

                                      B 1 Reply Last reply Reply Quote 0
                                      • B
                                        bug77 @fastfoot last edited by

                                        @fastfoot ok damit funktioniert es. Also liegt es am Button? Und nun?

                                        F 1 Reply Last reply Reply Quote 0
                                        • F
                                          fastfoot @bug77 last edited by

                                          @bug77 sagte in Docker Container restart iobroker per script:

                                          @fastfoot ok damit funktioniert es. Also liegt es am Button? Und nun?

                                          zeig mal das RAW Objekt deines Button

                                          B 1 Reply Last reply Reply Quote 0
                                          • B
                                            bug77 @fastfoot last edited by bug77

                                            @fastfoot

                                            {
                                             "from": "system.adapter.javascript.0",
                                             "user": "system.user.admin",
                                             "ts": 1631647986751,
                                             "common": {
                                               "name": "Container Restart",
                                               "type": "boolean",
                                               "role": "button",
                                               "desc": "von Skript erstellt",
                                               "read": true,
                                               "write": true,
                                               "def": false
                                             },
                                             "native": {},
                                             "acl": {
                                               "object": 1636,
                                               "owner": "system.user.admin",
                                               "ownerGroup": "system.group.administrator",
                                               "state": 1636
                                             },
                                             "_id": "0_userdata.0.Netzwerk.QNAP.Restart",
                                             "type": "state"
                                            }
                                            
                                            F 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            635
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            11
                                            62
                                            5086
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo