diff --git a/include/Configuration.h b/include/Configuration.h index cf2ce5b4..e85c1f91 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -14,6 +14,8 @@ #define WIFI_MAX_PASSWORD_STRLEN 64 #define WIFI_MAX_HOSTNAME_STRLEN 31 +#define SYSLOG_MAX_HOSTNAME_STRLEN 128 + #define NTP_MAX_SERVER_STRLEN 31 #define NTP_MAX_TIMEZONE_STRLEN 50 #define NTP_MAX_TIMEZONEDESCR_STRLEN 50 @@ -83,6 +85,12 @@ struct CONFIG_T { bool Enabled; } Mdns; + struct { + bool Enabled; + char Hostname[SYSLOG_MAX_HOSTNAME_STRLEN + 1]; + uint32_t Port; + } Syslog; + struct { char Server[NTP_MAX_SERVER_STRLEN + 1]; char Timezone[NTP_MAX_TIMEZONE_STRLEN + 1]; diff --git a/include/WebApi_errors.h b/include/WebApi_errors.h index 68e107d4..de74b976 100644 --- a/include/WebApi_errors.h +++ b/include/WebApi_errors.h @@ -71,6 +71,8 @@ enum WebApiError { NetworkDns1Invalid, NetworkDns2Invalid, NetworkApTimeoutInvalid, + NetworkSyslogHostnameLength, + NetworkSyslogPort, NtpBase = 9000, NtpServerLength, diff --git a/include/defaults.h b/include/defaults.h index ebad5027..50869825 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -22,6 +22,9 @@ #define MDNS_ENABLED false +#define SYSLOG_ENABLED false +#define SYSLOG_PORT 514 + #define NTP_SERVER_OLD "pool.ntp.org" #define NTP_SERVER "opendtu.pool.ntp.org" #define NTP_TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3" diff --git a/lang/el.lang.json b/lang/el.lang.json index 621175e9..d396e40f 100644 --- a/lang/el.lang.json +++ b/lang/el.lang.json @@ -119,6 +119,8 @@ "8004": "Η πρώτη IP του διακομιστή DNS δεν είναι έγκυρη!", "8005": "Η δεύτερη IP του διακομιστή DNS δεν είναι έγκυρη!", "8006": "Η τιμή λήξης χρονικού ορίου πρόσβασης διαχείρισης δεν είναι έγκυρη", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "Ο διακομιστής NTP πρέπει να αποτελείται από 1 έως {max} χαρακτήρες!", "9002": "Η ζώνη ώρας πρέπει να αποτελείται από 1 έως {max} χαρακτήρες!", "9003": "Η περιγραφή της ζώνης ώρας πρέπει να αποτελείται από 1 έως {max} χαρακτήρες!", diff --git a/lang/es.lang.json b/lang/es.lang.json index 2bb7ffe8..e7b141f8 100644 --- a/lang/es.lang.json +++ b/lang/es.lang.json @@ -119,6 +119,8 @@ "8004": "¡La dirección IP del servidor DNS 1 no es válida!", "8005": "¡La dirección IP del servidor DNS 2 no es válida!", "8006": "¡El valor de tiempo de espera del punto de acceso administrativo es inválido!", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "¡El servidor NTP debe tener entre 1 y {max} caracteres de longitud!", "9002": "¡La zona horaria debe tener entre 1 y {max} caracteres de longitud!", "9003": "¡La descripción de la zona horaria debe tener entre 1 y {max} caracteres de longitud!", diff --git a/lang/it.lang.json b/lang/it.lang.json index ebe9da74..fc49715f 100644 --- a/lang/it.lang.json +++ b/lang/it.lang.json @@ -119,6 +119,8 @@ "8004": "DNS Server IP 1 is invalid!", "8005": "DNS Server IP 2 is invalid!", "8006": "Administrative AccessPoint Timeout value is invalid", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "NTP Server must between 1 and {max} characters long!", "9002": "Timezone must between 1 and {max} characters long!", "9003": "Timezone description must between 1 and {max} characters long!", diff --git a/lang/pl.lang.json b/lang/pl.lang.json index 1c77ad1b..01873e54 100644 --- a/lang/pl.lang.json +++ b/lang/pl.lang.json @@ -119,6 +119,8 @@ "8004": "Adres IP serwera DNS 1 jest nieprawidłowy!", "8005": "Adres IP serwera DNS 2 jest nieprawidłowy!", "8006": "Wartość limitu czasu administracyjnego punktu dostępowego jest nieprawidłowa", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "Serwer NTP musi mieć od 1 do {max} znaków!", "9002": "Strefa czasowa musi mieć długość od 1 do {max} znaków!!", "9003": "Opis strefy czasowej musi mieć od 1 do {max} znaków!", diff --git a/src/Configuration.cpp b/src/Configuration.cpp index e4f6748f..bfe2002a 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -59,6 +59,11 @@ bool ConfigurationClass::write() JsonObject mdns = doc["mdns"].to(); mdns["enabled"] = config.Mdns.Enabled; + JsonObject syslog = doc["syslog"].to(); + syslog["enabled"] = config.Syslog.Enabled; + syslog["hostname"] = config.Syslog.Hostname; + syslog["port"] = config.Syslog.Port; + JsonObject ntp = doc["ntp"].to(); ntp["server"] = config.Ntp.Server; ntp["timezone"] = config.Ntp.Timezone; @@ -244,6 +249,11 @@ bool ConfigurationClass::read() JsonObject mdns = doc["mdns"]; config.Mdns.Enabled = mdns["enabled"] | MDNS_ENABLED; + JsonObject syslog = doc["syslog"]; + config.Syslog.Enabled = syslog["enabled"] | SYSLOG_ENABLED; + strlcpy(config.Syslog.Hostname, syslog["hostname"] | "", sizeof(config.Syslog.Hostname)); + config.Syslog.Port = syslog["port"] | SYSLOG_PORT; + JsonObject ntp = doc["ntp"]; strlcpy(config.Ntp.Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp.Server)); strlcpy(config.Ntp.Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp.Timezone)); diff --git a/src/WebApi_network.cpp b/src/WebApi_network.cpp index 0a847fe3..19754692 100644 --- a/src/WebApi_network.cpp +++ b/src/WebApi_network.cpp @@ -77,6 +77,9 @@ void WebApiNetworkClass::onNetworkAdminGet(AsyncWebServerRequest* request) root["password"] = config.WiFi.Password; root["aptimeout"] = config.WiFi.ApTimeout; root["mdnsenabled"] = config.Mdns.Enabled; + root["syslogenabled"] = config.Syslog.Enabled; + root["sysloghostname"] = config.Syslog.Hostname; + root["syslogport"] = config.Syslog.Port; WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); } @@ -170,6 +173,23 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); return; } + if (root["syslogenabled"].as()) { + if (root["sysloghostname"].as().length() == 0 || root["sysloghostname"].as().length() > SYSLOG_MAX_HOSTNAME_STRLEN) { + retMsg["message"] = "Syslog Server must between 1 and " STR(SYSLOG_MAX_HOSTNAME_STRLEN) " characters long!"; + retMsg["code"] = WebApiError::NetworkSyslogHostnameLength; + retMsg["param"]["max"] = SYSLOG_MAX_HOSTNAME_STRLEN; + WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); + return; + } + + if (root["syslogport"].as() == 0 || root["syslogport"].as() > 65535) { + retMsg["message"] = "Port must be a number between 1 and 65535!"; + retMsg["code"] = WebApiError::NetworkSyslogPort; + WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); + return; + } + + } { auto guard = Configuration.getWriteGuard(); @@ -205,6 +225,9 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) } config.WiFi.ApTimeout = root["aptimeout"].as(); config.Mdns.Enabled = root["mdnsenabled"].as(); + config.Syslog.Enabled = root["syslogenabled"].as(); + strlcpy(config.Syslog.Hostname, root["sysloghostname"].as().c_str(), sizeof(config.Syslog.Hostname)); + config.Syslog.Port = root["syslogport"].as(); } WebApi.writeConfig(retMsg); diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 53a81d3c..b101b827 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -104,6 +104,8 @@ "8004": "DNS-Server-IP 1 ist ungültig!", "8005": "DNS-Server-IP 2 ist ungültig!", "8006": "Administrative AccessPoint Timeout-Wert ist ungültig!", + "8007": "Syslog-Server muss zwischen 1 und {max} Zeichen lang sein!", + "8008": "Port muss eine Zahl zwischen 1 und 65535 sein!", "9001": "Zeitserver muss zwischen 1 und {max} Zeichen lang sein!", "9002": "Zeitzone muss zwischen 1 und {max} Zeichen lang sein!", "9003": "Zeitzonenbeschreibung muss zwischen 1 und {max} Zeichen lang sein!", @@ -477,7 +479,10 @@ "ApTimeoutHint": "Zeit die der AccessPoint offen gehalten wird. Ein Wert von 0 bedeutet unendlich.", "Minutes": "Minuten", "EnableMdns": "mDNS aktivieren", - "MdnsSettings": "mDNS-Einstellungen" + "MdnsSettings": "mDNS-Einstellungen", + "EnableSyslog": "Syslog aktivieren", + "SyslogSettings": "Syslog-Einstellungen", + "Port": "Port:" }, "mqttadmin": { "MqttSettings": "MQTT-Einstellungen", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 41de105f..cecd58ba 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -104,6 +104,8 @@ "8004": "DNS Server IP 1 is invalid!", "8005": "DNS Server IP 2 is invalid!", "8006": "Administrative AccessPoint Timeout value is invalid", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "NTP Server must between 1 and {max} characters long!", "9002": "Timezone must between 1 and {max} characters long!", "9003": "Timezone description must between 1 and {max} characters long!", @@ -477,7 +479,10 @@ "ApTimeoutHint": "Time which the AccessPoint is kept open. A value of 0 means infinite.", "Minutes": "minutes", "EnableMdns": "Enable mDNS", - "MdnsSettings": "mDNS Settings" + "MdnsSettings": "mDNS Settings", + "EnableSyslog": "Enable Syslog", + "SyslogSettings": "Syslog Settings", + "Port": "Port:" }, "mqttadmin": { "MqttSettings": "MQTT Settings", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 73afb555..9b8c362e 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -104,6 +104,8 @@ "8004": "L'adresse IP du serveur DNS primaire n'est pas valide !", "8005": "L'adresse IP du serveur DNS secondaire n'est pas valide !", "8006": "La valeur du délai d'attente du point d'accès administratif n'est pas valide !", + "8007": "Syslog Server must between 1 and {max} characters long!", + "8008": "Port must be a number between 1 and 65535!", "9001": "Le serveur NTP doit avoir une longueur comprise entre 1 et {max} caractères !", "9002": "Le fuseau horaire doit comporter entre 1 et {max} caractères !", "9003": "La description du fuseau horaire doit comporter entre 1 et {max} caractères !", diff --git a/webapp/src/types/NetworkConfig.ts b/webapp/src/types/NetworkConfig.ts index da5ddd44..b71c6a38 100644 --- a/webapp/src/types/NetworkConfig.ts +++ b/webapp/src/types/NetworkConfig.ts @@ -10,4 +10,7 @@ export interface NetworkConfig { dns2: string; aptimeout: number; mdnsenabled: boolean; + syslogenabled: boolean; + sysloghostname: string; + syslogport: number; } diff --git a/webapp/src/views/NetworkAdminView.vue b/webapp/src/views/NetworkAdminView.vue index d97e0995..700b613a 100644 --- a/webapp/src/views/NetworkAdminView.vue +++ b/webapp/src/views/NetworkAdminView.vue @@ -86,6 +86,29 @@ /> + + + + + + + +