mirror of
https://github.com/osmarks/ngircd.git
synced 2024-10-28 04:46:17 +00:00
Ping the service manager and set a status message
Periodically "ping" the service manager (every 3 seconds) and set a status message showing connection statistics. This enables using the systemd(8) watchdog functionality for the "ngircd.service" unit.
This commit is contained in:
parent
e4873b4d63
commit
791778d7b6
@ -37,6 +37,9 @@ EnvironmentFile=-/etc/default/ngircd-full-dbg
|
|||||||
# Start ngIRCd. Note: systemd doesn't allow to use $DAEMON here!
|
# Start ngIRCd. Note: systemd doesn't allow to use $DAEMON here!
|
||||||
ExecStart=/usr/sbin/ngircd --nodaemon --syslog $PARAMS
|
ExecStart=/usr/sbin/ngircd --nodaemon --syslog $PARAMS
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
# Error handling:
|
||||||
|
# ngIRCd tries to "ping" the service manager every 3 seconds.
|
||||||
|
WatchdogSec=10
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
@ -669,8 +669,9 @@ Conn_Handler(void)
|
|||||||
int i;
|
int i;
|
||||||
size_t wdatalen;
|
size_t wdatalen;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
time_t t;
|
time_t t, notify_t = 0;
|
||||||
bool command_available;
|
bool command_available;
|
||||||
|
char status[200];
|
||||||
|
|
||||||
Log(LOG_NOTICE, "Server \"%s\" (on \"%s\") ready.",
|
Log(LOG_NOTICE, "Server \"%s\" (on \"%s\") ready.",
|
||||||
Client_ID(Client_ThisServer()), Client_Hostname(Client_ThisServer()));
|
Client_ID(Client_ThisServer()), Client_Hostname(Client_ThisServer()));
|
||||||
@ -783,13 +784,24 @@ Conn_Handler(void)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Should ngIRCd timeout when idle? */
|
t = time(NULL);
|
||||||
if (Conf_IdleTimeout > 0 && NumConnectionsAccepted > 0
|
if (Conf_IdleTimeout > 0 && NumConnectionsAccepted > 0
|
||||||
&& idle_t > 0 && time(NULL) - idle_t >= Conf_IdleTimeout) {
|
&& idle_t > 0 && t - idle_t >= Conf_IdleTimeout) {
|
||||||
|
/* Should ngIRCd timeout when idle? */
|
||||||
LogDebug("Server idle timeout reached: %d second%s. Initiating shutdown ...",
|
LogDebug("Server idle timeout reached: %d second%s. Initiating shutdown ...",
|
||||||
Conf_IdleTimeout,
|
Conf_IdleTimeout,
|
||||||
Conf_IdleTimeout == 1 ? "" : "s");
|
Conf_IdleTimeout == 1 ? "" : "s");
|
||||||
NGIRCd_SignalQuit = true;
|
NGIRCd_SignalQuit = true;
|
||||||
|
} else if (Signal_NotifySvcMgr_Possible() && t - notify_t > 3) {
|
||||||
|
/* Send the current status to the service manager. */
|
||||||
|
snprintf(status, sizeof(status),
|
||||||
|
"WATCHDOG=1\nSTATUS=%ld connection%s established (%ld user%s, %ld server%s), %ld maximum. %ld accepted in total.\n",
|
||||||
|
NumConnections, NumConnections == 1 ? "" : "s",
|
||||||
|
Client_MyUserCount(), Client_MyUserCount() == 1 ? "" : "s",
|
||||||
|
Client_MyServerCount(), Client_MyServerCount() == 1 ? "" : "s",
|
||||||
|
NumConnectionsMax, NumConnectionsAccepted);
|
||||||
|
Signal_NotifySvcMgr(status);
|
||||||
|
notify_t = t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,6 +348,21 @@ Signals_Exit(void)
|
|||||||
signalpipe[0] = signalpipe[1] = 0;
|
signalpipe[0] = signalpipe[1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the service manager of the system can be notified.
|
||||||
|
*
|
||||||
|
* @returns true if notifying the service manager is theoretically possible.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Signal_NotifySvcMgr_Possible(void)
|
||||||
|
{
|
||||||
|
#if !defined(HAVE_SYS_UN_H) || !defined(SOCK_CLOEXEC)
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return getenv("NOTIFY_SOCKET") != NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the service manager using the "sd_notify" protocol.
|
* Notify the service manager using the "sd_notify" protocol.
|
||||||
*
|
*
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
bool Signals_Init PARAMS((void));
|
bool Signals_Init PARAMS((void));
|
||||||
void Signals_Exit PARAMS((void));
|
void Signals_Exit PARAMS((void));
|
||||||
|
|
||||||
|
GLOBAL bool Signal_NotifySvcMgr_Possible PARAMS((void));
|
||||||
GLOBAL void Signal_NotifySvcMgr PARAMS((const char *message));
|
GLOBAL void Signal_NotifySvcMgr PARAMS((const char *message));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user