1
0
Fork 0
mirror of https://github.com/Ylianst/MeshCentral.git synced 2025-02-12 11:01:52 +00:00
This commit is contained in:
Volkan Özdemir 2022-01-24 13:16:43 +03:00
commit b635492c34
79 changed files with 6928 additions and 5301 deletions

1
.gitignore vendored
View file

@ -308,3 +308,4 @@ __pycache__/
*.btm.cs *.btm.cs
*.odx.cs *.odx.cs
*.xsd.cs *.xsd.cs
.DS_Store

15
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,15 @@
{
// Verwendet IntelliSense zum Ermitteln möglicher Attribute.
// Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen.
// Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

View file

@ -22,7 +22,6 @@
<ItemGroup> <ItemGroup>
<Compile Include="agents\meshcmd.js" /> <Compile Include="agents\meshcmd.js" />
<Compile Include="agents\meshcmd.min.js" /> <Compile Include="agents\meshcmd.min.js" />
<Compile Include="agents\meshcore-clean.js" />
<Compile Include="agents\meshcore.min.js" /> <Compile Include="agents\meshcore.min.js" />
<Compile Include="agents\meshinstall-linux.js" /> <Compile Include="agents\meshinstall-linux.js" />
<Compile Include="agents\modules_meshcmd\amt-apfclient.js" /> <Compile Include="agents\modules_meshcmd\amt-apfclient.js" />
@ -58,7 +57,6 @@
<Compile Include="agents\modules_meshcore\amt-mei.js" /> <Compile Include="agents\modules_meshcore\amt-mei.js" />
<Compile Include="agents\modules_meshcore\linux-dhcp.js" /> <Compile Include="agents\modules_meshcore\linux-dhcp.js" />
<Compile Include="agents\modules_meshcore\monitor-border.js" /> <Compile Include="agents\modules_meshcore\monitor-border.js" />
<Compile Include="agents\modules_meshcore\scripttask.js" />
<Compile Include="agents\modules_meshcore\smbios.js" /> <Compile Include="agents\modules_meshcore\smbios.js" />
<Compile Include="agents\modules_meshcore\sysinfo.js" /> <Compile Include="agents\modules_meshcore\sysinfo.js" />
<Compile Include="agents\modules_meshcore\util-agentlog.js" /> <Compile Include="agents\modules_meshcore\util-agentlog.js" />
@ -231,6 +229,7 @@
<Content Include="agents\MeshService64-signed.exe" /> <Content Include="agents\MeshService64-signed.exe" />
<Content Include="agents\MeshService64.exe" /> <Content Include="agents\MeshService64.exe" />
<Content Include="agents\MeshService64.pdb" /> <Content Include="agents\MeshService64.pdb" />
<Content Include="agents\modules_meshcore\coretranslations.json" />
<Content Include="CreateSourcePackage.bat" /> <Content Include="CreateSourcePackage.bat" />
<Content Include="emails\account-check.html" /> <Content Include="emails\account-check.html" />
<Content Include="emails\account-check.txt" /> <Content Include="emails\account-check.txt" />

Binary file not shown.

View file

@ -1,11 +1,11 @@
{ {
"en": { "en": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "New Agent Version", "agentVersion": "New Version",
"group": "Device Group", "group": "Device Group",
"url": "Server URL", "url": "Server URL",
"meshName": "Mesh Name", "meshName": "Mesh Name",
"meshId": "Mesh Identifier", "meshId": "Group Identifier",
"serverId": "Server Identifier", "serverId": "Server Identifier",
"setup": "Setup", "setup": "Setup",
"update": "Update", "update": "Update",
@ -14,12 +14,13 @@
"connect": "Connect", "connect": "Connect",
"disconnect": "Disconnect", "disconnect": "Disconnect",
"cancel": "Cancel", "cancel": "Cancel",
"close": "Close",
"pressok": "Press OK to disconnect", "pressok": "Press OK to disconnect",
"elevation": "Elevated permissions is required to install/uninstall the agent.", "elevation": "Elevated permissions are required to install/uninstall this software.",
"sudo": "Please try again with sudo.", "sudo": "Please try again with sudo.",
"ctrlc": "Press Ctrl-C to exit.", "ctrlc": "Press Ctrl-C to exit.",
"commands": "You can run the text version from the command line with the following command(s)", "commands": "You can run the text version from the command line with the following command(s)",
"graphicalerror": "The graphical version of this installer canot run on this system", "graphicalerror": "The graphical version of this installer cannot run on this system",
"zenity": "Try installing/updating Zenity, and run again", "zenity": "Try installing/updating Zenity, and run again",
"status": [ "status": [
"NOT INSTALLED", "NOT INSTALLED",
@ -27,15 +28,14 @@
"NOT RUNNING" "NOT RUNNING"
], ],
"statusDescription": "Current Agent Status", "statusDescription": "Current Agent Status",
"description": "Click the buttons below to install or uninstall the mesh agent. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator." "description": "Click the buttons below to install or uninstall this remote management software. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator."
}, },
"cs": { "cs": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Nová verze agenta",
"group": "Skupina zařízení", "group": "Skupina zařízení",
"url": "URL serveru", "url": "URL serveru",
"meshName": "Název oka", "meshName": "Název oka",
"meshId": "Identifikátor sítě", "meshId": "Identifikátor skupiny",
"serverId": "Identifikátor serveru", "serverId": "Identifikátor serveru",
"setup": "Založit", "setup": "Založit",
"update": "Aktualizace", "update": "Aktualizace",
@ -44,12 +44,11 @@
"connect": "Připojit", "connect": "Připojit",
"disconnect": "Odpojit", "disconnect": "Odpojit",
"cancel": "Storno", "cancel": "Storno",
"close": "Zavřít",
"pressok": "Stisknutím tlačítka OK se odpojíte", "pressok": "Stisknutím tlačítka OK se odpojíte",
"elevation": "K instalaci / odinstalování agenta je vyžadováno zvýšené oprávnění.",
"sudo": "Zkuste to prosím znovu s sudo.", "sudo": "Zkuste to prosím znovu s sudo.",
"ctrlc": "Ukončete stisknutím Ctrl-C.", "ctrlc": "Ukončete stisknutím Ctrl-C.",
"commands": "Textovou verzi můžete spustit z příkazového řádku pomocí následujících příkazů", "commands": "Textovou verzi můžete spustit z příkazového řádku pomocí následujících příkazů",
"graphicalerror": "V tomto systému nelze spustit grafickou verzi tohoto instalačního programu",
"zenity": "Zkuste nainstalovat / aktualizovat Zenity a spustit znovu", "zenity": "Zkuste nainstalovat / aktualizovat Zenity a spustit znovu",
"status": [ "status": [
"NENÍ INSTALOVÁN", "NENÍ INSTALOVÁN",
@ -57,15 +56,17 @@
"NEFUNGUJE" "NEFUNGUJE"
], ],
"statusDescription": "Aktuální stav agenta", "statusDescription": "Aktuální stav agenta",
"description": "Kliknutím na tlačítka níže nainstalujete nebo odinstalujete agenta sítě. Po instalaci je tento software spuštěn na pozadí, což umožňuje spravovat a ovládat tento počítač vzdáleným správcem." "agentVersion": "Nová verze",
"elevation": "K instalaci/odinstalaci tohoto softwaru jsou vyžadována zvýšená oprávnění.",
"graphicalerror": "Na tomto systému nelze spustit grafickou verzi tohoto instalačního programu",
"description": "Klepnutím na tlačítka níže nainstalujete nebo odinstalujete tento software pro vzdálenou správu. Když je tento software nainstalován, běží na pozadí, což umožňuje spravovat a ovládat tento počítač vzdáleným správcem."
}, },
"de": { "de": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Neue Agentenversion",
"group": "Gerätegruppe", "group": "Gerätegruppe",
"url": "Server-URL", "url": "Server-URL",
"meshName": "Maschenname", "meshName": "Maschenname",
"meshId": "Netzkennung", "meshId": "Gruppen-ID",
"serverId": "Server-ID", "serverId": "Server-ID",
"setup": "Konfiguration", "setup": "Konfiguration",
"update": "Updates", "update": "Updates",
@ -74,12 +75,11 @@
"connect": "Verbinden", "connect": "Verbinden",
"disconnect": "Trennen", "disconnect": "Trennen",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"close": "Schließen",
"pressok": "Drücken Sie OK, um die Verbindung zu trennen", "pressok": "Drücken Sie OK, um die Verbindung zu trennen",
"elevation": "Für die Installation / Deinstallation des Agenten sind erhöhte Berechtigungen erforderlich.",
"sudo": "Bitte versuchen Sie es erneut mit sudo.", "sudo": "Bitte versuchen Sie es erneut mit sudo.",
"ctrlc": "Drücken Sie Strg-C, um den Vorgang zu beenden.", "ctrlc": "Drücken Sie Strg-C, um den Vorgang zu beenden.",
"commands": "Sie können die Textversion über die Befehlszeile mit den folgenden Befehlen ausführen.", "commands": "Sie können die Textversion über die Befehlszeile mit den folgenden Befehlen ausführen.",
"graphicalerror": "Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden",
"zenity": "Versuchen Sie, Zenity zu installieren / zu aktualisieren, und führen Sie es erneut aus", "zenity": "Versuchen Sie, Zenity zu installieren / zu aktualisieren, und führen Sie es erneut aus",
"status": [ "status": [
"NICHT INSTALLIERT", "NICHT INSTALLIERT",
@ -87,15 +87,17 @@
"NICHT LAUFEN" "NICHT LAUFEN"
], ],
"statusDescription": "Aktueller Agentenstatus", "statusDescription": "Aktueller Agentenstatus",
"description": "Klicken Sie auf die Schaltflächen unten, um den Mesh Agent zu installieren oder zu deinstallieren. Bei der Installation wird diese Software im Hintergrund ausgeführt, sodass dieser Computer von einem Remote-Administrator verwaltet und gesteuert werden kann." "agentVersion": "Neue Version",
"elevation": "Zum Installieren/Deinstallieren dieser Software sind erhöhte Berechtigungen erforderlich.",
"graphicalerror": "Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden",
"description": "Klicken Sie auf die Schaltflächen unten, um diese Fernverwaltungssoftware zu installieren oder zu deinstallieren. Nach der Installation wird diese Software im Hintergrund ausgeführt, sodass dieser Computer von einem entfernten Administrator verwaltet und gesteuert werden kann."
}, },
"es": { "es": {
"agent": "Agente", "agent": "Agente",
"agentVersion": "Nueva Versión del Agente",
"group": "Grupo de Dispositivos", "group": "Grupo de Dispositivos",
"url": "URL del servidor", "url": "URL del servidor",
"meshName": "Nombre de malla", "meshName": "Nombre de malla",
"meshId": "Identificador de malla", "meshId": "Identificador del Grupo",
"serverId": "Identificador de Servidor", "serverId": "Identificador de Servidor",
"setup": "Preparar", "setup": "Preparar",
"update": "Actualizar", "update": "Actualizar",
@ -104,12 +106,11 @@
"connect": "Conectar", "connect": "Conectar",
"disconnect": "Desconectar", "disconnect": "Desconectar",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Cerrar",
"pressok": "Presione OK para desconectar", "pressok": "Presione OK para desconectar",
"elevation": "Se requieren permisos elevados para instalar / desinstalar el agente.",
"sudo": "Vuelve a intentarlo con sudo.", "sudo": "Vuelve a intentarlo con sudo.",
"ctrlc": "Presione Ctrl-C para salir.", "ctrlc": "Presione Ctrl-C para salir.",
"commands": "Puedes ejecutar la versión de texto desde la línea de comandos con los siguientes comandos", "commands": "Puedes ejecutar la versión de texto desde la línea de comandos con los siguientes comandos",
"graphicalerror": "La versión gráfica de este instalador no se puede ejecutar en este sistema.",
"zenity": "Intenta instalar / actualizar Zenity y vuelve a ejecutar", "zenity": "Intenta instalar / actualizar Zenity y vuelve a ejecutar",
"status": [ "status": [
"NO INSTALADO", "NO INSTALADO",
@ -117,15 +118,17 @@
"NO EJECUTANDOSE" "NO EJECUTANDOSE"
], ],
"statusDescription": "Estado Actual del Agente", "statusDescription": "Estado Actual del Agente",
"description": "Haz clic en los botones a continuación para instalar o desinstalar el agente de malla. Cuando se instala, este software se ejecuta en segundo plano, lo que permite que este equipo sea administrado y controlado por un administrador remoto." "agentVersion": "Nueva versión",
"elevation": "Se requieren permisos elevados para instalar/desinstalar este software.",
"graphicalerror": "La versión gráfica de este instalador no puede ejecutarse en este sistema",
"description": "Haga clic en los botones a continuación para instalar o desinstalar este software de administración remota. Cuando se instala, este software se ejecuta en segundo plano, lo que permite que un administrador remoto administre y controle esta computadora."
}, },
"fi": { "fi": {
"agent": "Agentti", "agent": "Agentti",
"agentVersion": "Uusi agenttiversio",
"group": "Laiteryhmä", "group": "Laiteryhmä",
"url": "Palvelimen URL-osoite", "url": "Palvelimen URL-osoite",
"meshName": "Verkon nimi", "meshName": "Verkon nimi",
"meshId": "Verkon tunniste", "meshId": "Ryhmän tunniste",
"serverId": "Palvelimen tunniste", "serverId": "Palvelimen tunniste",
"setup": "Perustaa", "setup": "Perustaa",
"update": "Päivittää", "update": "Päivittää",
@ -134,12 +137,11 @@
"connect": "Yhdistä", "connect": "Yhdistä",
"disconnect": "Katkaise yhteys", "disconnect": "Katkaise yhteys",
"cancel": "Peruuta", "cancel": "Peruuta",
"close": "Sulje",
"pressok": "Katkaise yhteys painamalla OK", "pressok": "Katkaise yhteys painamalla OK",
"elevation": "Agentin asentaminen / poistaminen edellyttää korotettuja käyttöoikeuksia.",
"sudo": "Yritä uudelleen sudolla.", "sudo": "Yritä uudelleen sudolla.",
"ctrlc": "Poistu painamalla Ctrl-C.", "ctrlc": "Poistu painamalla Ctrl-C.",
"commands": "Voit suorittaa tekstiversio komentoriviltä seuraavilla komennoilla", "commands": "Voit suorittaa tekstiversio komentoriviltä seuraavilla komennoilla",
"graphicalerror": "Tämän asennusohjelman graafinen versio ei toimi tässä järjestelmässä",
"zenity": "Yritä asentaa / päivittää Zenity ja suorita uudelleen", "zenity": "Yritä asentaa / päivittää Zenity ja suorita uudelleen",
"status": [ "status": [
"EI ASENNETTU", "EI ASENNETTU",
@ -147,15 +149,17 @@
"EI RUNNING" "EI RUNNING"
], ],
"statusDescription": "Agentin nykyinen tila", "statusDescription": "Agentin nykyinen tila",
"description": "Napsauta alla olevia painikkeita asentaaksesi tai poistaaksesi verkkoagentin. Asennettuna tämä ohjelmisto toimii taustalla, jolloin etävalvoja hallitsee ja hallitsee tietokonetta." "agentVersion": "Uusi versio",
"elevation": "Tämän ohjelmiston asentaminen/asennuksen poistaminen edellyttää korotettuja käyttöoikeuksia.",
"graphicalerror": "Tämän asennusohjelman graafista versiota ei voi käyttää tässä järjestelmässä",
"description": "Napsauta alla olevia painikkeita asentaaksesi tai poistaaksesi tämän etähallintaohjelmiston. Kun ohjelmisto on asennettu, se toimii taustalla, jolloin etäjärjestelmänvalvoja voi hallita ja ohjata tätä tietokonetta."
}, },
"fr": { "fr": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Nouvelle version de l'agent",
"group": "Groupe d'appareils", "group": "Groupe d'appareils",
"url": "URL du serveur", "url": "URL du serveur",
"meshName": "Nom du maillage", "meshName": "Nom du maillage",
"meshId": "Identificateur de maillage", "meshId": "Identifiant de groupe",
"serverId": "Identifiant du serveur", "serverId": "Identifiant du serveur",
"setup": "Configuration", "setup": "Configuration",
"update": "Mettre à jour", "update": "Mettre à jour",
@ -164,12 +168,11 @@
"connect": "Se connecter", "connect": "Se connecter",
"disconnect": "Déconnecter", "disconnect": "Déconnecter",
"cancel": "Annuler", "cancel": "Annuler",
"close": "Fermer",
"pressok": "Appuyez sur OK pour vous déconnecter", "pressok": "Appuyez sur OK pour vous déconnecter",
"elevation": "Des autorisations élevées sont requises pour installer / désinstaller l'agent.",
"sudo": "Veuillez réessayer avec sudo.", "sudo": "Veuillez réessayer avec sudo.",
"ctrlc": "Appuyez sur Ctrl-C pour quitter.", "ctrlc": "Appuyez sur Ctrl-C pour quitter.",
"commands": "Vous pouvez exécuter la version texte à partir de la ligne de commande avec la ou les commandes suivantes", "commands": "Vous pouvez exécuter la version texte à partir de la ligne de commande avec la ou les commandes suivantes",
"graphicalerror": "La version graphique de ce programme d'installation ne peut pas s'exécuter sur ce système",
"zenity": "Essayez d'installer / mettre à jour Zenity et réexécutez", "zenity": "Essayez d'installer / mettre à jour Zenity et réexécutez",
"status": [ "status": [
"PAS INSTALLÉ", "PAS INSTALLÉ",
@ -177,15 +180,17 @@
"NE PAS COURRIR" "NE PAS COURRIR"
], ],
"statusDescription": "Statut actuel de l'agent", "statusDescription": "Statut actuel de l'agent",
"description": "Cliquez sur les boutons ci-dessous pour installer ou désinstaller l'agent de maillage. Une fois installé, ce logiciel s'exécute en arrière-plan permettant à cet ordinateur d'être géré et contrôlé par un administrateur distant." "agentVersion": "Nouvelle version",
"elevation": "Des autorisations élevées sont requises pour installer/désinstaller ce logiciel.",
"graphicalerror": "La version graphique de ce programme d'installation ne peut pas s'exécuter sur ce système",
"description": "Cliquez sur les boutons ci-dessous pour installer ou désinstaller ce logiciel de gestion à distance. Une fois installé, ce logiciel s'exécute en arrière-plan, ce qui permet à cet ordinateur d'être géré et contrôlé par un administrateur distant."
}, },
"hi": { "hi": {
"agent": "एजेंट", "agent": "एजेंट",
"agentVersion": "नया एजेंट संस्करण",
"group": "डिवाइस समूह", "group": "डिवाइस समूह",
"url": "सर्वर URL", "url": "सर्वर URL",
"meshName": "मेष नाम", "meshName": "मेष नाम",
"meshId": "मेष पहचानकर्ता", "meshId": "समूह पहचानकर्ता",
"serverId": "सर्वर पहचानकर्ता", "serverId": "सर्वर पहचानकर्ता",
"setup": "सेट अप", "setup": "सेट अप",
"update": "अपडेट करें", "update": "अपडेट करें",
@ -194,12 +199,11 @@
"connect": "जुडिये", "connect": "जुडिये",
"disconnect": "डिस्कनेक्ट", "disconnect": "डिस्कनेक्ट",
"cancel": "रद्द करना", "cancel": "रद्द करना",
"close": "बंद करे",
"pressok": "डिस्कनेक्ट करने के लिए ओके दबाएं", "pressok": "डिस्कनेक्ट करने के लिए ओके दबाएं",
"elevation": "एजेंट को इंस्टॉल / अनइंस्टॉल करने के लिए एलिवेटेड परमिशन की जरूरत होती है।",
"sudo": "कृपया सूडो के साथ फिर से प्रयास करें।", "sudo": "कृपया सूडो के साथ फिर से प्रयास करें।",
"ctrlc": "बाहर निकलने के लिए Ctrl-C दबाएं।", "ctrlc": "बाहर निकलने के लिए Ctrl-C दबाएं।",
"commands": "आप निम्न कमांड के साथ कमांड लाइन से टेक्स्ट संस्करण चला सकते हैं", "commands": "आप निम्न कमांड के साथ कमांड लाइन से टेक्स्ट संस्करण चला सकते हैं",
"graphicalerror": "इस इंस्टॉलर का आलेखीय संस्करण इस सिस्टम पर चलता है",
"zenity": "ज़ेनिटी को स्थापित / अपडेट करने का प्रयास करें, और फिर से चलाएं", "zenity": "ज़ेनिटी को स्थापित / अपडेट करने का प्रयास करें, और फिर से चलाएं",
"status": [ "status": [
"स्थापित नहीं है", "स्थापित नहीं है",
@ -207,15 +211,17 @@
"चल नहीं रहा" "चल नहीं रहा"
], ],
"statusDescription": "वर्तमान एजेंट की स्थिति", "statusDescription": "वर्तमान एजेंट की स्थिति",
"description": "मेष एजेंट को स्थापित या अनइंस्टॉल करने के लिए नीचे दिए गए बटन पर क्लिक करें। स्थापित होने पर, यह सॉफ़्टवेयर पृष्ठभूमि में चलता है, जिससे यह कंप्यूटर दूरस्थ व्यवस्थापक द्वारा प्रबंधित और नियंत्रित किया जा सकता है।" "agentVersion": "नया संस्करण",
"elevation": "इस सॉफ़्टवेयर को स्थापित/अनइंस्टॉल करने के लिए उन्नत अनुमतियों की आवश्यकता होती है।",
"graphicalerror": "इस इंस्टालर का आलेखीय संस्करण इस सिस्टम पर नहीं चल सकता",
"description": "इस दूरस्थ प्रबंधन सॉफ़्टवेयर को स्थापित या अनइंस्टॉल करने के लिए नीचे दिए गए बटनों पर क्लिक करें। स्थापित होने पर, यह सॉफ़्टवेयर पृष्ठभूमि में चलता है जिससे इस कंप्यूटर को दूरस्थ व्यवस्थापक द्वारा प्रबंधित और नियंत्रित किया जा सकता है।"
}, },
"it": { "it": {
"agent": "Agente", "agent": "Agente",
"agentVersion": "Nuova versione dell'agente ",
"group": "Gruppo di dispositivi", "group": "Gruppo di dispositivi",
"url": "URL del server", "url": "URL del server",
"meshName": "Nome mesh", "meshName": "Nome mesh",
"meshId": "Identificatore di mesh", "meshId": "Identificatore di gruppo",
"serverId": "Identificatore del server", "serverId": "Identificatore del server",
"setup": "Impostare", "setup": "Impostare",
"update": "Aggiornamenti", "update": "Aggiornamenti",
@ -224,12 +230,11 @@
"connect": "Connetti", "connect": "Connetti",
"disconnect": "Disconnetti", "disconnect": "Disconnetti",
"cancel": "Annulla", "cancel": "Annulla",
"close": "Chiudere",
"pressok": "Premi OK per disconnetterti", "pressok": "Premi OK per disconnetterti",
"elevation": "Sono necessarie autorizzazioni elevate per installare / disinstallare l'agente.",
"sudo": "Riprova con sudo.", "sudo": "Riprova con sudo.",
"ctrlc": "Premi Ctrl-C per uscire.", "ctrlc": "Premi Ctrl-C per uscire.",
"commands": "Puoi eseguire la versione testuale dalla riga di comando con i seguenti comandi ", "commands": "Puoi eseguire la versione testuale dalla riga di comando con i seguenti comandi ",
"graphicalerror": "La versione grafica di questo programma di installazione non può essere eseguita su questo sistema",
"zenity": "Prova a installare/aggiornare Zenity ed esegui di nuovo", "zenity": "Prova a installare/aggiornare Zenity ed esegui di nuovo",
"status": [ "status": [
"NON INSTALLATO", "NON INSTALLATO",
@ -237,15 +242,17 @@
"NON IN ESECUZIONE" "NON IN ESECUZIONE"
], ],
"statusDescription": "Stato attuale dell'agente", "statusDescription": "Stato attuale dell'agente",
"description": "Fare clic sui pulsanti sottostanti per installare o disinstallare l'agente mesh. Una volta installato, questo software viene eseguito in background consentendo a questo computer di essere gestito e controllato da un amministratore remoto." "agentVersion": "Nuova versione",
"elevation": "Per installare/disinstallare questo software sono necessarie autorizzazioni elevate.",
"graphicalerror": "La versione grafica di questo programma di installazione non può essere eseguita su questo sistema",
"description": "Fare clic sui pulsanti seguenti per installare o disinstallare questo software di gestione remota. Una volta installato, questo software viene eseguito in background consentendo a questo computer di essere gestito e controllato da un amministratore remoto."
}, },
"ja": { "ja": {
"agent": "エージェント", "agent": "エージェント",
"agentVersion": "新しいエージェントバージョン",
"group": "デバイスグループ", "group": "デバイスグループ",
"url": "サーバーのURL", "url": "サーバーのURL",
"meshName": "メッシュ名", "meshName": "メッシュ名",
"meshId": "メッシュ識別子", "meshId": "グループ識別子",
"serverId": "サーバー識別子", "serverId": "サーバー識別子",
"setup": "セットアップ", "setup": "セットアップ",
"update": "更新", "update": "更新",
@ -254,12 +261,11 @@
"connect": "つなぐ", "connect": "つなぐ",
"disconnect": "切断する", "disconnect": "切断する",
"cancel": "キャンセル", "cancel": "キャンセル",
"close": "閉じる",
"pressok": "OKを押して切断します", "pressok": "OKを押して切断します",
"elevation": "エージェントをインストール/アンインストールするには、昇格された権限が必要です。",
"sudo": "sudoでもう一度やり直してください。", "sudo": "sudoでもう一度やり直してください。",
"ctrlc": "Ctrl-Cを押して終了します。", "ctrlc": "Ctrl-Cを押して終了します。",
"commands": "次のコマンドを使用して、コマンドラインからテキストバージョンを実行できます。", "commands": "次のコマンドを使用して、コマンドラインからテキストバージョンを実行できます。",
"graphicalerror": "このインストーラーのグラフィカルバージョンは、このシステムでは実行できません",
"zenity": "Zenityをインストール/更新して、もう一度実行してください", "zenity": "Zenityをインストール/更新して、もう一度実行してください",
"status": [ "status": [
"インストールされていない", "インストールされていない",
@ -267,15 +273,17 @@
"走っていない" "走っていない"
], ],
"statusDescription": "現在のエージェントステータス", "statusDescription": "現在のエージェントステータス",
"description": "下のボタンをクリックして、メッシュエージェントをインストールまたはアンインストールします。インストールすると、このソフトウェアはバックグラウンドで実行され、リモート管理者がこのコンピューターを管理および制御できるようになります。" "agentVersion": "新しいバージョン",
"elevation": "このソフトウェアをインストール/アンインストールするには、昇格された権限が必要です。",
"graphicalerror": "このインストーラーのグラフィカルバージョンは、このシステムでは実行できません",
"description": "このリモート管理ソフトウェアをインストールまたはアンインストールするには、下のボタンをクリックしてください。インストールすると、このソフトウェアはバックグラウンドで実行され、リモート管理者がこのコンピューターを管理および制御できるようになります。"
}, },
"ko": { "ko": {
"agent": "에이전트", "agent": "에이전트",
"agentVersion": "새에이전트 버전",
"group": "장치 그룹", "group": "장치 그룹",
"url": "서버의 위치", "url": "서버의 위치",
"meshName": "메시의 이름", "meshName": "메시의 이름",
"meshId": "메시의 식별자", "meshId": "그룹 식별자",
"serverId": "서버의 식별자", "serverId": "서버의 식별자",
"setup": "설정하다", "setup": "설정하다",
"update": "개조하다", "update": "개조하다",
@ -284,28 +292,25 @@
"connect": "연결", "connect": "연결",
"disconnect": "연결 해제", "disconnect": "연결 해제",
"cancel": "취소", "cancel": "취소",
"close": "닫기",
"pressok": "연결을 끊으려면 \"OK\"를 누르십시오", "pressok": "연결을 끊으려면 \"OK\"를 누르십시오",
"elevation": "관리자 권한은 에이전트 제거 / 설치하는 데 필요",
"sudo": "\"sudo\"로 다시 시도하십시오", "sudo": "\"sudo\"로 다시 시도하십시오",
"ctrlc": "종료하려면 \"Ctrl-C\"를 누르십시오.", "ctrlc": "종료하려면 \"Ctrl-C\"를 누르십시오.",
"commands": "다음 명령을 사용하여 콘솔에서 텍스트 버전을 실행할 수 있습니다", "commands": "다음 명령을 사용하여 콘솔에서 텍스트 버전을 실행할 수 있습니다",
"graphicalerror": "이 설치 프로그램의 그래픽 버전은이 시스템에서 실행할 수 없습니다.",
"zenity": "\"Zenity\"를 설치 또는 업데이트하고 다시 시도하십시오", "zenity": "\"Zenity\"를 설치 또는 업데이트하고 다시 시도하십시오",
"status": [ "status": [
"없다", "없다",
"운영", "운영",
"중지됨" "중지됨"
], ],
"statusDescription": "에이전트 상태", "statusDescription": "에이전트 상태"
"description": "메시 에이전트를 설치 또는 제거하려면 아래 버튼을 클릭하십시오. 이 프로그램은 설치하면 백그라운드에서 실행되므로 원격 관리자가이 컴퓨터를 관리하고 제어 할 수 있습니다."
}, },
"nl": { "nl": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Nieuwe agent versie",
"group": "Apparaat groep", "group": "Apparaat groep",
"url": "Server URL", "url": "Server URL",
"meshName": "Mesh naam", "meshName": "Mesh naam",
"meshId": "Mesh identificatie", "meshId": "Groepsidentificatie",
"serverId": "Server identificatie", "serverId": "Server identificatie",
"setup": "Setup", "setup": "Setup",
"update": "Bijwerken", "update": "Bijwerken",
@ -314,12 +319,11 @@
"connect": "Verbinden", "connect": "Verbinden",
"disconnect": "Verbreken", "disconnect": "Verbreken",
"cancel": "Annuleren", "cancel": "Annuleren",
"close": "Sluiten",
"pressok": "Druk op OK om de verbinding te verbreken", "pressok": "Druk op OK om de verbinding te verbreken",
"elevation": "Verhoogde machtigingen zijn vereist om de agent te installeren / verwijderen.",
"sudo": "Probeer het opnieuw met sudo.", "sudo": "Probeer het opnieuw met sudo.",
"ctrlc": "Druk op Ctrl-C om af te sluiten.", "ctrlc": "Druk op Ctrl-C om af te sluiten.",
"commands": "U kunt de tekstversie vanaf de opdrachtregel uitvoeren met de volgende opdracht(en)", "commands": "U kunt de tekstversie vanaf de opdrachtregel uitvoeren met de volgende opdracht(en)",
"graphicalerror": "De grafische versie van dit installatieprogramma kan niet op dit systeem worden uitgevoerd",
"zenity": "Probeer Zenity te installeren / bij te werken en voer het opnieuw uit", "zenity": "Probeer Zenity te installeren / bij te werken en voer het opnieuw uit",
"status": [ "status": [
"NIET GEÏNSTALLEERD", "NIET GEÏNSTALLEERD",
@ -327,15 +331,17 @@
"NIET ACTIEF" "NIET ACTIEF"
], ],
"statusDescription": "Huidige agent status", "statusDescription": "Huidige agent status",
"description": "Klik op de onderstaande knoppen om de mesh-agent te installeren of te verwijderen. Na installatie wordt deze software op de achtergrond uitgevoerd, zodat deze computer kan worden beheerd en bestuurd door een externe beheerder." "agentVersion": "Nieuwe versie",
"elevation": "Verhoogde machtigingen zijn vereist om deze software te installeren/verwijderen.",
"graphicalerror": "De grafische versie van dit installatieprogramma kan niet op dit systeem draaien",
"description": "Klik op de onderstaande knoppen om deze software voor beheer op afstand te installeren of te verwijderen. Na installatie draait deze software op de achtergrond waardoor deze computer kan worden beheerd en gecontroleerd door een externe beheerder."
}, },
"pt": { "pt": {
"agent": "Agente", "agent": "Agente",
"agentVersion": "Nova versão do agente",
"group": "Grupo de dispositivos", "group": "Grupo de dispositivos",
"url": "URL do servidor", "url": "URL do servidor",
"meshName": "Nome da malha", "meshName": "Nome da malha",
"meshId": "Identificador de malha", "meshId": "Identificador de Grupo",
"serverId": "Identificador de Servidor", "serverId": "Identificador de Servidor",
"setup": "Configuração", "setup": "Configuração",
"update": "Atualizar", "update": "Atualizar",
@ -344,28 +350,25 @@
"connect": "Conectar", "connect": "Conectar",
"disconnect": "Desconectar", "disconnect": "Desconectar",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Fechar",
"pressok": "Pressione OK para desconectar", "pressok": "Pressione OK para desconectar",
"elevation": "Permissões elevadas são necessárias para instalar / desinstalar o agente.",
"sudo": "Por favor, tente novamente com sudo.", "sudo": "Por favor, tente novamente com sudo.",
"ctrlc": "Pressione Ctrl-C para sair.", "ctrlc": "Pressione Ctrl-C para sair.",
"commands": "Você pode executar a versão em texto a partir da linha de comando com o (s) seguinte (s) comando (s)", "commands": "Você pode executar a versão em texto a partir da linha de comando com o (s) seguinte (s) comando (s)",
"graphicalerror": "A versão gráfica deste instalador não pode ser executada neste sistema",
"zenity": "Tente instalar / atualizar o Zenity e execute novamente", "zenity": "Tente instalar / atualizar o Zenity e execute novamente",
"status": [ "status": [
"NÃO INSTALADO", "NÃO INSTALADO",
"CORRIDA", "CORRIDA",
"NÃO CORRENDO" "NÃO CORRENDO"
], ],
"statusDescription": "Status atual do agente", "statusDescription": "Status atual do agente"
"description": "Clique nos botões abaixo para instalar ou desinstalar o agente mesh. Quando instalado, este software é executado em segundo plano, permitindo que o computador seja gerenciado e controlado por um administrador remoto."
}, },
"ru": { "ru": {
"agent": "Агент", "agent": "Агент",
"agentVersion": "Новая версия агента",
"group": "Группа устройства", "group": "Группа устройства",
"url": "URL-адрес сервера", "url": "URL-адрес сервера",
"meshName": "Имя сетки", "meshName": "Имя сетки",
"meshId": "Идентификатор сетки", "meshId": "Идентификатор группы",
"serverId": "Идентификатор сервера", "serverId": "Идентификатор сервера",
"setup": "Настроить", "setup": "Настроить",
"update": "Обновить", "update": "Обновить",
@ -374,28 +377,25 @@
"connect": "Подключиться", "connect": "Подключиться",
"disconnect": "Разъединить", "disconnect": "Разъединить",
"cancel": "Отмена", "cancel": "Отмена",
"close": "Закрыть",
"pressok": "Нажмите ОК для отключения", "pressok": "Нажмите ОК для отключения",
"elevation": "Для установки / удаления агента требуются повышенные разрешения.",
"sudo": "Пожалуйста, попробуйте еще раз с помощью sudo.", "sudo": "Пожалуйста, попробуйте еще раз с помощью sudo.",
"ctrlc": "Нажмите Ctrl-C для выхода.", "ctrlc": "Нажмите Ctrl-C для выхода.",
"commands": "Вы можете запустить текстовую версию из командной строки с помощью следующих команд", "commands": "Вы можете запустить текстовую версию из командной строки с помощью следующих команд",
"graphicalerror": "Графическая версия этого установщика не может работать в этой системе.",
"zenity": "Попробуйте установить / обновить Zenity и снова запустить", "zenity": "Попробуйте установить / обновить Zenity и снова запустить",
"status": [ "status": [
"НЕ УСТАНОВЛЕНО", "НЕ УСТАНОВЛЕНО",
"ЗАПУЩЕН", "ЗАПУЩЕН",
"НЕ ЗАПУЩЕН" "НЕ ЗАПУЩЕН"
], ],
"statusDescription": "Текущий статус агента", "statusDescription": "Текущий статус агента"
"description": "Нажмите кнопки ниже, чтобы установить или удалить агент сетки. После установки это программное обеспечение работает в фоновом режиме, позволяя управлять этим компьютером удаленным администратором."
}, },
"sv": { "sv": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Ny agentversion",
"group": "Enhetsgrupp", "group": "Enhetsgrupp",
"url": "Serverns URL", "url": "Serverns URL",
"meshName": "Masknamn", "meshName": "Masknamn",
"meshId": "Mesh Identifier", "meshId": "Gruppidentifierare",
"serverId": "Serveridentifierare", "serverId": "Serveridentifierare",
"setup": "Uppstart", "setup": "Uppstart",
"update": "Uppdatering", "update": "Uppdatering",
@ -404,28 +404,25 @@
"connect": "Anslut", "connect": "Anslut",
"disconnect": "Koppla ifrån", "disconnect": "Koppla ifrån",
"cancel": "Avbryt", "cancel": "Avbryt",
"close": "Stäng",
"pressok": "Tryck på OK för att koppla bort", "pressok": "Tryck på OK för att koppla bort",
"elevation": "Förhöjda behörigheter krävs för att installera / avinstallera agenten.",
"sudo": "Försök igen med sudo.", "sudo": "Försök igen med sudo.",
"ctrlc": "Tryck på Ctrl-C för att avsluta.", "ctrlc": "Tryck på Ctrl-C för att avsluta.",
"commands": "Du kan köra textversionen från kommandoraden med följande kommando (er)", "commands": "Du kan köra textversionen från kommandoraden med följande kommando (er)",
"graphicalerror": "Den grafiska versionen av detta installationsprogram kan inte köras på detta system",
"zenity": "Försök att installera / uppdatera Zenity och kör igen", "zenity": "Försök att installera / uppdatera Zenity och kör igen",
"status": [ "status": [
"INTE INSTALLERAD", "INTE INSTALLERAD",
"LÖPNING", "LÖPNING",
"SPRINGER INTE" "SPRINGER INTE"
], ],
"statusDescription": "Aktuell agentstatus", "statusDescription": "Aktuell agentstatus"
"description": "Klicka på knapparna nedan för att installera eller avinstallera nätagenten. När den installeras körs denna programvara i bakgrunden så att den här datorn kan hanteras och styras av en fjärradministratör."
}, },
"tr": { "tr": {
"agent": "Ajan", "agent": "Ajan",
"agentVersion": "Yeni Temsilci Sürümü",
"group": "Cihaz Grubu", "group": "Cihaz Grubu",
"url": "Sunucu URL'si", "url": "Sunucu URL'si",
"meshName": "Mesh Adı", "meshName": "Mesh Adı",
"meshId": "Mesh Tanımlayıcı", "meshId": "Grup Tanımlayıcı",
"serverId": "Sunucu Tanımlayıcı", "serverId": "Sunucu Tanımlayıcı",
"setup": "Kurmak", "setup": "Kurmak",
"update": "Güncelleme", "update": "Güncelleme",
@ -433,29 +430,30 @@
"uninstall": "Kaldır", "uninstall": "Kaldır",
"connect": "Bağlan", "connect": "Bağlan",
"disconnect": "Bağlantıyı kes", "disconnect": "Bağlantıyı kes",
"cancel": "İptal etmek", "cancel": "İptal",
"close": "Kapat",
"pressok": "Bağlantıyı kesmek için Tamam'a basın", "pressok": "Bağlantıyı kesmek için Tamam'a basın",
"elevation": "Aracıyı yüklemek / kaldırmak için yükseltilmiş izinler gereklidir.",
"sudo": "Lütfen sudo ile tekrar deneyin.", "sudo": "Lütfen sudo ile tekrar deneyin.",
"ctrlc": ıkmak için Ctrl-C tuşlarına basın.", "ctrlc": ıkmak için Ctrl-C tuşlarına basın.",
"commands": "Metin sürümünü aşağıdaki komutlarla komut satırından çalıştırabilirsiniz.", "commands": "Metin sürümünü aşağıdaki komutlarla komut satırından çalıştırabilirsiniz.",
"graphicalerror": "Bu yükleyicinin grafik versiyonu bu sistemde çalışamaz",
"zenity": "Zenity'yi kurmayı / güncellemeyi deneyin ve tekrar çalıştırın", "zenity": "Zenity'yi kurmayı / güncellemeyi deneyin ve tekrar çalıştırın",
"status": [ "status": [
"YÜKLÜ DEĞİL", "YÜKLÜ DEĞİL",
"KOŞU", "KOŞU",
"KOŞMAK YOK" "KOŞMAK YOK"
], ],
"statusDescription": "Mevcut Temsilci Durumu", "statusDescription": "Mevcut Agent Durumu",
"description": "Mesh aracısını yüklemek veya kaldırmak için aşağıdaki düğmelere tıklayın. Bu yazılım yüklendiğinde arka planda çalışarak bu bilgisayarın bir uzak yönetici tarafından yönetilmesine ve kontrol edilmesine olanak tanır." "agentVersion": "Yeni sürüm",
"elevation": "Bu yazılımı yüklemek/kaldırmak için yüksek izinler gerekir.",
"graphicalerror": "Bu yükleyicinin grafik sürümü bu sistemde çalışamaz",
"description": "Bu uzaktan yönetim yazılımını yüklemek veya kaldırmak için aşağıdaki düğmelere tıklayın. Yüklendiğinde, bu yazılım arka planda çalışır ve bu bilgisayarın uzak bir yönetici tarafından yönetilmesine ve kontrol edilmesine olanak tanır."
}, },
"zh-chs": { "zh-chs": {
"agent": "代理", "agent": "代理",
"agentVersion": "新代理版本",
"group": "设备组", "group": "设备组",
"url": "服务器网址", "url": "服务器网址",
"meshName": "网格名称", "meshName": "网格名称",
"meshId": "网格标识符", "meshId": "标识符",
"serverId": "服务器标识符", "serverId": "服务器标识符",
"setup": "设定", "setup": "设定",
"update": "更新资料", "update": "更新资料",
@ -464,28 +462,25 @@
"connect": "连接", "connect": "连接",
"disconnect": "断线", "disconnect": "断线",
"cancel": "取消", "cancel": "取消",
"close": "关",
"pressok": "按确定断开连接", "pressok": "按确定断开连接",
"elevation": "安装/卸载代理需要提升的权限。",
"sudo": "请使用sudo再试一次。", "sudo": "请使用sudo再试一次。",
"ctrlc": "按Ctrl-C退出。", "ctrlc": "按Ctrl-C退出。",
"commands": "您可以使用以下命令从命令行运行文本版本", "commands": "您可以使用以下命令从命令行运行文本版本",
"graphicalerror": "此安装程序Canot的图形版本在此系统上运行",
"zenity": "尝试安装/更新Zenity然后再次运行", "zenity": "尝试安装/更新Zenity然后再次运行",
"status": [ "status": [
"未安装", "未安装",
"正在运行", "正在运行",
"不在运行" "不在运行"
], ],
"statusDescription": "当前代理状态", "statusDescription": "当前代理状态"
"description": "单击下面的按钮以安装或卸载网状代理。安装后,该软件将在后台运行,从而允许该计算机由远程管理员进行管理和控制。"
}, },
"zh-cht": { "zh-cht": {
"agent": "代理", "agent": "代理",
"agentVersion": "新代理版本",
"group": "裝置群", "group": "裝置群",
"url": "服務器網址", "url": "服務器網址",
"meshName": "網格名稱", "meshName": "網格名稱",
"meshId": "網格標識符", "meshId": "標識符",
"serverId": "服務器標識符", "serverId": "服務器標識符",
"setup": "設定", "setup": "設定",
"update": "更新資料", "update": "更新資料",
@ -494,28 +489,25 @@
"connect": "連接", "connect": "連接",
"disconnect": "斷線", "disconnect": "斷線",
"cancel": "取消", "cancel": "取消",
"close": "關",
"pressok": "按確定斷開連接", "pressok": "按確定斷開連接",
"elevation": "安裝/卸載代理需要提升的權限。",
"sudo": "請使用sudo再試一次。", "sudo": "請使用sudo再試一次。",
"ctrlc": "按Ctrl-C退出。", "ctrlc": "按Ctrl-C退出。",
"commands": "您可以使用以下命令從命令行運行文本版本", "commands": "您可以使用以下命令從命令行運行文本版本",
"graphicalerror": "此安裝程序Canot的圖形版本在此系統上運行",
"zenity": "嘗試安裝/更新Zenity然後再次運行", "zenity": "嘗試安裝/更新Zenity然後再次運行",
"status": [ "status": [
"未安裝", "未安裝",
"正在運行", "正在運行",
"不在運行" "不在運行"
], ],
"statusDescription": "當前代理狀態", "statusDescription": "當前代理狀態"
"description": "單擊下面的按鈕以安裝或卸載網狀代理。安裝後,該軟件將在後台運行,從而允許該計算機由遠程管理員進行管理和控制。"
}, },
"da": { "da": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Ny agentversion",
"group": "Enhedsgruppe", "group": "Enhedsgruppe",
"url": "Server URL", "url": "Server URL",
"meshName": "Mesh Navn", "meshName": "Mesh Navn",
"meshId": "Mesh Identifier", "meshId": "Gruppe-id",
"serverId": "Serveridentifikator", "serverId": "Serveridentifikator",
"setup": "Opsætning", "setup": "Opsætning",
"update": "Opdatering", "update": "Opdatering",
@ -524,12 +516,11 @@
"connect": "Forbind", "connect": "Forbind",
"disconnect": "Afbryd", "disconnect": "Afbryd",
"cancel": "Annuller", "cancel": "Annuller",
"close": "Luk",
"pressok": "Tryk på OK for at afbryde", "pressok": "Tryk på OK for at afbryde",
"elevation": "Elleverede tilladelser er påkrævet for at installere/afinstallere agenten.",
"sudo": "Prøv venligst igen med sudo.", "sudo": "Prøv venligst igen med sudo.",
"ctrlc": "Tryk på Ctrl-C for at afslutte.", "ctrlc": "Tryk på Ctrl-C for at afslutte.",
"commands": "Du kan køre tekstversionen fra kommandolinjen med følgende kommando(er)", "commands": "Du kan køre tekstversionen fra kommandolinjen med følgende kommando(er)",
"graphicalerror": "Den grafiske version af dette installationsprogram kan ikke køre på dette system",
"zenity": "Prøv at installere/opdatere Zenity, og kør igen", "zenity": "Prøv at installere/opdatere Zenity, og kør igen",
"status": [ "status": [
"IKKE INSTALLERET", "IKKE INSTALLERET",
@ -537,15 +528,17 @@
"KØRER IKKE" "KØRER IKKE"
], ],
"statusDescription": "Aktuel agentstatus", "statusDescription": "Aktuel agentstatus",
"description": "Klik på knapperne nedenfor for at installere eller afinstallere mesh-agenten. Når den er installeret, kører denne software i baggrunden, og tillader at denne computer kan administreres og kontrolleres af en fjernadministrator." "agentVersion": "Ny version",
"elevation": "Forhøjede tilladelser er nødvendige for at installere/afinstallere denne software.",
"graphicalerror": "Den grafiske version af dette installationsprogram kan ikke køre på dette system",
"description": "Klik på knapperne nedenfor for at installere eller afinstallere denne fjernstyringssoftware. Når den er installeret, kører denne software i baggrunden, så denne computer kan administreres og kontrolleres af en fjernadministrator."
}, },
"pl": { "pl": {
"agent": "Agent", "agent": "Agent",
"agentVersion": "Nowa Wersja Agenta",
"group": "Grupa Urządzeń", "group": "Grupa Urządzeń",
"url": "URL Serwera", "url": "URL Serwera",
"meshName": "Nazwa Sieci", "meshName": "Nazwa Sieci",
"meshId": "Identyfikator sieci", "meshId": "Identyfikator Grupy",
"serverId": "Identyfikator Serwera", "serverId": "Identyfikator Serwera",
"setup": "Konfiguracja", "setup": "Konfiguracja",
"update": "Aktualizacja", "update": "Aktualizacja",
@ -554,12 +547,11 @@
"connect": "Połącz", "connect": "Połącz",
"disconnect": "Rozłącz", "disconnect": "Rozłącz",
"cancel": "Anuluj", "cancel": "Anuluj",
"close": "Zamknij",
"pressok": "Naciśnij OK by się rozłączyć", "pressok": "Naciśnij OK by się rozłączyć",
"elevation": "Do zainstalowania/odinstalowania agenta wymagane są podwyższone uprawnienia.",
"sudo": "Proszę spróbować ponownie z sudo.", "sudo": "Proszę spróbować ponownie z sudo.",
"ctrlc": "Naciśnij Ctrl-C by wyjść.", "ctrlc": "Naciśnij Ctrl-C by wyjść.",
"commands": "Możesz uruchomić wersję tekstową z linii poleceń za pomocą następujących komend", "commands": "Możesz uruchomić wersję tekstową z linii poleceń za pomocą następujących komend",
"graphicalerror": "Graficzna wersja tego instalatora nie może być uruchomiona w tym systemie.",
"zenity": "Spróbuj zainstalować/zaktualizować Zenity i uruchom ponownie", "zenity": "Spróbuj zainstalować/zaktualizować Zenity i uruchom ponownie",
"status": [ "status": [
"NIE ZAINSTALOWANY", "NIE ZAINSTALOWANY",
@ -567,15 +559,17 @@
"NIE DZIAŁA" "NIE DZIAŁA"
], ],
"statusDescription": "Obecny Status Agenta", "statusDescription": "Obecny Status Agenta",
"description": "Kliknij poniższe przyciski, aby zainstalować lub odinstalować agenta. Po zainstalowaniu, to oprogramowanie działa w tle, umożliwiając zarządzanie i kontrolowanie tego komputera przez zdalnego administratora." "agentVersion": "Nowa Wersja",
"elevation": "Do zainstalowania/odinstalowania tego oprogramowania wymagane są podwyższone uprawnienia.",
"graphicalerror": "Graficzna wersja tego instalatora nie może być uruchomiona w tym systemie",
"description": "Kliknij poniższe przyciski, aby zainstalować lub odinstalować oprogramowanie zdalnego dostępu. Po zainstalowaniu, to oprogramowanie działa w tle, umożliwiając zarządzanie i kontrolowanie tego komputera przez zdalnego administratora."
}, },
"pt-br": { "pt-br": {
"agent": "Agente", "agent": "Agente",
"agentVersion": "Nova versão do agente",
"group": "Grupo de Dispositivos", "group": "Grupo de Dispositivos",
"url": "URL do servidor", "url": "URL do servidor",
"meshName": "Nome Mesh", "meshName": "Nome Mesh",
"meshId": "Identificador Mesh", "meshId": "Identificador de Grupo",
"serverId": "Identificador de Servidor", "serverId": "Identificador de Servidor",
"setup": "Configurar", "setup": "Configurar",
"update": "Atualizar", "update": "Atualizar",
@ -584,19 +578,17 @@
"connect": "Conectar", "connect": "Conectar",
"disconnect": "Desconectar", "disconnect": "Desconectar",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Fechar",
"pressok": "Pressione OK para desconectar", "pressok": "Pressione OK para desconectar",
"elevation": "Permissões elevadas são necessárias para instalar / desinstalar o agente.",
"sudo": "Por favor, tente novamente com sudo.", "sudo": "Por favor, tente novamente com sudo.",
"ctrlc": "Pressione Ctrl-C para sair.", "ctrlc": "Pressione Ctrl-C para sair.",
"commands": "Você pode executar a versão em texto a partir da linha de comando com o (s) seguinte (s) comando (s)", "commands": "Você pode executar a versão em texto a partir da linha de comando com o (s) seguinte (s) comando (s)",
"graphicalerror": "A versão gráfica deste instalador não pode ser executada neste sistema",
"zenity": "Tente instalar / atualizar o Zenity e execute novamente", "zenity": "Tente instalar / atualizar o Zenity e execute novamente",
"status": [ "status": [
"NÃO INSTALADO", "NÃO INSTALADO",
"Executando", "Executando",
"NÃO EXECUTANDO" "NÃO EXECUTANDO"
], ],
"statusDescription": "Status atual do agente", "statusDescription": "Status atual do agente"
"description": "Clique nos botões abaixo para instalar ou desinstalar o agente mesh. Quando instalado, este software é executado em segundo plano, permitindo que o computador seja gerenciado e controlado por um administrador remoto."
} }
} }

View file

@ -13,39 +13,99 @@
}, },
"cs": { "cs": {
"allow": "Dovolit", "allow": "Dovolit",
"deny": "Odmítnout" "deny": "Odmítnout",
"autoAllowForFive": "Automaticky přijímat všechna připojení na dalších 5 minut",
"terminalConsent": "{0} žádá o vzdálený terminálový přístup. Přístup povolen?",
"desktopConsent": "{0} žádá o přístup ke vzdálené ploše. Přístup povolen?",
"fileConsent": "{0} požaduje vzdálený přístup k souboru. Přístup povolen?",
"terminalNotify": "{0} zahájil relaci vzdáleného terminálu.",
"desktopNotify": "{0} zahájil relaci vzdálené plochy.",
"fileNotify": "{0} zahájil relaci vzdáleného souboru.",
"privacyBar": "Sdílení plochy s: {0}"
}, },
"de": { "de": {
"allow": "Erlauben", "allow": "Erlauben",
"deny": "Verweigern" "deny": "Verweigern",
"autoAllowForFive": "Alle Verbindungen für die nächsten 5 Minuten erlauben",
"terminalConsent": "{0} erbittet Fern-Terminalzugriff. Zugang erlauben?",
"desktopConsent": "{0} erbittet Fern-Desktopzugriff. Zugang erlauben?",
"fileConsent": "{0} erbittet Fern-Dateizugriff. Zugang erlauben?",
"terminalNotify": "{0} hat eine Fern-Terminalzugriff-Sitzung gestartet.",
"desktopNotify": "{0} hat eine Fern-Desktopzugriff-Sitzung gestartet.",
"fileNotify": "{0} hat eine Fern-Dateizugriff-Sitzung gestartet.",
"privacyBar": "Teile desktop mit: {0}"
}, },
"es": { "es": {
"allow": "Permitir", "allow": "Permitir",
"deny": "Negar" "deny": "Negar",
"autoAllowForFive": "Aceptar automáticamente todas las conexiones durante los próximos 5 minutos",
"terminalConsent": "{0} solicitando acceso a terminal remoto. ¿Autorizará el acceso?",
"desktopConsent": "{0} solicita acceso a escritorio remoto. ¿Autorizará el acceso?",
"fileConsent": "{0} solicita acceso remoto al archivo. ¿Autorizará el acceso?",
"terminalNotify": "{0} inició una sesión de terminal remota.",
"desktopNotify": "{0} inició una sesión de escritorio remoto.",
"fileNotify": "{0} inició una sesión de archivo remoto.",
"privacyBar": "Compartir escritorio con: {0}"
}, },
"fi": { "fi": {
"allow": "Sallia", "allow": "Sallia",
"deny": "Kieltää" "deny": "Kieltää",
"autoAllowForFive": "Hyväksy automaattisesti kaikki yhteydet seuraavan 5 minuutin ajan",
"terminalConsent": "{0} pyytää etäpäätteen käyttöoikeutta. Myönnetäänkö käyttöoikeus?",
"desktopConsent": "{0} pyytää etätyöpöytäkäyttöä. Myönnetäänkö käyttöoikeus?",
"fileConsent": "{0} pyytää etäkäyttöoikeutta tiedostoon. Myönnetäänkö käyttöoikeus?",
"terminalNotify": "{0} aloitti etäpääteistunnon.",
"desktopNotify": "{0} aloitti etätyöpöytäistunnon.",
"fileNotify": "{0} aloitti etätiedostoistunnon.",
"privacyBar": "Työpöytä jaetaan seuraavien kanssa: {0}"
}, },
"fr": { "fr": {
"allow": "Permettre", "allow": "Permettre",
"deny": "Refuser", "deny": "Refuser",
"autoAllowForFive": "Accepter automatiquement les connexions pendant les 5 prochaines minutes", "autoAllowForFive": "Accepter automatiquement les connexions pendant les 5 prochaines minutes",
"terminalConsent": "{0} demande(s) d'utilisation du terminal distant. Autoriser l'accès ?", "terminalConsent": "{0} demande(nt) d'utilisation du terminal à distance. Autoriser l'accès ?",
"desktopConsent": "{0} demande(s) d'utilisation du bureau distant. Autoriser l'accès ?", "desktopConsent": "{0} demande(nt) l'utilisation du bureau à distance. Autoriser l'accès ?",
"fileConsent": "{0} demande(s) d'accès à un fichier distant. Autoriser l'accès ?" "fileConsent": "{0} demande(nt) d'accès à un fichier à distance. Autoriser l'accès ?",
"terminalNotify": "{0} a démarré une session de terminal distant.",
"desktopNotify": "{0} a démarré une session de bureau à distance.",
"fileNotify": "{0} a démarré une session de fichiers à distance.",
"privacyBar": "Partage du bureau avec : {0}"
}, },
"hi": { "hi": {
"allow": "अनुमति", "allow": "अनुमति",
"deny": "मना" "deny": "मना",
"autoAllowForFive": "अगले 5 मिनट के लिए सभी कनेक्शन स्वतः स्वीकार करें",
"terminalConsent": "{0} दूरस्थ टर्मिनल पहुंच का अनुरोध कर रहा है। अनुदान पहुँच?",
"desktopConsent": "{0} दूरस्थ डेस्कटॉप पहुंच का अनुरोध कर रहा है। अनुदान पहुँच?",
"fileConsent": "{0} दूरस्थ फ़ाइल एक्सेस का अनुरोध करना। अनुदान पहुँच?",
"terminalNotify": "{0} ने दूरस्थ टर्मिनल सत्र प्रारंभ किया।",
"desktopNotify": "{0} ने दूरस्थ डेस्कटॉप सत्र प्रारंभ किया।",
"fileNotify": "{0} ने दूरस्थ फ़ाइल सत्र प्रारंभ किया।",
"privacyBar": "इसके साथ डेस्कटॉप साझा करना: {0}"
}, },
"it": { "it": {
"allow": "Permettere", "allow": "Permettere",
"deny": "Negare" "deny": "Negare",
"autoAllowForFive": "Accetta automaticamente tutte le connessioni per i prossimi 5 minuti",
"terminalConsent": "{0} che richiede l'accesso al terminale remoto. Concedere l'accesso?",
"desktopConsent": "{0} che richiede l'accesso al desktop remoto. Concedere l'accesso?",
"fileConsent": "{0} che richiede l'accesso al file remoto. Concedere l'accesso?",
"terminalNotify": "{0} ha avviato una sessione di terminale remoto.",
"desktopNotify": "{0} ha avviato una sessione desktop remoto.",
"fileNotify": "{0} ha avviato una sessione di file remota.",
"privacyBar": "Condivisione del desktop con: {0}"
}, },
"ja": { "ja": {
"allow": "許可する", "allow": "許可する",
"deny": "拒否" "deny": "拒否",
"autoAllowForFive": "次の5分間はすべての接続を自動受け入れます",
"terminalConsent": "{0}リモート端末アクセスを要求しています。アクセス許可?",
"desktopConsent": "{0}リモートデスクトップアクセスを要求しています。アクセス許可?",
"fileConsent": "{0}リモートファイルアクセスを要求しています。アクセス許可?",
"terminalNotify": "{0}がリモートターミナルセッションを開始しました。",
"desktopNotify": "{0}はリモートデスクトップセッションを開始しました。",
"fileNotify": "{0}がリモートファイルセッションを開始しました。",
"privacyBar": "デスクトップの共有:{0}"
}, },
"ko": { "ko": {
"allow": "허용하다", "allow": "허용하다",
@ -57,7 +117,15 @@
}, },
"nl": { "nl": {
"allow": "Toestaan", "allow": "Toestaan",
"deny": "Weigeren" "deny": "Weigeren",
"autoAllowForFive": "Alle verbindingen automatisch accepteren voor de komende 5 minuten",
"terminalConsent": "{0} verzoekt om toegang tot externe terminal.Toegang verlenen?",
"desktopConsent": "{0} verzoekt om toegang tot extern bureaublad.Toegang verlenen?",
"fileConsent": "{0} verzoekt om externe bestandstoegang.Toegang verlenen?",
"terminalNotify": "{0} heeft een externe terminalsessie gestart.",
"desktopNotify": "{0} heeft een extern bureaubladsessie gestart.",
"fileNotify": "{0} heeft een externe bestandssessie gestart.",
"privacyBar": "Bureaublad delen met: {0}"
}, },
"pt": { "pt": {
"allow": "Permitir", "allow": "Permitir",
@ -73,7 +141,15 @@
}, },
"tr": { "tr": {
"allow": "İzin vermek", "allow": "İzin vermek",
"deny": "İnkar etmek" "deny": "İnkar etmek",
"autoAllowForFive": "Sonraki 5 dakika boyunca tüm bağlantıları otomatik olarak kabul et",
"terminalConsent": "{0} uzak terminal erişimi istiyor. Erişim izni veriyor musunuz?",
"desktopConsent": "{0} uzak masaüstü erişimi istiyor. Erişim izni veriyor musunuz?",
"fileConsent": "{0} uzak dosya Erişimi istiyor. Erişim izni veriyor musunuz?",
"terminalNotify": "{0} bir uzak terminal oturumu başlattı.",
"desktopNotify": "{0} bir uzak masaüstü oturumu başlattı.",
"fileNotify": "{0} bir uzak dosya oturumu başlattı.",
"privacyBar": "Masaüstünü şu kişilerle paylaşma: {0}"
}, },
"zh-chs": { "zh-chs": {
"allow": "允许", "allow": "允许",
@ -81,11 +157,27 @@
}, },
"da": { "da": {
"allow": "Tillad", "allow": "Tillad",
"deny": "Afslå" "deny": "Afslå",
"autoAllowForFive": "Accepter automatisk alle forbindelser i de næste 5 minutter",
"terminalConsent": "{0} anmoder om ekstern terminaladgang. Give adgang?",
"desktopConsent": "{0} anmoder om fjernskrivebordsadgang. Give adgang?",
"fileConsent": "{0} anmoder om fjernadgang til fil. Give adgang?",
"terminalNotify": "{0} startede en fjernterminalsession.",
"desktopNotify": "{0} startede en fjernskrivebordssession.",
"fileNotify": "{0} startede en ekstern filsession.",
"privacyBar": "Deler skrivebordet med: {0}"
}, },
"pl": { "pl": {
"allow": "Zezwól", "allow": "Zezwól",
"deny": "Odrzucono" "deny": "Odrzucono",
"autoAllowForFive": "Automatycznie akceptuj wszystkie połączenia przez następne 5 minut",
"terminalConsent": "{0} prosi o zdalny dostęp do terminala. Przyznać dostęp?",
"desktopConsent": "{0} prosi o zdalny dostęp do pulpitu. Przyznać dostęp?",
"fileConsent": "{0} prosi o zdalny dostęp do plików. Przyznać dostęp?",
"terminalNotify": "{0} rozpoczął sesję dostępu do terminala.",
"desktopNotify": "{0} rozpoczął sesję dostępu do pulpitu.",
"fileNotify": "{0} rozpoczął sesję dostępu do plików.",
"privacyBar": "Współdzielenie pulpitu z: {0}"
}, },
"pt-br": { "pt-br": {
"allow": "Permitir", "allow": "Permitir",

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Server IDER handler * @description MeshCentral Server IDER handler
* @author Ylian Saint-Hilaire & Bryan Roe * @author Ylian Saint-Hilaire & Bryan Roe
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel(R) AMT Event Parser * @description MeshCentral Intel(R) AMT Event Parser
* @author Ylian Saint-Hilaire & Bryan Roe * @author Ylian Saint-Hilaire & Bryan Roe
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel AMT manager * @description MeshCentral Intel AMT manager
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel AMT Hello server * @description MeshCentral Intel AMT Hello server
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel(R) AMT Local Scanner * @description MeshCentral Intel(R) AMT Local Scanner
* @author Ylian Saint-Hilaire & Joko Sastriawan * @author Ylian Saint-Hilaire & Joko Sastriawan
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @fileoverview Script Compiler / Decompiler / Runner * @fileoverview Script Compiler / Decompiler / Runner
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.1.0e * @version v0.1.0e
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral MSTSC & SSH relay * @description MeshCentral MSTSC & SSH relay
* @author Ylian Saint-Hilaire & Bryan Roe * @author Ylian Saint-Hilaire & Bryan Roe
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description Certificate generator * @description Certificate generator
* @author Joko Sastriawan / Ylian Saint-Hilaire * @author Joko Sastriawan / Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Common Library * @description MeshCentral Common Library
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

85
db.js
View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral database module * @description MeshCentral database module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.2 * @version v0.0.2
*/ */
@ -423,7 +423,16 @@ module.exports.CreateDB = function (parent, func) {
// Get the number of records in the database for various types, this is the slow NeDB way. // Get the number of records in the database for various types, this is the slow NeDB way.
// WARNING: This is a terrible query for database performance. Only do this when needed. This query will look at almost every document in the database. // WARNING: This is a terrible query for database performance. Only do this when needed. This query will look at almost every document in the database.
obj.getStats = function (func) { obj.getStats = function (func) {
if (obj.databaseType == 3) { if (obj.databaseType == 6) {
// PostgreSQL
// TODO
} else if (obj.databaseType == 5) {
// MySQL
// TODO
} else if (obj.databaseType == 4) {
// MariaDB
// TODO
} else if (obj.databaseType == 3) {
// MongoDB // MongoDB
obj.file.aggregate([{ "$group": { _id: "$type", count: { $sum: 1 } } }]).toArray(function (err, docs) { obj.file.aggregate([{ "$group": { _id: "$type", count: { $sum: 1 } } }]).toArray(function (err, docs) {
var counters = {}, totalCount = 0; var counters = {}, totalCount = 0;
@ -656,13 +665,13 @@ module.exports.CreateDB = function (parent, func) {
} else if (parent.args.mysql) { } else if (parent.args.mysql) {
// Use MySQL // Use MySQL
obj.databaseType = 5; obj.databaseType = 5;
var tempDatastore = require('mysql').createConnection(connectionObject); var tempDatastore = require('mysql').createPool(connectionObject);
tempDatastore.query('CREATE DATABASE IF NOT EXISTS ' + dbname, function (error) { tempDatastore.query('CREATE DATABASE IF NOT EXISTS ' + dbname, function (error) {
if (error != null) { if (error != null) {
console.log('Auto-create database failed: ' + error); console.log('Auto-create database failed: ' + error);
} }
connectionObject.database = dbname; connectionObject.database = dbname;
Datastore = require('mysql').createConnection(connectionObject); Datastore = require('mysql').createPool(connectionObject);
createTablesIfNotExist(dbname); createTablesIfNotExist(dbname);
}); });
setTimeout(function () { tempDatastore.end(); }, 2000); setTimeout(function () { tempDatastore.end(); }, 2000);
@ -677,32 +686,38 @@ module.exports.CreateDB = function (parent, func) {
const { Pool, Client } = require('pg'); const { Pool, Client } = require('pg');
connectinArgs.database = dbname; connectinArgs.database = dbname;
Datastore = new Client(connectinArgs); Datastore = new Client(connectinArgs);
Datastore.connect() Datastore.connect();
parent.debug('db', 'Checking tables...'); if (err == null) {
sqlDbBatchExec([ // Database was created, create the tables
'CREATE TABLE IF NOT EXISTS main (id VARCHAR(256) PRIMARY KEY NOT NULL, type CHAR(32), domain CHAR(64), extra CHAR(255), extraex CHAR(255), doc JSON)', parent.debug('db', 'Creating tables...');
'CREATE TABLE IF NOT EXISTS events(id SERIAL PRIMARY KEY, time TIMESTAMP, domain CHAR(64), action CHAR(255), nodeid CHAR(255), userid CHAR(255), doc JSON)', sqlDbBatchExec([
'CREATE TABLE IF NOT EXISTS eventids(fkid INT NOT NULL, target CHAR(255), CONSTRAINT fk_eventid FOREIGN KEY (fkid) REFERENCES events (id) ON DELETE CASCADE ON UPDATE RESTRICT)', 'CREATE TABLE IF NOT EXISTS main (id VARCHAR(256) PRIMARY KEY NOT NULL, type CHAR(32), domain CHAR(64), extra CHAR(255), extraex CHAR(255), doc JSON)',
'CREATE TABLE IF NOT EXISTS serverstats (time TIMESTAMP PRIMARY KEY, expire TIMESTAMP, doc JSON)', 'CREATE TABLE IF NOT EXISTS events(id SERIAL PRIMARY KEY, time TIMESTAMP, domain CHAR(64), action CHAR(255), nodeid CHAR(255), userid CHAR(255), doc JSON)',
'CREATE TABLE IF NOT EXISTS power (id SERIAL PRIMARY KEY, time TIMESTAMP, nodeid CHAR(255), doc JSON)', 'CREATE TABLE IF NOT EXISTS eventids(fkid INT NOT NULL, target CHAR(255), CONSTRAINT fk_eventid FOREIGN KEY (fkid) REFERENCES events (id) ON DELETE CASCADE ON UPDATE RESTRICT)',
'CREATE TABLE IF NOT EXISTS smbios (id CHAR(255) PRIMARY KEY, time TIMESTAMP, expire TIMESTAMP, doc JSON)', 'CREATE TABLE IF NOT EXISTS serverstats (time TIMESTAMP PRIMARY KEY, expire TIMESTAMP, doc JSON)',
'CREATE TABLE IF NOT EXISTS plugin (id SERIAL PRIMARY KEY, doc JSON)' 'CREATE TABLE IF NOT EXISTS power (id SERIAL PRIMARY KEY, time TIMESTAMP, nodeid CHAR(255), doc JSON)',
], function (results) { 'CREATE TABLE IF NOT EXISTS smbios (id CHAR(255) PRIMARY KEY, time TIMESTAMP, expire TIMESTAMP, doc JSON)',
parent.debug('db', 'Checking indexes...'); 'CREATE TABLE IF NOT EXISTS plugin (id SERIAL PRIMARY KEY, doc JSON)'
sqlDbExec('CREATE INDEX ndxtypedomainextra ON main (type, domain, extra)', null, function (err, response) { }); ], function (results) {
sqlDbExec('CREATE INDEX ndxextra ON main (extra)', null, function (err, response) { }); parent.debug('db', 'Creating indexes...');
sqlDbExec('CREATE INDEX ndxextraex ON main (extraex)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxtypedomainextra ON main (type, domain, extra)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxeventstime ON events(time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxextra ON main (extra)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxeventsusername ON events(domain, userid, time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxextraex ON main (extraex)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxeventsdomainnodeidtime ON events(domain, nodeid, time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxeventstime ON events(time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxeventids ON eventids(target)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxeventsusername ON events(domain, userid, time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxserverstattime ON serverstats (time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxeventsdomainnodeidtime ON events(domain, nodeid, time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxserverstatexpire ON serverstats (expire)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxeventids ON eventids(target)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxpowernodeidtime ON power (nodeid, time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxserverstattime ON serverstats (time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxsmbiostime ON smbios (time)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxserverstatexpire ON serverstats (expire)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxsmbiosexpire ON smbios (expire)', null, function (err, response) { }); sqlDbExec('CREATE INDEX ndxpowernodeidtime ON power (nodeid, time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxsmbiostime ON smbios (time)', null, function (err, response) { });
sqlDbExec('CREATE INDEX ndxsmbiosexpire ON smbios (expire)', null, function (err, response) { });
setupFunctions(func);
});
} else {
// Database already existed, skip table and index creation
setupFunctions(func); setupFunctions(func);
}); }
}); });
} else if (parent.args.mongodb) { } else if (parent.args.mongodb) {
// Use MongoDB // Use MongoDB
@ -1103,7 +1118,7 @@ module.exports.CreateDB = function (parent, func) {
else if (results.command == 'SELECT') { else if (results.command == 'SELECT') {
for (var i in results.rows) { if (results.rows[i].doc) { if (typeof results.rows[i].doc == 'string') { docs.push(JSON.parse(results.rows[i].doc)); } else { docs.push(results.rows[i].doc); } } } for (var i in results.rows) { if (results.rows[i].doc) { if (typeof results.rows[i].doc == 'string') { docs.push(JSON.parse(results.rows[i].doc)); } else { docs.push(results.rows[i].doc); } } }
} }
if (func) { try { func(null, docs); } catch (ex) { console.log('SQLERR5', ex); } } if (func) { try { func(null, docs, results); } catch (ex) { console.log('SQLERR5', ex); } }
} }
}); });
} }
@ -1260,7 +1275,7 @@ module.exports.CreateDB = function (parent, func) {
obj.RemoveAllEvents = function (domain) { sqlDbQuery('DELETE FROM events', null, function (err, docs) { }); }; obj.RemoveAllEvents = function (domain) { sqlDbQuery('DELETE FROM events', null, function (err, docs) { }); };
obj.RemoveAllNodeEvents = function (domain, nodeid) { if ((domain == null) || (nodeid == null)) return; sqlDbQuery('DELETE FROM events WHERE domain = $1 AND nodeid = $2', [domain, nodeid], function (err, docs) { }); }; obj.RemoveAllNodeEvents = function (domain, nodeid) { if ((domain == null) || (nodeid == null)) return; sqlDbQuery('DELETE FROM events WHERE domain = $1 AND nodeid = $2', [domain, nodeid], function (err, docs) { }); };
obj.RemoveAllUserEvents = function (domain, userid) { if ((domain == null) || (userid == null)) return; sqlDbQuery('DELETE FROM events WHERE domain = $1 AND userid = $2', [domain, userid], function (err, docs) { }); }; obj.RemoveAllUserEvents = function (domain, userid) { if ((domain == null) || (userid == null)) return; sqlDbQuery('DELETE FROM events WHERE domain = $1 AND userid = $2', [domain, userid], function (err, docs) { }); };
obj.GetFailedLoginCount = function (userid, domainid, lastlogin, func) { sqlDbExec('SELECT COUNT(id) FROM events WHERE action = "authfail" AND domain = $1 AND userid = $2 AND time > $3', [domainid, userid, lastlogin], function (err, response) { func(err == null ? response['COUNT(id)'] : 0); }); } obj.GetFailedLoginCount = function (userid, domainid, lastlogin, func) { sqlDbQuery('SELECT COUNT(*) FROM events WHERE action = \'authfail\' AND domain = $1 AND userid = $2 AND time > $3', [domainid, userid, lastlogin], function (err, response, raw) { func(err == null ? parseInt(raw.rows[0].count) : 0); }); }
// Database actions on the power collection // Database actions on the power collection
obj.getAllPower = function (func) { sqlDbQuery('SELECT doc FROM power', null, func); }; obj.getAllPower = function (func) { sqlDbQuery('SELECT doc FROM power', null, func); };
@ -1305,10 +1320,10 @@ module.exports.CreateDB = function (parent, func) {
// Get database information (TODO: Complete this) // Get database information (TODO: Complete this)
obj.getDbStats = function (func) { obj.getDbStats = function (func) {
obj.stats = { c: 4 }; obj.stats = { c: 4 };
sqlDbExec('SELECT COUNT(id) FROM main', null, function (err, response) { obj.stats.meshcentral = response['COUNT(id)']; if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } }); sqlDbQuery('SELECT COUNT(*) FROM main', null, function (err, response, raw) { obj.stats.meshcentral = (err == null ? parseInt(raw.rows[0].count) : 0); if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } });
sqlDbExec('SELECT COUNT(time) FROM serverstats', null, function (err, response) { obj.stats.serverstats = response['COUNT(time)']; if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } }); sqlDbQuery('SELECT COUNT(*) FROM serverstats', null, function (err, response, raw) { obj.stats.serverstats = (err == null ? parseInt(raw.rows[0].count) : 0); if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } });
sqlDbExec('SELECT COUNT(id) FROM power', null, function (err, response) { obj.stats.power = response['COUNT(id)']; if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } }); sqlDbQuery('SELECT COUNT(*) FROM power', null, function (err, response, raw) { obj.stats.power = (err == null ? parseInt(raw.rows[0].count) : 0); if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } });
sqlDbExec('SELECT COUNT(id) FROM smbios', null, function (err, response) { obj.stats.smbios = response['COUNT(id)']; if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } }); sqlDbQuery('SELECT COUNT(*) FROM smbios', null, function (err, response, raw) { obj.stats.smbios = (err == null ? parseInt(raw.rows[0].count) : 0); if (--obj.stats.c == 0) { delete obj.stats.c; func(obj.stats); } });
} }
// Plugin operations // Plugin operations

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> anmoder om e-mailbekræftelse, klik på følgende link for at fuldføre processen.</p> <p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> anmoder om e-mailbekræftelse, klik på følgende link for at fuldføre processen.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klik her for at bekræfte din e-mailadresse.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klik her for at bekræfte din e-mailadresse.</a>
</p> </p>

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Olá [[[NOME DE USUÁRIO]]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[NOME DO SERVIDOR]]]</a> está solicitando verificação de e-mail, clique no link a seguir para concluir o processo.</p> <p>Olá [[[NOME DE USUÁRIO]]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> está solicitando verificação de e-mail, clique no link a seguir para concluir o processo.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Clique aqui para verificar seu endereço de e-mail.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Clique aqui para verificar seu endereço de e-mail.</a>
</p> </p>

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> begär e-postverifiering, klicka på följande länk för att slutföra processen.</p> <p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> begär e-postverifiering, klicka på följande länk för att slutföra processen.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klicka här för att verifiera din e-postadress.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klicka här för att verifiera din e-postadress.</a>
</p> </p>

View file

@ -14,6 +14,6 @@
</p> </p>
Venlig hilsen, Venlig hilsen,
<br> <br>
[[[BRUGERNAVN]]] [[[USERNAME]]]
<br> <br>
</div></body></html> </div></body></html>

View file

@ -14,6 +14,6 @@
</p> </p>
Atenciosamente, Atenciosamente,
<br> <br>
[[[NOME DO USUÁRIO]]] [[[USERNAME]]]
<br> <br>
</div></body></html> </div></body></html>

View file

@ -14,6 +14,6 @@
</p> </p>
Cumprimentos, Cumprimentos,
<br> <br>
[[[NOME DO USUÁRIO]]] [[[USERNAME]]]
<br> <br>
</div></body></html> </div></body></html>

View file

@ -14,6 +14,6 @@
</p> </p>
Vänliga hälsningar, Vänliga hälsningar,
<br> <br>
[[[ANVÄNDARNAMN]]] [[[USERNAME]]]
<br> <br>
</div></body></html> </div></body></html>

View file

@ -7,6 +7,6 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Giriş jetonunuz: [[[TOKEN]]]</p> <p>Giriş anahtarınız: [[[TOKEN]]]</p>
<p>Bu simge yalnızca bir kez kullanılabilir ve 5 dakika geçerlidir.</p> <p>Bu simge yalnızca bir kez kullanılabilir ve 5 dakika geçerlidir.</p>
</div></body></html> </div></body></html>

View file

@ -1,4 +1,4 @@
[[[SERVERNAME]]] - Hesap Girişi [[[SERVERNAME]]] - Hesap Girişi
Giriş jetonunuz: [[[TOKEN]]] Giriş anahtarınız: [[[TOKEN]]]
~ ~
Bu simge yalnızca bir kez kullanılabilir ve 5 dakika geçerlidir. Bu simge yalnızca bir kez kullanılabilir ve 5 dakika geçerlidir.

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> anmoder om en nulstilling af kontoadgangskode, klik på følgende link for at fuldføre processen.</p> <p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> anmoder om en nulstilling af kontoadgangskode, klik på følgende link for at fuldføre processen.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klik her for at nulstille adgangskoden til din konto.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klik her for at nulstille adgangskoden til din konto.</a>
</p> </p>

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Olá [[[NOME DE USUÁRIO]]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[NOME DO SERVIDOR]]]</a> está solicitando a redefinição da senha da conta, clique no link a seguir para concluir o processo.</p> <p>Olá [[[NOME DE USUÁRIO]]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> está solicitando a redefinição da senha da conta, clique no link a seguir para concluir o processo.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Clique aqui para redefinir a senha da sua conta.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Clique aqui para redefinir a senha da sua conta.</a>
</p> </p>

View file

@ -7,7 +7,7 @@
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> begär återställning av kontolösenord, klicka på följande länk för att slutföra processen.</p> <p>Hej [[[USERNAME]], <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> begär återställning av kontolösenord, klicka på följande länk för att slutföra processen.</p>
<p style="margin-left:30px"> <p style="margin-left:30px">
<a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klicka här för att återställa ditt kontolösenord.</a> <a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]][[[URLARGS2]]]">Klicka här för att återställa ditt kontolösenord.</a>
</p> </p>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] Oznámení zařízení</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] Oznámení zařízení</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. Následující zařízení změnila svůj stav připojení.
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: Připojená zařízení:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: Odpojená zařízení:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">klikněte zde</a> within 1 hour of getting this message. Chcete-li se odhlásit, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">klikněte zde</a> do 1 hodiny od obdržení této zprávy.
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] Oznámení zařízení
~<area-header> ~<area-header>
The following devices have changed their connection state. Následující zařízení změnila svůj stav připojení.
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: Připojená zařízení:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: Odpojená zařízení:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] Chcete-li se odhlásit, načtěte tento odkaz do 1 hodiny od obdržení této zprávy: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] Gerätebenachrichtigung</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] Gerätebenachrichtigung</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. Die folgenden Geräte haben ihren Verbindungsstatus geändert.
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: Verbundene Geräte:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: Getrennte Geräte:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">hier klicken</a> within 1 hour of getting this message. Deabonnieren, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">hier klicken</a> innerhalb 1 Stunde nach erhalt dieser Nachricht.
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] Gerätebenachrichtigung
~<area-header> ~<area-header>
The following devices have changed their connection state. Die folgenden Geräte haben ihren Verbindungsstatus geändert.
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: Verbundene Geräte:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: Getrennte Geräte:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] Um sich abzumelden, laden Sie diesen Link innerhalb von 1 Stunde nach Erhalt dieser Nachricht: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] - Laitteen ilmoitus</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Laitteen ilmoitus</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. Seuraavat laitteet ovat muuttaneet yhteystilaa.
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: Kytketyt laitteet:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: Irrotetut laitteet:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">klikkaa tästä</a> within 1 hour of getting this message. Lopettaa tilauksen, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">klikkaa tästä</a> tunnin sisällä tämän viestin vastaanottamisesta.
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] - Laitteen ilmoitus
~<area-header> ~<area-header>
The following devices have changed their connection state. Seuraavat laitteet ovat muuttaneet yhteystilaa.
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: Kytketyt laitteet:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: Irrotetut laitteet:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] Peruuta tilaus lataamalla tämä linkki tunnin sisällä tämän viestin vastaanottamisesta: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] - डिवाइस नोटिफिकेशन</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - डिवाइस नोटिफिकेशन</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. निम्न उपकरणों ने अपनी कनेक्शन स्थिति बदल दी है।
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: जुड़ी हुई डिवाइसेज:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: डिस्कनेक्ट किए गए डिवाइस:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">यहाँ क्लिक करें</a> within 1 hour of getting this message. सदस्यता रद्द करने के लिए, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">यहाँ क्लिक करें</a> यह संदेश मिलने के 1 घंटे के भीतर।
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] - डिवाइस नोटिफिकेशन
~<area-header> ~<area-header>
The following devices have changed their connection state. निम्न उपकरणों ने अपनी कनेक्शन स्थिति बदल दी है।
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: जुड़ी हुई डिवाइसेज:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: डिस्कनेक्ट किए गए डिवाइस:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] सदस्यता समाप्त करने के लिए, यह संदेश मिलने के 1 घंटे के भीतर इस लिंक को लोड करें: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] - Notifica dispositivo</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Notifica dispositivo</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. I seguenti dispositivi hanno cambiato il loro stato di connessione.
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: Dispositivi collegati:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,15 +22,15 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: Dispositivi disconnessi:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNESSIONI]]]
</b></p> </b></p>
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">clicca qui</a> within 1 hour of getting this message. Per annullare l'iscrizione, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">clicca qui</a> entro 1 ora dalla ricezione di questo messaggio.
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] - Notifica dispositivo
~<area-header> ~<area-header>
The following devices have changed their connection state. I seguenti dispositivi hanno cambiato il loro stato di connessione.
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: Dispositivi collegati:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: Dispositivi disconnessi:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] Per annullare l'iscrizione, carica questo link entro 1 ora dalla ricezione di questo messaggio: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]]-デバイス通知</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]]-デバイス通知</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. 次のデバイスは接続状態を変更しました。
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: 接続されているデバイス:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: 切断されたデバイス:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">ここをクリック</a> within 1 hour of getting this message. 退会するには、 <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">ここをクリック</a> このメッセージを受け取ってから1時間以内。
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]]-デバイス通知
~<area-header> ~<area-header>
The following devices have changed their connection state. 次のデバイスは接続状態を変更しました。
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: 接続されているデバイス:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: 切断されたデバイス:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] 登録を解除するには、次のメッセージが表示されてから1時間以内に次のリンクを読み込みます[[[SERVERURL]]] [[[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -1,20 +1,20 @@
<html><head></head><body><div>[[[SERVERNAME]]] - Device Notification</div> <html><head></head><body><div>[[[SERVERNAME]]] - Cihaz Bildirimi</div>
<div style="font-family:Arial,Helvetica,sans-serif"> <div style="font-family:Arial,Helvetica,sans-serif">
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Device Notification</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Cihaz Bildirimi</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>
<area-header> <area-header>
<p> <p>
The following devices have changed their connection state. Aşağıdaki cihazlar bağlantı durumlarını değiştirdi.
</p> </p>
</area-header> </area-header>
<area-connections> <area-connections>
<p> <p>
Connected devices: Bağlı cihazlar:
</p> </p>
<p><b> <p><b>
[[[CONNECTIONS]]] [[[CONNECTIONS]]]
@ -22,7 +22,7 @@
</area-connections> </area-connections>
<area-disconnections> <area-disconnections>
<p> <p>
Disconnected devices: Bağlantısı kesilen cihazlar:
</p> </p>
<p><b> <p><b>
[[[DISCONNECTIONS]]] [[[DISCONNECTIONS]]]
@ -30,7 +30,7 @@
</area-disconnections> </area-disconnections>
<area-footer> <area-footer>
<p> <p>
To unsubscribe, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">buraya Tıkla</a> within 1 hour of getting this message. Abonelikten çıkmak, <a href="[[[SERVERURL]]][[[UNSUBSCRIBELINK]]]">buraya Tıkla</a> Bu mesajı aldıktan sonra 1 saat içinde.
</p> </p>
</area-footer> </area-footer>
</div></body></html> </div></body></html>

View file

@ -1,22 +1,22 @@
[[[SERVERNAME]]] - Device Notification [[[SERVERNAME]]] - Cihaz Bildirimi
~<area-header> ~<area-header>
The following devices have changed their connection state. Aşağıdaki cihazlar bağlantı durumlarını değiştirdi.
~</area-header> ~</area-header>
~<area-connections> ~<area-connections>
~ ~
Connected devices: Bağlı cihazlar:
~ ~
~[[[CONNECTIONS]]] ~[[[CONNECTIONS]]]
~ ~
~</area-connections> ~</area-connections>
~<area-disconnections> ~<area-disconnections>
~ ~
Disconnected devices: Bağlantısı kesilen cihazlar:
~ ~
~[[[DISCONNECTIONS]]] ~[[[DISCONNECTIONS]]]
~ ~
~</area-disconnections> ~</area-disconnections>
~<area-footer> ~<area-footer>
To unsubscribe, load this link within 1 hour of getting this message: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]] Aboneliğinizi iptal etmek için, bu mesajı aldıktan sonraki 1 saat içinde bu bağlantıyı yükleyin: [[[SERVERURL]]][[[UNSUBSCRIBELINK]]]
~</area-footer> ~</area-footer>

View file

@ -12,7 +12,7 @@
Hej [[[NAME]]] Hej [[[NAME]]]
</p> </p>
</area-name> </area-name>
<p>Bruger [[[USERNAME]]] på serveren <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> anmoder dig om at installere software for at starte en fjernbetjeningssession.</p> <p>Bruger [[[USERNAME]]] på serveren <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> anmoder dig om at installere software for at starte en fjernbetjeningssession.</p>
<area-msg> <area-msg>
<p> <p>
Meddelelse: <b notrans="1">[[[MSG]]]</b> Meddelelse: <b notrans="1">[[[MSG]]]</b>
@ -38,5 +38,5 @@
</p> </p>
</area-link> </area-link>
<p>Hvis du ikke startede denne anmodning, bedes du ignorere denne mail.</p> <p>Hvis du ikke startede denne anmodning, bedes du ignorere denne mail.</p>
Venlig hilsen,<br>[[[BRUGERNAVN]]]<br> Venlig hilsen,<br>[[[USERNAME]]]<br>
</div></body></html> </div></body></html>

View file

@ -12,7 +12,7 @@
Olá [[[NAME]]], Olá [[[NAME]]],
</p> </p>
</area-name> </area-name>
<p>Usuário [[[USERNAME]]] no servidor <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[NOME DO SERVIDOR]]]</a> está solicitando a instalação de um software para iniciar uma sessão de controle remoto.</p> <p>Usuário [[[USERNAME]]] no servidor <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> está solicitando a instalação de um software para iniciar uma sessão de controle remoto.</p>
<area-msg> <area-msg>
<p> <p>
Mensagem: <b notrans="1">[[[MSG]]]</b> Mensagem: <b notrans="1">[[[MSG]]]</b>
@ -38,5 +38,5 @@
</p> </p>
</area-link> </area-link>
<p>Se você não iniciou esta solicitação, ignore este e-mail.</p> <p>Se você não iniciou esta solicitação, ignore este e-mail.</p>
Atenciosamente,<br>[[[NOME DO USUÁRIO]]]<br> Atenciosamente,<br>[[[USERNAME]]]<br>
</div></body></html> </div></body></html>

View file

@ -38,5 +38,5 @@
</p> </p>
</area-link> </area-link>
<p>Se você não iniciou esta solicitação, ignore este e-mail.</p> <p>Se você não iniciou esta solicitação, ignore este e-mail.</p>
Cumprimentos,<br>[[[NOME DO USUÁRIO]]]<br> Cumprimentos,<br>[[[USERNAME]]]<br>
</div></body></html> </div></body></html>

View file

@ -12,7 +12,7 @@
Hej [[[NAME]]] Hej [[[NAME]]]
</p> </p>
</area-name> </area-name>
<p>Användare [[[USERNAME]]] på servern <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVER NAMN]]]</a> ber dig att installera programvara för att starta en fjärrkontrollsession.</p> <p>Användare [[[USERNAME]]] på servern <a href="[[[SERVERURL]]][[[URLARGS1]]]">[[[SERVERNAME]]]</a> ber dig att installera programvara för att starta en fjärrkontrollsession.</p>
<area-msg> <area-msg>
<p> <p>
Meddelande: <b notrans="1">[[[MSG]]]</b> Meddelande: <b notrans="1">[[[MSG]]]</b>
@ -38,5 +38,5 @@
</p> </p>
</area-link> </area-link>
<p>Om du inte initierade denna begäran, ignorerar du det här meddelandet.</p> <p>Om du inte initierade denna begäran, ignorerar du det här meddelandet.</p>
Vänliga hälsningar,<br>[[[ANVÄNDARNAMN]]]<br> Vänliga hälsningar,<br>[[[USERNAME]]]<br>
</div></body></html> </div></body></html>

