2012-05-07 16:05:30 +00:00
|
|
|
/**
|
|
|
|
* eventlogs.cpp
|
|
|
|
* This file is part of the YATE Project http://YATE.null.ro
|
|
|
|
*
|
|
|
|
* Write the events and alerts to text log files
|
|
|
|
*
|
|
|
|
* Yet Another Telephony Engine - a fully featured software PBX and IVR
|
2014-02-05 11:42:17 +00:00
|
|
|
* Copyright (C) 2012-2014 Null Team
|
2012-05-07 16:05:30 +00:00
|
|
|
*
|
2013-08-06 13:38:10 +00:00
|
|
|
* This software is distributed under multiple licenses;
|
|
|
|
* see the COPYING file in the main directory for licensing
|
|
|
|
* information for this specific distribution.
|
|
|
|
*
|
|
|
|
* This use of this software may be subject to additional restrictions.
|
|
|
|
* See the LEGAL file in the main directory for details.
|
2012-05-07 16:05:30 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2013-08-06 13:38:10 +00:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
2012-05-07 16:05:30 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <yatengine.h>
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
using namespace TelEngine;
|
|
|
|
namespace { // anonymous
|
|
|
|
|
2012-06-12 23:47:01 +00:00
|
|
|
class EventLogsHandler;
|
2012-05-07 16:05:30 +00:00
|
|
|
|
|
|
|
class EventLogsPlugin : public Plugin
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
EventLogsPlugin();
|
|
|
|
~EventLogsPlugin();
|
|
|
|
virtual void initialize();
|
|
|
|
private:
|
|
|
|
EventLogsHandler* m_handler;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _WINDOWS
|
|
|
|
const char eoln[] = { '\r', '\n' };
|
|
|
|
#else
|
|
|
|
const char eoln[] = { '\n' };
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static String s_baseDir;
|
|
|
|
static bool s_pubRead = false;
|
|
|
|
|
|
|
|
INIT_PLUGIN(EventLogsPlugin);
|
|
|
|
|
|
|
|
|
2012-06-12 23:47:01 +00:00
|
|
|
class EventLogsHandler : public MessageHandler, public Mutex
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
EventLogsHandler(const char *name)
|
|
|
|
: MessageHandler(name,100,__plugin.name()),
|
|
|
|
Mutex(false,"EventLogs"),
|
|
|
|
m_mappings("")
|
|
|
|
{ }
|
|
|
|
virtual bool received(Message &msg);
|
|
|
|
void init(const NamedList* mappings);
|
|
|
|
private:
|
|
|
|
bool writeLog(const char* name, const String& line);
|
|
|
|
NamedList m_mappings;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-05-07 16:05:30 +00:00
|
|
|
bool EventLogsHandler::writeLog(const char* name, const String& line)
|
|
|
|
{
|
|
|
|
File f;
|
|
|
|
if (!f.openPath(name,true,false,true,true,true,s_pubRead))
|
|
|
|
return false;
|
|
|
|
f.writeData(line.c_str(),line.length());
|
|
|
|
f.writeData(eoln,sizeof(eoln));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool EventLogsHandler::received(Message &msg)
|
|
|
|
{
|
|
|
|
if (!msg.getBoolValue(YSTRING("eventwrite_eventlogs"),true))
|
|
|
|
return false;
|
|
|
|
const String& from = msg[YSTRING("from")];
|
|
|
|
if (from.null())
|
|
|
|
return false;
|
|
|
|
const String& text = msg[YSTRING("fulltext")];
|
|
|
|
if (text.null())
|
|
|
|
return false;
|
|
|
|
String file;
|
|
|
|
Lock lock(this);
|
|
|
|
if (s_baseDir.null())
|
|
|
|
return false;
|
|
|
|
unsigned int len = m_mappings.length();
|
|
|
|
for (unsigned int i = 0; i < len; i++) {
|
|
|
|
const NamedString* n = m_mappings.getParam(i);
|
|
|
|
if (!n)
|
|
|
|
continue;
|
|
|
|
Regexp r(n->name());
|
|
|
|
String tmp(from);
|
|
|
|
if (tmp.matches(r)) {
|
|
|
|
file = tmp.replaceMatches(*n);
|
|
|
|
if (file)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (file) {
|
|
|
|
if (!file.startsWith(Engine::pathSeparator()))
|
|
|
|
file = s_baseDir + file;
|
|
|
|
if (!writeLog(file,text))
|
|
|
|
Debug(__plugin.name(),DebugWarn,"Failed to log to file '%s'",file.c_str());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
void EventLogsHandler::init(const NamedList* mappings)
|
|
|
|
{
|
|
|
|
m_mappings.clearParams();
|
|
|
|
if (mappings)
|
|
|
|
m_mappings.copyParams(*mappings);
|
|
|
|
if (m_mappings.count() == 0)
|
|
|
|
m_mappings.addParam("^[A-Za-z0-9_-]\\+","\\0.log");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EventLogsPlugin::EventLogsPlugin()
|
|
|
|
: Plugin("eventlogs",true),
|
|
|
|
m_handler(0)
|
|
|
|
{
|
|
|
|
Output("Loaded module Event Logs");
|
|
|
|
}
|
|
|
|
|
|
|
|
EventLogsPlugin::~EventLogsPlugin()
|
|
|
|
{
|
|
|
|
Output("Unloading module Event Logs");
|
|
|
|
}
|
|
|
|
|
|
|
|
void EventLogsPlugin::initialize()
|
|
|
|
{
|
|
|
|
Output("Initializing module Event Logs");
|
|
|
|
Configuration cfg(Engine::configFile("eventlogs"));
|
|
|
|
String base = cfg.getValue("general","logs_dir");
|
|
|
|
Engine::self()->runParams().replaceParams(base);
|
|
|
|
if (base) {
|
|
|
|
File::mkDir(base);
|
|
|
|
if (!base.endsWith(Engine::pathSeparator()))
|
|
|
|
base += Engine::pathSeparator();
|
|
|
|
}
|
|
|
|
Lock lock(m_handler);
|
|
|
|
s_baseDir = base;
|
|
|
|
s_pubRead = cfg.getBoolValue("general","public_read");
|
|
|
|
if (m_handler)
|
|
|
|
m_handler->init(cfg.getSection("mappings"));
|
|
|
|
else if (base) {
|
|
|
|
m_handler = new EventLogsHandler("module.update");
|
|
|
|
m_handler->init(cfg.getSection("mappings"));
|
|
|
|
Engine::install(m_handler);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}; // anonymous namespace
|
|
|
|
|
|
|
|
/* vi: set ts=8 sw=4 sts=4 noet: */
|