kopia lustrzana https://github.com/Aircoookie/WLED
changes suggested by netmindz
rodzic
51bd04ae91
commit
a77b85a08d
|
@ -37,42 +37,6 @@ SYSLOG_HTML = """
|
||||||
Enable Syslog: <input type="checkbox" name="SL_en"><br>
|
Enable Syslog: <input type="checkbox" name="SL_en"><br>
|
||||||
Host: <input type="text" name="SL_host" maxlength="32"><br>
|
Host: <input type="text" name="SL_host" maxlength="32"><br>
|
||||||
Port: <input type="number" name="SL_port" min="1" max="65535" value="%SL_port%"><br>
|
Port: <input type="number" name="SL_port" min="1" max="65535" value="%SL_port%"><br>
|
||||||
|
|
||||||
<!-- These UI elements are commented out but preserved for potential future use -->
|
|
||||||
<!--
|
|
||||||
Protocol:
|
|
||||||
<select name="SL_proto">
|
|
||||||
<option value="0">BSD (RFC3164)</option>
|
|
||||||
<option value="1">RFC5424</option>
|
|
||||||
<option value="2">Raw</option>
|
|
||||||
</select><br>
|
|
||||||
Facility:
|
|
||||||
<select name="SL_fac">
|
|
||||||
<option value="0">KERN</option>
|
|
||||||
<option value="1">USER</option>
|
|
||||||
<option value="3">DAEMON</option>
|
|
||||||
<option value="5">SYSLOG</option>
|
|
||||||
<option value="16">LOCAL0</option>
|
|
||||||
<option value="17">LOCAL1</option>
|
|
||||||
<option value="18">LOCAL2</option>
|
|
||||||
<option value="19">LOCAL3</option>
|
|
||||||
<option value="20">LOCAL4</option>
|
|
||||||
<option value="21">LOCAL5</option>
|
|
||||||
<option value="22">LOCAL6</option>
|
|
||||||
<option value="23">LOCAL7</option>
|
|
||||||
</select><br>
|
|
||||||
Severity:
|
|
||||||
<select name="SL_sev">
|
|
||||||
<option value="0">EMERG</option>
|
|
||||||
<option value="1">ALERT</option>
|
|
||||||
<option value="2">CRIT</option>
|
|
||||||
<option value="3">ERR</option>
|
|
||||||
<option value="4">WARNING</option>
|
|
||||||
<option value="5">NOTICE</option>
|
|
||||||
<option value="6">INFO</option>
|
|
||||||
<option value="7">DEBUG</option>
|
|
||||||
</select><br>
|
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -120,15 +84,9 @@ def inject_syslog_ui(source, target, env, retry_count=0):
|
||||||
original = f.read()
|
original = f.read()
|
||||||
modified = original
|
modified = original
|
||||||
|
|
||||||
# replace existing section if present
|
# replace the single comment with HTML
|
||||||
if '<!-- SYSLOG-START -->' in modified and '<!-- SYSLOG-END -->' in modified:
|
if '<!-- SYSLOG-INJECT -->' in modified:
|
||||||
start = modified.index('<!-- SYSLOG-START -->')
|
modified = modified.replace('<!-- SYSLOG-INJECT -->', SYSLOG_HTML)
|
||||||
end = modified.index('<!-- SYSLOG-END -->') + len('<!-- SYSLOG-END -->')
|
|
||||||
modified = (
|
|
||||||
modified[:start]
|
|
||||||
+ '<!-- SYSLOG-START -->\n' + SYSLOG_HTML + '\n<!-- SYSLOG-END -->'
|
|
||||||
+ modified[end:]
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
# insert before last <hr>
|
# insert before last <hr>
|
||||||
idx = modified.rfind('<hr>')
|
idx = modified.rfind('<hr>')
|
||||||
|
@ -137,7 +95,7 @@ def inject_syslog_ui(source, target, env, retry_count=0):
|
||||||
return
|
return
|
||||||
modified = (
|
modified = (
|
||||||
modified[:idx]
|
modified[:idx]
|
||||||
+ '<!-- SYSLOG-START -->\n' + SYSLOG_HTML + '\n<!-- SYSLOG-END -->\n'
|
+ SYSLOG_HTML + '\n'
|
||||||
+ modified[idx:]
|
+ modified[idx:]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -160,7 +118,7 @@ def inject_syslog_ui(source, target, env, retry_count=0):
|
||||||
# verify that SYSLOG markers really are in the file
|
# verify that SYSLOG markers really are in the file
|
||||||
with open(html_path, 'r', encoding='utf8') as f:
|
with open(html_path, 'r', encoding='utf8') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
if '<!-- SYSLOG-START -->' not in content or '<!-- SYSLOG-END -->' not in content:
|
if '<!-- SYSLOG-INJECT -->' not in content:
|
||||||
print("Backup exists but SYSLOG markers missing—forcing re-injection.")
|
print("Backup exists but SYSLOG markers missing—forcing re-injection.")
|
||||||
os.remove(bak)
|
os.remove(bak)
|
||||||
# only retry up to 3 times
|
# only retry up to 3 times
|
||||||
|
|
|
@ -541,9 +541,6 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
||||||
CJSON(syslogEnabled, if_syslog["en"]);
|
CJSON(syslogEnabled, if_syslog["en"]);
|
||||||
getStringFromJson(syslogHost, if_syslog[F("host")], 33);
|
getStringFromJson(syslogHost, if_syslog[F("host")], 33);
|
||||||
CJSON(syslogPort, if_syslog["port"]);
|
CJSON(syslogPort, if_syslog["port"]);
|
||||||
// CJSON(syslogProtocol, if_syslog["proto"]);
|
|
||||||
// CJSON(syslogFacility, if_syslog["fac"]);
|
|
||||||
// CJSON(syslogSeverity, if_syslog["sev"]);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
JsonObject if_ntp = interfaces[F("ntp")];
|
JsonObject if_ntp = interfaces[F("ntp")];
|
||||||
|
@ -1066,9 +1063,6 @@ void serializeConfig(JsonObject root) {
|
||||||
if_syslog["en"] = syslogEnabled;
|
if_syslog["en"] = syslogEnabled;
|
||||||
if_syslog["host"] = syslogHost;
|
if_syslog["host"] = syslogHost;
|
||||||
if_syslog["port"] = syslogPort;
|
if_syslog["port"] = syslogPort;
|
||||||
// if_syslog["proto"] = syslogProtocol;
|
|
||||||
// if_syslog["fac"] = syslogFacility;
|
|
||||||
// if_syslog["sev"] = syslogSeverity;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
JsonObject if_ntp = interfaces.createNestedObject("ntp");
|
JsonObject if_ntp = interfaces.createNestedObject("ntp");
|
||||||
|
|
|
@ -237,7 +237,7 @@ Baud rate:
|
||||||
</select><br>
|
</select><br>
|
||||||
<i>Keep at 115200 to use Improv. Some boards may not support high rates.</i>
|
<i>Keep at 115200 to use Improv. Some boards may not support high rates.</i>
|
||||||
</div>
|
</div>
|
||||||
<!-- SYSLOG-START --><!-- SYSLOG-END -->
|
<!-- SYSLOG-INJECT -->
|
||||||
<hr>
|
<hr>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -479,16 +479,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||||
|
|
||||||
t = request->arg(F("SL_port")).toInt();
|
t = request->arg(F("SL_port")).toInt();
|
||||||
if (t > 0) syslogPort = t;
|
if (t > 0) syslogPort = t;
|
||||||
|
|
||||||
// t = request->arg(F("SL_proto")).toInt();
|
|
||||||
// if (t >= SYSLOG_PROTO_BSD && t <= SYSLOG_PROTO_RAW) syslogProtocol = t;
|
|
||||||
|
|
||||||
// t = request->arg(F("SL_fac")).toInt();
|
|
||||||
// if (t >= SYSLOG_KERN && t <= SYSLOG_LOCAL7) syslogFacility = t;
|
|
||||||
|
|
||||||
// t = request->arg(F("SL_sev")).toInt();
|
|
||||||
// if (t >= SYSLOG_EMERG && t <= SYSLOG_DEBUG) syslogSeverity = t;
|
|
||||||
|
|
||||||
Syslog.begin(syslogHost, syslogPort,
|
Syslog.begin(syslogHost, syslogPort,
|
||||||
syslogFacility, syslogSeverity, syslogProtocol);
|
syslogFacility, syslogSeverity, syslogProtocol);
|
||||||
|
|
||||||
|
|
|
@ -3,42 +3,6 @@
|
||||||
|
|
||||||
#include "syslog.h"
|
#include "syslog.h"
|
||||||
|
|
||||||
// Comment out but preserve the protocol names
|
|
||||||
/*
|
|
||||||
static const char* const protoNames[] PROGMEM = {
|
|
||||||
PSTR("BSD"),
|
|
||||||
PSTR("RFC5424"),
|
|
||||||
PSTR("RAW"),
|
|
||||||
PSTR("UNKNOWN")
|
|
||||||
};
|
|
||||||
static const uint8_t protoCount = sizeof(protoNames)/sizeof(*protoNames);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Comment out but preserve facility names
|
|
||||||
/*
|
|
||||||
// We fill invalid entries with PSTR("UNKNOWN") so we can index 0..24 safely
|
|
||||||
static const char* const facilityNames[] PROGMEM = {
|
|
||||||
PSTR("KERN"), PSTR("USER"), PSTR("UNKNOWN"), PSTR("DAEMON"),
|
|
||||||
PSTR("UNKNOWN"),PSTR("SYSLOG"), PSTR("UNKNOWN"), PSTR("UNKNOWN"),
|
|
||||||
PSTR("UNKNOWN"),PSTR("UNKNOWN"),PSTR("UNKNOWN"), PSTR("UNKNOWN"),
|
|
||||||
PSTR("UNKNOWN"),PSTR("UNKNOWN"),PSTR("UNKNOWN"), PSTR("UNKNOWN"),
|
|
||||||
PSTR("LCL0"), PSTR("LCL1"), PSTR("LCL2"), PSTR("LCL3"),
|
|
||||||
PSTR("LCL4"), PSTR("LCL5"), PSTR("LCL6"), PSTR("LCL7"),
|
|
||||||
PSTR("UNKNOWN") // catch-all at index 24
|
|
||||||
};
|
|
||||||
static const uint8_t facCount = sizeof(facilityNames)/sizeof(*facilityNames);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Comment out but preserve severity names
|
|
||||||
/*
|
|
||||||
static const char* const severityNames[] PROGMEM = {
|
|
||||||
PSTR("EMERG"), PSTR("ALERT"), PSTR("CRIT"), PSTR("ERR"),
|
|
||||||
PSTR("WARN"), PSTR("NOTE"), PSTR("INFO"), PSTR("DEBUG"),
|
|
||||||
PSTR("UNKNOWN")
|
|
||||||
};
|
|
||||||
static const uint8_t sevCount = sizeof(severityNames) / sizeof(*severityNames);
|
|
||||||
*/
|
|
||||||
|
|
||||||
SyslogPrinter::SyslogPrinter() :
|
SyslogPrinter::SyslogPrinter() :
|
||||||
_lastOperationSucceeded(true),
|
_lastOperationSucceeded(true),
|
||||||
_lastErrorMessage(""),
|
_lastErrorMessage(""),
|
||||||
|
@ -55,24 +19,6 @@ void SyslogPrinter::begin(const char* host, uint16_t port,
|
||||||
DEBUG_PRINTF_P(PSTR(" Hostname: %s\n"), host);
|
DEBUG_PRINTF_P(PSTR(" Hostname: %s\n"), host);
|
||||||
DEBUG_PRINTF_P(PSTR(" Cached IP: %s\n"), syslogHostIP.toString().c_str());
|
DEBUG_PRINTF_P(PSTR(" Cached IP: %s\n"), syslogHostIP.toString().c_str());
|
||||||
DEBUG_PRINTF_P(PSTR(" Port: %u\n"), (unsigned)port);
|
DEBUG_PRINTF_P(PSTR(" Port: %u\n"), (unsigned)port);
|
||||||
|
|
||||||
/*
|
|
||||||
// Protocol
|
|
||||||
uint8_t pidx = protocol < (protoCount - 1) ? protocol : (protoCount - 1);
|
|
||||||
const char* pstr = (const char*)pgm_read_ptr(&protoNames[pidx]);
|
|
||||||
DEBUG_PRINTF_P(PSTR(" Protocol: %u (%s)\n"), (unsigned)protocol, pstr);
|
|
||||||
|
|
||||||
// — Facility
|
|
||||||
uint8_t fidx = facility < (facCount - 1) ? facility : (facCount - 1);
|
|
||||||
const char* fstr = (const char*)pgm_read_ptr(&facilityNames[fidx]);
|
|
||||||
DEBUG_PRINTF_P(PSTR(" Facility: %u (%s)\n"), (unsigned)facility, fstr);
|
|
||||||
|
|
||||||
// Severity
|
|
||||||
uint8_t idx = severity < sevCount-1 ? severity : sevCount-1;
|
|
||||||
const char* sevStr = (const char*)pgm_read_ptr(&severityNames[idx]);
|
|
||||||
DEBUG_PRINTF_P(PSTR(" Severity: %u (%s)\n"), (unsigned)severity, sevStr);
|
|
||||||
*/
|
|
||||||
|
|
||||||
DEBUG_PRINTF_P(PSTR("======================================\n"));
|
DEBUG_PRINTF_P(PSTR("======================================\n"));
|
||||||
|
|
||||||
strlcpy(syslogHost, host, sizeof(syslogHost));
|
strlcpy(syslogHost, host, sizeof(syslogHost));
|
||||||
|
@ -211,76 +157,35 @@ size_t SyslogPrinter::write(const uint8_t *buf, size_t size, uint8_t severity) {
|
||||||
String cleanHostname = String(serverDescription);
|
String cleanHostname = String(serverDescription);
|
||||||
cleanHostname.replace(' ', '_');
|
cleanHostname.replace(' ', '_');
|
||||||
|
|
||||||
// Handle different syslog protocol formats
|
// Note: Only BSD protocol is currently implemented
|
||||||
// Note: Only BSD protocol is currently implemented; RFC5424 and RAW are preserved for future use
|
syslogUdp.printf("<%d>", pri);
|
||||||
// switch (_protocol) {
|
|
||||||
// case SYSLOG_PROTO_BSD:
|
if (ntpEnabled && ntpConnected) {
|
||||||
// RFC 3164 format: <PRI>TIMESTAMP HOSTNAME APP-NAME: MESSAGE
|
// Month abbreviation
|
||||||
syslogUdp.printf("<%d>", pri);
|
static const char* const months[] = {
|
||||||
|
"Jan","Feb","Mar","Apr","May","Jun",
|
||||||
if (ntpEnabled && ntpConnected) {
|
"Jul","Aug","Sep","Oct","Nov","Dec"
|
||||||
// Month abbreviation
|
};
|
||||||
static const char* const months[] = {
|
|
||||||
"Jan","Feb","Mar","Apr","May","Jun",
|
|
||||||
"Jul","Aug","Sep","Oct","Nov","Dec"
|
|
||||||
};
|
|
||||||
|
|
||||||
syslogUdp.printf("%s %2d %02d:%02d:%02d ",
|
syslogUdp.printf("%s %2d %02d:%02d:%02d ",
|
||||||
months[month(localTime) - 1],
|
months[month(localTime) - 1],
|
||||||
day(localTime),
|
day(localTime),
|
||||||
hour(localTime),
|
hour(localTime),
|
||||||
minute(localTime),
|
minute(localTime),
|
||||||
second(localTime));
|
second(localTime));
|
||||||
} else {
|
} else {
|
||||||
// No valid time available
|
// No valid time available
|
||||||
syslogUdp.print(F("Jan 01 00:00:00 "));
|
syslogUdp.print(F("Jan 01 00:00:00 "));
|
||||||
}
|
|
||||||
|
|
||||||
// Add hostname and app name
|
|
||||||
syslogUdp.print(cleanHostname);
|
|
||||||
syslogUdp.print(" ");
|
|
||||||
syslogUdp.print(_appName);
|
|
||||||
syslogUdp.print(": ");
|
|
||||||
|
|
||||||
// Add message content
|
|
||||||
size = syslogUdp.write(buf, size);
|
|
||||||
/*
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SYSLOG_PROTO_RFC5424:
|
|
||||||
// RFC 5424 format: <PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
|
|
||||||
syslogUdp.printf("<%d>1 ", pri); // Version is always 1
|
|
||||||
|
|
||||||
if (ntpEnabled && ntpConnected) {
|
|
||||||
syslogUdp.printf("%04d-%02d-%02dT%02d:%02d:%02dZ ",
|
|
||||||
year(localTime),
|
|
||||||
month(localTime),
|
|
||||||
day(localTime),
|
|
||||||
hour(localTime),
|
|
||||||
minute(localTime),
|
|
||||||
second(localTime));
|
|
||||||
} else {
|
|
||||||
// No valid time available
|
|
||||||
syslogUdp.print(F("1970-01-01T00:00:00Z "));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add hostname, app name, and other fields (using - for empty fields)
|
|
||||||
syslogUdp.print(cleanHostname);
|
|
||||||
syslogUdp.print(" ");
|
|
||||||
syslogUdp.print(_appName);
|
|
||||||
syslogUdp.print(F(" - - - ")); // PROCID, MSGID, and STRUCTURED-DATA are empty
|
|
||||||
|
|
||||||
// Add message content
|
|
||||||
size = syslogUdp.write(buf, size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SYSLOG_PROTO_RAW:
|
|
||||||
default:
|
|
||||||
// Just send the raw message (like original NetDebug)
|
|
||||||
size = syslogUdp.write(buf, size);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
// Add hostname and app name
|
||||||
|
syslogUdp.print(cleanHostname);
|
||||||
|
syslogUdp.print(" ");
|
||||||
|
syslogUdp.print(_appName);
|
||||||
|
syslogUdp.print(": ");
|
||||||
|
|
||||||
|
// Add message content
|
||||||
|
size = syslogUdp.write(buf, size);
|
||||||
|
|
||||||
syslogUdp.endPacket();
|
syslogUdp.endPacket();
|
||||||
return size;
|
return size;
|
||||||
|
|
|
@ -8,42 +8,11 @@
|
||||||
#define SYSLOG_BUFFER_SIZE 128
|
#define SYSLOG_BUFFER_SIZE 128
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Syslog facility codes - commented out but preserved
|
|
||||||
/*
|
|
||||||
#define SYSLOG_KERN 0 // kernel messages
|
|
||||||
#define SYSLOG_USER 1 // user-level messages
|
|
||||||
#define SYSLOG_DAEMON 3 // system daemons
|
|
||||||
#define SYSLOG_SYSLOG 5 // messages generated internally by syslogd
|
|
||||||
*/
|
|
||||||
#define SYSLOG_LOCAL0 16 // local use 0
|
#define SYSLOG_LOCAL0 16 // local use 0
|
||||||
/*
|
|
||||||
#define SYSLOG_LOCAL1 17 // local use 1
|
|
||||||
#define SYSLOG_LOCAL2 18 // local use 2
|
|
||||||
#define SYSLOG_LOCAL3 19 // local use 3
|
|
||||||
#define SYSLOG_LOCAL4 20 // local use 4
|
|
||||||
#define SYSLOG_LOCAL5 21 // local use 5
|
|
||||||
#define SYSLOG_LOCAL6 22 // local use 6
|
|
||||||
#define SYSLOG_LOCAL7 23 // local use 7
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Syslog severity levels - commented out but preserved
|
|
||||||
/*
|
|
||||||
#define SYSLOG_EMERG 0 // Emergency: system is unusable
|
|
||||||
#define SYSLOG_ALERT 1 // Alert: action must be taken immediately
|
|
||||||
#define SYSLOG_CRIT 2 // Critical: critical conditions
|
|
||||||
#define SYSLOG_ERR 3 // Error: error conditions
|
|
||||||
#define SYSLOG_WARNING 4 // Warning: warning conditions
|
|
||||||
#define SYSLOG_NOTICE 5 // Notice: normal but significant condition
|
|
||||||
#define SYSLOG_INFO 6 // Informational: informational messages
|
|
||||||
*/
|
|
||||||
#define SYSLOG_DEBUG 7 // Debug: debug-level messages
|
#define SYSLOG_DEBUG 7 // Debug: debug-level messages
|
||||||
|
|
||||||
// Syslog protocol formats - commented out but preserved
|
// Syslog protocol formats - commented out but preserved
|
||||||
#define SYSLOG_PROTO_BSD 0 // Legacy BSD format (RFC 3164)
|
#define SYSLOG_PROTO_BSD 0 // Legacy BSD format (RFC 3164)
|
||||||
/*
|
|
||||||
#define SYSLOG_PROTO_RFC5424 1 // Modern syslog format (RFC 5424)
|
|
||||||
#define SYSLOG_PROTO_RAW 2 // Raw text (like original NetDebug)
|
|
||||||
*/
|
|
||||||
|
|
||||||
class SyslogPrinter : public Print {
|
class SyslogPrinter : public Print {
|
||||||
private:
|
private:
|
||||||
|
|
Ładowanie…
Reference in New Issue