Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Ordner auf neue Dateien überwachen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Ordner auf neue Dateien überwachen

Geplant Angeheftet Gesperrt Verschoben JavaScript
37 Beiträge 8 Kommentatoren 5.4k Aufrufe 7 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T tomily

    @mickym hast du den Flow wieder rausgenommen?
    Darf ich ihn mir trotzdem anschauen? Wäre total super, möchte diese Option nicht ausser Acht lassen.

    mickymM Online
    mickymM Online
    mickym
    Most Active
    schrieb am zuletzt editiert von
    #24

    @tomily Hängt dran.

    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

    1 Antwort Letzte Antwort
    0
    • T tomily

      @mickym
      Ich danke Dir für den input. Für mich sind trotzdem beide Varianten sehr interessant.

      Der Ursprüngliche Zweck war ja zu erkennen, wenn keine neue Dateien mehr kommen. Der permanente Überwachung wäre sicherlich auch in einigen Situationen sinnvoll.

      Zur NOT könnte ich das Verzeichnis dauerhaft mounten. Aber egtl muss und soll das nicht sein.

      Die Prüfung würde mir 1-2x am Tag reichen. Weiss nicht, ob die „Dauerprüfung“ evtl traffic oder performance Probleme verursacht?

      @ente34
      Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?
      War zwar keine ursprüngliche Anforderung von mir, aber nachdem ich meine ganzen Check-Jobs eingerichtet habe, bin ich noch darauf gestossen.

      E Offline
      E Offline
      ente34
      schrieb am zuletzt editiert von
      #25

      @tomily sagte in Ordner auf neue Dateien überwachen:

      Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?

      Man muss das Script nur ein wenig umstellen:

      const fs = require('fs');
      const util = require('util');
      const readdir = util.promisify(fs.readdir);
      const stat = util.promisify(fs.stat);
      const lstat = util.promisify(fs.lstat);
      
      const mountDir = '/home/pi/mount';
      const nasDir = '//nas02/backup/raspi-iobroker';
      const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
      const umountCmd = `sudo umount ${nasDir}`;
      
      const warnSeconds = 5 * 86400;
      
      async function NewestFile(dir) {
          let newestFileAge = 0;
          let newestFile = '';
          //console.log('### '+dir);
          try {
              let files = [];
              files = await readdir(dir);
      
      
              for (let file of files) {
                  let fullpath = dir + '/' + file;
                  const s = await lstat(fullpath);
                  if (s.isFile()) {
                      const stats = await stat(fullpath);
                      if (stats.mtimeMs > newestFileAge) {
                          newestFileAge = stats.mtimeMs;
                          newestFile = file;
                      }
                  } else {
                      let values = await NewestFile(fullpath);
                      if (values.age > newestFileAge) {
                          newestFileAge = values.age;
                          newestFile = values.file;
                      }
                  }
              }
          } catch (e) {
              console.log(e);
          } finally {
              return { file: newestFile,  age:newestFileAge };
          }
      }
      
      /**
       * Executes a shell command and return it as a Promise.
       * @param cmd {string}
       * @return {Promise<string>}
       */
      function execShellCommand(cmd) {
          const exec = require('child_process').exec;
          return new Promise((resolve, reject) => {
              exec(cmd, (error, stdout, stderr) => {
                  if (error) {
                      console.warn(error);
                  }
                  resolve(stdout ? stdout : stderr);
              });
          });
      }
      
      async function checkBackup() {
          try {
              //hier mount-Kommando
              await execShellCommand(mountCmd);
      
              let result = await NewestFile(mountDir);
              let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
              if (seconds > warnSeconds) {
                  console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                  // Mail abschicken
                  console.log('Send Mail');
              }
      
              //hier umount-Kommando
              await execShellCommand(umountCmd);
          } catch (e) {
              console.warn(e);
          }
      }
      
      // 22:30
      schedule('30 22 * * *', () => {
          checkBackup();
      });
      T 1 Antwort Letzte Antwort
      0
      • E ente34

        @tomily sagte in Ordner auf neue Dateien überwachen:

        Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?

        Man muss das Script nur ein wenig umstellen:

        const fs = require('fs');
        const util = require('util');
        const readdir = util.promisify(fs.readdir);
        const stat = util.promisify(fs.stat);
        const lstat = util.promisify(fs.lstat);
        
        const mountDir = '/home/pi/mount';
        const nasDir = '//nas02/backup/raspi-iobroker';
        const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
        const umountCmd = `sudo umount ${nasDir}`;
        
        const warnSeconds = 5 * 86400;
        
        async function NewestFile(dir) {
            let newestFileAge = 0;
            let newestFile = '';
            //console.log('### '+dir);
            try {
                let files = [];
                files = await readdir(dir);
        
        
                for (let file of files) {
                    let fullpath = dir + '/' + file;
                    const s = await lstat(fullpath);
                    if (s.isFile()) {
                        const stats = await stat(fullpath);
                        if (stats.mtimeMs > newestFileAge) {
                            newestFileAge = stats.mtimeMs;
                            newestFile = file;
                        }
                    } else {
                        let values = await NewestFile(fullpath);
                        if (values.age > newestFileAge) {
                            newestFileAge = values.age;
                            newestFile = values.file;
                        }
                    }
                }
            } catch (e) {
                console.log(e);
            } finally {
                return { file: newestFile,  age:newestFileAge };
            }
        }
        
        /**
         * Executes a shell command and return it as a Promise.
         * @param cmd {string}
         * @return {Promise<string>}
         */
        function execShellCommand(cmd) {
            const exec = require('child_process').exec;
            return new Promise((resolve, reject) => {
                exec(cmd, (error, stdout, stderr) => {
                    if (error) {
                        console.warn(error);
                    }
                    resolve(stdout ? stdout : stderr);
                });
            });
        }
        
        async function checkBackup() {
            try {
                //hier mount-Kommando
                await execShellCommand(mountCmd);
        
                let result = await NewestFile(mountDir);
                let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                if (seconds > warnSeconds) {
                    console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                    // Mail abschicken
                    console.log('Send Mail');
                }
        
                //hier umount-Kommando
                await execShellCommand(umountCmd);
            } catch (e) {
                console.warn(e);
            }
        }
        
        // 22:30
        schedule('30 22 * * *', () => {
            checkBackup();
        });
        T Offline
        T Offline
        tomily
        schrieb am zuletzt editiert von
        #26

        @ente34
        Bitte entschuldigt die erneute späte Antwort. Ich bin wirklich schlimm! 🙂

        Habe mir das erste Skript schon etwas auf meine Bedürfnisse angepasst. Das gleiche musste ich mit dem zweiten nun auch tun und es FUNKTIONIERT TADELLOS 🙂

        Ich habe mir nun für mehrere Ordner und Dateien unterschiedliche Skripte zusammengebaut, die ich hinterinander laufen lasse.

        Das passt für mich nun hervorragend.

        An der Stelle möchte ich mich recht herzlich für eure konstruktive Vorschläge bedanken. Auch Dir @ente34 herzlichen Dank für die Mühe und Zeit.

        Bin sehr happy über das Ergebnis 🙂

        T 1 Antwort Letzte Antwort
        0
        • T tomily

          @ente34
          Bitte entschuldigt die erneute späte Antwort. Ich bin wirklich schlimm! 🙂

          Habe mir das erste Skript schon etwas auf meine Bedürfnisse angepasst. Das gleiche musste ich mit dem zweiten nun auch tun und es FUNKTIONIERT TADELLOS 🙂

          Ich habe mir nun für mehrere Ordner und Dateien unterschiedliche Skripte zusammengebaut, die ich hinterinander laufen lasse.

          Das passt für mich nun hervorragend.

          An der Stelle möchte ich mich recht herzlich für eure konstruktive Vorschläge bedanken. Auch Dir @ente34 herzlichen Dank für die Mühe und Zeit.

          Bin sehr happy über das Ergebnis 🙂

          T Offline
          T Offline
          tomily
          schrieb am zuletzt editiert von
          #27

          @tomily
          Hey zusammen,

          habe die Skripte nun einige Zeit am laufen. Funktioniert super und hab mich schon mehrmals auf nicht mehr funktionierende Backups hingewiesen 🙂

          ZIEL ERREICHT 😃

          Eine Frage bzw. weitere Idee habe ich noch:

          Kann ich das Skript auch "umdrehen", sodass auf NEUE DATEIEN geprüft wird?
          Also: Verzeichniss sollte immer leer sein und sobald eine oder mehrer Dateien drin liegen, wird ausgelöst?

          Muss ich nur die Abfrage nach Zeit umdrehen?

          Beste Grüße
          Tom

          E 1 Antwort Letzte Antwort
          0
          • T tomily

            @tomily
            Hey zusammen,

            habe die Skripte nun einige Zeit am laufen. Funktioniert super und hab mich schon mehrmals auf nicht mehr funktionierende Backups hingewiesen 🙂

            ZIEL ERREICHT 😃

            Eine Frage bzw. weitere Idee habe ich noch:

            Kann ich das Skript auch "umdrehen", sodass auf NEUE DATEIEN geprüft wird?
            Also: Verzeichniss sollte immer leer sein und sobald eine oder mehrer Dateien drin liegen, wird ausgelöst?

            Muss ich nur die Abfrage nach Zeit umdrehen?

            Beste Grüße
            Tom

            E Offline
            E Offline
            ente34
            schrieb am zuletzt editiert von
            #28

            @tomily
            Das geht leider nicht. Ich habe das Script mal erweitert,
            Du musst chkDirNotEmpty() oder chkDirTreeNotEmpty() benutzen, je nachdem, ob Du ein einzelnes Directory oder rekursiv den ganzen Baum absuchen willst

            const fs = require('fs');
            const util = require('util');
            const readdir = util.promisify(fs.readdir);
            const stat = util.promisify(fs.stat);
            const lstat = util.promisify(fs.lstat);
            
            const mountDir = '/home/pi/mount';
            const nasDir = '//nas02/backup/raspi-iobroker/backitup';
            const mountCmd = `sudo mount -t cifs -o username=rsync,password=...,vers=3.0 ${nasDir} ${mountDir}`;
            const umountCmd = `sudo umount ${nasDir}`;
            
            const warnSeconds = 5 * 86400;
            
            async function NewestFile(dir) {
                let newestFileAge = 0;
                let newestFile = '';
                //console.log('### '+dir);
                try {
                    let files = [];
                    files = await readdir(dir);
            
            
                    for (let file of files) {
                        let fullpath = dir + '/' + file;
                        const s = await lstat(fullpath);
                        if (s.isFile()) {
                            const stats = await stat(fullpath);
                            if (stats.mtimeMs > newestFileAge) {
                                newestFileAge = stats.mtimeMs;
                                newestFile = file;
                            }
                        } else {
                            let values = await NewestFile(fullpath);
                            if (values.age > newestFileAge) {
                                newestFileAge = values.age;
                                newestFile = values.file;
                            }
                        }
                    }
            
                } catch (e) {
                    console.log(e);
                } finally {
                    return { file: newestFile,  age:newestFileAge };
                }
            }
            
            async function chkDirNotEmpty(dir) {
                let files = await readdir(dir); 
                if ( files.length ){
                    return files[0];
                }
                return "";
            }
            
            async function chkDirTreeNotEmpty(dir) {
                let foundFile = '';
                try {
                    let files = [];
                    files = await readdir(dir);
            
                    for (let file of files) {
                        let fullpath = dir + '/' + file;
                        const s = await lstat(fullpath);
                        if (s.isFile()) {
                            foundFile = fullpath;
                            break;
                        } else {
                            let rc = await chkDirTreeNotEmpty(fullpath);
                            if (rc != "") {
                                foundFile = rc;
                                break;
                            }
                        }
                    }
            
                } catch (e) {
                    console.log(e);
                } finally {
                    return foundFile;
                }
            }
            
            /**
             * Executes a shell command and return it as a Promise.
             * @param cmd {string}
             * @return {Promise<string>}
             */
            function execShellCommand(cmd) {
                const exec = require('child_process').exec;
                return new Promise((resolve, reject) => {
                    exec(cmd, (error, stdout, stderr) => {
                        if (error) {
                            console.warn(error);
                        }
                        resolve(stdout ? stdout : stderr);
                    });
                });
            }
            
            async function checkBackup() {
                try {
                    //hier mount-Kommando
                    await execShellCommand(mountCmd);
                    
                    //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                    let file = await chkDirNotEmpty(mountDir);
                    
                    //Nach Files im Directory-Tree suchen (rekursiv)
                    //file = await chkDirTreeNotEmpty(mountDir);
                    if (file != "") {
                        console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                        // Mail abschicken
                        console.log('Send Mail');
            
                    }
                   
                    let result = await NewestFile(mountDir);
                    let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                    if (seconds > warnSeconds) {
                        console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                        // Mail abschicken
                        console.log('Send Mail');
                    }
            
                    //hier umount-Kommando
                    await execShellCommand(umountCmd);
                } catch (e) {
                    console.warn(e);
                }
            }
            
            // 22:30
            schedule('30 22 * * *', () => {
                checkBackup();
            });
            checkBackup();
            
            
            T 1 Antwort Letzte Antwort
            0
            • T tomily

              Hallo zusammen,

              hat jemand eine Idee, wie ich folgendes realisieren kann?

              Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
              In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

              Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

              Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

              Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

              Grüße

              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von
              #29

              @tomily sagte in Ordner auf neue Dateien überwachen:

              Hallo zusammen,

              hat jemand eine Idee, wie ich folgendes realisieren kann?

              Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
              In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

              Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

              Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

              Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

              Grüße

              Warum nimmst du nicht eine Standard Bibliothek von Node?
              Diese hat Cross Platform Support und funktioniert also für win linux und macos
              35 mio downloads pro Woche können nicht irren
              https://www.npmjs.com/package/chokidar

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              1 Antwort Letzte Antwort
              0
              • E ente34

                @tomily
                Das geht leider nicht. Ich habe das Script mal erweitert,
                Du musst chkDirNotEmpty() oder chkDirTreeNotEmpty() benutzen, je nachdem, ob Du ein einzelnes Directory oder rekursiv den ganzen Baum absuchen willst

                const fs = require('fs');
                const util = require('util');
                const readdir = util.promisify(fs.readdir);
                const stat = util.promisify(fs.stat);
                const lstat = util.promisify(fs.lstat);
                
                const mountDir = '/home/pi/mount';
                const nasDir = '//nas02/backup/raspi-iobroker/backitup';
                const mountCmd = `sudo mount -t cifs -o username=rsync,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                const umountCmd = `sudo umount ${nasDir}`;
                
                const warnSeconds = 5 * 86400;
                
                async function NewestFile(dir) {
                    let newestFileAge = 0;
                    let newestFile = '';
                    //console.log('### '+dir);
                    try {
                        let files = [];
                        files = await readdir(dir);
                
                
                        for (let file of files) {
                            let fullpath = dir + '/' + file;
                            const s = await lstat(fullpath);
                            if (s.isFile()) {
                                const stats = await stat(fullpath);
                                if (stats.mtimeMs > newestFileAge) {
                                    newestFileAge = stats.mtimeMs;
                                    newestFile = file;
                                }
                            } else {
                                let values = await NewestFile(fullpath);
                                if (values.age > newestFileAge) {
                                    newestFileAge = values.age;
                                    newestFile = values.file;
                                }
                            }
                        }
                
                    } catch (e) {
                        console.log(e);
                    } finally {
                        return { file: newestFile,  age:newestFileAge };
                    }
                }
                
                async function chkDirNotEmpty(dir) {
                    let files = await readdir(dir); 
                    if ( files.length ){
                        return files[0];
                    }
                    return "";
                }
                
                async function chkDirTreeNotEmpty(dir) {
                    let foundFile = '';
                    try {
                        let files = [];
                        files = await readdir(dir);
                
                        for (let file of files) {
                            let fullpath = dir + '/' + file;
                            const s = await lstat(fullpath);
                            if (s.isFile()) {
                                foundFile = fullpath;
                                break;
                            } else {
                                let rc = await chkDirTreeNotEmpty(fullpath);
                                if (rc != "") {
                                    foundFile = rc;
                                    break;
                                }
                            }
                        }
                
                    } catch (e) {
                        console.log(e);
                    } finally {
                        return foundFile;
                    }
                }
                
                /**
                 * Executes a shell command and return it as a Promise.
                 * @param cmd {string}
                 * @return {Promise<string>}
                 */
                function execShellCommand(cmd) {
                    const exec = require('child_process').exec;
                    return new Promise((resolve, reject) => {
                        exec(cmd, (error, stdout, stderr) => {
                            if (error) {
                                console.warn(error);
                            }
                            resolve(stdout ? stdout : stderr);
                        });
                    });
                }
                
                async function checkBackup() {
                    try {
                        //hier mount-Kommando
                        await execShellCommand(mountCmd);
                        
                        //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                        let file = await chkDirNotEmpty(mountDir);
                        
                        //Nach Files im Directory-Tree suchen (rekursiv)
                        //file = await chkDirTreeNotEmpty(mountDir);
                        if (file != "") {
                            console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                            // Mail abschicken
                            console.log('Send Mail');
                
                        }
                       
                        let result = await NewestFile(mountDir);
                        let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                        if (seconds > warnSeconds) {
                            console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                            // Mail abschicken
                            console.log('Send Mail');
                        }
                
                        //hier umount-Kommando
                        await execShellCommand(umountCmd);
                    } catch (e) {
                        console.warn(e);
                    }
                }
                
                // 22:30
                schedule('30 22 * * *', () => {
                    checkBackup();
                });
                checkBackup();
                
                
                T Offline
                T Offline
                tomily
                schrieb am zuletzt editiert von
                #30

                @ente34 Servus,
                ich danke Dir für deine Mühe und bitte herzlichst um Entschuldigung für meine späte Rückmeldung. Bin in den letzten Tagen umgezogen und war leider komplett offline.

                Hatte die vorgehenden Scripte etwas umgebaut, damit ich die Email auf meine Bedürfnisse anpassen kann. Du wirst schnell sehen, dass ich überhaupt kein guter Skripter bin, aber es hat funktioniert.

                Bei der neuen Variante bekomme ich die Email, auch wenn KEINE Datei im Ordner ist.

                Die Prüfung auf das Dateialter wäre mir dem Fall egal. Kann ich das dann einfach raus nehmen?
                Ich möchte nur prüfen, OB Dateien da sind oder Nicht. Das Alter der Dateien spielt für mich keine Rolle, deshalb habe ich es auf 0 gesetzt.

                Habe ich nun selbst einen Fehler eingebaut, oder wieso kommt die Mail jedes mal? 🤦 🐶

                // Skript zur Überprüfung von LEEREN bzw. NICHT-LEEREN VERZEICHNISSEN
                
                //Threshold - Dauer in Tagen
                var thresholdDays = 0;
                // Variable für Dateialter in Tagen. Wird weiter unten benutzt.
                var fileageDays = 0;
                // Variable für Dateinamen. Wird weiter unten benutzt.
                var newestFileName = 0;
                // Variable für "Jobname"
                var jobname = "VerzeichnissPruefung";
                
                const fs = require('fs');
                const util = require('util');
                const readdir = util.promisify(fs.readdir);
                const stat = util.promisify(fs.stat);
                const lstat = util.promisify(fs.lstat);
                
                
                // Mountbefehl zusammensetzen
                const mountDir = '/mnt/backupchecktemp';
                const nasDir = '//IP/PFAD'
                const mountCmd = `sudo mount -t cifs -o username=USERNAME,password=PASSWORT,vers=1.0 ${nasDir} ${mountDir}`;
                const umountCmd = `sudo umount ${nasDir}`;
                
                const warnSeconds = thresholdDays * 86400;
                
                async function NewestFile(dir) {
                    let newestFileAge = 0;
                    let newestFile = '';
                    //console.log('### '+dir);
                    try {
                        let files = [];
                        files = await readdir(dir);
                 
                
                        for (let file of files) {
                            let fullpath = dir + '/' + file;
                            const s = await lstat(fullpath);
                            if (s.isFile()) {
                                const stats = await stat(fullpath);
                                if (stats.mtimeMs > newestFileAge) {
                                    newestFileAge = stats.mtimeMs;
                                    newestFile = file;
                                }
                            } else {
                                let values = await NewestFile(fullpath);
                                if (values.age > newestFileAge) {
                                    newestFileAge = values.age;
                                    newestFile = values.file;
                                }
                            }
                        }
                 
                
                    } catch (e) {
                        console.log(e);
                    } finally {
                        return { file: newestFile,  age:newestFileAge };
                    }
                }
                 
                
                async function chkDirNotEmpty(dir) {
                    let files = await readdir(dir); 
                    if ( files.length ){
                        return files[0];
                    }
                    return "";
                }
                 
                
                async function chkDirTreeNotEmpty(dir) {
                    let foundFile = '';
                    try {
                        let files = [];
                        files = await readdir(dir);
                 
                
                        for (let file of files) {
                            let fullpath = dir + '/' + file;
                            const s = await lstat(fullpath);
                            if (s.isFile()) {
                                foundFile = fullpath;
                                break;
                            } else {
                                let rc = await chkDirTreeNotEmpty(fullpath);
                                if (rc != "") {
                                    foundFile = rc;
                                    break;
                                }
                            }
                        }
                 
                
                    } catch (e) {
                        console.log(e);
                    } finally {
                        return foundFile;
                    }
                }
                
                
                
                /**
                 * Executes a shell command and return it as a Promise.
                 * @param cmd {string}
                 * @return {Promise<string>}
                 */
                
                function execShellCommand(cmd) {
                    const exec = require('child_process').exec;
                    return new Promise((resolve, reject) => {
                        exec(cmd, (error, stdout, stderr) => {
                            if (error) {
                                console.warn(error);
                            }
                            resolve(stdout ? stdout : stderr);
                        });
                    });
                }
                 
                
                async function checkBackup() {
                    try {
                        //hier mount-Kommando
                        await execShellCommand(mountCmd);
                      
                        //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                        //let file = await chkDirNotEmpty(mountDir);
                   
                        //Nach Files im Directory-Tree suchen (rekursiv)
                        //file = await chkDirTreeNotEmpty(mountDir);
                        //if (file != "") {
                        //    console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                            // Mail abschicken
                        //    console.log('Send Mail');
                        //}
                
                
                        let result = await NewestFile(mountDir);
                        let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                		// Dateialter in Tagen ausrechnen und in Variable übergeben
                        (fileageDays = (seconds / 86400))
                        newestFileName = result.file
                		if (seconds > warnSeconds) {
                            console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                            // Mail abschicken
                			console.log('Send Mail');
                			sendTo("email.0", "send", {
                				text: "Directorycheck: " + jobname + "\nLetzte Datei: " + newestFileName + " \nAlter der Datei: " + fileageDays.toFixed(1) + " Tage \nThreshold: " + thresholdDays + " Tage" + "\nVerzeichnis: " + nasDir,
                				to: 'monitoring@tomkeierleber.de',
                				subject: 'Monitoring // Neue Dateien gefunden: ' + jobname
                				});
                						
                        }
                
                
                        //hier umount-Kommando
                        await execShellCommand(umountCmd);
                    } catch (e) {
                        console.warn(e);
                    }
                }
                
                // Time scheduler
                schedule('05 16 * * *', () => {
                    checkBackup();
                });
                checkBackup();
                
                 
                
                
                E 1 Antwort Letzte Antwort
                0
                • T tomily

                  @ente34 Servus,
                  ich danke Dir für deine Mühe und bitte herzlichst um Entschuldigung für meine späte Rückmeldung. Bin in den letzten Tagen umgezogen und war leider komplett offline.

                  Hatte die vorgehenden Scripte etwas umgebaut, damit ich die Email auf meine Bedürfnisse anpassen kann. Du wirst schnell sehen, dass ich überhaupt kein guter Skripter bin, aber es hat funktioniert.

                  Bei der neuen Variante bekomme ich die Email, auch wenn KEINE Datei im Ordner ist.

                  Die Prüfung auf das Dateialter wäre mir dem Fall egal. Kann ich das dann einfach raus nehmen?
                  Ich möchte nur prüfen, OB Dateien da sind oder Nicht. Das Alter der Dateien spielt für mich keine Rolle, deshalb habe ich es auf 0 gesetzt.

                  Habe ich nun selbst einen Fehler eingebaut, oder wieso kommt die Mail jedes mal? 🤦 🐶

                  // Skript zur Überprüfung von LEEREN bzw. NICHT-LEEREN VERZEICHNISSEN
                  
                  //Threshold - Dauer in Tagen
                  var thresholdDays = 0;
                  // Variable für Dateialter in Tagen. Wird weiter unten benutzt.
                  var fileageDays = 0;
                  // Variable für Dateinamen. Wird weiter unten benutzt.
                  var newestFileName = 0;
                  // Variable für "Jobname"
                  var jobname = "VerzeichnissPruefung";
                  
                  const fs = require('fs');
                  const util = require('util');
                  const readdir = util.promisify(fs.readdir);
                  const stat = util.promisify(fs.stat);
                  const lstat = util.promisify(fs.lstat);
                  
                  
                  // Mountbefehl zusammensetzen
                  const mountDir = '/mnt/backupchecktemp';
                  const nasDir = '//IP/PFAD'
                  const mountCmd = `sudo mount -t cifs -o username=USERNAME,password=PASSWORT,vers=1.0 ${nasDir} ${mountDir}`;
                  const umountCmd = `sudo umount ${nasDir}`;
                  
                  const warnSeconds = thresholdDays * 86400;
                  
                  async function NewestFile(dir) {
                      let newestFileAge = 0;
                      let newestFile = '';
                      //console.log('### '+dir);
                      try {
                          let files = [];
                          files = await readdir(dir);
                   
                  
                          for (let file of files) {
                              let fullpath = dir + '/' + file;
                              const s = await lstat(fullpath);
                              if (s.isFile()) {
                                  const stats = await stat(fullpath);
                                  if (stats.mtimeMs > newestFileAge) {
                                      newestFileAge = stats.mtimeMs;
                                      newestFile = file;
                                  }
                              } else {
                                  let values = await NewestFile(fullpath);
                                  if (values.age > newestFileAge) {
                                      newestFileAge = values.age;
                                      newestFile = values.file;
                                  }
                              }
                          }
                   
                  
                      } catch (e) {
                          console.log(e);
                      } finally {
                          return { file: newestFile,  age:newestFileAge };
                      }
                  }
                   
                  
                  async function chkDirNotEmpty(dir) {
                      let files = await readdir(dir); 
                      if ( files.length ){
                          return files[0];
                      }
                      return "";
                  }
                   
                  
                  async function chkDirTreeNotEmpty(dir) {
                      let foundFile = '';
                      try {
                          let files = [];
                          files = await readdir(dir);
                   
                  
                          for (let file of files) {
                              let fullpath = dir + '/' + file;
                              const s = await lstat(fullpath);
                              if (s.isFile()) {
                                  foundFile = fullpath;
                                  break;
                              } else {
                                  let rc = await chkDirTreeNotEmpty(fullpath);
                                  if (rc != "") {
                                      foundFile = rc;
                                      break;
                                  }
                              }
                          }
                   
                  
                      } catch (e) {
                          console.log(e);
                      } finally {
                          return foundFile;
                      }
                  }
                  
                  
                  
                  /**
                   * Executes a shell command and return it as a Promise.
                   * @param cmd {string}
                   * @return {Promise<string>}
                   */
                  
                  function execShellCommand(cmd) {
                      const exec = require('child_process').exec;
                      return new Promise((resolve, reject) => {
                          exec(cmd, (error, stdout, stderr) => {
                              if (error) {
                                  console.warn(error);
                              }
                              resolve(stdout ? stdout : stderr);
                          });
                      });
                  }
                   
                  
                  async function checkBackup() {
                      try {
                          //hier mount-Kommando
                          await execShellCommand(mountCmd);
                        
                          //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                          //let file = await chkDirNotEmpty(mountDir);
                     
                          //Nach Files im Directory-Tree suchen (rekursiv)
                          //file = await chkDirTreeNotEmpty(mountDir);
                          //if (file != "") {
                          //    console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                              // Mail abschicken
                          //    console.log('Send Mail');
                          //}
                  
                  
                          let result = await NewestFile(mountDir);
                          let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                  		// Dateialter in Tagen ausrechnen und in Variable übergeben
                          (fileageDays = (seconds / 86400))
                          newestFileName = result.file
                  		if (seconds > warnSeconds) {
                              console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                              // Mail abschicken
                  			console.log('Send Mail');
                  			sendTo("email.0", "send", {
                  				text: "Directorycheck: " + jobname + "\nLetzte Datei: " + newestFileName + " \nAlter der Datei: " + fileageDays.toFixed(1) + " Tage \nThreshold: " + thresholdDays + " Tage" + "\nVerzeichnis: " + nasDir,
                  				to: 'monitoring@tomkeierleber.de',
                  				subject: 'Monitoring // Neue Dateien gefunden: ' + jobname
                  				});
                  						
                          }
                  
                  
                          //hier umount-Kommando
                          await execShellCommand(umountCmd);
                      } catch (e) {
                          console.warn(e);
                      }
                  }
                  
                  // Time scheduler
                  schedule('05 16 * * *', () => {
                      checkBackup();
                  });
                  checkBackup();
                  
                   
                  
                  
                  E Offline
                  E Offline
                  ente34
                  schrieb am zuletzt editiert von
                  #31

                  @tomily
                  Ich muss noch einmal nachfragen, wann möchtest Du bei der neuen Variante eine Nachricht bekommen?
                  Willst Du beide Varianten für verschiedene Directories gleichzeitig benutzen?

                  T 1 Antwort Letzte Antwort
                  0
                  • E ente34

                    @tomily
                    Ich muss noch einmal nachfragen, wann möchtest Du bei der neuen Variante eine Nachricht bekommen?
                    Willst Du beide Varianten für verschiedene Directories gleichzeitig benutzen?

                    T Offline
                    T Offline
                    tomily
                    schrieb am zuletzt editiert von
                    #32

                    @ente34 Dieser Anwendungsfall wäre:

                    Benachrichtigung, wenn Ordner NICHT Leer ist.

                    Es handelt sich also beispielsweise um ein Verzeichnis, das immer leer sein sollte. Sobald es nicht mehr leer ist (Inhalt y >= 1 Datei), dann wird die Benachrichtigung ausgelöst.

                    Keine Sorge, die anderen Skripte waren nicht um sonst und sind beide fleißig im Einsatz.
                    Beim Einsetzen und anpassen ist mir diese Anwendungsart noch eingefallen und wäre sehr hilfreich.

                    Grüße

                    E 1 Antwort Letzte Antwort
                    0
                    • T tomily

                      @ente34 Dieser Anwendungsfall wäre:

                      Benachrichtigung, wenn Ordner NICHT Leer ist.

                      Es handelt sich also beispielsweise um ein Verzeichnis, das immer leer sein sollte. Sobald es nicht mehr leer ist (Inhalt y >= 1 Datei), dann wird die Benachrichtigung ausgelöst.

                      Keine Sorge, die anderen Skripte waren nicht um sonst und sind beide fleißig im Einsatz.
                      Beim Einsetzen und anpassen ist mir diese Anwendungsart noch eingefallen und wäre sehr hilfreich.

                      Grüße

                      E Offline
                      E Offline
                      ente34
                      schrieb am zuletzt editiert von
                      #33

                      @tomily
                      Du musst nur folgendes einkommentieren (ev. anderen Pfad statt mountDir benutzen)

                              //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                              let file = await chkDirNotEmpty(mountDir);
                              if (file != "") {
                                  console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                  // Mail abschicken
                                  console.log('Send Mail');
                              }
                      
                      
                      T 1 Antwort Letzte Antwort
                      0
                      • E ente34

                        @tomily
                        Du musst nur folgendes einkommentieren (ev. anderen Pfad statt mountDir benutzen)

                                //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                let file = await chkDirNotEmpty(mountDir);
                                if (file != "") {
                                    console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                    // Mail abschicken
                                    console.log('Send Mail');
                                }
                        
                        
                        T Offline
                        T Offline
                        tomily
                        schrieb am zuletzt editiert von
                        #34

                        @ente34
                        GEIL!

                        GEIL! 🙂

                        Es ist manchmal so einfach. Habe den falschen Bereich auskommentiert, weil ich den Code nicht 100%ig verstanden hab.
                        Durch deine erneute und geduldige Hilfe bin ich erneut am Ziel 🙂

                        Mega cool....auch das funktioniert nun genau wie gewünscht 😃

                        Grüße
                        Tomily

                        1 Antwort Letzte Antwort
                        0
                        • AlCalzoneA AlCalzone

                          Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                          M Offline
                          M Offline
                          michihorn
                          schrieb am zuletzt editiert von
                          #35

                          @alcalzone sagte in Ordner auf neue Dateien überwachen:

                          Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                          Hast du ein Beispiel dazu, ich möchte gerne ein Verzeichnis auf meiner Fritzbox.NAS lesen können
                          Gruß
                          Michael

                          AlCalzoneA 1 Antwort Letzte Antwort
                          0
                          • M michihorn

                            @alcalzone sagte in Ordner auf neue Dateien überwachen:

                            Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                            Hast du ein Beispiel dazu, ich möchte gerne ein Verzeichnis auf meiner Fritzbox.NAS lesen können
                            Gruß
                            Michael

                            AlCalzoneA Offline
                            AlCalzoneA Offline
                            AlCalzone
                            Developer
                            schrieb am zuletzt editiert von
                            #36

                            @michihorn Öhh...

                            const fs = require("fs");
                            const mtime = fs.statSync("/pfad/des/verzeichnisses").mtime;
                            
                            if (mtime > /* Zeitstempel */) {
                              // reagieren
                            }
                            

                            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                            1 Antwort Letzte Antwort
                            0
                            • E ente34

                              @tomily

                              Ungefähr so
                              Du benötigst aber den neuesten javascript-Adapter 4.11.0

                              const fs = require('fs');
                              const util = require('util');
                              const readdir = util.promisify(fs.readdir);
                              const stat = util.promisify(fs.stat);
                              const lstat = util.promisify(fs.lstat);
                              
                              async function checkDir(dir) {
                                  let files = [];
                                  try {
                                      files = await readdir(dir);
                                     
                                      let newestFileAge = 0;
                                      let newestFile = '';
                              
                                      for (let file of files) {
                                          let fullpath = dir + '/' + file;
                                          const s = await lstat(fullpath);
                                          if (s.isFile()) {
                                              const stats = await stat(fullpath);
                                              if (stats.mtimeMs > newestFileAge) {
                                                  newestFileAge = stats.mtimeMs;
                                                  newestFile = file;
                                              }
                                          }
                                      }
                              
                                      let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                      console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                  } catch (e) {
                                      console.log(e);
                                  }
                              }
                              
                              checkDir('c:/temp');
                              
                              
                              A Offline
                              A Offline
                              abuzze
                              schrieb am zuletzt editiert von
                              #37

                              @ente34 sagte in Ordner auf neue Dateien überwachen:

                              @tomily

                              Ungefähr so
                              Du benötigst aber den neuesten javascript-Adapter 4.11.0

                              const fs = require('fs');
                              const util = require('util');
                              const readdir = util.promisify(fs.readdir);
                              const stat = util.promisify(fs.stat);
                              const lstat = util.promisify(fs.lstat);
                              
                              async function checkDir(dir) {
                                  let files = [];
                                  try {
                                      files = await readdir(dir);
                                     
                                      let newestFileAge = 0;
                                      let newestFile = '';
                              
                                      for (let file of files) {
                                          let fullpath = dir + '/' + file;
                                          const s = await lstat(fullpath);
                                          if (s.isFile()) {
                                              const stats = await stat(fullpath);
                                              if (stats.mtimeMs > newestFileAge) {
                                                  newestFileAge = stats.mtimeMs;
                                                  newestFile = file;
                                              }
                                          }
                                      }
                              
                                      let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                      console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                  } catch (e) {
                                      console.log(e);
                                  }
                              }
                              
                              checkDir('c:/temp');
                              
                              

                              Hallo in die Runde.
                              Ist schon ein bisschen älter das Thema aber ich habe dazu noch eine Frage.
                              Was muss ich an diesem Code ändern, damit ich auch Unterverzeichnisse auf neuste Dateien prüfen kann ?
                              Danke

                              1 Antwort Letzte Antwort
                              0
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              747

                              Online

                              32.4k

                              Benutzer

                              81.4k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Tags
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe