diff --git a/src/server/Dispatcher.cpp b/src/server/Dispatcher.cpp index 74f6ff2..a1f448b 100644 --- a/src/server/Dispatcher.cpp +++ b/src/server/Dispatcher.cpp @@ -30,14 +30,11 @@ void DProcess::startProc(){ finished = QDateTime::currentDateTime(); emit ProcFinished(ID); return; - }else if(proclog.isEmpty()){ - started = QDateTime::currentDateTime(); //first cmd started - rawcmds = cmds; - }else{ - proclog.append("\n"); } QString cmd = cmds.takeFirst(); success = false; //not finished yet + if(!proclog.isEmpty()){ proclog.append("\n"); } + else{ started = QDateTime::currentDateTime(); } //first cmd started proclog.append("[Running Command: "+cmd+" ]"); this->start(cmd); } @@ -75,7 +72,7 @@ void DProcess::cmdFinished(int ret, QProcess::ExitStatus status){ // Dispatcher Class // ================================ Dispatcher::Dispatcher(){ - + connect(this, SIGNAL(mkprocs(Dispatcher::PROC_QUEUE, QString, QStringList)), this, SLOT(mkProcs(Dispatcher::PROC_QUEUE, QString, QStringList)) ); } Dispatcher::~Dispatcher(){ @@ -104,28 +101,30 @@ void Dispatcher::queueProcess(Dispatcher::PROC_QUEUE queue, QString ID, QString } void Dispatcher::queueProcess(Dispatcher::PROC_QUEUE queue, QString ID, QStringList cmds){ //This is the primary queueProcess() function - all the overloads end up here to do the actual work - DProcess *P = createProcess(ID, cmds); - QList list; - if(!HASH.contains(queue)){ HASH.insert(queue, list); } //insert an empty list - HASH[queue] << P; //add this proc to the end of the list - if(queue==NO_QUEUE || HASH[queue].length()==1){ - emit DispatchStarting(P->ID); - P->startProc(); //go ahead and start it now - }else{ CheckQueues(); } + //For multi-threading, need to emit a signal/slot for this action (object creations need to be in same thread as parent) + emit mkProcs(queue, ID, cmds); } // === PRIVATE === //Simplification routine for setting up a process -DProcess* Dispatcher:: createProcess(QString ID, QStringList cmds){ - DProcess* P = new DProcess(this); +DProcess* Dispatcher::createProcess(QString ID, QStringList cmds){ + DProcess* P = new DProcess(); P->cmds = cmds; P->ID = ID; - P->success = false; connect(P, SIGNAL(ProcFinished(QString)), this, SLOT(ProcFinished(QString)) ); return P; } // === PRIVATE SLOTS === +void Dispatcher::mkProcs(Dispatcher::PROC_QUEUE queue, QString ID, QStringList cmds){ + DProcess *P = createProcess(ID, cmds); + QList list; + if(!HASH.contains(queue)){ HASH.insert(queue, list); } //insert an empty list + HASH[queue] << P; //add this proc to the end of the list + if(queue==NO_QUEUE || HASH[queue].length()==1){ P->startProc(); } //go ahead and start it now + else{ CheckQueues(); } +} + void Dispatcher::ProcFinished(QString ID){ //Find the process with this ID and close it down (with proper events) bool found = false; @@ -154,7 +153,7 @@ void Dispatcher::ProcFinished(QString ID){ } void Dispatcher::CheckQueues(){ - for(int i=0; i(i); if(HASH.contains(queue)){ QList list = HASH[queue]; @@ -168,5 +167,5 @@ void Dispatcher::CheckQueues(){ } //end loop over list } - } //end loop over queue types + } //end loop over queue types } diff --git a/src/server/Dispatcher.h b/src/server/Dispatcher.h index 5a40332..6e6ff07 100644 --- a/src/server/Dispatcher.h +++ b/src/server/Dispatcher.h @@ -74,12 +74,17 @@ private: DProcess* createProcess(QString ID, QStringList cmds); private slots: + void mkProcs(Dispatcher::PROC_QUEUE, QString ID, QStringList cmds); void ProcFinished(QString ID); void CheckQueues(); signals: + //Main signals void DispatchFinished(QString ID, bool success); void DispatchStarting(QString ID); + + //Signals for private usage + void mkprocs(Dispatcher::PROC_QUEUE, QString ID, QStringList cmds); }; diff --git a/src/server/EventWatcher.cpp b/src/server/EventWatcher.cpp index 7b08090..3e9ba38 100644 --- a/src/server/EventWatcher.cpp +++ b/src/server/EventWatcher.cpp @@ -9,6 +9,8 @@ // === PUBLIC === EventWatcher::EventWatcher(){ + qRegisterMetaType("EventWatcher::EVENT_TYPE"); + starting = true; LPlog_pos = LPrep_pos = LPerr_pos = 0; //no pos yet watcher = new QFileSystemWatcher(this); diff --git a/src/server/LogManager.cpp b/src/server/LogManager.cpp index f585fe7..947f678 100644 --- a/src/server/LogManager.cpp +++ b/src/server/LogManager.cpp @@ -3,7 +3,10 @@ #define TMPBREAK "" //Overall check/creation of the log directory void LogManager::checkLogDir(){ - // - TO-DO + if(!QFile::exists(LOGDIR)){ + QDir dir(LOGDIR); + dir.mkpath(LOGDIR); + } } //Main Log write function (all the overloaded versions end up calling this one) diff --git a/src/server/WebServer.cpp b/src/server/WebServer.cpp index be67bc3..765459f 100644 --- a/src/server/WebServer.cpp +++ b/src/server/WebServer.cpp @@ -148,7 +148,6 @@ void WebServer::NewSocketConnection(){ qDebug() << "New Socket Connection"; connect(sock, SIGNAL(SocketClosed(QString)), this, SLOT(SocketClosed(QString)) ); connect(EVENTS, SIGNAL(NewEvent(EventWatcher::EVENT_TYPE, QJsonValue)), sock, SLOT(EventUpdate(EventWatcher::EVENT_TYPE, QJsonValue)) ); - connect(sock, SIGNAL(BlackListAddress(QHostAddress)), this, SLOT(BlackListConnection(QHostAddress)) ); OpenSockets << sock; } diff --git a/src/server/main.cpp b/src/server/main.cpp index 5b3deba..87adc56 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -52,6 +52,8 @@ int main( int argc, char ** argv ) qDebug() << "sysadm-server must be started as root!"; return 1; } + LogManager::checkLogDir(); //ensure the logging directry exists + //Evaluate input arguments bool websocket = false; quint16 port = 0; @@ -89,6 +91,7 @@ int main( int argc, char ** argv ) if( w->startServer(port, websocket) ){ QThread TBACK; EVENTS->moveToThread(&TBACK); + DISPATCHER->moveToThread(&TBACK); TBACK.start(); QTimer::singleShot(0,EVENTS, SLOT(start()) ); //Now start the main event loop