Generalized Util::Config::is_restarting for rolling restarts, added rolling restart support to listening socket outputs
This commit is contained in:
parent
42da518d5f
commit
ea443945fe
10 changed files with 72 additions and 24 deletions
|
@ -35,6 +35,7 @@
|
|||
#include <unistd.h>
|
||||
|
||||
bool Util::Config::is_active = false;
|
||||
bool Util::Config::is_restarting = false;
|
||||
static Socket::Server *serv_sock_pointer = 0;
|
||||
uint32_t Util::Config::printDebugLevel = DEBUG; //
|
||||
std::string Util::Config::streamName;
|
||||
|
@ -321,16 +322,19 @@ int Util::Config::forkServer(Socket::Server &server_socket, int (*callback)(Sock
|
|||
}
|
||||
}
|
||||
Util::Procs::socketList.erase(server_socket.getSocket());
|
||||
server_socket.close();
|
||||
if (!is_restarting){
|
||||
server_socket.close();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Util::Config::serveThreadedSocket(int (*callback)(Socket::Connection &)){
|
||||
Socket::Server server_socket;
|
||||
if (vals.isMember("socket")){
|
||||
if (Socket::checkTrueSocket(0)){
|
||||
server_socket = Socket::Server(0);
|
||||
}else if (vals.isMember("socket")){
|
||||
server_socket = Socket::Server(Util::getTmpFolder() + getString("socket"));
|
||||
}
|
||||
if (vals.isMember("port") && vals.isMember("interface")){
|
||||
} else if (vals.isMember("port") && vals.isMember("interface")){
|
||||
server_socket = Socket::Server(getInteger("port"), getString("interface"), false);
|
||||
}
|
||||
if (!server_socket.connected()){
|
||||
|
@ -340,6 +344,13 @@ int Util::Config::serveThreadedSocket(int (*callback)(Socket::Connection &)){
|
|||
serv_sock_pointer = &server_socket;
|
||||
DEVEL_MSG("Activating threaded server: %s", getString("cmd").c_str());
|
||||
activate();
|
||||
if (server_socket.getSocket()){
|
||||
int oldSock = server_socket.getSocket();
|
||||
if (!dup2(oldSock, 0)){
|
||||
server_socket = Socket::Server(0);
|
||||
close(oldSock);
|
||||
}
|
||||
}
|
||||
int r = threadServer(server_socket, callback);
|
||||
serv_sock_pointer = 0;
|
||||
return r;
|
||||
|
@ -347,10 +358,11 @@ int Util::Config::serveThreadedSocket(int (*callback)(Socket::Connection &)){
|
|||
|
||||
int Util::Config::serveForkedSocket(int (*callback)(Socket::Connection &S)){
|
||||
Socket::Server server_socket;
|
||||
if (vals.isMember("socket")){
|
||||
if (Socket::checkTrueSocket(0)){
|
||||
server_socket = Socket::Server(0);
|
||||
}else if (vals.isMember("socket")){
|
||||
server_socket = Socket::Server(Util::getTmpFolder() + getString("socket"));
|
||||
}
|
||||
if (vals.isMember("port") && vals.isMember("interface")){
|
||||
} else if (vals.isMember("port") && vals.isMember("interface")){
|
||||
server_socket = Socket::Server(getInteger("port"), getString("interface"), false);
|
||||
}
|
||||
if (!server_socket.connected()){
|
||||
|
@ -360,6 +372,13 @@ int Util::Config::serveForkedSocket(int (*callback)(Socket::Connection &S)){
|
|||
serv_sock_pointer = &server_socket;
|
||||
DEVEL_MSG("Activating forked server: %s", getString("cmd").c_str());
|
||||
activate();
|
||||
if (server_socket.getSocket()){
|
||||
int oldSock = server_socket.getSocket();
|
||||
if (!dup2(oldSock, 0)){
|
||||
server_socket = Socket::Server(0);
|
||||
close(oldSock);
|
||||
}
|
||||
}
|
||||
int r = forkServer(server_socket, callback);
|
||||
serv_sock_pointer = 0;
|
||||
return r;
|
||||
|
|
|
@ -24,6 +24,7 @@ namespace Util{
|
|||
public:
|
||||
// variables
|
||||
static bool is_active; ///< Set to true by activate(), set to false by the signal handler.
|
||||
static bool is_restarting; ///< Set to true when restarting, set to false on boot.
|
||||
static uint32_t printDebugLevel;
|
||||
static std::string streamName; ///< Used by debug messages to identify the stream name
|
||||
// functions
|
||||
|
|
|
@ -58,6 +58,13 @@ bool Socket::isLocalhost(const std::string &remotehost){
|
|||
return false;
|
||||
}
|
||||
|
||||
///Checks if the given file descriptor is actually socket or not.
|
||||
bool Socket::checkTrueSocket(int sock){
|
||||
struct stat sBuf;
|
||||
if (sock != -1 && !fstat(sock, &sBuf)){return S_ISSOCK(sBuf.st_mode);}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Socket::isLocal(const std::string &remotehost){
|
||||
struct ifaddrs *ifAddrStruct = NULL;
|
||||
struct ifaddrs *ifa = NULL;
|
||||
|
@ -400,9 +407,7 @@ void Socket::Connection::setBoundAddr(){
|
|||
Socket::Connection::Connection(int sockNo){
|
||||
sSend = sockNo;
|
||||
sRecv = -1;
|
||||
isTrueSocket = false;
|
||||
struct stat sBuf;
|
||||
if (sSend != -1 && !fstat(sSend, &sBuf)){isTrueSocket = S_ISSOCK(sBuf.st_mode);}
|
||||
isTrueSocket = Socket::checkTrueSocket(sSend);
|
||||
setBoundAddr();
|
||||
up = 0;
|
||||
down = 0;
|
||||
|
@ -422,9 +427,7 @@ Socket::Connection::Connection(int write, int read){
|
|||
}else{
|
||||
sRecv = -1;
|
||||
}
|
||||
isTrueSocket = false;
|
||||
struct stat sBuf;
|
||||
if (sSend != -1 && !fstat(sSend, &sBuf)){isTrueSocket = S_ISSOCK(sBuf.st_mode);}
|
||||
isTrueSocket = Socket::checkTrueSocket(sSend);
|
||||
setBoundAddr();
|
||||
up = 0;
|
||||
down = 0;
|
||||
|
@ -1089,6 +1092,11 @@ Socket::Server::Server(){
|
|||
sock = -1;
|
||||
}// Socket::Server base Constructor
|
||||
|
||||
/// Create a new Server from existing socket.
|
||||
Socket::Server::Server(int fromSock){
|
||||
sock = fromSock;
|
||||
}
|
||||
|
||||
/// Create a new TCP Server. The socket is immediately bound and set to listen.
|
||||
/// A maximum of 100 connections will be accepted between accept() calls.
|
||||
/// Any further connections coming in will be dropped.
|
||||
|
|
|
@ -41,6 +41,7 @@ namespace Socket{
|
|||
bool isLocal(const std::string & host);
|
||||
/// Returns true if given human-readable hostname is a local address.
|
||||
bool isLocalhost(const std::string & host);
|
||||
bool checkTrueSocket(int sock);
|
||||
|
||||
/// A buffer made out of std::string objects that can be efficiently read from and written to.
|
||||
class Buffer{
|
||||
|
@ -165,7 +166,8 @@ namespace Socket{
|
|||
bool IPv4bind(int port, std::string hostname, bool nonblock); ///< Attempt to bind an IPv4 socket
|
||||
public:
|
||||
Server(); ///< Create a new base Server.
|
||||
Server(int port, std::string hostname = "0.0.0.0", bool nonblock = false); ///< Create a new TCP Server.
|
||||
Server(int existingSock); ///< Create a new Server from existing socket.
|
||||
Server(int port, std::string hostname, bool nonblock = false); ///< Create a new TCP Server.
|
||||
Server(std::string adres, bool nonblock = false); ///< Create a new Unix Server.
|
||||
Connection accept(bool nonblock = false); ///< Accept any waiting connections.
|
||||
void setBlocking(bool blocking); ///< Set this socket to be blocking (true) or nonblocking (false).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue