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