View file

@ -3,7 +3,7 @@
<table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8"> <table style="background-color:#003366;color:lightgray;width:100%" cellpadding="8">
<tbody><tr> <tbody><tr>
<td> <td>
<b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Aracı Kurulumu</b> <b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent Kurulumu</b>
</td> </td>
</tr> </tr>
</tbody></table> </tbody></table>

View file

@ -1,2 +1,2 @@
[[0]] doğrulama kodu: [[1]] [[0]] doğrulama kodu: [[1]]
[[0]] erişim jetonu: [[1]] [[0]] erişim anahtarı: [[1]]

View file

@ -1,5 +1,5 @@
/* /*
Copyright 2018-2021 Intel Corporation Copyright 2018-2022 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Firebase communication module * @description MeshCentral Firebase communication module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel(R) AMT Interceptor * @description MeshCentral Intel(R) AMT Interceptor
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.3 * @version v0.0.3
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral letsEncrypt module, uses ACME-Client to do all the work. * @description MeshCentral letsEncrypt module, uses ACME-Client to do all the work.
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.2 * @version v0.0.2
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral MeshAgent * @description MeshCentral MeshAgent
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2019-2021 * @copyright Intel Corporation 2019-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral accelerator * @description MeshCentral accelerator
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral MeshAgent communication module * @description MeshCentral MeshAgent communication module
* @author Ylian Saint-Hilaire & Bryan Roe * @author Ylian Saint-Hilaire & Bryan Roe
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -3,7 +3,7 @@
/** /**
* @description MeshCentral bot sample code * @description MeshCentral bot sample code
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -508,6 +508,7 @@
"description": { "type": "string", "default": "Mesh Agent background service", "description": "The description of the agent as displayed to the user." }, "description": { "type": "string", "default": "Mesh Agent background service", "description": "The description of the agent as displayed to the user." },
"companyName": { "type": "string", "default": "Mesh Agent", "description": "This will be used as the path to install the agent, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's." }, "companyName": { "type": "string", "default": "Mesh Agent", "description": "This will be used as the path to install the agent, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's." },
"serviceName": { "type": "string", "default": "Mesh Agent", "description": "The name of the background service, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's but should be set to an all lower case, no space string." }, "serviceName": { "type": "string", "default": "Mesh Agent", "description": "The name of the background service, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's but should be set to an all lower case, no space string." },
"image": { "type": "string", "default": null, "description": "The filename of a image file in .png format located in meshcentral-data to display in the MeshCentral Agent installation dialog, image should be square and from 64x64 to 200x200." },
"fileName": { "type": "string", "default": "meshagent", "description": "The agent filename." } "fileName": { "type": "string", "default": "meshagent", "description": "The agent filename." }
} }
}, },

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral main module * @description MeshCentral main module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */
@ -1285,6 +1285,7 @@ function CreateMeshCentralServer(config, args) {
if (typeof obj.config.domains[i].agentcustomization.description != 'string') { delete obj.config.domains[i].agentcustomization.description; } else { obj.config.domains[i].agentcustomization.description = obj.config.domains[i].agentcustomization.description.split('\r').join('').split('\n').join(''); } if (typeof obj.config.domains[i].agentcustomization.description != 'string') { delete obj.config.domains[i].agentcustomization.description; } else { obj.config.domains[i].agentcustomization.description = obj.config.domains[i].agentcustomization.description.split('\r').join('').split('\n').join(''); }
if (typeof obj.config.domains[i].agentcustomization.companyname != 'string') { delete obj.config.domains[i].agentcustomization.companyname; } else { obj.config.domains[i].agentcustomization.companyname = obj.config.domains[i].agentcustomization.companyname.split('\r').join('').split('\n').join(''); } if (typeof obj.config.domains[i].agentcustomization.companyname != 'string') { delete obj.config.domains[i].agentcustomization.companyname; } else { obj.config.domains[i].agentcustomization.companyname = obj.config.domains[i].agentcustomization.companyname.split('\r').join('').split('\n').join(''); }
if (typeof obj.config.domains[i].agentcustomization.servicename != 'string') { delete obj.config.domains[i].agentcustomization.servicename; } else { obj.config.domains[i].agentcustomization.servicename = obj.config.domains[i].agentcustomization.servicename.split('\r').join('').split('\n').join('').split(' ').join('').split('"').join('').split('\'').join('').split('>').join('').split('<').join('').split('/').join('').split('\\').join(''); } if (typeof obj.config.domains[i].agentcustomization.servicename != 'string') { delete obj.config.domains[i].agentcustomization.servicename; } else { obj.config.domains[i].agentcustomization.servicename = obj.config.domains[i].agentcustomization.servicename.split('\r').join('').split('\n').join('').split(' ').join('').split('"').join('').split('\'').join('').split('>').join('').split('<').join('').split('/').join('').split('\\').join(''); }
if (typeof obj.config.domains[i].agentcustomization.image != 'string') { delete obj.config.domains[i].agentcustomization.image; } else { try { obj.config.domains[i].agentcustomization.image = 'data:image/png;base64,' + Buffer.from(obj.fs.readFileSync(obj.getConfigFilePath(obj.config.domains[i].agentcustomization.image)), 'binary').toString('base64'); } catch (ex) { console.log(ex); delete obj.config.domains[i].agentcustomization.image; } }
} else { } else {
delete obj.config.domains[i].agentcustomization; delete obj.config.domains[i].agentcustomization;
} }
@ -1549,7 +1550,10 @@ function CreateMeshCentralServer(config, args) {
// Load MeshAgent translation strings // Load MeshAgent translation strings
try { try {
var translations = JSON.parse(obj.fs.readFileSync(obj.path.join(__dirname, 'agents', 'agent-translations.json')).toString()); var translationpath = obj.path.join(__dirname, 'agents', 'agent-translations.json');
var translationpath2 = obj.path.join(obj.datapath, 'agents', 'agent-translations.json');
if (obj.fs.existsSync(translationpath2)) { translationpath = translationpath2; } // If the agent is present in "meshcentral-data/agents", use that one instead.
var translations = JSON.parse(obj.fs.readFileSync(translationpath).toString());
if (translations['zh-chs']) { translations['zh-hans'] = translations['zh-chs']; delete translations['zh-chs']; } if (translations['zh-chs']) { translations['zh-hans'] = translations['zh-chs']; delete translations['zh-chs']; }
if (translations['zh-cht']) { translations['zh-hant'] = translations['zh-cht']; delete translations['zh-cht']; } if (translations['zh-cht']) { translations['zh-hant'] = translations['zh-cht']; delete translations['zh-cht']; }
obj.agentTranslations = JSON.stringify(translations); obj.agentTranslations = JSON.stringify(translations);
@ -2627,6 +2631,9 @@ function CreateMeshCentralServer(config, args) {
for (var toolname in meshToolsList) { for (var toolname in meshToolsList) {
if (meshToolsList[toolname].winhash === true) { if (meshToolsList[toolname].winhash === true) {
var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname); var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname);
var toolpath2 = obj.path.join(obj.datapath, 'agents', meshToolsList[toolname].localname);
if (obj.fs.existsSync(toolpath2)) { toolpath = toolpath2; } // If the tool is present in "meshcentral-data/agents", use that one instead.
var hashStream = obj.crypto.createHash('sha384'); var hashStream = obj.crypto.createHash('sha384');
hashStream.toolname = toolname; hashStream.toolname = toolname;
hashStream.toolpath = toolpath; hashStream.toolpath = toolpath;
@ -2643,6 +2650,9 @@ function CreateMeshCentralServer(config, args) {
obj.exeHandler.hashExecutableFile(options); obj.exeHandler.hashExecutableFile(options);
} else { } else {
var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname); var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname);
var toolpath2 = obj.path.join(obj.datapath, 'agents', meshToolsList[toolname].localname);
if (obj.fs.existsSync(toolpath2)) { toolpath = toolpath2; } // If the tool is present in "meshcentral-data/agents", use that one instead.
var stream = null; var stream = null;
try { try {
stream = obj.fs.createReadStream(toolpath); stream = obj.fs.createReadStream(toolpath);
@ -2771,6 +2781,8 @@ function CreateMeshCentralServer(config, args) {
var archcount = 0; var archcount = 0;
for (var archid in obj.meshAgentsArchitectureNumbers) { for (var archid in obj.meshAgentsArchitectureNumbers) {
var agentpath = obj.path.join(__dirname, 'agents', obj.meshAgentsArchitectureNumbers[archid].localname); var agentpath = obj.path.join(__dirname, 'agents', obj.meshAgentsArchitectureNumbers[archid].localname);
var agentpath2 = obj.path.join(obj.datapath, 'agents', obj.meshAgentsArchitectureNumbers[archid].localname);
if (obj.fs.existsSync(agentpath2)) { agentpath = agentpath2; } // If the agent is present in "meshcentral-data/agents", use that one instead.
// Fetch all the agent binary information // Fetch all the agent binary information
var stats = null; var stats = null;

View file

@ -1,5 +1,13 @@
#!/usr/bin/env node #!/usr/bin/env node
/**
* @description MeshCentral command line tool
* @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2022
* @license Apache-2.0
* @version v0.0.1
*/
// Make sure we have the dependency modules // Make sure we have the dependency modules
try { require('minimist'); } catch (ex) { console.log('Missing module "minimist", type "npm install minimist" to install it.'); return; } try { require('minimist'); } catch (ex) { console.log('Missing module "minimist", type "npm install minimist" to install it.'); return; }
try { require('ws'); } catch (ex) { console.log('Missing module "ws", type "npm install ws" to install it.'); return; } try { require('ws'); } catch (ex) { console.log('Missing module "ws", type "npm install ws" to install it.'); return; }
@ -2048,7 +2056,11 @@ function serverConnect() {
for (var j in devicesInMesh) { for (var j in devicesInMesh) {
var n = devicesInMesh[j]; var n = devicesInMesh[j];
nodecount++; nodecount++;
console.log('\"' + settings.xmeshes[i]._id.split('/')[2] + '\",\"' + settings.xmeshes[i].name.split('\"').join('') + '\",\"' + n._id.split('/')[2] + '\",\"' + n.name.split('\"').join('') + '\",' + (n.icon ? n.icon : 0) + ',' + (n.conn ? n.conn : 0) + ',' + (n.pwr ? n.pwr : 0)); if (settings.xmeshes) {
console.log('\"' + settings.xmeshes[i]._id.split('/')[2] + '\",\"' + settings.xmeshes[i].name.split('\"').join('') + '\",\"' + n._id.split('/')[2] + '\",\"' + n.name.split('\"').join('') + '\",' + (n.icon ? n.icon : 0) + ',' + (n.conn ? n.conn : 0) + ',' + (n.pwr ? n.pwr : 0));
} else {
console.log('\"' + n._id.split('/')[2] + '\",\"' + n.name.split('\"').join('') + '\",' + (n.icon ? n.icon : 0) + ',' + (n.conn ? n.conn : 0) + ',' + (n.pwr ? n.pwr : 0));
}
} }
} }
if (nodecount == 0) { console.log('None'); } if (nodecount == 0) { console.log('None'); }
@ -2069,7 +2081,6 @@ function serverConnect() {
nodes.push(devicesInMesh[j]); nodes.push(devicesInMesh[j]);
} }
} }
console.log(JSON.stringify(nodes, ' ', 2)); console.log(JSON.stringify(nodes, ' ', 2));
} else { } else {
// Display the list of nodes in text format // Display the list of nodes in text format

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral remote desktop multiplexor * @description MeshCentral remote desktop multiplexor
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral device file download relay module * @description MeshCentral device file download relay module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral IP KVM Management Module * @description MeshCentral IP KVM Management Module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2021 * @copyright Intel Corporation 2021-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral e-mail server communication modules * @description MeshCentral e-mail server communication modules
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */
@ -679,7 +679,7 @@ module.exports.CreateMeshMail = function (parent, domain) {
if (domain == null) return; if (domain == null) return;
// Send the email // Send the email
obj.sendDeviceNotifyMail(domain, user.name, user.email, connections, disconnections, 'us-en', null); obj.sendDeviceNotifyMail(domain, user.name, user.email, connections, disconnections, user.llang, null);
// Clean up // Clean up
delete obj.deviceNotifications[userid]; delete obj.deviceNotifications[userid];

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral connection relay module * @description MeshCentral connection relay module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Mesh Agent Local Scanner * @description MeshCentral Mesh Agent Local Scanner
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral SMS gateway communication module * @description MeshCentral SMS gateway communication module
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral MeshAgent * @description MeshCentral MeshAgent
* @author Ylian Saint-Hilaire & Bryan Roe * @author Ylian Saint-Hilaire & Bryan Roe
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */
@ -1474,8 +1474,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
} }
// Get the domain // Get the domain
var delGroupDomain = parent.parent.config.domains[ugroupidsplit[1]]; var delGroupDomain;
if (delGroupDomain == null) { err = "Invalid domain id"; } if (ugroupidsplit != null) {
delGroupDomain = parent.parent.config.domains[ugroupidsplit[1]];
if (delGroupDomain == null) { err = "Invalid domain id"; }
}
// Handle any errors // Handle any errors
if (err != null) { if (err != null) {
@ -1592,7 +1595,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
if (err != null) { if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'changemeshnotify', responseid: command.responseid, result: err })); } catch (ex) { } } break; } if (err != null) { if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'changemeshnotify', responseid: command.responseid, result: err })); } catch (ex) { } } break; }
// Change the device group notification // Change the device group notification
if (user.links == null) { user.links = {}; }
if (user.links[command.meshid]) { if (user.links[command.meshid]) {
// The user has direct rights for this device group
if (command.notify == 0) { if (command.notify == 0) {
delete user.links[command.meshid].notify; delete user.links[command.meshid].notify;
} else { } else {
@ -2095,18 +2100,20 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
if ((parent.GetMeshRights(user, mesh) & MESHRIGHT_EDITMESH) == 0) return; if ((parent.GetMeshRights(user, mesh) & MESHRIGHT_EDITMESH) == 0) return;
if ((command.meshid.split('/').length != 3) || (command.meshid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain if ((command.meshid.split('/').length != 3) || (command.meshid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain
if ((common.validateString(command.meshname, 1, 128) == true) && (command.meshname != mesh.name)) { change = 'Group name changed from "' + mesh.name + '" to "' + command.meshname + '"'; mesh.name = command.meshname; } var changesids = [];
if ((common.validateString(command.desc, 0, 1024) == true) && (command.desc != mesh.desc)) { if (change != '') change += ' and description changed'; else change += 'Group "' + mesh.name + '" description changed'; mesh.desc = command.desc; } if ((common.validateString(command.meshname, 1, 128) == true) && (command.meshname != mesh.name)) { change = 'Device group name changed from "' + mesh.name + '" to "' + command.meshname + '"'; changesids.push(1); mesh.name = command.meshname; }
if ((common.validateInt(command.flags) == true) && (command.flags != mesh.flags)) { if (change != '') change += ' and flags changed'; else change += 'Group "' + mesh.name + '" flags changed'; mesh.flags = command.flags; } if ((common.validateString(command.desc, 0, 1024) == true) && (command.desc != mesh.desc)) { if (change != '') change += ' and description changed'; else change += 'Device group "' + mesh.name + '" description changed'; changesids.push(2); mesh.desc = command.desc; }
if ((common.validateInt(command.consent) == true) && (command.consent != mesh.consent)) { if (change != '') change += ' and consent changed'; else change += 'Group "' + mesh.name + '" consent changed'; mesh.consent = command.consent; } if ((common.validateInt(command.flags) == true) && (command.flags != mesh.flags)) { if (change != '') change += ' and flags changed'; else change += 'Device group "' + mesh.name + '" flags changed'; changesids.push(3); mesh.flags = command.flags; }
if ((common.validateInt(command.expireDevs, 0, 2000) == true) && (command.expireDevs != mesh.expireDevs)) { if (change != '') change += ' and auto-remove changed'; else change += 'Group "' + mesh.name + '" auto-remove changed'; if (command.expireDevs == 0) { delete mesh.expireDevs; } else { mesh.expireDevs = command.expireDevs; } } if ((common.validateInt(command.consent) == true) && (command.consent != mesh.consent)) { if (change != '') change += ' and consent changed'; else change += 'Device group "' + mesh.name + '" consent changed'; changesids.push(4); mesh.consent = command.consent; }
if ((common.validateInt(command.expireDevs, 0, 2000) == true) && (command.expireDevs != mesh.expireDevs)) { if (change != '') change += ' and auto-remove changed'; else change += 'Device group "' + mesh.name + '" auto-remove changed'; changesids.push(5); if (command.expireDevs == 0) { delete mesh.expireDevs; } else { mesh.expireDevs = command.expireDevs; } }
// See if we need to change device group invitation codes // See if we need to change device group invitation codes
if (mesh.mtype == 2) { if (mesh.mtype == 2) {
if (command.invite === '*') { if (command.invite === '*') {
// Clear invite codes // Clear invite codes
if (mesh.invite != null) { delete mesh.invite; } if (mesh.invite != null) { delete mesh.invite; }
if (change != '') { change += ' and invite code changed'; } else { change += 'Group "' + mesh.name + '" invite code changed'; } if (change != '') { change += ' and invite code changed'; } else { change += 'Device group "' + mesh.name + '" invite code changed'; }
changesids.push(6);
} else if ((typeof command.invite == 'object') && (Array.isArray(command.invite.codes)) && (typeof command.invite.flags == 'number')) { } else if ((typeof command.invite == 'object') && (Array.isArray(command.invite.codes)) && (typeof command.invite.flags == 'number')) {
// Set invite codes // Set invite codes
if ((mesh.invite == null) || (mesh.invite.codes != command.invite.codes) || (mesh.invite.flags != command.invite.flags)) { if ((mesh.invite == null) || (mesh.invite.codes != command.invite.codes) || (mesh.invite.flags != command.invite.flags)) {
@ -2123,14 +2130,15 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
return; return;
} }
mesh.invite = { codes: command.invite.codes, flags: command.invite.flags }; mesh.invite = { codes: command.invite.codes, flags: command.invite.flags };
if (change != '') { change += ' and invite code changed'; } else { change += 'Group "' + mesh.name + '" invite code changed'; } if (change != '') { change += ' and invite code changed'; } else { change += 'Device group "' + mesh.name + '" invite code changed'; }
changesids.push(6);
} }
} }
} }
if (change != '') { if (change != '') {
db.Set(mesh); db.Set(mesh);
var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, flags: mesh.flags, consent: mesh.consent, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite, expireDevs: command.expireDevs }; var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, flags: mesh.flags, consent: mesh.consent, action: 'meshchange', links: mesh.links, msgid: 142, msgArgs: [ mesh.name, changesids ], msg: change, domain: domain.id, invite: mesh.invite, expireDevs: command.expireDevs };
if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come. if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come.
parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [user._id]), obj, event); parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [user._id]), obj, event);
} }
@ -2254,7 +2262,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
} }
mesh = parent.meshes[command.meshid]; mesh = parent.meshes[command.meshid];
change = '';
if (mesh) { if (mesh) {
// Check if this user has rights to do this // Check if this user has rights to do this
if ((parent.GetMeshRights(user, mesh) & MESHRIGHT_EDITMESH) == 0) return; if ((parent.GetMeshRights(user, mesh) & MESHRIGHT_EDITMESH) == 0) return;
@ -2263,7 +2270,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// TODO: Check if this is a change from the existing policy // TODO: Check if this is a change from the existing policy
// Perform the Intel AMT policy change // Perform the Intel AMT policy change
change = 'Intel AMT policy change';
var amtpolicy = { type: command.amtpolicy.type }; var amtpolicy = { type: command.amtpolicy.type };
if ((command.amtpolicy.type === 2) || (command.amtpolicy.type === 3)) { if ((command.amtpolicy.type === 2) || (command.amtpolicy.type === 3)) {
amtpolicy = { type: command.amtpolicy.type, badpass: command.amtpolicy.badpass, cirasetup: command.amtpolicy.cirasetup }; amtpolicy = { type: command.amtpolicy.type, badpass: command.amtpolicy.badpass, cirasetup: command.amtpolicy.cirasetup };
@ -2275,7 +2281,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
db.Set(mesh); db.Set(mesh);
var amtpolicy2 = Object.assign({}, amtpolicy); // Shallow clone var amtpolicy2 = Object.assign({}, amtpolicy); // Shallow clone
if (amtpolicy2.password != null) { amtpolicy2.password = 1; } if (amtpolicy2.password != null) { amtpolicy2.password = 1; }
var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, amt: amtpolicy2, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite }; var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, amt: amtpolicy2, action: 'meshchange', links: mesh.links, msgid: 141, msg: "Intel(r) AMT policy change", domain: domain.id, invite: mesh.invite };
if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come. if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come.
parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [user._id]), obj, event); parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [user._id]), obj, event);
@ -2961,6 +2967,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// Event the node change. Only do this if the database will not do it. // Event the node change. Only do this if the database will not do it.
event.msg = 'Changed device ' + node.name + ' from group ' + mesh.name + ': ' + changes.join(', '); event.msg = 'Changed device ' + node.name + ' from group ' + mesh.name + ': ' + changes.join(', ');
event.node = parent.CloneSafeNode(node); event.node = parent.CloneSafeNode(node);
event.msgid = 140;
event.msgArgs = [ node.name, mesh.name, changes.join(', ') ];
if (amtchange == 1) { event.amtchange = 1; } // This will give a hint to the AMT Manager to reconnect using new AMT credentials if (amtchange == 1) { event.amtchange = 1; } // This will give a hint to the AMT Manager to reconnect using new AMT credentials
if (command.rdpport == 3389) { event.node.rdpport = 3389; } if (command.rdpport == 3389) { event.node.rdpport = 3389; }
if (command.rfbport == 5900) { event.node.rfbport = 5900; } if (command.rfbport == 5900) { event.node.rfbport = 5900; }
@ -4360,7 +4368,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
} }
} else { } else {
// Get previous logins for specific userid // Get previous logins for specific userid
if (user.siteadmin === SITERIGHT_ADMIN) { if ((user.siteadmin & SITERIGHT_MANAGEUSERS) != 0) {
var splitUser = command.userid.split('/'); var splitUser = command.userid.split('/');
if ((obj.crossDomain === true) || (splitUser[1] === domain.id)) { if ((obj.crossDomain === true) || (splitUser[1] === domain.id)) {
if (db.GetUserLoginEvents) { if (db.GetUserLoginEvents) {
@ -5100,7 +5108,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// Add a new user account // Add a new user account
var err = null, errid = 0, newusername, newuserid, newuserdomain; var err = null, errid = 0, newusername, newuserid, newuserdomain;
try { try {
if ((user.siteadmin & 2) == 0) { err = "Permission denied"; errid = 1; } if ((user.siteadmin & MESHRIGHT_MANAGEUSERS) == 0) { err = "Permission denied"; errid = 1; }
else if (common.validateUsername(command.username, 1, 256) == false) { err = "Invalid username"; errid = 2; } // Username is between 1 and 64 characters, no spaces else if (common.validateUsername(command.username, 1, 256) == false) { err = "Invalid username"; errid = 2; } // Username is between 1 and 64 characters, no spaces
else if ((command.username[0] == '~') || (command.username.indexOf('/') >= 0)) { err = "Invalid username"; errid = 2; } // Usernames cant' start with ~ and can't have '/' else if ((command.username[0] == '~') || (command.username.indexOf('/') >= 0)) { err = "Invalid username"; errid = 2; } // Usernames cant' start with ~ and can't have '/'
else if (common.validateString(command.pass, 1, 256) == false) { err = "Invalid password"; errid = 3; } // Password is between 1 and 256 characters else if (common.validateString(command.pass, 1, 256) == false) { err = "Invalid password"; errid = 3; } // Password is between 1 and 256 characters

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Intel(R) AMT MPS server * @description MeshCentral Intel(R) AMT MPS server
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MQTT broker reference implementation based on AEDES * @description MQTT broker reference implementation based on AEDES
* @author Joko Banu Sastriawan, Ylian Saint-Hilaire * @author Joko Banu Sastriawan, Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral Multi-Server Support * @description MeshCentral Multi-Server Support
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

View file

@ -1,6 +1,6 @@
{ {
"name": "meshcentral", "name": "meshcentral",
"version": "0.9.71", "version": "0.9.73",
"keywords": [ "keywords": [
"Remote Device Management", "Remote Device Management",
"Remote Device Monitoring", "Remote Device Monitoring",

View file

@ -226,6 +226,10 @@ body {
-ms-grid-row: 2; -ms-grid-row: 2;
} }
.logoncontrolspan, .logoncontrolspan2 {
color: white;
}
.topbar_td { .topbar_td {
width: 100px; width: 100px;
height: 24px; height: 24px;
@ -1112,6 +1116,7 @@ NoMeshesPanel img {
height: calc(100vh - 295px); height: calc(100vh - 295px);
overflow: auto; overflow: auto;
-webkit-user-select: none; -webkit-user-select: none;
user-select: none;
position: relative; position: relative;
} }
@ -1120,6 +1125,7 @@ NoMeshesPanel img {
width: 100%; width: 100%;
overflow: auto; overflow: auto;
-webkit-user-select: none; -webkit-user-select: none;
user-select: none;
background-color: lightsteelblue; background-color: lightsteelblue;
} }
@ -1900,6 +1906,7 @@ a {
-khtml-user-select: none; -khtml-user-select: none;
-webkit-user-select: none; -webkit-user-select: none;
-o-user-select: none; -o-user-select: none;
user-select: none;
cursor: default; cursor: default;
-khtml-user-drag: element; -khtml-user-drag: element;
clear: both; clear: both;
@ -2509,6 +2516,7 @@ a {
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
-ms-touch-action: none; -ms-touch-action: none;
touch-action: none;
position: absolute; position: absolute;
top: 0px; top: 0px;
bottom: 0px; bottom: 0px;
@ -2726,6 +2734,7 @@ a {
height: calc(100vh - 323px); height: calc(100vh - 323px);
overflow: auto; overflow: auto;
-webkit-user-select: none; -webkit-user-select: none;
user-select: none;
} }
.room4submenu #p13filetable { .room4submenu #p13filetable {

View file

@ -1,7 +1,7 @@
/** /**
* @description Meshcentral web server * @description Meshcentral web server
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.2 * @version v0.0.2
*/ */

View file

@ -249,6 +249,7 @@
"description": "Compagny® Product™ agent for remote monitoring, management and assistance.", "description": "Compagny® Product™ agent for remote monitoring, management and assistance.",
"companyName": "Compagny", "companyName": "Compagny",
"serviceName": "compagnyagent", "serviceName": "compagnyagent",
"image": "agent-logo.png",
"fileName": "compagnyagent" "fileName": "compagnyagent"
}, },
"_assistantCustomization": { "_assistantCustomization": {

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral v1 legacy Swarm Server, used to update agents and get them on MeshCentral2 * @description MeshCentral v1 legacy Swarm Server, used to update agents and get them on MeshCentral2
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */

File diff suppressed because it is too large Load diff

View file

@ -132,7 +132,7 @@
<div style="float:right"> <div style="float:right">
<div id=notificationCount onclick="clickNotificationIcon()" class="unselectable" style="display: none;" title="Click to view current notifications">0</div> <div id=notificationCount onclick="clickNotificationIcon()" class="unselectable" style="display: none;" title="Click to view current notifications">0</div>
</div> </div>
<p id="logoutControl"><span id=logoutControlSpan style="color:white"></span><span id=idleTimeoutNotify style="color:yellow"></span></p> <p id="logoutControl"><span id=logoutControlSpan class="logoncontrolspan" style="color:white"></span><span id=idleTimeoutNotify style="color:yellow"></span></p>
</div> </div>
<div id="page_leftbar"> <div id="page_leftbar">
<div style="height:16px"></div> <div style="height:16px"></div>
@ -284,7 +284,7 @@
<img style="cursor:pointer;margin-top:4px;display:none" title="Expand All" id="ExpandAllButton" src="images/icon-expand.png" loading=lazy width=9 height=11 onclick="cmexpandaction(1)" /> <img style="cursor:pointer;margin-top:4px;display:none" title="Expand All" id="ExpandAllButton" src="images/icon-expand.png" loading=lazy width=9 height=11 onclick="cmexpandaction(1)" />
<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All" />&nbsp; <input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All" />&nbsp;
<input type=button id=GroupActionButton disabled="disabled" value="Group Action" onclick=groupActionFunction() />&nbsp; <input type=button id=GroupActionButton disabled="disabled" value="Group Action" onclick=groupActionFunction() />&nbsp;
<input id=SearchInput type=search autocomplete=off placeholder=Filter onchange=onDeviceSearchChanged(event) onclick=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />&nbsp; <input id=SearchInput type=search autocomplete=off placeholder=Filter onchange=onDeviceSearchChanged(event) onclick=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) onfocus=onSearchFocus(1) onblur=onSearchFocus(0) title="Filter: user:xxx or u:xxx ip:xxx group:xxx or g:xxx tag:xxx or t: xxx atag:xxx or a:xxx os:xxx amt:xxx desc:xxx wsc:ok wsc:noav wsc:noupdate wsc:nofirewall wsc:any"/>&nbsp;
<span id=SearchInputClearButton style="display:none;position:relative"><img src="images/x16.png" type="button" onclick="clearDeviceSearch()" style="position:absolute;cursor:pointer;left:-18px;top:-8px" srcset="images/x32.png 2x"/></span> <span id=SearchInputClearButton style="display:none;position:relative"><img src="images/x16.png" type="button" onclick="clearDeviceSearch()" style="position:absolute;cursor:pointer;left:-18px;top:-8px" srcset="images/x32.png 2x"/></span>
<select id=DevFilterSelect onchange=onOnlineCheckBox(event) title="Device Filter"> <select id=DevFilterSelect onchange=onOnlineCheckBox(event) title="Device Filter">
<option value=0>All</option> <option value=0>All</option>
@ -1121,7 +1121,7 @@
<td class="style14"> <td class="style14">
<div style="float:right"> <div style="float:right">
</div> </div>
<div> <div id="p50userGroupOps">
<input type=button id=UsersGroupsSelectAllButton onclick="p50usersSelectallButtonFunction()" value="Select All" /> <input type=button id=UsersGroupsSelectAllButton onclick="p50usersSelectallButtonFunction()" value="Select All" />
<input type=button id=UsersGroupsGroupActionButton disabled="disabled" value="Group Action" onclick=p50usersGroupActionFunction() /> <input type=button id=UsersGroupsGroupActionButton disabled="disabled" value="Group Action" onclick=p50usersGroupActionFunction() />
<input id=NewUserGroupButton type=button onclick=showCreateUserGroupDialog(1) value="New Group..." /> <input id=NewUserGroupButton type=button onclick=showCreateUserGroupDialog(1) value="New Group..." />
@ -1247,6 +1247,7 @@
<div id=dialog4 style=""> <div id=dialog4 style="">
<input id="d4WrapButton" type="button" value="Wrap On" onclick="d4ToggleWrap()" /> <input id="d4WrapButton" type="button" value="Wrap On" onclick="d4ToggleWrap()" />
<input id="d4SizeButton" type="button" value="Small" onclick="d4ToggleSize()" /> <input id="d4SizeButton" type="button" value="Small" onclick="d4ToggleSize()" />
<input id="d4EncodingButton" type="button" value="Raw" onclick="d4ToggleEncoding()" />
<textarea id=d4editorarea autocomplete="off" style="height:calc(100vh - 286px);width:100%;overflow:scroll;resize:none;white-space:pre"></textarea> <textarea id=d4editorarea autocomplete="off" style="height:calc(100vh - 286px);width:100%;overflow:scroll;resize:none;white-space:pre"></textarea>
</div> </div>
<div id=dialog7 style=""> <div id=dialog7 style="">
@ -1581,8 +1582,10 @@
// Set the file editor // Set the file editor
d4EditWrapVal = getstore('editorWrap', 0); d4EditWrapVal = getstore('editorWrap', 0);
d4EditSizeVal = getstore('editorSize', 0); d4EditSizeVal = getstore('editorSize', 0);
d4EditEncodingVal = getstore('editorEncoding', 0);
d4ToggleWrap(true); d4ToggleWrap(true);
d4ToggleSize(true); d4ToggleSize(true);
d4ToggleEncoding(true);
if (pluginHandler != null) pluginHandler.callHook('onWebUIStartupEnd'); if (pluginHandler != null) pluginHandler.callHook('onWebUIStartupEnd');
// Deleted non-english style and fix all topbar titles // Deleted non-english style and fix all topbar titles
@ -2050,6 +2053,7 @@
// We are user administrator // We are user administrator
if (users == null) { meshserver.send({ action: 'users' }); } if (users == null) { meshserver.send({ action: 'users' }); }
if (wssessions == null) { meshserver.send({ action: 'wssessioncount' }); } if (wssessions == null) { meshserver.send({ action: 'wssessioncount' }); }
mainUpdate(8192 + 16384);
} else { } else {
// We are not user administrator // We are not user administrator
users = null; users = null;
@ -5232,35 +5236,39 @@
} }
function groupActionFunction() { function groupActionFunction() {
var addedOptions = '', nodeids = getCheckedDevices(), added = 0; var addedOptions = [], nodeids = getCheckedDevices(), added = 0;
// Check if any of the selected devices have a MQTT connection active // Check if any of the selected devices have a MQTT connection active
if (features & 0x00400000) { if (features & 0x00400000) {
for (var i in nodeids) { if ((getNodeFromId(nodeids[i]).conn & 16) != 0) { addedOptions += '<option value=103>' + "Send MQTT Message" + '</option>'; break; } } for (var i in nodeids) { if ((getNodeFromId(nodeids[i]).conn & 16) != 0) { addedOptions.push({ v:103, name: "Send MQTT Message" });; break; } }
} }
// Display the "Uninstall Agent" option if allowed and we selected connected devices. // Display the options that are allowed depending on what devices are selected.
addedOptions.push({ v: 105, name: "Export device information", s:true });
for (var i in nodeids) { for (var i in nodeids) {
var node = getNodeFromId(nodeids[i]), rights = GetNodeRights(node); var node = getNodeFromId(nodeids[i]), rights = GetNodeRights(node);
if ((rights & 1) && ((added & 2) == 0)) { added |= 2; addedOptions += '<option value=102>' + "Move to device group" + '</option>'; } if ((rights & 1) && ((added & 2) == 0)) { added |= 2; addedOptions.push({ v: 102, name: "Move to device group" }); }
if (((node.conn & 1) != 0) && ((rights & 0x8000) != 0) && ((added & 1) == 0)) { added |= 1; addedOptions += '<option value=104>' + "Uninstall Agent" + '</option>'; } if (((node.conn & 1) != 0) && ((rights & 0x8000) != 0) && ((added & 1) == 0)) { added |= 1; addedOptions.push({ v: 104, name: "Uninstall Agent" }); }
if ((rights & 64) && ((added & 8) == 0)) { added |= 8; addedOptions += '<option value=100>' + "Wake-up devices" + '</option>'; } if ((rights & 64) && ((added & 8) == 0)) { added |= 8; addedOptions.push({ v: 100, name: "Wake-up devices" }); }
if ((rights & 262144) && ((added & 4) == 0)) { added |= 4; addedOptions += '<option value=4>' + "Sleep devices" + '</option><option value=3>' + "Reset devices" + '</option><option value=2>' + "Power off devices" + '</option>'; } if ((rights & 262144) && ((added & 4) == 0)) { added |= 4; addedOptions.push({ v: 4, name: "Sleep devices" }); addedOptions.push({ v: 3, name: "Reset devices" }); addedOptions.push({ v: 2, name: "Power off devices" }); }
if ((rights & 131072) && ((added & 16) == 0)) { added |= 16; addedOptions += '<option value=106>' + "Run commands" + '</option>'; } if ((rights & 131072) && ((added & 16) == 0)) { added |= 16; addedOptions.push({ v: 106, name: "Run commands" }); }
if ((rights & 16384) && ((added & 32) == 0)) { added |= 32; addedOptions += '<option value=108>' + "Device notification" + '</option>'; } if ((rights & 16384) && ((added & 32) == 0)) { added |= 32; addedOptions.push({ v: 108, name: "Device notification" }); }
if ((rights & 4) && ((added & 64) == 0)) { added |= 64; addedOptions += '<option value=107>' + "Edit tags" + '</option>'; } if ((rights & 4) && ((added & 64) == 0)) { added |= 64; addedOptions.push({ v: 107, name: "Edit tags" }); }
if ((rights & 8) && ((added & 256) == 0)) { added |= 256; addedOptions += '<option value=109>' + "Upload files" + '</option>'; } if ((rights & 8) && ((added & 256) == 0)) { added |= 256; addedOptions.push({ v: 109, name: "Upload files" }); }
if ((rights & 32768) && ((added & 128) == 0)) { added |= 128; addedOptions += '<option value=101>' + "Delete devices" + '</option>'; } if ((rights & 32768) && ((added & 128) == 0)) { added |= 128; addedOptions.push({ v: 101, name: "Delete devices" }); }
if ((node.agent != null) && (features2 & 0x00000010) && (rights == 0xFFFFFFFF) && ((added & 512) == 0)) { if ((node.agent != null) && (features2 & 0x00000010) && (rights == 0xFFFFFFFF) && ((added & 512) == 0)) {
added |= 512; added |= 512;
addedOptions += '<option value=110>' + "Force agent update" + '</option>'; addedOptions.push({ v: 110, name: "Force agent update" });
addedOptions += '<option value=111>' + "Clear agent core" + '</option>'; addedOptions.push({ v: 111, name: "Clear agent core" });
addedOptions += '<option value=112>' + "Upload default server core" + '</option>'; addedOptions.push({ v: 112, name: "Upload default server core" });
} }
} }
var addedOptionsStr = '';
addedOptions.sort(nameSort);
for (var i in addedOptions) { addedOptionsStr += '<option value=' + addedOptions[i].v + (addedOptions[i].s?' selected':'') + '>' + addedOptions[i].name + '</option>'; }
var x = "Select an operation to perform on all selected devices. Actions will be performed only with proper rights." + '<br /><br />'; var x = "Select an operation to perform on all selected devices. Actions will be performed only with proper rights." + '<br /><br />';
x += addHtmlValue("Operation", '<select id=d2groupop><option value=105>' + "Export device information" + '</option>' + '</option>' + addedOptions + '</select>'); x += addHtmlValue("Operation", '<select id=d2groupop>' + addedOptionsStr + '</select>');
setDialogMode(2, "Group Action", 3, groupActionFunctionEx, x); setDialogMode(2, "Group Action", 3, groupActionFunctionEx, x);
} }
@ -10209,7 +10217,13 @@
QS('dialog').width = 'auto'; QS('dialog').width = 'auto';
QS('dialog').bottom = '80px'; QS('dialog').bottom = '80px';
QS('dialog').top = QS('dialog').left = QS('dialog').right = '100px'; QS('dialog').top = QS('dialog').left = QS('dialog').right = '100px';
Q('d4editorarea').value = decode_utf8(gdownloadFile.data); if (d4EditEncodingVal == 1) {
// UTF8 Encoding
Q('d4editorarea').value = decode_utf8(gdownloadFile.data);
} else {
// RAW Encoding
Q('d4editorarea').value = gdownloadFile.data;
}
gdownloadFile = null; gdownloadFile = null;
} else { } else {
// Save the file to disk // Save the file to disk
@ -10222,6 +10236,7 @@
var d4EditWrapVal = 0; var d4EditWrapVal = 0;
var d4EditSizeVal = 0; var d4EditSizeVal = 0;
var d4EditEncodingVal = 0;
function d4ToggleWrap(update) { function d4ToggleWrap(update) {
if (!update) { d4EditWrapVal = ++d4EditWrapVal % 2; } if (!update) { d4EditWrapVal = ++d4EditWrapVal % 2; }
Q('d4WrapButton').value = ["Wrap: ON","Wrap: OFF"][d4EditWrapVal]; Q('d4WrapButton').value = ["Wrap: ON","Wrap: OFF"][d4EditWrapVal];
@ -10237,8 +10252,28 @@
putstore('editorSize', d4EditSizeVal); putstore('editorSize', d4EditSizeVal);
} }
function d4ToggleEncoding(update) {
if (!update) {
d4EditEncodingVal = ++d4EditEncodingVal % 2;
if (d4EditEncodingVal == 1) {
Q('d4editorarea').value = decode_utf8(Q('d4editorarea').value);
} else {
Q('d4editorarea').value = encode_utf8(Q('d4editorarea').value);
}
}
Q('d4EncodingButton').value = ["Encoding: RAW","Encoding: UTF8"][d4EditEncodingVal];
putstore('editorEncoding', d4EditEncodingVal);
}
function p13editSaveBack(b, tag) { function p13editSaveBack(b, tag) {
var data = new TextEncoder().encode(Q('d4editorarea').value); var data;
if (d4EditEncodingVal == 1) {
// UTF8 encoding
data = new TextEncoder().encode(Q('d4editorarea').value);
} else {
// RAW encoding
data = new TextEncoder().encode(decode_utf8(Q('d4editorarea').value));
}
p13uploadFileContinue(1, [{ name: tag, size: data.byteLength, type: 'text/plain', xdata: data }]); p13uploadFileContinue(1, [{ name: tag, size: data.byteLength, type: 'text/plain', xdata: data }]);
} }
@ -13416,9 +13451,21 @@
136: "Forcibly disconnected files session of user {0}", 136: "Forcibly disconnected files session of user {0}",
137: "Forcibly disconnected routing session of user {0}", 137: "Forcibly disconnected routing session of user {0}",
138: "Added device share {0} recurring daily.", 138: "Added device share {0} recurring daily.",
139: "Added device share {0} recurring weekly." 139: "Added device share {0} recurring weekly.",
140: "Changed device {0} from group {1}: {2}",
141: "Intel(r) AMT policy change",
142: "Device group {0} was changed: {1}"
}; };
var eventsShortMessageId = {
1: "Group name",
2: "Description",
3: "Flags",
4: "Consent",
5: "Auto-Remove",
6: "Invite code"
}
// Highlights the device being hovered // Highlights the device being hovered
function eventMouseHover(e, over) { function eventMouseHover(e, over) {
e.children[1].classList.remove('g1s'); e.children[1].classList.remove('g1s');
@ -13452,7 +13499,14 @@
if (event.msgArgs != null) { if (event.msgArgs != null) {
for (var i in event.msgArgs) { for (var i in event.msgArgs) {
var xx = event.msgArgs[i]; var xx = event.msgArgs[i];
if ((typeof xx == 'string') && (xx.indexOf('DATETIME:') == 0)) { xx = printFlexDateTime(new Date(parseInt(xx.substring(9)))); } if (Array.isArray(xx)) {
var x2 = [];
for (var j in xx) { if ((typeof xx[j] == 'number') && (eventsShortMessageId[xx[j]])) { x2.push(eventsShortMessageId[xx[j]]); } else { x2.push(xx[j]); } }
xx = x2.join(", ");
} else {
if ((typeof xx == 'string') && (xx.indexOf('DATETIME:') == 0)) { xx = printFlexDateTime(new Date(parseInt(xx.substring(9)))); }
}
msg = msg.split('{' + i + '}').join(xx); msg = msg.split('{' + i + '}').join(xx);
} }
} }
@ -14186,6 +14240,9 @@
// //
function updateUserGroups() { function updateUserGroups() {
// Display user group operations only if allowed for us
QV('p50userGroupOps', (userinfo.siteadmin & 256) != 0); // SITERIGHT_USERGROUPS = 256
// Sort the list of group names // Sort the list of group names
var sortedGroups = [], x = ''; var sortedGroups = [], x = '';
if (usergroups) { for (var i in usergroups) { sortedGroups.push(usergroups[i]); } } if (usergroups) { for (var i in usergroups) { sortedGroups.push(usergroups[i]); } }
@ -14210,7 +14267,7 @@
// Re-check userid's // Re-check userid's
elements = document.getElementsByClassName('UserGroupCheckbox'); elements = document.getElementsByClassName('UserGroupCheckbox');
for (var i=0;i<elements.length;i++) { elements[i].checked = ((checkedUserGroupids.indexOf(elements[i].value) >= 0)); } for (var i = 0; i < elements.length; i++) { elements[i].checked = ((checkedUserGroupids.indexOf(elements[i].value) >= 0)); }
p50updateInfo(); p50updateInfo();
// Update current user panel if needed // Update current user panel if needed

View file

@ -1,7 +1,7 @@
/** /**
* @description MeshCentral web server * @description MeshCentral web server
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */
@ -2777,7 +2777,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
webstate: encodeURIComponent(webstate).replace(/'/g, '%27'), webstate: encodeURIComponent(webstate).replace(/'/g, '%27'),
amtscanoptions: amtscanoptions, amtscanoptions: amtscanoptions,
pluginHandler: (parent.pluginHandler == null) ? 'null' : parent.pluginHandler.prepExports() pluginHandler: (parent.pluginHandler == null) ? 'null' : parent.pluginHandler.prepExports()
}, dbGetFunc.req, domain)); }, dbGetFunc.req, domain), user);
} }
xdbGetFunc.req = req; xdbGetFunc.req = req;
xdbGetFunc.res = res; xdbGetFunc.res = res;
@ -4944,6 +4944,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; } if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; }
if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; } if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; }
if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; }
if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; }
} }
if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } // Translation strings, not for MeshCentral Assistant if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } // Translation strings, not for MeshCentral Assistant
} }
@ -5315,6 +5316,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; } if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; }
if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; } if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; }
if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; }
if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; }
} }
if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; }
@ -5415,6 +5417,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; } if (domain.agentcustomization.companyname != null) { meshsettings += 'companyName=' + domain.agentcustomization.companyname + '\r\n'; }
if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; } if (domain.agentcustomization.servicename != null) { meshsettings += 'meshServiceName=' + domain.agentcustomization.servicename + '\r\n'; }
if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; }
if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; }
} }
if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; }
return meshsettings; return meshsettings;
@ -6339,7 +6342,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
obj.agentapp.ws(url + 'agent.ashx', function (ws, req) { obj.agentapp.ws(url + 'agent.ashx', function (ws, req) {
var domain = checkAgentIpAddress(ws, req); var domain = checkAgentIpAddress(ws, req);
if (domain == null) { parent.debug('web', 'Got agent connection with bad domain or blocked IP address ' + req.clientIp + ', holding.'); return; } if (domain == null) { parent.debug('web', 'Got agent connection with bad domain or blocked IP address ' + req.clientIp + ', holding.'); return; }
//console.log('Agent connect: ' + req.clientIp); if (domain.agentkey && ((req.query.key == null) || (domain.agentkey.indexOf(req.query.key) == -1))) { return; } // If agent key is required and not provided or not valid, just hold the websocket and do nothing.
try { obj.meshAgentHandler.CreateMeshAgent(obj, obj.db, ws, req, obj.args, domain); } catch (e) { console.log(e); } try { obj.meshAgentHandler.CreateMeshAgent(obj, obj.db, ws, req, obj.args, domain); } catch (e) { console.log(e); }
}); });
@ -7613,7 +7616,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
} }
// Render a page using the proper language // Render a page using the proper language
function render(req, res, filename, args) { function render(req, res, filename, args, user) {
if (obj.renderPages != null) { if (obj.renderPages != null) {
// Get the list of acceptable languages in order // Get the list of acceptable languages in order
var acceptLanguages = obj.getLanguageCodes(req); var acceptLanguages = obj.getLanguageCodes(req);
@ -7622,19 +7625,25 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
var fileOptions = obj.renderPages[obj.path.basename(filename)]; var fileOptions = obj.renderPages[obj.path.basename(filename)];
if (fileOptions != null) { if (fileOptions != null) {
for (var i in acceptLanguages) { for (var i in acceptLanguages) {
if ((acceptLanguages[i] == 'en') || (acceptLanguages[i].startsWith('en-'))) { args.lang = 'en'; break; } // English requested, break out. if ((acceptLanguages[i] == 'en') || (acceptLanguages[i].startsWith('en-'))) {
// English requested
args.lang = 'en';
if (user && user.llang) { delete user.llang; obj.db.SetUser(user); } // Clear user 'last language' used if needed. Since English is the default, remove "last language".
break;
}
if (fileOptions[acceptLanguages[i]] != null) { if (fileOptions[acceptLanguages[i]] != null) {
// Found a match. If the file no longer exists, default to English. // Found a match. If the file no longer exists, default to English.
obj.fs.exists(fileOptions[acceptLanguages[i]] + '.handlebars', function (exists) { obj.fs.exists(fileOptions[acceptLanguages[i]] + '.handlebars', function (exists) {
if (exists) { args.lang = acceptLanguages[i]; res.render(fileOptions[acceptLanguages[i]], args); } else { args.lang = 'en'; res.render(filename, args); } if (exists) { args.lang = acceptLanguages[i]; res.render(fileOptions[acceptLanguages[i]], args); } else { args.lang = 'en'; res.render(filename, args); }
}); });
if (user && (user.llang != acceptLanguages[i])) { user.llang = acceptLanguages[i]; obj.db.SetUser(user); } // Set user 'last language' used if needed.
return; return;
} }
} }
} }
} }
// No matches found, render the default english page. // No matches found, render the default English page.
res.render(filename, args); res.render(filename, args);
} }

View file

@ -1,7 +1,7 @@
/** /**
* @description Windows Service Launcher * @description Windows Service Launcher
* @author Ylian Saint-Hilaire * @author Ylian Saint-Hilaire
* @copyright Intel Corporation 2018-2021 * @copyright Intel Corporation 2018-2022
* @license Apache-2.0 * @license Apache-2.0
* @version v0.0.1 * @version v0.0.1
*/ */