diff --git a/.env - Leer b/.env - Leer index 02b831f..1ef165d 100644 --- a/.env - Leer +++ b/.env - Leer @@ -1,4 +1,4 @@ -DEBUG=app,alarmManager,print,geocodeManager,calendar,fwvv,telegram,wss,database,httpsServer,appAPI +DEBUG=app,alarmManager,print,geocodeManager,calendar,fwvv,telegram,wss,database,httpsServer,appAPI,update # Um Änderungen zu übernehmen muss das Programm neu gestartet werden @@ -51,6 +51,15 @@ FOLDER_ARCHIVE=C:\Archiv # Telegram Bilder automatisch in Diashow ohne man. Freigabe (true/false) BOT_IMG_AUTOFREIGABE=true +# Pfad zu Tesseract (Raspberry: siehe 'which tesseract') +TESSERACT_PATH=C:/Program Files/Tesseract-OCR/tesseract.exe + +# Pfad zu Ghostscript (Raspberry: siehe 'which ghostscript') +GHOSTSCRIPT_PATH=C:/Program Files/gs/gs9.53.3/bin/gswin64c.exe + +# Fax Eingang Verzögerung (sek) (evtl bei Hylafax nötig ca. 30 ??) +FAX_INPUT_DELAY=0 + ######## STANDBY Bildschirm / Telegram Kalender ######## @@ -101,6 +110,12 @@ FWVV_DATENSICHERUNG= ######## DRUCKEN ######## +#Orginalfax Drucken (true/false) +FAX_DRUCK=false + +#Seitenzahl +FAX_DRUCK_SEITENZAHL=1 + #Alarmdruck (true/false) ALARMDRUCK=true diff --git a/README.md b/README.md index 0bffde7..75e604d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ -https://www.ghostscript.com/download/gsdnld.html -sudo apt-get install ghostscript - - -# FWMonitor +# FWMonitor Diese Software kann bei Feuerwehren dazu verwendet werden, die Informationen des Alarmfax auf einem Bildschirm darzustellen. Insbesondere werden die Informationen so aufbereitet, dass der Einsatzort auf einer Karte visualisiert wird. @@ -13,37 +9,37 @@ Die Faxauswertung ist derzeit auf die ILS Rosenheim abgestimmt (kann aber am Anf * Standby-Display mit Uhrzeit, Diashow, Kalender/Google Kalender, Verfügbarkeitsanzeige der Einsatzkräfte, DWD Warnungen * Alarm-Display - * Alle relevanten Infos aus dem Alarmfax - * Kartenanzeige - * Rückmeldungen der Einsatzkräfte + * Alle relevanten Infos aus dem Alarmfax + * Kartenanzeige + * Rückmeldungen der Einsatzkräfte * PDF-Display für Schulungspräsentationen etc. * Telegram Messenger - * Alarminfo (Einstellbar für verschiedene Personengruppen: Fax, Schlagwort, ...) - * Rückmeldungen zum Alarm - * Kalender mit Terminerinnerungen (Einstellbar für verschiedene Personengruppen) - * Verfügbarkeits Anzeige/Einstellung - * Einsatzstatistik - * Hydrantenposition eintragen + * Alarminfo (Einstellbar für verschiedene Personengruppen: Fax, Schlagwort, ...) + * Rückmeldungen zum Alarm + * Kalender mit Terminerinnerungen (Einstellbar für verschiedene Personengruppen) + * Verfügbarkeits Anzeige/Einstellung + * Einsatzstatistik + * Hydrantenposition eintragen * Installierbare WebApp für Android und IOS - * Alarminfo (Einstellbar für verschiedene Personengruppen: Fax, Schlagwort, ...) - * Rückmeldungen zum Alarm - * Kalender mit Terminerinnerungen (Einstellbar für verschiedene Personengruppen) - * Bearbeiten des Kalenders - * Verfügbarkeits Anzeige/Einstellung - * Verfügbarkeits Pläne (Wochentagsweise) - * Hydrantenkarte - * Einsatzstatistik - * Admin-Optionen - * Benutzereinstellungen - * Kalendergruppen - * Alarmgruppen - * Präsentationssteuerung + * Alarminfo (Einstellbar für verschiedene Personengruppen: Fax, Schlagwort, ...) + * Rückmeldungen zum Alarm + * Kalender mit Terminerinnerungen (Einstellbar für verschiedene Personengruppen) + * Bearbeiten des Kalenders + * Verfügbarkeits Anzeige/Einstellung + * Verfügbarkeits Pläne (Wochentagsweise) + * Hydrantenkarte + * Einsatzstatistik + * Admin-Optionen + * Benutzereinstellungen + * Kalendergruppen + * Alarmgruppen + * Präsentationssteuerung * Kartenausdruck * Adress-Koordinaten Suche über - * Bing - * Nominatim - * OSM Gebäudenamen - * Bahnübergänge + * Bing + * Nominatim + * OSM Gebäudenamen + * Bahnübergänge * Kalender mit Erinnerungen und Gruppen * Alarmdrucker Papierlevel-Warnung * ... @@ -53,27 +49,27 @@ Die Faxauswertung ist derzeit auf die ILS Rosenheim abgestimmt (kann aber am Anf Raspberry PI: - GIT installieren `sudo apt-get install git` - CUPS installieren siehe https://www.elektronik-kompendium.de/sites/raspberry-pi/2007081.htm - - `sudo apt-get install printer-driver-cups-pdf` - im Browser unter `127.0.0.1:631` CUPS konfigurieren (Login gleich wie Raspberry): - gewünschten Drucker als `Alarmdrucker` (Name) einrichten; PDF-Printer als `PDFPrint` (Name) einrichten - - https://wiki.ubuntuusers.de/CUPS-PDF/#ndern-des-Speicherorts - Archivordner einstellen (am besten als ganzer Pfad /home/pi/...) + gewünschten Drucker als `Alarmdrucker` (Name) einrichten; - NodeJS installiern siehe https://www.w3schools.com/nodejs/nodejs_raspberrypi.asp - Tesseract installieren `sudo apt-get install tesseract-ocr` (Test mit: `tesseract -v`) + - Ghostscript installieren `sudo apt-get install ghostscript` - `cd /home/pi/Desktop/` - Faxeingang über Fritzbox: siehe https://strobelstefan.org/?p=5405 und https://pypi.org/project/pdf2image/ und https://github.com/windele/alarmdisplay-ffw/blob/master/infos/Installation_auf_Raspberry_Pi.md - Faxeingang über USB Faxmodem: siehe https://wiki.ubuntuusers.de/HylaFAX/ - -Windows: - - Empfehlung: EM-OCR https://feuersoftware.com/forum/index.php?thread/2125-em-ocr-einsatzmonitor-pdf-tiff-txt-fax-konverter-mit-ordner%C3%BCberwachung/ +Windows: - NodeJS: https://nodejs.org/de/ - FoxitReader: https://www.foxitsoftware.com/de/pdf-reader/ - Git: https://git-scm.com/downloads + - Ghostscript: https://www.ghostscript.com/download/gsdnld.html + - Tesseract: https://digi.bib.uni-mannheim.de/tesseract/ + Bei Installation auswählen: Additional Language Data > German -Bei beiden: In Konsole (Windows: Rechtsklick - Git Bash here) sudo unter Windows evtl. nicht notwendig: - - `git clone https://github.com/Retschga/FWMonitor.git` +Bei beiden: In Konsole (Windows: Rechtsklick - Git Bash here) (sudo unter Windows evtl. nicht notwendig): + - Aktuelle Version Datei unter Releases herunterladen, extrahieren - `cd "FWMonitor"` - `sudo npm install --unsafe-perm` - `sudo npm i puppeteer` @@ -81,12 +77,14 @@ Bei beiden: In Konsole (Windows: Rechtsklick - Git Bash here) sudo unter Windows ## Update -- Einfach die Dateien nochmal herunterladen und die alten ersetzen -- .env (Ist-Stand) mit .env-leer (Soll-Stand) vergleichen, gegebenfalls Einträge hinzufügen/ändern/löschen -- Libraries updaten `npm install` -- Wenn nötig die verbundenen Geräte unter Einstellungen updaten -- Software neu starten + - Einfach die neue Version unter Releases herunterladen und die alten ersetzen (evtl. vorher Sicherungskopie anlegen) + - Achtung bei eigen veränderten Dateien, diese unter Umständen nicht überschreiben + - .env (Ist-Stand) mit .env-leer (Soll-Stand) vergleichen, gegebenfalls Einträge hinzufügen/ändern/löschen + - Libraries updaten `npm install` + - Wenn nötig die verbundenen Geräte unter Einstellungen updaten + - Software neu starten + ## Einstellungen Für den Server PC/Raspberry PI sollte eine feste IP-Adresse vergeben sein! @@ -118,13 +116,13 @@ Veränderte Einstellungen erfordern immer einen Software Neustart! - dann unten "Neue Freigabe", dann "MyFRITZ!-Freigabe" HTTPS-Server - Windows: - - https://certbot.eff.org/lets-encrypt/windows-other befolgen - - Cert und Key von C:\Certbot\live\ unter .env als "HTTPS_KEY" und "HTTPS_CERT" eintragen + - https://certbot.eff.org/lets-encrypt/windows-other befolgen + - Cert und Key von C:\Certbot\live\ unter .env als "HTTPS_KEY" und "HTTPS_CERT" eintragen - Raspberry Pi: - - `cd ~` - - `git clone https://github.com/letsencrypt/letsencrypt` - - `cd letsencrypt` - - `./letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN --redirect -m DEINE_MAIL --standalone` + - `cd ~` + - `git clone https://github.com/letsencrypt/letsencrypt` + - `cd letsencrypt` + - `./letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN --redirect -m DEINE_MAIL --standalone` - Alternativ zu MyFritz kann auch ein anderer DynDNS Dienst oder eine feste IP verwendet werden @@ -134,22 +132,23 @@ Veränderte Einstellungen erfordern immer einen Software Neustart! - Werte in .env unter "VAPID" eintragen - Auto Renew Let´s Encrypt - - Windows: Aufgabenplanung öffnen - - Eingache aufgabe erstellen (rechts) - - Name: certbot - - Wöchentlich - - Sonntag - - Programm Starten - - Programm/Skript: certbot - - Argumente hinzufügen: renew - - Raspberry Pi: `sudo crontab -e` - - `0 0 * * 0 ./letsencrypt-auto -d ERSTE_DOMAIN --redirect -m DEINE_MAIL --agree-tos --renew-by-default --standalone + - Windows: Aufgabenplanung öffnen + - Eingache aufgabe erstellen (rechts) + - Name: certbot + - Wöchentlich + - Sonntag + - Programm Starten + - Programm/Skript: certbot + - Argumente hinzufügen: renew + - Raspberry Pi: `sudo crontab -e` + - `0 0 * * 0 ./letsencrypt-auto -d ERSTE_DOMAIN --redirect -m DEINE_MAIL --agree-tos --renew-by-default --standalone ## Programmstart (manuell) In Konsole (Windows: Rechtsklick - Git Bash here): - - `node app` + - Windows: `start.bat` oder `./start.bat` + - Raspberry: `sudo ./start.sh` Nun im Webbrowser die IP-Adresse:8080 des Computers eingeben, auf dem FWmonitor läuft. (Herauszufinden in Konsole: Windows: ipconfig; Raspberry: ifconfig; Eigener PC: 127.0.0.1) @@ -158,22 +157,22 @@ Bsp: 192.168.2.153:8080 oder 127.0.0.1:8080 ## Autostart / Installation des Displays Raspberry: - - Benötigt min. Raspian buster - - `sudo apt-get update` - - `sudo apt-get upgrade` - - Server: - - `sudo crontab -e`; darin `@reboot PFAD_ZU_FWMONITOR/start.sh > /home/pi/Desktop/log.txt` hinzufügen - - Display: - IP_ADRESSE=IP Adresse des Servers, PORT=8080 außer wenn in .env geändert - - `wget IP_ADRESSE:PORT/scripts/installDisplay.sh` - - `sudo chmod +x installDisplay.sh` - - `sudo ./installDisplay.sh IP_ADRESSE:PORT CLIENT_NAME` + - Benötigt min. Raspian buster + - `sudo apt-get update` + - `sudo apt-get upgrade` + - Server: + - `sudo crontab -e`; darin `@reboot PFAD_ZU_FWMONITOR/start.sh > /home/pi/Desktop/log.txt` hinzufügen + - Display: + IP_ADRESSE=IP Adresse des Servers, PORT=8080 außer wenn in .env geändert + - `wget IP_ADRESSE:PORT/scripts/installDisplay.sh` + - `sudo chmod +x installDisplay.sh` + - `sudo ./installDisplay.sh IP_ADRESSE:PORT CLIENT_NAME` Windows: - - Server: - - unter `C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp` Verknüpfung zu start.bat erstellen - - Display: - - Um den Browser automatisch zu starten: siehe https://blog.moortaube.de/2017/02/21/google-chrome-im-fullscreen-%C3%B6ffnen/ + - Server: + - unter `C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp` Verknüpfung zu start.bat erstellen + - Display: + - Um den Browser automatisch zu starten: siehe https://blog.moortaube.de/2017/02/21/google-chrome-im-fullscreen-%C3%B6ffnen/ ## Benutzer hinzufügen Einfach dem erstellten Telegram-Bot /start schreiben. @@ -217,9 +216,9 @@ Bei Fragen oder Anregungen einfach in GitHub oben unter Issues ein Issue erstell * Bing Geocode * openstreetmap - https://www.openstreetmap.org/fixthemap * Hillshading - https://klokantech.github.io/dare-raster-tiles/hillshade/ -* Overpass - https://wiki.openstreetmap.org/wiki/DE:Overpass_API -* OpenFireMap - https://wiki.openstreetmap.org/wiki/DE:OpenFireMap -* Nominatim Geocode - https://nominatim.openstreetmap.org/ +* Overpass - https://wiki.openstreetmap.org/wiki/DE:Overpass_API +* OpenFireMap - https://wiki.openstreetmap.org/wiki/DE:OpenFireMap +* Nominatim Geocode - https://nominatim.openstreetmap.org/ * diff-match-patch - https://github.com/google/diff-match-patch * Diashow - https://gist.github.com/mhulse/66bcbb7099bb4beae530 * Python Timer - https://gist.github.com/aeroaks/ac4dbed9c184607a330c @@ -235,23 +234,23 @@ Bei Fragen oder Anregungen einfach in GitHub oben unter Issues ein Issue erstell | Router |-----| USB-Modem |-----| Raspberry PI |-----| Monitor | ---------- | ------------- | Server | ----------- ----------------------| Display | - | ----------- ---------------- + | ----------- ---------------- ----| Drucker | - ----------- + ----------- ------------ ------------------- ------------------------ ----------- | Fritzbox |-----| Win10 PC Server | ))) ((( | Raspberry PI Display |-----| Monitor | ------------ | ------------------- ------------------------ ----------- - | ----------- + | ----------- ----| Drucker | - ----------- + ----------- ------------ ------------------- ------------------------ ----------- | Fritzbox | ))) ((( | Win10 PC Server | ))) ((( | Raspberry PI Display |-----| Monitor | ------------ | ------------------- ------------------------ ----------- - | ----------- - ----| Drucker | - ----------- + | ----------- + ----| Drucker | + ----------- ``` ## Authors diff --git a/app.js b/app.js index 77e49fb..4cb1d88 100644 --- a/app.js +++ b/app.js @@ -14,6 +14,7 @@ var webNotifications = require('./webNotifications'); var printer = require('./printer')(); const calendar = require('./calendar')(); const startupCheck = require('./startupCheck')(); +const updateManager = require('./updateManager')(); // ---------------- Fehlerausgabe ---------------- process.on('uncaughtException', function (err) { @@ -29,6 +30,7 @@ var ignoreNextAlarm = false; var ignoreNextAlarm_min = 0; process.env.VERSION = "2.2.0"; +process.env.VERSION_REMOTE = ''; @@ -277,6 +279,9 @@ var checkInFolder = function() { if(status != lastStatus) { + // Telegram + _bot[0].sendSoftwareInfo("Eingangsordner Status: " + (status ? "Verbunden" : "Getrennt") + "!"); + // APP var zeigeBis = new Date(); zeigeBis.setTime(zeigeBis.getTime() + (60 * 60 * 1000)); @@ -299,8 +304,49 @@ var checkInFolder = function() { }, 60000 * 5 ); } +var checkForUpdate = async function() { + let infoSendt = false; + let check = async () => { + let ret = await updateManager.checkForUpdate(); + if(ret.availible == true) { + process.env.VERSION_REMOTE = ret.version; + console.log(); + console.log('UPDATE VERFÜGBAR:'); + console.log('Version: ' + ret.version); + console.log('Info:\n' + ret.text); + console.log(); + + if(infoSendt == false) { + infoSendt = true; + + // Telegram + _bot[0].sendSoftwareInfo("Update verfügbar! " + process.env.VERSION + ' -> ' + ret.version + '\n' + ret.text); + + // APP + var zeigeBis = new Date(); + zeigeBis.setTime(zeigeBis.getTime() + (60 * 60 * 1000)); + webNotifications.notify( + "Software Information", + "Update verfügbar! " + process.env.VERSION + ' -> ' + ret.version + '\n' + ret.text, + zeigeBis, + false, + new Date(), + zeigeBis, + false, + [], + ['softwareInfo'] + ); + } + } + } + let interval = setInterval(async () => { + check(); + }, 60000 *60 *24 ); + check(); +} + -async function main() { +async function main() { await startupCheck.check(); @@ -310,7 +356,7 @@ async function main() { console.log(''); // ---------------- PROGRAMMSTART ---------------- - await db.updateDatabase(); + await db.updateDatabase(); // ---------------- Module starten ---------------- _httpServer[0] = require('./httpServer')(_httpServer, _httpsServer, _bot, setIgnoreNextAlarm, getIgnoreNextAlarm); @@ -336,6 +382,9 @@ async function main() { global.startTime = new Date(); + // Update Check + await checkForUpdate(); + // ---------------- Verzeichnisüberwachung ---------------- diff --git a/database.js b/database.js index 5089894..55c9e0e 100644 --- a/database.js +++ b/database.js @@ -122,9 +122,11 @@ module.exports = function () { }; // ---- Statistik ---- - const getStatistik = async function () { - //return await dbQuery("SELECT einsatzstichwort, count(einsatzstichwort) AS number FROM alarms WHERE strftime('%Y', date) = strftime('%Y', DATE('now')) GROUP BY einsatzstichwort"); + const getStatistik = async function (year) { + if(!year) return await dbQuery("SELECT einsatzstichwort, count(einsatzstichwort) AS number FROM alarms WHERE strftime('%Y', date) = strftime('%Y', DATE('now')) GROUP BY einsatzstichwort ORDER BY number DESC"); + else + return await dbQuery("SELECT einsatzstichwort, count(einsatzstichwort) AS number FROM alarms WHERE strftime('%Y', date)=? GROUP BY einsatzstichwort ORDER BY number DESC", year); } const addStatistik = async function (aktion, user) { var now = new Date(); diff --git a/filesHTTPS/javascripts/appMain.js b/filesHTTPS/javascripts/appMain.js index ce24ac2..250e00d 100644 --- a/filesHTTPS/javascripts/appMain.js +++ b/filesHTTPS/javascripts/appMain.js @@ -756,18 +756,24 @@ async function kalenderFull_loadKalender() { // ---------------- STATISTIK ---------------- -async function statistik_loadStatistik() { +async function statistik_loadStatistik(year) { // Prüfe ob FWVV Anbindung aktiviert if(FWVV != 'true' && FWVV != true) { document.getElementById("statistik_fwvv").classList.add('hidden') } + + // Aktuelles Jahr eintragen + if(!year) + year = document.getElementById("statistik_selectedYear").innerHTML = new Date().getFullYear(); try { - let response = await fetchWithParam('app/api/statistik', {}); + let response = await fetchWithParam('app/api/statistik', {'year': year}); let eins = 0; + document.getElementById("statistik_list").innerHTML = ''; + for(let i = 0; i < response.length; i++) { eins += parseInt(response[i][0]); @@ -794,7 +800,7 @@ async function statistik_loadStatistik() { async function statistik_loadEinsatzzeit() { try { - let response = await fetchWithParam('app/api/einsatzzeit', {}); + let response = await fetchWithParam('app/api/einsatzzeit', {'year': document.getElementById("statistik_selectedYear").innerHTML}); document.getElementById("statistik_einsatzzeit").innerHTML = response.hour + ' Stunden ' + response.minute + ' Minuten (' + response.num + ' Einsätze)'; @@ -804,6 +810,18 @@ async function statistik_loadEinsatzzeit() { } } +function statistik_nextYear() { + let elemSelectedYear = document.getElementById("statistik_selectedYear"); + elemSelectedYear.innerHTML = parseInt(elemSelectedYear.innerHTML) + 1; + statistik_loadStatistik(elemSelectedYear.innerHTML); +} + +function statistik_prevYear() { + let elemSelectedYear = document.getElementById("statistik_selectedYear"); + elemSelectedYear.innerHTML = parseInt(elemSelectedYear.innerHTML) - 1; + statistik_loadStatistik(elemSelectedYear.innerHTML); +} + // ---------------- VERFUEGBARKEIT ---------------- @@ -1080,9 +1098,10 @@ async function benutzer_loadBenutzer() { '' + '
' + ''+alarmgruppen[response[i].group-1].name.replace(/\s/g, ' ')+'' + - (response[i].admin=='1' ? 'Admin' : '') + - (response[i].drucker=='1' ? 'Drucker' : '') + - (response[i].kalender=='1' ? 'Kalender' : '') + + (response[i].admin=='1' ? 'Admin' : '') + + (response[i].drucker=='1' ? 'Drucker' : '') + + (response[i].softwareInfo=='1' ? 'Softwareinfo' : '') + + (response[i].kalender=='1' ? 'Kalender' : '') + kalGrString + (response[i].status == '-1' ? '
Telegr. Bot blockiert ' : ' ') + (response[i].status == '-2' ? '
telegr. Benutzer gelöscht' : ' ') + diff --git a/filesHTTPS/statistik.html b/filesHTTPS/statistik.html index 05cb39a..21e6ea8 100644 --- a/filesHTTPS/statistik.html +++ b/filesHTTPS/statistik.html @@ -1,8 +1,13 @@
- +

Statistik

+
+   +   + +
diff --git a/fwvvAnbindung.js b/fwvvAnbindung.js index ca39c23..8f24504 100644 --- a/fwvvAnbindung.js +++ b/fwvvAnbindung.js @@ -81,7 +81,7 @@ module.exports = function () { * @param {String} name * @param {String} vorname */ - function getEinsatzZeit(name, vorname) { + function getEinsatzZeit(name, vorname, year) { return new Promise((resolve, reject) => { debug("Einsatzzeit: " + name + " " + vorname); @@ -107,8 +107,9 @@ module.exports = function () { const size = entry.vars.uncompressedSize; // There is also compressedSize; if (fileName === "E_PERSON.DBF") { var parser = Parser(entry); - var diesesJahr = new Date().getFullYear(); - + //var diesesJahr = new Date().getFullYear(); + let diesesJahr = year; + parser.on('header', (h) => { //debug('dBase file header has been parsed'); //debug(h); diff --git a/routes/appAPI.js b/routes/appAPI.js index 70764e9..af18a93 100644 --- a/routes/appAPI.js +++ b/routes/appAPI.js @@ -796,7 +796,13 @@ module.exports = function (_httpServer, _httpsServer, _bot, setIgnoreNextAlarm, // ---- Statistik ---- // get Statistik router.get('/api/statistik', async function (req, res) { - let rows = await db.getStatistik().catch((err) => { console.error('[appIndex] DB Fehler', err) }); + let year = req.query.year; + if (year == undefined) { + res.status(500).send({ error: 'No Params' }); + return; + } + + let rows = await db.getStatistik(year).catch((err) => { console.error('[appIndex] DB Fehler', err) }); if (rows == undefined) { res.send("Fehler"); return; @@ -824,9 +830,15 @@ module.exports = function (_httpServer, _httpsServer, _bot, setIgnoreNextAlarm, // get Einsatzzeit router.get('/api/einsatzzeit', async function (req, res) { + let year = req.query.year; + if (year == undefined) { + res.status(500).send({ error: 'No Params' }); + return; + } + let rows = await db.getUserByTelId(req.session.telegramID).catch((err) => { console.error('[appIndex] DB Fehler', err) }); - let zeit = await fwvv.getEinsatzZeit(rows[0].name, rows[0].vorname) + let zeit = await fwvv.getEinsatzZeit(rows[0].name, rows[0].vorname, year) .then((arr) => { res.json({ hour: Math.floor(arr[0] / 60), minute: (arr[0] % 60), num: arr[1] }); @@ -916,7 +928,7 @@ module.exports = function (_httpServer, _httpsServer, _bot, setIgnoreNextAlarm, ret.push({"id": "-1", "type": `{"type":"MainSoftware", "name":"FWmonitor - Haupt Software", - "info":"Version ${process.env.VERSION}", + "info":"v${process.env.VERSION} ${process.env.VERSION != process.env.VERSION_REMOTE ? '(v'+process.env.VERSION_REMOTE+' Verfügbar)' : ''}", "actions":[{"id": "7"}, {"id": "-1", "key": "Startzeit", "value": "${startTime}"}]}` }); diff --git a/telegramBot.js b/telegramBot.js index 1d384e1..5c8edba 100644 --- a/telegramBot.js +++ b/telegramBot.js @@ -1378,6 +1378,29 @@ _${st_nichtverf}_`, } } + // ---------------- Softwareinfo ---------------- + async function sendSoftwareInfo(infotext) { + debug('sendSoftwareInfo', infotext); + try { + + let rows = await db.getUserAllowed(); + + rows.forEach((element) => { + if (element.softwareInfo == 1) { + sendMessage( + element.telegramid, + '*Software Info:* \n _' + infotext + '_', + Telegraf.Extra.markdown() + ); + } + }); + + } catch (error) { + console.error('[TelegramBot] sendPapierInfo() Fehler', error); + } + } + + // ---------------- Starte Bot ---------------- bot.startPolling(); @@ -1391,7 +1414,8 @@ _${st_nichtverf}_`, removeUser, sendMsgToAll, sendPapierInfo, - sendMessage + sendMessage, + sendSoftwareInfo }; } diff --git a/updateManager.js b/updateManager.js new file mode 100644 index 0000000..8b7044a --- /dev/null +++ b/updateManager.js @@ -0,0 +1,46 @@ +'use strict'; + +// Modul Drucken +module.exports = function () { + + // ---------------- LIBRARIES ---------------- + const debug = require('debug')('update'); + const axios = require('axios') + + /** + * Gibt die aktuelle Version auf Github zurück + */ + async function getRemoteVersion() { + try { + const response = await axios.get('https://api.github.com/repos/retschga/fwmonitor/releases/latest'); + debug('Aktuelle Version: ' + response['data']['tag_name']); + debug('Info:\n' + response['data']['body']); + return {'version': response['data']['tag_name'], 'text': response['data']['body']}; + } catch (error) { + console.error(error); + return undefined; + } + } + + /** + * Vergleicht die installierte Version mit der aktuellen Version auf Github + */ + async function checkForUpdate() { + try { + const response = await getRemoteVersion(); + if(response != undefined && process.env.VERSION != response.version) { + return {'availible': true, 'version': response.version, 'text': response.text}; + } else { + return {'availible': false, 'version': '', 'text': ''}; + } + } catch (error) { + console.error(error); + return {'availible': false, 'version': '', 'text': ''}; + } + } + + + return { + checkForUpdate + }; +} \ No newline at end of file diff --git a/views/appWorker.ejs b/views/appWorker.ejs index 6b252fb..fd9c0ff 100644 --- a/views/appWorker.ejs +++ b/views/appWorker.ejs @@ -1,14 +1,14 @@ console.log('Loaded service worker!'); -const staticCacheName = 'pages-cache-Vers.-2021-01-30-006'; +const staticCacheName = 'pages-cache-Vers.-2021-02-10-001'; const filesToCache = [ // '/app/404.html', '/app/offline.html', // '/app/index.html', '/stylesheets/normalize.min.css', -// '/app/appClient.js', -// '/app/filesHTTPS/javascripts/appMain.js', + '/app/appClient.js', + '/app/filesHTTPS/javascripts/appMain.js', '/app/auto/index.html', '/app/filesHTTPS/javascripts/autoMain.js',