mirror of https://github.com/lumapu/ahoy.git
				
				
			
				 2 changed files with 153 additions and 0 deletions
			
			
		| @ -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 | ||||
| @ -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 | ||||
					Loading…
					
					
				
		Reference in new issue