diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 84a7dd8f..2ee4a155 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -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; diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index eec1f08e..0e73f41d 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -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; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 079f8e62..d60451f1 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -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_ptrpongReceived = 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_ptrgetJID().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 &c, const st } void NetworkPluginServer::pingTimeout() { - std::cout << "pingtimeout\n"; for (std::list::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() { diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index d9f65d11..d75b52d6 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -20,6 +20,9 @@ #include "transport/sqlite3backend.h" #include +#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 &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 &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; } diff --git a/src/transport.cpp b/src/transport.cpp index b3426327..965a2688 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -28,8 +28,9 @@ #include "Swiften/TLS/OpenSSL/OpenSSLServerContext.h" #include "Swiften/TLS/PKCS12Certificate.h" #include "Swiften/TLS/OpenSSL/OpenSSLServerContextFactory.h" -#include -#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) {