diff --git a/src/server/Dispatcher.cpp b/src/server/Dispatcher.cpp index a39cdaa..940b861 100644 --- a/src/server/Dispatcher.cpp +++ b/src/server/Dispatcher.cpp @@ -30,6 +30,7 @@ DProcess::~DProcess(){ } void DProcess::procReady(){ + rawcmds = cmds; proclog.insert("cmd_list",QJsonArray::fromStringList(cmds)); proclog.insert("process_id",ID); proclog.insert("state","pending"); @@ -125,6 +126,56 @@ Dispatcher::~Dispatcher(){ } +QJsonObject Dispatcher::listJobs(){ + QJsonObject out; + for(int i=0; i(i); + if(HASH.contains(queue)){ + QJsonObject obj; + QList list = HASH[queue]; + for(int j=0; jrawcmds)); + if(queue!=NO_QUEUE){ proc.insert("queue_position",QString::number(j)); } + if( list[j]->isRunning() ){ proc.insert("state", "running"); } + else if(list[j]->isDone() ){ proc.insert("state", "finished"); } + else{ proc.insert("state","pending"); } + obj.insert(list[j]->ID, proc); + } //end loop over list + QString qname; + switch(queue){ + case NO_QUEUE: + qname="no_queue"; break; + case PKG_QUEUE: + qname="pkg_queue"; break; + case IOCAGE_QUEUE: + qname="iocage_queue"; break; + } + out.insert(qname,obj); + } + } //end loop over queue types + return out; +} + +QJsonObject Dispatcher::killJobs(QStringList ids){ + QStringList killed; + for(int i=0; i(i); + if(HASH.contains(queue)){ + QList list = HASH[queue]; + for(int j=0; jID)){ + killed << list[j]->ID; + QTimer::singleShot(10, list[j], SLOT(kill())); //10ms buffer + } + } //end loop over list + } + } //end loop over queue types + QJsonObject obj; + obj.insert("killed_jobs", QJsonArray::fromStringList(killed)); + return obj; +} + void Dispatcher::start(QString queuefile){ //Setup connections here (in case it was moved to different thread after creation) //connect(this, SIGNAL(mkprocs(Dispatcher::PROC_QUEUE, DProcess*)), this, SLOT(mkProcs(Dispatcher::PROC_QUEUE, DProcess*)) ); diff --git a/src/server/Dispatcher.h b/src/server/Dispatcher.h index 95b7747..547ba98 100644 --- a/src/server/Dispatcher.h +++ b/src/server/Dispatcher.h @@ -22,7 +22,7 @@ public: //output variables for logging purposes bool success; //QDateTime t_started, t_finished; - // QStringList rawcmds; //copy of cmds at start of process + QStringList rawcmds; //copy of cmds at start of process //Get the current process log (can be run during/after the process runs) QJsonObject getProcLog(); @@ -61,6 +61,9 @@ public: Dispatcher(); ~Dispatcher(); + QJsonObject listJobs(); + QJsonObject killJobs(QStringList ids); + public slots: //Main start/stop void start(QString queuefile); //load any previously-unrun processes diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 20f46be..de9cd33 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -23,7 +23,7 @@ #define DEBUG 0 -#define SCLISTDELIM QString("::::") //SysCache List Delimiter +//#define SCLISTDELIM QString("::::") //SysCache List Delimiter RestOutputStruct::ExitCode WebSocket::AvailableSubsystems(bool allaccess, QJsonObject *out){ //Probe the various subsystems to see what is available through this server //Output format: @@ -287,8 +287,9 @@ RestOutputStruct::ExitCode WebSocket::EvaluateDispatcherRequest(bool allaccess, //Return the PENDING result LogManager::log(LogManager::HOST, "Client Launched Processes["+SockPeerIP+"]: "+ids.join(",") ); out->insert("started", QJsonArray::fromStringList(ids)); - //}else if(act=="read"){ - + }else if(act=="list"){ + QJsonObject info = DISPATCHER->listJobs(); + out->insert("jobs", info); }else{ return RestOutputStruct::BADREQUEST; }