Switch part of libtransport and libpurple backend into log4cxx

This commit is contained in:
HanzZ 2011-06-20 21:45:05 +02:00
parent f9d40b961a
commit b5c2a6e001
5 changed files with 75 additions and 41 deletions

View file

@ -15,15 +15,20 @@
#include "transport/networkplugin.h"
#include "spectrumeventloop.h"
#include "geventloop.h"
#include "log4cxx/logger.h"
#include "log4cxx/consoleappender.h"
#include "log4cxx/patternlayout.h"
#define Log(X, STRING) std::cout << "[SPECTRUM] " << X << " " << STRING << "\n";
using namespace log4cxx;
static LoggerPtr logger_libpurple = Logger::getLogger("backend.libpurple");
static LoggerPtr logger = Logger::getLogger("backend");
using namespace Transport;
class SpectrumNetworkPlugin;
Logger *_logger;
SpectrumNetworkPlugin *np;
static gboolean nodaemon = FALSE;
@ -107,14 +112,14 @@ static void * requestInput(const char *title, const char *primary,const char *se
static void *requestAction(const char *title, const char *primary, const char *secondary, int default_action, PurpleAccount *account, const char *who,PurpleConversation *conv, void *user_data, size_t action_count, va_list actions){
std::string t(title ? title : "NULL");
if (t == "SSL Certificate Verification") {
Log("purple", "accepting SSL certificate");
LOG4CXX_INFO(logger, "accepting SSL certificate");
va_arg(actions, char *);
((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
}
else {
if (title) {
std::string headerString(title);
Log("purple", "header string: " << headerString);
LOG4CXX_INFO(logger, "header string: " << headerString);
if (headerString == "SSL Certificate Verification") {
va_arg(actions, char *);
((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
@ -149,7 +154,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
PurpleAccount *account = NULL;
const char *protocol = CONFIG_STRING(config, "service.protocol").c_str();
if (purple_accounts_find(legacyName.c_str(), protocol) != NULL){
Log(user, "this account already exists");
// Log(user, "this account already exists");
account = purple_accounts_find(legacyName.c_str(), protocol);
// User *u = (User *) account->ui_data;
// if (u && u != user) {
@ -158,7 +163,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
// }
}
else {
Log(user, "creating new account");
// Log(user, "creating new account");
account = purple_account_new(legacyName.c_str(), protocol);
purple_accounts_add(account);
@ -848,16 +853,17 @@ static void signed_on(PurpleConnection *gc, gpointer unused) {
}
static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) {
std::string c("[LIBPURPLE");
std::string c("");
std::string args(arg_s);
args.erase(args.size() - 1);
if (category) {
c.push_back('/');
c.append(category);
}
c.push_back(']');
c.push_back(':');
std::cout << c << " " << arg_s;
LOG4CXX_INFO(logger_libpurple, c << args);
}
/*
@ -1025,6 +1031,9 @@ int main(int argc, char **argv) {
return 1;
}
LoggerPtr root = log4cxx::Logger::getRootLogger();
root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n")));
initPurple(config);
SpectrumEventLoop eventLoop;

View file

@ -29,6 +29,12 @@
#include "Swiften/Server/ServerStanzaChannel.h"
#include "Swiften/Elements/StreamError.h"
#include "pbnetwork.pb.h"
#include "log4cxx/logger.h"
#include "log4cxx/basicconfigurator.h"
using namespace log4cxx;
static LoggerPtr logger = Logger::getLogger("NetworkPlugin");
namespace Transport {
@ -238,24 +244,24 @@ void NetworkPlugin::handleRoomChanged(const std::string &user, const std::string
void NetworkPlugin::_handleConnected(bool error) {
if (error) {
std::cerr << "Connecting error\n";
LOG4CXX_ERROR(logger, "Connecting error. Exiting");
m_pingTimer->stop();
exit(1);
}
else {
std::cout << "Connected\n";
LOG4CXX_INFO(logger, "Connected to NetworkPluginServer");
m_pingTimer->start();
}
}
void NetworkPlugin::handleDisconnected() {
std::cerr << "Disconnected\n";
LOG4CXX_INFO(logger, "Disconnected from NetworkPluginServer. Exiting.");
m_pingTimer->stop();
exit(1);
}
void NetworkPlugin::connect() {
std::cout << "Trying to connect the server\n";
LOG4CXX_INFO(logger, "Connecting NetworkPluginServer host " << m_host << " port " << m_port);
m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(m_host), m_port));
}
@ -457,12 +463,12 @@ void NetworkPlugin::sendPong() {
wrap.SerializeToString(&message);
send(message);
std::cout << "SENDING PONG\n";
LOG4CXX_INFO(logger, "PONG");
}
void NetworkPlugin::pingTimeout() {
std::cout << "PINGTIMEOUT " << m_pingReceived << " " << this << "\n";
if (m_pingReceived == false) {
LOG4CXX_ERROR(logger, "No PING received for long time (NetworkPluginServer crashed?). Exiting");
exit(1);
}
m_pingReceived = false;

View file

@ -37,9 +37,14 @@
#include "pbnetwork.pb.h"
#include "sys/wait.h"
#include "sys/signal.h"
#include "log4cxx/logger.h"
using namespace log4cxx;
namespace Transport {
static LoggerPtr logger = Logger::getLogger("NetworkPluginServer");
class NetworkConversation : public Conversation {
public:
NetworkConversation(ConversationManager *conversationManager, const std::string &legacyName, bool muc = false) : Conversation(conversationManager, legacyName, muc) {
@ -85,6 +90,7 @@ class NetworkFactory : public Factory {
wrap.SerializeToString(&MESSAGE);
static int exec_(const char *path, const char *host, const char *port, const char *config) {
LOG4CXX_INFO(logger, "Starting new backend " << path);
// char *argv[] = {(char*)script_name, '\0'};
int status = 0;
pid_t pid = fork();
@ -139,6 +145,8 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
m_server->onNewConnection.connect(boost::bind(&NetworkPluginServer::handleNewClientConnection, this, _1));
m_server->start();
LOG4CXX_INFO(logger, "Listening on host " << CONFIG_STRING(m_config, "service.backend_host") << " port " << CONFIG_STRING(m_config, "service.backend_port"));
signal(SIGCHLD, SigCatcher);
exec_(CONFIG_STRING(m_config, "service.backend").c_str(), CONFIG_STRING(m_config, "service.backend_host").c_str(), CONFIG_STRING(m_config, "service.backend_port").c_str(), m_config->getConfigFile().c_str());
@ -155,6 +163,8 @@ void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr<Swift::Con
client->pongReceived = true;
client->connection = c;
LOG4CXX_INFO(logger, "New backend " << client << " connected. Current backend count=" << (m_clients.size() + 1));
if (m_clients.size() == 0) {
// first backend connected, start the server, we're ready.
m_component->start();
@ -169,7 +179,9 @@ void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr<Swift::Con
}
void NetworkPluginServer::handleSessionFinished(Client *c) {
LOG4CXX_INFO(logger, "Backend " << c << " disconnected. Current backend count=" << (m_clients.size() - 1));
for (std::list<User *>::const_iterator it = c->users.begin(); it != c->users.end(); it++) {
LOG4CXX_ERROR(logger, "Backend " << c << " disconnected (probably crashed) with active user " << (*it)->getJID().toString());
(*it)->setData(NULL);
(*it)->handleDisconnected("Internal Server Error, please reconnect.");
}
@ -188,14 +200,11 @@ void NetworkPluginServer::handleSessionFinished(Client *c) {
void NetworkPluginServer::handleConnectedPayload(const std::string &data) {
pbnetwork::Connected payload;
std::cout << "CONNECTED LOGIN 2 " << payload.user() << "\n";
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
std::cout << "CONNECTED LOGIN 3 " << payload.user() << "\n";
m_component->m_userRegistry->onPasswordValid(payload.user());
// std::cout << payload.name() << "\n";
}
void NetworkPluginServer::handleDisconnectedPayload(const std::string &data) {
@ -269,7 +278,6 @@ void NetworkPluginServer::handleChatStatePayload(const std::string &data, Swift:
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
if (!conv) {
std::cout << "handling chatstate: NO conv with buddyname=" << payload.buddyname() << "\n";
return;
}
@ -456,7 +464,6 @@ void NetworkPluginServer::send(boost::shared_ptr<Swift::Connection> &c, const st
}
void NetworkPluginServer::pingTimeout() {
std::cout << "pingtimeout\n";
for (std::list<Client *>::const_iterator it = m_clients.begin(); it != m_clients.end(); it++) {
if ((*it)->pongReceived) {
sendPing((*it));
@ -471,6 +478,7 @@ void NetworkPluginServer::pingTimeout() {
void NetworkPluginServer::handleUserCreated(User *user) {
Client *c = getFreeClient();
if (!c) {
LOG4CXX_ERROR(logger, "There is no backend to handle user " << user->getJID().toString());
user->handleDisconnected("Internal Server Error, please reconnect.");
return;
}
@ -589,7 +597,7 @@ void NetworkPluginServer::handleUserDestroyed(User *user) {
send(c->connection, message);
c->users.remove(user);
if (c->users.size() == 0) {
std::cout << "DISCONNECTING\n";
LOG4CXX_INFO(logger, "Disconnecting backend " << c << ". There are no users.");
c->connection->disconnect();
c->connection.reset();
// m_clients.erase(user->connection);
@ -731,7 +739,7 @@ void NetworkPluginServer::sendPing(Client *c) {
send(c->connection, message);
c->pongReceived = false;
std::cout << "SENDING PING\n";
LOG4CXX_INFO(logger, "PING to " << c);
}
NetworkPluginServer::Client *NetworkPluginServer::getFreeClient() {

View file

@ -20,6 +20,9 @@
#include "transport/sqlite3backend.h"
#include <boost/bind.hpp>
#include "log4cxx/logger.h"
using namespace log4cxx;
#define SQLITE_DB_VERSION 3
#define CHECK_DB_RESPONSE(stmt) \
@ -31,7 +34,7 @@
// Prepare the SQL statement
#define PREP_STMT(sql, str) \
if(sqlite3_prepare_v2(m_db, std::string(str).c_str(), -1, &sql, NULL)) { \
onStorageError(str, (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); \
LOG4CXX_ERROR(logger, str<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); \
return false; \
}
@ -52,18 +55,19 @@
#define GET_INT(STATEMENT) sqlite3_column_int(STATEMENT, STATEMENT##_id_get++)
#define GET_STR(STATEMENT) (const char *) sqlite3_column_text(STATEMENT, STATEMENT##_id_get++)
#define EXECUTE_STATEMENT(STATEMENT, NAME) if(sqlite3_step(STATEMENT) != SQLITE_DONE) {\
onStorageError(NAME, (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));\
LOG4CXX_ERROR(logger, NAME<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));\
}
using namespace boost;
namespace Transport {
static LoggerPtr logger = Logger::getLogger("SQLite3Backend");
SQLite3Backend::SQLite3Backend(Config *config) {
m_config = config;
m_db = NULL;
m_prefix = CONFIG_STRING(m_config, "database.prefix");
std::cout << "SQLITE3 " << this << "\n";
}
SQLite3Backend::~SQLite3Backend(){
@ -96,6 +100,7 @@ SQLite3Backend::~SQLite3Backend(){
}
bool SQLite3Backend::connect() {
LOG4CXX_INFO(logger, "Opening database " << CONFIG_STRING(m_config, "database.database"));
if (sqlite3_open(CONFIG_STRING(m_config, "database.database").c_str(), &m_db)) {
sqlite3_close(m_db);
return false;
@ -186,7 +191,7 @@ bool SQLite3Backend::exec(const std::string &query) {
char *errMsg = 0;
int rc = sqlite3_exec(m_db, query.c_str(), NULL, 0, &errMsg);
if (rc != SQLITE_OK) {
onStorageError(query, errMsg);
LOG4CXX_ERROR(logger, errMsg << " during statement " << query);
sqlite3_free(errMsg);
return false;
}
@ -203,7 +208,7 @@ void SQLite3Backend::setUser(const UserInfo &user) {
sqlite3_bind_int (m_setUser, 6, user.vip);
if(sqlite3_step(m_setUser) != SQLITE_DONE) {
onStorageError("setUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "setUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
}
}
@ -225,7 +230,7 @@ bool SQLite3Backend::getUser(const std::string &barejid, UserInfo &user) {
}
if (ret != SQLITE_DONE) {
onStorageError("getUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "getUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
}
return false;
@ -246,7 +251,7 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) {
BIND_INT(m_addBuddy, buddyInfo.flags);
if(sqlite3_step(m_addBuddy) != SQLITE_DONE) {
onStorageError("addBuddy query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "addBuddy query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return -1;
}
@ -347,7 +352,7 @@ bool SQLite3Backend::getBuddies(long id, std::list<BuddyInfo> &roster) {
}
// if (ret != SQLITE_DONE) {
// onStorageError("getBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
// LOG4CXX_ERROR(logger, "getBuddiesSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
// return false;
// }
@ -355,7 +360,7 @@ bool SQLite3Backend::getBuddies(long id, std::list<BuddyInfo> &roster) {
}
if (ret != SQLITE_DONE) {
onStorageError("getBuddies query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "getBuddies query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return false;
}
@ -366,28 +371,28 @@ bool SQLite3Backend::removeUser(long id) {
sqlite3_reset(m_removeUser);
sqlite3_bind_int(m_removeUser, 1, id);
if(sqlite3_step(m_removeUser) != SQLITE_DONE) {
onStorageError("removeUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "removeUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return false;
}
sqlite3_reset(m_removeUserSettings);
sqlite3_bind_int(m_removeUserSettings, 1, id);
if(sqlite3_step(m_removeUserSettings) != SQLITE_DONE) {
onStorageError("removeUserSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "removeUserSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return false;
}
sqlite3_reset(m_removeUserBuddies);
sqlite3_bind_int(m_removeUserBuddies, 1, id);
if(sqlite3_step(m_removeUserBuddies) != SQLITE_DONE) {
onStorageError("removeUserBuddies query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "removeUserBuddies query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return false;
}
sqlite3_reset(m_removeUserBuddiesSettings);
sqlite3_bind_int(m_removeUserBuddiesSettings, 1, id);
if(sqlite3_step(m_removeUserBuddiesSettings) != SQLITE_DONE) {
onStorageError("removeUserBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
LOG4CXX_ERROR(logger, "removeUserBuddiesSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
return false;
}

View file

@ -28,8 +28,9 @@
#include "Swiften/TLS/OpenSSL/OpenSSLServerContext.h"
#include "Swiften/TLS/PKCS12Certificate.h"
#include "Swiften/TLS/OpenSSL/OpenSSLServerContextFactory.h"
#include <log4cxx/logger.h>
#include "log4cxx/basicconfigurator.h"
#include "log4cxx/logger.h"
#include "log4cxx/consoleappender.h"
#include "log4cxx/patternlayout.h"
using namespace Swift;
using namespace boost;
@ -38,6 +39,7 @@ using namespace log4cxx;
namespace Transport {
static LoggerPtr logger = Logger::getLogger("Component");
static LoggerPtr logger_xml = Logger::getLogger("Component.XML");
class MyUserRegistry : public Swift::UserRegistry {
public:
@ -66,7 +68,11 @@ Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) {
m_factory = factory;
m_loop = loop;
BasicConfigurator::configure();
// BasicConfigurator::configure();
LoggerPtr root = Logger::getRootLogger();
root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n")));
m_jid = Swift::JID(CONFIG_STRING(m_config, "service.jid"));
@ -201,11 +207,11 @@ void Component::handleConnectionError(const ComponentError &error) {
}
void Component::handleDataRead(const Swift::SafeByteArray &data) {
onXMLIn(safeByteArrayToString(data));
LOG4CXX_INFO(logger_xml, "XML IN " << safeByteArrayToString(data));
}
void Component::handleDataWritten(const Swift::SafeByteArray &data) {
onXMLOut(safeByteArrayToString(data));
LOG4CXX_INFO(logger_xml, "XML OUT " << safeByteArrayToString(data));
}
void Component::handlePresence(Swift::Presence::ref presence) {