Line data Source code
1 : /*
2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3 : * Copyright Contributors to the OpenSDN project
4 : */
5 : #ifndef __SYSLOG_COLLECTOR_H__
6 : #define __SYSLOG_COLLECTOR_H__
7 :
8 : #include "io/tcp_server.h"
9 : #include "io/tcp_session.h"
10 : #include "io/udp_server.h"
11 : #include "io/io_log.h"
12 : #include "viz_message.h"
13 : #include "db_handler.h"
14 :
15 : typedef boost::function<bool(const VizMsg*, bool,
16 : DbHandler *, GenDb::GenDbIf::DbAddColumnCb)> VizCallback;
17 :
18 : class SyslogParser;
19 : class SyslogGenerator;
20 : class SyslogQueueEntry
21 : {
22 : public:
23 : size_t length;
24 : boost::asio::const_buffer data;
25 : std::string ip;
26 : int port;
27 : virtual void free ();
28 0 : SyslogQueueEntry (boost::asio::const_buffer d, size_t l,
29 0 : std::string ip_, int port_):
30 0 : length(l), data(d), ip (ip_), port (port_)
31 : {
32 0 : }
33 0 : virtual ~SyslogQueueEntry() {}
34 : };
35 :
36 : typedef boost::function<void(SyslogQueueEntry *)> SyslogMsgReadFn;
37 :
38 : class SyslogTcpSession;
39 :
40 : class SyslogTcpListener : public TcpServer
41 : {
42 : public:
43 : SyslogTcpListener (EventManager *evm, SyslogMsgReadFn read_cb);
44 : virtual TcpSession *AllocSession(Socket *socket);
45 : virtual void Start (std::string ipaddress, int port);
46 : virtual void Shutdown ();
47 : virtual void ReadMsg(SyslogQueueEntry *sqe);
48 :
49 : private:
50 : SyslogTcpSession *session_;
51 : SyslogMsgReadFn read_cb_;
52 : };
53 :
54 : class SyslogUDPListener: public UdpServer
55 : {
56 : public:
57 : SyslogUDPListener (EventManager *evm, SyslogMsgReadFn read_cb);
58 : virtual void Start (std::string ipaddress, int port);
59 : virtual void Shutdown ();
60 :
61 : private:
62 : void HandleReceive(const boost::asio::const_buffer &recv_buffer,
63 : boost::asio::ip::udp::endpoint remote_endpoint,
64 : std::size_t bytes_transferred,
65 : const boost::system::error_code& error);
66 : SyslogMsgReadFn read_cb_;
67 : };
68 :
69 : class SyslogListeners
70 : {
71 : public:
72 : static const int kDefaultSyslogPort = 514;
73 : SyslogListeners (EventManager *evm, VizCallback cb,
74 : DbHandlerPtr db_handler, std::string ipaddress,
75 : int port=kDefaultSyslogPort);
76 : SyslogListeners (EventManager *evm, VizCallback cb,
77 : DbHandlerPtr db_handler, int port=kDefaultSyslogPort);
78 : virtual void Start ();
79 : virtual void Shutdown ();
80 : bool IsRunning ();
81 0 : VizCallback ProcessSandeshMsgCb() const { return cb_; }
82 0 : DbHandlerPtr GetDbHandler () const { return db_handler_; }
83 0 : SandeshMessageBuilder *GetBuilder () const { return builder_; }
84 : int GetTcpPort();
85 : int GetUdpPort();
86 : private:
87 : boost::scoped_ptr<SyslogParser> parser_;
88 : SyslogUDPListener *udp_listener_;
89 : SyslogTcpListener *tcp_listener_;
90 : int port_;
91 : std::string ipaddress_;
92 : bool inited_;
93 : VizCallback cb_;
94 : DbHandlerPtr db_handler_;
95 : SandeshMessageBuilder *builder_;
96 : };
97 :
98 : class SyslogParser
99 : {
100 :
101 : public:
102 : SyslogParser (SyslogListeners *syslog);
103 : virtual ~SyslogParser ();
104 : void Parse (SyslogQueueEntry *sqe);
105 :
106 : void Shutdown ();
107 :
108 : SyslogParser ();
109 :
110 : void Init();
111 : void WaitForIdle (int max_wait);
112 :
113 : enum dtype {
114 : int_type = 42,
115 : str_type
116 : };
117 : struct Holder {
118 : std::string key;
119 : dtype type;
120 : int64_t i_val;
121 : std::string s_val;
122 :
123 196 : Holder (std::string k, std::string v):
124 196 : key(k), type(str_type), s_val(v)
125 196 : { }
126 469 : Holder (std::string k, int64_t v):
127 469 : key(k), type(int_type), i_val(v)
128 469 : { }
129 :
130 : std::string repr()
131 : {
132 : std::ostringstream s;
133 : s << "{ \"" << key << "\": ";
134 : if (type == int_type)
135 : s << i_val << "}";
136 : else if (type == str_type)
137 : s << "\"" << s_val << "\"}";
138 : else
139 : s << "**bad type**}";
140 : return s.str();
141 : }
142 :
143 : void print ()
144 : {
145 : LOG(DEBUG, "{ \"" << key << "\": ");
146 : if (type == int_type)
147 : LOG(DEBUG, i_val << "}");
148 : else if (type == str_type)
149 : LOG(DEBUG, "\"" << s_val << "\"}");
150 : else
151 : LOG(DEBUG, "**bad type**}");
152 : }
153 : };
154 :
155 : typedef std::map<std::string, Holder> syslog_m_t;
156 :
157 : template <typename Iterator>
158 : static bool parse_syslog (Iterator start, Iterator end, syslog_m_t &v);
159 :
160 : static std::string GetMapVals (syslog_m_t v, std::string key, std::string def);
161 :
162 : static int64_t GetMapVal (syslog_m_t v, std::string key, int def);
163 :
164 : static void GetFacilitySeverity (syslog_m_t v, int& facility, int& severity);
165 :
166 : static void GetTimestamp (syslog_m_t v, time_t& timestamp);
167 :
168 : static void PostParsing (syslog_m_t &v);
169 :
170 : SyslogGenerator *GetGenerator (std::string ip);
171 :
172 : std::string GetSyslogFacilityName (uint64_t f);
173 :
174 : std::string EscapeXmlTags (std::string text);
175 :
176 : std::string GetMsgBody (syslog_m_t v);
177 :
178 : std::string GetModule(syslog_m_t v);
179 :
180 : std::string GetFacility(syslog_m_t v);
181 :
182 : int GetPID(syslog_m_t v);
183 :
184 : protected:
185 : virtual void MakeSandesh (syslog_m_t v);
186 :
187 : bool ClientParse (SyslogQueueEntry *sqe);
188 : private:
189 : WorkQueue<SyslogQueueEntry*> work_queue_;
190 : boost::uuids::random_generator umn_gen_;
191 : boost::ptr_map<std::string, SyslogGenerator> genarators_;
192 : SyslogListeners *syslog_;
193 : std::vector<std::string> facilitynames_;
194 : };
195 :
196 :
197 :
198 : #endif // __SYSLOG_COLLECTOR_H__
|