-
-
Notifications
You must be signed in to change notification settings - Fork 224
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'fsck-block-development03' into development03
- Loading branch information
Showing
5 changed files
with
169 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
#include <algorithm> | ||
#include "syslog.h" | ||
|
||
#ifdef ENABLE_SYSLOG | ||
|
||
#define SYSLOG_MAX_PACKET_SIZE 256 | ||
|
||
|
||
//----------------------------------------------------------------------------- | ||
void DbgSyslog::setup(settings_t *config) { | ||
mConfig = config; | ||
|
||
// Syslog callback overrides web-serial callback | ||
registerDebugCb(std::bind(&DbgSyslog::syslogCb, this, std::placeholders::_1)); // dbg.h | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
void DbgSyslog::syslogCb (String msg) | ||
{ | ||
if (!mSyslogIP.isSet()) { | ||
// use WiFi.hostByName to DNS lookup for IPAddress of syslog server | ||
if (WiFi.status() == WL_CONNECTED) { | ||
WiFi.hostByName(SYSLOG_HOST,mSyslogIP); | ||
} | ||
} | ||
if (!mSyslogIP.isSet()) { | ||
return; | ||
} | ||
uint16_t msgLength = msg.length(); | ||
uint16_t msgPos = 0; | ||
|
||
do { | ||
uint16_t charsToCopy = std::min(msgLength-msgPos,SYSLOG_BUF_SIZE - mSyslogBufFill); | ||
|
||
while (charsToCopy > 0) { | ||
mSyslogBuffer[mSyslogBufFill] = msg[msgPos]; | ||
msgPos++; | ||
mSyslogBufFill++; | ||
charsToCopy--; | ||
} | ||
mSyslogBuffer[mSyslogBufFill] = '\0'; | ||
|
||
bool isBufferFull = (mSyslogBufFill == SYSLOG_BUF_SIZE); | ||
bool isEolFound = false; | ||
if (mSyslogBufFill >= 2) { | ||
isEolFound = (mSyslogBuffer[mSyslogBufFill-2] == '\r' && mSyslogBuffer[mSyslogBufFill-1] == '\n'); | ||
} | ||
// Get severity from input message | ||
if (msgLength >= 2) { | ||
if (':' == msg[1]) { | ||
switch(msg[0]) { | ||
case 'E': mSyslogSeverity = PRI_ERROR; break; | ||
case 'W': mSyslogSeverity = PRI_WARNING; break; | ||
case 'I': mSyslogSeverity = PRI_INFO; break; | ||
case 'D': mSyslogSeverity = PRI_DEBUG; break; | ||
default: mSyslogSeverity = PRI_NOTICE; break; | ||
} | ||
} | ||
} | ||
|
||
if (isBufferFull || isEolFound) { | ||
// Send mSyslogBuffer in chunks because mSyslogBuffer is larger than syslog packet size | ||
int packetStart = 0; | ||
int packetSize = 122; // syslog payload depends also on hostname and app | ||
char saveChar; | ||
if (isEolFound) { | ||
mSyslogBuffer[mSyslogBufFill-2]=0; // skip \r\n | ||
} | ||
while(packetStart < mSyslogBufFill) { | ||
saveChar = mSyslogBuffer[packetStart+packetSize]; | ||
mSyslogBuffer[packetStart+packetSize] = 0; | ||
log(mConfig->sys.deviceName,SYSLOG_FACILITY, mSyslogSeverity, &mSyslogBuffer[packetStart]); | ||
mSyslogBuffer[packetStart+packetSize] = saveChar; | ||
packetStart += packetSize; | ||
} | ||
mSyslogBufFill = 0; | ||
} | ||
|
||
} while (msgPos < msgLength); // Message not completely processed | ||
|
||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
void DbgSyslog::log(const char *hostname, uint8_t facility, uint8_t severity, char* msg) { | ||
// The PRI value is an integer number which calculates by the following metric: | ||
uint8_t priority = (8 * facility) + severity; | ||
|
||
// This is a unit8 instead of a char because that's what udp.write() wants | ||
uint8_t buffer[SYSLOG_MAX_PACKET_SIZE]; | ||
int len = snprintf((char*)buffer, SYSLOG_MAX_PACKET_SIZE, "<%d>%s %s: %s", priority, hostname, SYSLOG_APP, msg); | ||
//printf("syslog::log %s\n",mSyslogIP.toString().c_str()); | ||
//printf("syslog::log %d %s\n",len,buffer); | ||
// Send the raw UDP packet | ||
mSyslogUdp.beginPacket(mSyslogIP, SYSLOG_PORT); | ||
mSyslogUdp.write(buffer, len); | ||
mSyslogUdp.endPacket(); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
|
||
#ifndef __SYSLOG_H__ | ||
#define __SYSLOG_H__ | ||
|
||
#ifdef ESP8266 | ||
#include <ESP8266WiFi.h> | ||
#elif defined(ESP32) | ||
#include <WiFi.h> | ||
#endif | ||
#include <WiFiUdp.h> | ||
#include "../config/config.h" | ||
#include "../config/settings.h" | ||
|
||
#ifdef ENABLE_SYSLOG | ||
|
||
#define SYSLOG_BUF_SIZE 255 | ||
|
||
#define PRI_EMERGENCY 0 | ||
#define PRI_ALERT 1 | ||
#define PRI_CRITICAL 2 | ||
#define PRI_ERROR 3 | ||
#define PRI_WARNING 4 | ||
#define PRI_NOTICE 5 | ||
#define PRI_INFO 6 | ||
#define PRI_DEBUG 7 | ||
|
||
#define FAC_USER 1 | ||
#define FAC_LOCAL0 16 | ||
#define FAC_LOCAL1 17 | ||
#define FAC_LOCAL2 18 | ||
#define FAC_LOCAL3 19 | ||
#define FAC_LOCAL4 20 | ||
#define FAC_LOCAL5 21 | ||
#define FAC_LOCAL6 22 | ||
#define FAC_LOCAL7 23 | ||
|
||
class DbgSyslog { | ||
public: | ||
void setup (settings_t *config); | ||
void syslogCb(String msg); | ||
void log(const char *hostname, uint8_t facility, uint8_t severity, char* msg); | ||
|
||
private: | ||
WiFiUDP mSyslogUdp; | ||
IPAddress mSyslogIP; | ||
settings_t *mConfig; | ||
char mSyslogBuffer[SYSLOG_BUF_SIZE+1]; | ||
uint16_t mSyslogBufFill = 0; | ||
int mSyslogSeverity = PRI_NOTICE; | ||
}; | ||
|
||
#endif | ||
|
||
#endif |