1
0
mirror of https://github.com/anope/anope.git synced 2026-06-25 15:06:37 +02:00

Added a new logging system

This commit is contained in:
Adam
2010-08-27 20:56:28 -04:00
parent 73fb94c553
commit c2ddecc2b1
119 changed files with 1516 additions and 1222 deletions
+138 -142
View File
@@ -43,7 +43,6 @@ Anope::string orig_cwd; /* Original current working directory */
Anope::string log_filename = "services.log"; /* -log filename */
int debug = 0; /* -debug */
bool readonly = false; /* -readonly */
bool LogChan = false; /* -logchan */
bool nofork = false; /* -nofork */
bool nothird = false; /* -nothrid */
bool noexpire = false; /* -noexpire */
@@ -138,7 +137,7 @@ extern void expire_all()
FOREACH_MOD(I_OnPreDatabaseExpire, OnPreDatabaseExpire());
Alog(LOG_DEBUG) << "Running expire routines";
Log(LOG_DEBUG) << "Running expire routines";
expire_nicks();
expire_chans();
expire_requests();
@@ -156,7 +155,7 @@ void save_databases()
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnSaveDatabase, OnSaveDatabase());
Alog(LOG_DEBUG) << "Saving FFF databases";
Log(LOG_DEBUG) << "Saving databases";
}
/*************************************************************************/
@@ -169,7 +168,7 @@ void do_restart_services()
expire_all();
save_databases();
}
Alog() << "Restarting";
Log() << "Restarting";
FOREACH_MOD(I_OnPreRestart, OnPreRestart());
@@ -188,15 +187,12 @@ void do_restart_services()
ircdproto->SendSquit(Config->ServerName, quitmsg);
SocketEngine->Process();
delete UplinkSock;
close_log();
ModuleManager::UnloadAll();
chdir(binary_dir.c_str());
execve(services_bin.c_str(), my_av, my_envp);
if (!readonly)
{
open_log();
log_perror("Restart failed");
close_log();
throw FatalException("Restart failed");
}
FOREACH_MOD(I_OnRestart, OnRestart());
@@ -214,7 +210,7 @@ static void services_shutdown()
if (quitmsg.empty())
quitmsg = "Terminating, reason unknown";
Alog() << quitmsg;
Log() << quitmsg;
if (started && UplinkSock)
{
/* Send a quit for all of our bots */
@@ -259,7 +255,7 @@ void sighandler(int signum)
#ifndef _WIN32
if (signum == SIGHUP)
{
Alog() << "Received SIGHUP: Saving Databases & Rehash Configuration";
Log() << "Received SIGHUP: Saving Databases & Rehash Configuration";
expire_all();
save_databases();
@@ -273,7 +269,7 @@ void sighandler(int signum)
}
catch (const ConfigException &ex)
{
Alog() << "Error reloading configuration file: " << ex.GetReason();
Log() << "Error reloading configuration file: " << ex.GetReason();
}
return;
@@ -287,7 +283,7 @@ void sighandler(int signum)
signal(SIGHUP, SIG_IGN);
#endif
Alog() << "Received SIGTERM, exiting.";
Log() << "Received SIGTERM, exiting.";
expire_all();
save_databases();
@@ -300,7 +296,7 @@ void sighandler(int signum)
if (nofork)
{
signal(SIGINT, SIG_IGN);
Alog() << "Received SIGINT, exiting.";
Log() << "Received SIGINT, exiting.";
expire_all();
save_databases();
quitmsg = "Shutting down on SIGINT";
@@ -323,7 +319,7 @@ void sighandler(int signum)
if (isatty(2))
fprintf(stderr, "%s\n", quitmsg.c_str());
else
Alog() << quitmsg;
Log() << quitmsg;
exit(1);
}
@@ -398,11 +394,11 @@ static bool Connect()
}
catch (const SocketException &ex)
{
Alog() << "Unable to connect to server" << servernum << " (" << uplink_server->host << ":" << uplink_server->port << "), " << ex.GetReason();
Log() << "Unable to connect to server" << servernum << " (" << uplink_server->host << ":" << uplink_server->port << "), " << ex.GetReason();
continue;
}
Alog() << "Connected to Server " << servernum << " (" << uplink_server->host << ":" << uplink_server->port << ")";
Log() << "Connected to Server " << servernum << " (" << uplink_server->host << ":" << uplink_server->port << ")";
return true;
}
@@ -417,175 +413,175 @@ static bool Connect()
int main(int ac, char **av, char **envp)
{
my_av = av;
my_envp = envp;
try
{
my_av = av;
my_envp = envp;
char cwd[PATH_MAX] = "";
char cwd[PATH_MAX] = "";
#ifdef _WIN32
GetCurrentDirectory(PATH_MAX, cwd);
GetCurrentDirectory(PATH_MAX, cwd);
#else
getcwd(cwd, PATH_MAX);
getcwd(cwd, PATH_MAX);
#endif
orig_cwd = cwd;
orig_cwd = cwd;
#ifndef _WIN32
/* If we're root, issue a warning now */
if (!getuid() && !getgid())
{
fprintf(stderr, "WARNING: You are currently running Anope as the root superuser. Anope does not\n");
fprintf(stderr, " require root privileges to run, and it is discouraged that you run Anope\n");
fprintf(stderr, " as the root superuser.\n");
}
/* If we're root, issue a warning now */
if (!getuid() && !getgid())
{
fprintf(stderr, "WARNING: You are currently running Anope as the root superuser. Anope does not\n");
fprintf(stderr, " require root privileges to run, and it is discouraged that you run Anope\n");
fprintf(stderr, " as the root superuser.\n");
}
#endif
binary_dir = GetFullProgDir(av[0]);
if (binary_dir[binary_dir.length() - 1] == '.')
binary_dir = binary_dir.substr(0, binary_dir.length() - 2);
binary_dir = GetFullProgDir(av[0]);
if (binary_dir[binary_dir.length() - 1] == '.')
binary_dir = binary_dir.substr(0, binary_dir.length() - 2);
#ifdef _WIN32
Anope::string::size_type n = binary_dir.rfind('\\');
services_dir = binary_dir.substr(0, n) + "\\data";
Anope::string::size_type n = binary_dir.rfind('\\');
services_dir = binary_dir.substr(0, n) + "\\data";
#else
Anope::string::size_type n = binary_dir.rfind('/');
services_dir = binary_dir.substr(0, n) + "/data";
Anope::string::size_type n = binary_dir.rfind('/');
services_dir = binary_dir.substr(0, n) + "/data";
#endif
/* Clean out the module runtime directory prior to running, just in case files were left behind during a previous run */
ModuleRunTimeDirCleanUp();
/* Clean out the module runtime directory prior to running, just in case files were left behind during a previous run */
ModuleRunTimeDirCleanUp();
/* General initialization first */
int i = init_primary(ac, av);
if (i)
return i;
/* General initialization first */
Init(ac, av);
Alog(LOG_TERMINAL) << "Anope " << Anope::Version() << ", " << Anope::Build();
#ifdef _WIN32
Alog(LOG_TERMINAL) << "Using configuration file " << services_dir << "\\" << services_conf;
#else
Alog(LOG_TERMINAL) << "Using configuration file " << services_dir << "/" << services_conf;
#endif
/* If the first connect fails give up, don't sit endlessly trying to reconnect */
if (!Connect())
{
Log() << "Can't connect to any servers";
return 0;
}
/* Initialization stuff. */
i = init_secondary(ac, av);
if (i)
return i;
ircdproto->SendConnect();
FOREACH_MOD(I_OnServerConnect, OnServerConnect());
/* If the first connect fails give up, don't sit endlessly trying to reconnect */
if (!Connect())
fatal_perror("Can't connect to any servers");
ircdproto->SendConnect();
FOREACH_MOD(I_OnServerConnect, OnServerConnect());
started = true;
started = true;
#ifndef _WIN32
if (Config->DumpCore)
{
rlimit rl;
if (getrlimit(RLIMIT_CORE, &rl) == -1)
Alog() << "Failed to getrlimit()!";
else
if (Config->DumpCore)
{
rl.rlim_cur = rl.rlim_max;
if (setrlimit(RLIMIT_CORE, &rl) == -1)
Alog() << "setrlimit() failed, cannot increase coredump size";
rlimit rl;
if (getrlimit(RLIMIT_CORE, &rl) == -1)
Log() << "Failed to getrlimit()!";
else
{
rl.rlim_cur = rl.rlim_max;
if (setrlimit(RLIMIT_CORE, &rl) == -1)
Log() << "setrlimit() failed, cannot increase coredump size";
}
}
}
#endif
/* Set up timers */
time_t last_check = time(NULL);
ExpireTimer expireTimer(Config->ExpireTimeout, last_check);
UpdateTimer updateTimer(Config->UpdateTimeout, last_check);
/* Set up timers */
time_t last_check = time(NULL);
ExpireTimer expireTimer(Config->ExpireTimeout, last_check);
UpdateTimer updateTimer(Config->UpdateTimeout, last_check);
/*** Main loop. ***/
while (!quitting)
{
while (!quitting && UplinkSock)
/*** Main loop. ***/
while (!quitting)
{
time_t t = time(NULL);
Alog(LOG_DEBUG_2) << "Top of main loop";
if (!readonly && (save_data || shutting_down))
while (!quitting && UplinkSock)
{
if (!noexpire)
expire_all();
if (shutting_down)
ircdproto->SendGlobops(NULL, "Updating databases on shutdown, please wait.");
save_databases();
save_data = false;
}
time_t t = time(NULL);
if (shutting_down)
{
quitting = true;
break;
}
Log(LOG_DEBUG_2) << "Top of main loop";
if (t - last_check >= Config->TimeoutCheck)
{
TimerManager::TickTimers(t);
last_check = t;
}
/* Process any modes that need to be (un)set */
ModeManager::ProcessModes();
/* Process the socket engine */
SocketEngine->Process();
}
if (quitting)
/* Disconnect and exit */
services_shutdown();
else
{
FOREACH_MOD(I_OnServerDisconnect, OnServerDisconnect());
/* Clear all of our users, but not our bots */
for (user_map::const_iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; )
{
User *u = it->second;
++it;
if (!findbot(u->nick))
delete u;
}
Me->SetFlag(SERVER_SYNCING);
Me->ClearLinks();
unsigned j = 0;
for (; j < (Config->MaxRetries ? Config->MaxRetries : j + 1); ++j)
{
Alog() << "Disconnected from the server, retrying in " << Config->RetryWait << " seconds";
sleep(Config->RetryWait);
if (Connect())
if (!readonly && (save_data || shutting_down))
{
ircdproto->SendConnect();
FOREACH_MOD(I_OnServerConnect, OnServerConnect());
if (!noexpire)
expire_all();
if (shutting_down)
ircdproto->SendGlobops(NULL, "Updating databases on shutdown, please wait.");
save_databases();
save_data = false;
}
if (shutting_down)
{
quitting = true;
break;
}
if (t - last_check >= Config->TimeoutCheck)
{
TimerManager::TickTimers(t);
last_check = t;
}
/* Process any modes that need to be (un)set */
ModeManager::ProcessModes();
/* Process the socket engine */
SocketEngine->Process();
}
if (Config->MaxRetries && j == Config->MaxRetries)
if (quitting)
/* Disconnect and exit */
services_shutdown();
else
{
Alog() << "Max connection retry limit exceeded";
quitting = true;
FOREACH_MOD(I_OnServerDisconnect, OnServerDisconnect());
/* Clear all of our users, but not our bots */
for (user_map::const_iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; )
{
User *u = it->second;
++it;
if (!findbot(u->nick))
delete u;
}
Me->SetFlag(SERVER_SYNCING);
Me->ClearLinks();
unsigned j = 0;
for (; j < (Config->MaxRetries ? Config->MaxRetries : j + 1); ++j)
{
Log() << "Disconnected from the server, retrying in " << Config->RetryWait << " seconds";
sleep(Config->RetryWait);
if (Connect())
{
ircdproto->SendConnect();
FOREACH_MOD(I_OnServerConnect, OnServerConnect());
break;
}
}
if (Config->MaxRetries && j == Config->MaxRetries)
{
Log() << "Max connection retry limit exceeded";
quitting = true;
}
}
}
}
catch (const FatalException &ex)
{
if (!ex.GetReason().empty())
Log(LOG_TERMINAL) << ex.GetReason();
return -1;
}
return 0;
}
inline Anope::string Anope::Version()
Anope::string Anope::Version()
{
return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH) + VERSION_EXTRA + " (" + stringify(VERSION_BUILD) + ")";
}
inline Anope::string Anope::Build()
Anope::string Anope::Build()
{
return "build #" + stringify(BUILD) + ", compiled " + Anope::compiled;
}