4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
19 * Anytun is free software: you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation, either version 3 of the License, or
24 * Anytun is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
35 #include "datatypes.h"
37 #include "logTargets.h"
39 #include "anytunError.h"
43 #ifdef LOG_WINEVENTLOG
48 #include <boost/date_time/posix_time/posix_time.hpp>
50 LogTarget::LogTarget() : opened(false), enabled(false), max_prio(Log::PRIO_NOTICE)
54 LogTarget::LogTarget(int prio) : opened(false), enabled(false), max_prio(prio)
58 LogTargetList::~LogTargetList()
63 LogTargetList::target_type_t LogTargetList::targetTypeFromString(std::string type)
65 if(type == "syslog") { return TARGET_SYSLOG; }
66 if(type == "file") { return TARGET_FILE; }
67 if(type == "stdout") { return TARGET_STDOUT; }
68 if(type == "stderr") { return TARGET_STDERR; }
69 if(type == "eventlog") { return TARGET_WINEVENTLOG; }
70 return TARGET_UNKNOWN;
73 std::string LogTargetList::targetTypeToString(target_type_t type)
84 case TARGET_WINEVENTLOG:
91 LogTarget* LogTargetList::add(std::string conf)
93 std::stringstream s(conf);
95 getline(s, type, ':');
97 throw syntax_error(conf, 0);
100 int prio = Log::PRIO_NOTICE;
103 throw syntax_error(conf, conf.find_first_of(':')+1);
110 throw syntax_error(conf, (s.tellg() > 0) ? static_cast<size_t>(s.tellg()) - 1 : 0);
117 return add(targetTypeFromString(type), prio, buff);
120 LogTarget* LogTargetList::add(target_type_t type, int prio, std::string conf)
123 case TARGET_SYSLOG: {
125 if(!LogTargetSyslog::duplicateAllowed() && targets.count(TARGET_SYSLOG)) {
126 AnytunError::throwErr() << targetTypeToString(TARGET_SYSLOG) << " logtarget is supported only once";
129 return targets.insert(TargetsMap::value_type(TARGET_SYSLOG, new LogTargetSyslog(prio, conf)))->second;
131 AnytunError::throwErr() << targetTypeToString(TARGET_SYSLOG) << " logtarget is not supported";
136 if(!LogTargetFile::duplicateAllowed() && targets.count(TARGET_FILE)) {
137 AnytunError::throwErr() << targetTypeToString(TARGET_FILE) << " logtarget is supported only once";
140 return targets.insert(TargetsMap::value_type(TARGET_FILE, new LogTargetFile(prio, conf)))->second;
142 AnytunError::throwErr() << targetTypeToString(TARGET_FILE) << " logtarget is not supported";
146 case TARGET_STDERR: {
148 if(!LogTargetStdout::duplicateAllowed() && targets.count(type)) {
149 AnytunError::throwErr() << targetTypeToString(type) << " logtarget is supported only once";
152 if(type == TARGET_STDERR) {
153 return targets.insert(TargetsMap::value_type(type, new LogTargetStdout(prio, std::cerr)))->second;
155 return targets.insert(TargetsMap::value_type(type, new LogTargetStdout(prio, std::cout)))->second;
158 AnytunError::throwErr() << targetTypeToString(type) + " logtarget is not supported";
161 case TARGET_WINEVENTLOG: {
162 #ifdef LOG_WINEVENTLOG
163 if(!LogTargetWinEventlog::duplicateAllowed() && targets.count(TARGET_WINEVENTLOG)) {
164 AnytunError::throwErr() << targetTypeToString(TARGET_WINEVENTLOG) << " logtarget is supported only once";
167 return targets.insert(TargetsMap::value_type(TARGET_WINEVENTLOG, new LogTargetWinEventlog(prio, conf)))->second;
169 AnytunError::throwErr() << targetTypeToString(TARGET_WINEVENTLOG) << " logtarget is not supported";
173 AnytunError::throwErr() << "unknown log target";
178 void LogTargetList::clear()
180 TargetsMap::iterator it;
181 for(it = targets.begin(); it != targets.end(); ++it) {
187 void LogTargetList::log(std::string msg, int prio)
189 TargetsMap::const_iterator it;
190 for(it = targets.begin(); it != targets.end(); ++it) {
191 if(it->second->isEnabled() && it->second->getMaxPrio() >= prio) {
192 it->second->log(msg, prio);
199 int LogTargetSyslog::facilityFromString(std::string fac)
201 if(fac == "user") { return FAC_USER; }
202 if(fac == "mail") { return FAC_MAIL; }
203 if(fac == "daemon") { return FAC_DAEMON; }
204 if(fac == "auth") { return FAC_AUTH; }
205 if(fac == "syslog") { return FAC_SYSLOG; }
206 if(fac == "lpr") { return FAC_LPR; }
207 if(fac == "news") { return FAC_NEWS; }
208 if(fac == "uucp") { return FAC_UUCP; }
209 if(fac == "cron") { return FAC_CRON; }
210 if(fac == "authpriv") { return FAC_AUTHPRIV; }
211 if(fac == "ftp") { return FAC_FTP; }
212 if(fac == "local0") { return FAC_LOCAL0; }
213 if(fac == "local1") { return FAC_LOCAL1; }
214 if(fac == "local2") { return FAC_LOCAL2; }
215 if(fac == "local3") { return FAC_LOCAL3; }
216 if(fac == "local4") { return FAC_LOCAL4; }
217 if(fac == "local5") { return FAC_LOCAL5; }
218 if(fac == "local6") { return FAC_LOCAL6; }
219 if(fac == "local7") { return FAC_LOCAL7; }
221 AnytunError::throwErr() << "unknown syslog facility";
225 std::string LogTargetSyslog::facilityToString(int fac)
267 AnytunError::throwErr() << "unknown syslog facility";
272 LogTargetSyslog::LogTargetSyslog(int prio, std::string conf) : LogTarget(prio)
274 std::stringstream s(conf);
275 facility = FAC_DAEMON;
276 getline(s, logname, ',');
282 getline(s, fac, ',');
287 facility = LogTargetSyslog::facilityFromString(fac);
290 LogTargetSyslog::~LogTargetSyslog()
297 void LogTargetSyslog::open()
299 openlog(logname.c_str(), LOG_PID, facility);
303 void LogTargetSyslog::close()
309 void LogTargetSyslog::log(std::string msg, int prio)
315 syslog((prio + 2) | facility, "%s", msg.c_str());
318 LogTargetSyslog& LogTargetSyslog::setLogName(std::string l)
328 LogTargetSyslog& LogTargetSyslog::setFacility(int f)
341 LogTargetFile::LogTargetFile(int prio, std::string conf) : LogTarget(prio)
343 std::stringstream s(conf);
344 getline(s, logfilename, ',');
346 logfilename = "anytun.log";
350 LogTargetFile::~LogTargetFile()
357 void LogTargetFile::open()
359 logfile.open(logfilename.c_str(), std::fstream::out | std::fstream::app);
360 opened = logfile.is_open();
363 void LogTargetFile::close()
365 if(logfile.is_open()) {
371 void LogTargetFile::log(std::string msg, int prio)
377 std::string timestamp = boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time());
378 logfile << timestamp << " " << Log::prioToString(prio) << ": " << msg << std::endl;
381 LogTargetFile& LogTargetFile::setLogFilename(std::string l)
394 LogTargetStdout::LogTargetStdout(int prio, std::ostream& s) : LogTarget(prio), stream(s)
398 LogTargetStdout::~LogTargetStdout()
405 void LogTargetStdout::open()
410 void LogTargetStdout::close()
415 void LogTargetStdout::log(std::string msg, int prio)
421 std::string timestamp = boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time());
422 stream << timestamp << " " << Log::prioToString(prio) << ": " << msg << std::endl;
427 #ifdef LOG_WINEVENTLOG
428 LogTargetWinEventlog::LogTargetWinEventlog(int prio, std::string conf) : LogTarget(prio)
430 std::stringstream s(conf);
431 getline(s, logname, ',');
437 LogTargetWinEventlog::~LogTargetWinEventlog()
444 void LogTargetWinEventlog::open()
446 h_event_source = RegisterEventSourceA(NULL, logname.c_str());
452 void LogTargetWinEventlog::close()
455 DeregisterEventSource(h_event_source);
460 void LogTargetWinEventlog::log(std::string msg, int prio)
466 LPCTSTR lpszStrings[1];
467 CHAR buffer[STERROR_TEXT_MAX];
468 StringCchPrintfA(buffer, STERROR_TEXT_MAX, "%s", msg.c_str());
469 lpszStrings[0] = buffer;
471 ReportEventA(h_event_source, prioToEventLogType(prio), 0, prio, NULL, 1, 0, lpszStrings, NULL);
475 LogTargetWinEventlog& LogTargetWinEventlog::setLogName(std::string l)
485 WORD LogTargetWinEventlog::prioToEventLogType(int prio)
488 case Log::PRIO_ERROR:
489 return EVENTLOG_ERROR_TYPE;
490 case Log::PRIO_WARNING:
491 return EVENTLOG_WARNING_TYPE;
492 case Log::PRIO_NOTICE:
493 return EVENTLOG_INFORMATION_TYPE;
495 return EVENTLOG_SUCCESS;
496 case Log::PRIO_DEBUG:
497 return EVENTLOG_INFORMATION_TYPE;
499 return EVENTLOG_ERROR_TYPE;