diff --git a/module/javascript/script_module.js b/module/javascript/script_module.js index 9db879f2ff817b62c6e25b2fedeb6007a19f8eff..78cae4b027466856a4aacb0b9d84ae7f6d304cb6 100644 --- a/module/javascript/script_module.js +++ b/module/javascript/script_module.js @@ -2790,7 +2790,7 @@ vitisApp.on('appMainDrtvLoaded', function () { "className": "modal-danger", "message": response["data"]["errorMessage"] }; - scope["modalWindow"]("dialog", "ERROR_REEINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions); + scope["modalWindow"]("dialog", "ERROR_REINTEGRATE_METADATA_PUBLICATION_WORKSPACE", oOptions); } else { // Affiche le message de succés. $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { @@ -3861,4 +3861,59 @@ vitisApp.on('appMainDrtvLoaded', function () { } }); }; + + /** + * stopOrderProcess function. + * Arrête une demande en cours. + */ + angular.element(vitisApp.appMainDrtv).scope()["stopOrderProcess"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]); + var $rootScope = angular.element(vitisApp.appStatisticsFormDrtv).injector().get(["$rootScope"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]); + // + $log.info("stopOrderProcess"); + // Une seule demande peut être arrêté. + var aSelectedRows = $rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"](); + var oOptions = { + "className": "modal-danger" + }; + if (aSelectedRows.length > 0) { + if (aSelectedRows.length == 1) { + if (aSelectedRows[0]["order_status_id"] == 5) { + ajaxRequest({ + "method": "PUT", + "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/gtf/orders/" + aSelectedRows[0]["order_id"] + "/stop", + "params": {"order_id": aSelectedRows[0]["order_id"]}, + //"scope": scope, + "success": function(response) { + if (response["data"]["status"] === 0) { + var oOptions = { + "className": "modal-danger", + "message": response["data"]["errorMessage"] + }; + scope["modalWindow"]("dialog", "REQUEST_ERROR", oOptions); + } else { + // + $rootScope['refreshGrid']($rootScope["gridApi"][envSrvc["sSelectedGridOptionsName"]]['grid']['appScope'], envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]]); + $rootScope["refreshSupervisionRecap"](); + // Affiche le message de succés. + $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) { + $.notify(sTranslation, "success"); + }); + } + } + }); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER", oOptions); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER", oOptions); + } + else + $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER", oOptions); + }; }); \ No newline at end of file diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json index 8db960cb04e9401ce05af7062e7e349c12b79530..ca2d7d11b3d4cf0efe55dc6d11a4c27137086335 100644 --- a/module/lang/lang-en.json +++ b/module/lang/lang-en.json @@ -63,7 +63,10 @@ "FORM_NOTIFICATION_SUPERVISION_ORDER" : "Notification", "FORM_URL_SUPERVISION_ORDER" : "Order URL", "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Planning date", - "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "One or more orders are being executed and their processes will be deleted.", + "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "One or more orders are being executed and their processes will be deleted", + "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Please select a running order to stop it", + "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "You can only stop one running order at a time", + "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "The selected order is not running", "" : "", "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Subscriptions", "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Enabled", diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json index 09079f6d35ef38c455a7f5f8cd819c4434f9670f..608d664c6e8780c3847bf3fad57dad32399d6caf 100644 --- a/module/lang/lang-fr.json +++ b/module/lang/lang-fr.json @@ -64,6 +64,9 @@ "FORM_URL_SUPERVISION_ORDER" : "URL de la demande", "FORM_MINEXECDATE_SUPERVISION_ORDER" : "Date de planification", "CONFIRM_DELETE_ORDERS_SUPERVISION_ORDER" : "Une ou plusieurs demandes sont en cours d'exécution et leurs processus seront supprimés.", + "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER" : "Veuillez sélectioner une demande en cours pour la stopper.", + "ERROR_STOP_ORDER_PROCESS_ONE_ORDER_ONLY_SUPERVISION_ORDER" : "Vous ne pouvez stopper qu'une seule demande en cours à la fois.", + "ERROR_STOP_ORDER_PROCESS_NO_RUNNING_ORDER_SUPERVISION_ORDER" : "La demande sélectionnée n'est pas en cours d'exécution.", "" : "", "STATUS_TITLE_SUPERVISION_SUBSCRIPTION" : "Abonnements", "ENABLED_SUBSCRIPTION_BOX_TITLE_SUPERVISION_SUBSCRIPTION" : "Actif", diff --git a/web_service/class/gtf_lib/FmeServer.class.inc b/web_service/class/gtf_lib/FmeServer.class.inc index f2cb3f205b4ccc9a451d92f953350bf3eea8222e..dd4833959835e24ca48b5d0030a4cd34d1643660 100644 --- a/web_service/class/gtf_lib/FmeServer.class.inc +++ b/web_service/class/gtf_lib/FmeServer.class.inc @@ -11,9 +11,9 @@ require_once("vmlib/logUtil.inc"); Class FmeServer { const CURL_CONNECTION_TIMEOUT = 0; const CURL_TIMEOUT = 360; - const INFO_FME_SERVER_ASYNCHRONOUS_JOB_CANCELED = '|INFORM|PHP| Le traitement asynchrone a été annulé sur Fme Server'; - const INFO_FME_SERVER_ASYNCHRONOUS_JOB_STOPPED = '|INFORM|PHP| Le traitement asynchrone a été arrêté sur Fme Server'; - const INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED = '|INFORM|PHP| Le traitement asynchrone a été supprimé sur Fme Server'; + const INFO_FME_SERVER_JOB_CANCELED = '|INFORM|PHP| Le traitement a été annulé sur Fme Server'; + const INFO_FME_SERVER_JOB_STOPPED = '|INFORM|PHP| Le traitement a été arrêté sur Fme Server'; + const INFO_FME_SERVER_JOB_REMOVED = '|INFORM|PHP| Le traitement a été supprimé sur Fme Server'; public $sUrl; public $sTimeUnit; @@ -637,7 +637,7 @@ Class FmeServer { if ($this->stopJob($iJobId) !== false) { // Supprime définitivement la demande sur Fme Server. if ($this->serviceRequest('transformations/jobs/completed/' . $iJobId, 'delete') !== false) - writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED . " (job id $iJobId).", $this->sLogFilePath); + writeToLog(self::INFO_FME_SERVER_JOB_REMOVED . " (job id $iJobId).", $this->sLogFilePath); else return false; } @@ -657,7 +657,7 @@ Class FmeServer { if ($this->sToken !== false) { // Annule le traitement. if ($this->serviceRequest('transformations/jobs/queued/' . $iJobId, 'delete') !== false) - writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_CANCELED . " (job id $iJobId).", $this->sLogFilePath); + writeToLog(self::INFO_FME_SERVER_JOB_CANCELED . " (job id $iJobId).", $this->sLogFilePath); else return false; } @@ -679,13 +679,13 @@ Class FmeServer { // Annule une demande en attente ou arrête une demande en cours. $aQueuedStatus = array('SUBMITTED', 'QUEUED', 'DELAYED', 'PAUSED'); $aRunningStatus = array('IN_PROCESS', 'PULLED'); - error_log($oJobLog->status); + $aStoppedStatus = array('DELETED', 'ABORTED', 'FME_FAILURE', 'JOB_FAILURE', 'SUCCESS'); if (in_array($oJobLog->status, $aQueuedStatus)) $this->cancelJob($iJobId); - else { + else if (!in_array($oJobLog->status, $aStoppedStatus)){ // Annule le traitement. if ($this->serviceRequest('transformations/jobs/running/' . $iJobId, 'delete') !== false) - writeToLog(self::INFO_FME_SERVER_ASYNCHRONOUS_JOB_STOPPED . " (job id $iJobId).", $this->sLogFilePath); + writeToLog(self::INFO_FME_SERVER_JOB_STOPPED . " (job id $iJobId).", $this->sLogFilePath); else return false; } diff --git a/web_service/ws/Gtf.class.sql.inc b/web_service/ws/Gtf.class.sql.inc index e2e4aa5b1263209ac63c3a4a5934ee7c449711b0..724684fd24dc3c6678a3d13df317140b5edf6c46 100644 --- a/web_service/ws/Gtf.class.sql.inc +++ b/web_service/ws/Gtf.class.sql.inc @@ -25,12 +25,12 @@ $aSql['getOrderWorkspace'] = 'SELECT workspace_id FROM [sSchemaGtf].v_order WHER $aSql['getOrderEngineStatus'] = 'SELECT gtf_engine.enabled FROM [sSchemaGtf]."order" LEFT JOIN [sSchemaGtf].gtf_engine ON "order".gtf_engine_id = gtf_engine.gtf_engine_id WHERE order_id = [order_id]'; $aSql['getRunningOrders'] = 'SELECT order_id, gtf_engine_id FROM [sSchemaGtf]."order" WHERE order_status_id IN (1, 5)'; $aSql['updateOrderStatus'] = 'UPDATE [sSchemaGtf].order SET order_status_id = [order_status_id] WHERE order_id = [order_id]'; +//$aSql['getOrdersToDelete'] = 'SELECT order_id, gtf_engine_id, order_status_id FROM [sSchemaGtf]."order" WHERE order_id IN([idList])'; +$aSql['getOrdersToDelete'] = 'SELECT fme_engine.fme_engine_type_id, "order".order_id, "order".gtf_engine_id, "order".order_status_id FROM [sSchemaGtf].order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND order_id IN([idList])'; //$aSql['getOrderFmeEngine'] = 'SELECT fme_engine.fme_engine_type_id, fme_engine.server_url, fme_engine.login, fme_engine.password, fme_engine.fme_cloud_api_token, fme_engine.fme_server_instance_name, server.engines_home, v_order.gtf_engine_id FROM [sSchemaGtf].v_order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = v_order.gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] LIMIT 1'; -//$aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] AND fme_engine_type_id = \'desktop\' AND pid IS NOT NULL LIMIT 1'; -//$aSql['getGtfEngineHome'] = 'SELECT engines_home, gtf_engine_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine WHERE gtf_engine.server_id = "server".server_id AND gtf_engine_id IN([gtf_engine_id])'; -//$aSql['getGtfEngineHome'] = 'SELECT engines_home, gtf_engine_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine WHERE gtf_engine.server_id = "server".server_id AND gtf_engine_id = [gtf_engine_id]'; -$aSql['getGtfEngineHome'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND order_id = [order_id]'; -//$aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [iOrderId] AND fme_engine_type_id = \'desktop\' AND pid IS NOT NULL LIMIT 1'; +$aSql['getGtfEngineHomeFromOrderId'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND order_id = [order_id]'; +$aSql['getGtfEngineHomeFromEngineId'] = 'SELECT engines_home, "order".gtf_engine_id, "order".order_id FROM [sSchemaGtf]."server", [sSchemaGtf].gtf_engine, [sSchemaGtf]."order" WHERE gtf_engine.server_id = "server".server_id AND gtf_engine.gtf_engine_id = "order".gtf_engine_id AND gtf_engine.gtf_engine_id = [iGtfEngineId]'; +$aSql['getFmeServerOrder'] = 'SELECT fme_engine.fme_engine_type_id, fme_engine.server_url, fme_engine.login, fme_engine.password, fme_engine.fme_cloud_api_token, fme_engine.fme_server_instance_name, "order".gtf_engine_id, "order".pid, server.engines_home, "order".log_url FROM [sSchemaGtf].order, [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [order_id] LIMIT 1'; $aSql['getOrderPid'] = 'SELECT fme_engine.fme_engine_type_id, "order".gtf_engine_id, "order".pid FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine, [sSchemaGtf].server WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND server.server_id = fme_engine.server_id AND order_id = [order_id] LIMIT 1'; $aSql['getOrderFmeEngineType'] = 'SELECT fme_engine.fme_engine_type_id FROM [sSchemaGtf]."order", [sSchemaGtf].gtf_engine, [sSchemaGtf].fme_engine WHERE gtf_engine.gtf_engine_id = "order".gtf_engine_id AND fme_engine.fme_engine_id = gtf_engine.fme_engine_id AND order_id = [order_id] LIMIT 1'; // UserSubscriptions diff --git a/web_service/ws/Order.class.inc b/web_service/ws/Order.class.inc old mode 100755 new mode 100644 index 784b59f65fb02cf037474d2073116fdd800555ff..4888332c83f02362aec2b3fcc487c7484c259546 --- a/web_service/ws/Order.class.inc +++ b/web_service/ws/Order.class.inc @@ -15,7 +15,6 @@ require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc'; * */ class Order extends GTF { - public $oError; /** diff --git a/web_service/ws/Orders.class.inc b/web_service/ws/Orders.class.inc index 90240b7f6469bb20ff97e6f6b8419c7a07cf2973..352904e19eb1e11929a5dab922ea59e0a081b7ed 100644 --- a/web_service/ws/Orders.class.inc +++ b/web_service/ws/Orders.class.inc @@ -16,7 +16,7 @@ require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc'; require_once 'Order.class.inc'; require_once __DIR__ . '/../../class/vmlib/BdDataAccess.inc'; require_once 'gtf_lib/FmeServer.class.inc'; - +require_once 'gtf_lib/FmeCloud.class.inc'; class Orders extends GTF { /** @@ -318,6 +318,7 @@ class Orders extends GTF { function PUT() { if (!empty($this->aPath[2])) { if (!empty($this->aPath[3])) { + // Arrêt d'une demande en cours. if ($this->aPath[3] == 'stop') $aReturn = $this->stopFmeOrder($this->aValues["my_vitis_id"]); } @@ -483,8 +484,8 @@ class Orders extends GTF { $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); } } else { - // Stoppe le processus des demandes (uniquement pour Fme Desktop). - $this->stopFmeDesktopOrdersProcess(); + // Stoppe les demandes en cours (Fme Server -> supprime le traitement et le répertoire des données). + $this->deleteFmeOrders(); // $aReturn = $this->genericDelete($this->aProperties['schema_gtf'], 'order', 'order_id'); $sMessage = $aReturn['sMessage']; @@ -618,7 +619,6 @@ class Orders extends GTF { * \param $sTable Name of the table. * \param $iWorkspaceId Identifier of the treatment. */ - function getIdEngine($iUserOrderId, $sTable, $iWorkspaceId) { require $this->sRessourcesFile; // Récupération de l'algorithme @@ -704,20 +704,142 @@ class Orders extends GTF { } /** - * function stopFmeDesktopOrdersProcess + * function deleteFmeOrders + */ + function deleteFmeOrders() { + require $this->sRessourcesFile; + // Infos des demandes à supprimer. + $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); + $aParams['idList'] = array('value' => $this->aValues['idList'], 'type' => 'group'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrdersToDelete'], $aParams); + if (!$this->oConnection->oBd->enErreur()) { + while ($aDemande = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + $aRunningJob = array(); + if ($aDemande['order_status_id'] == 5) { + // Paramètres de la demande si c'est un traitement asynchrone sur Fme server. + if ($aDemande['fme_engine_type_id'] != "desktop") { + $aRunningJobs = $this->getFmeServerRunningJobs($aDemande['gtf_engine_id']); + $aRunningJob = $this->getFmeServerRunningJob($aDemande['order_id'], $aRunningJobs); + } + // Stoppe la demande en cours. + $this->stopFmeOrder($aDemande['order_id']); + } + // Supprime le traitement sur Fme Server. + if ($aDemande['fme_engine_type_id'] != "desktop") + $this->deleteFmeServerOrder($aDemande['order_id'], $aDemande['gtf_engine_id'], $aRunningJob); + } + } + } + + /** + * function deleteFmeServerOrder + * \param $iOrderId Id of the Gtf order. + * \param $iGtfEngineId Id of the Gtf engine. + * \param $aRunningJob A running job on Fme Server. + */ + function deleteFmeServerOrder($iOrderId, $iGtfEngineId, $aRunningJob = array()) { + $sEngineLogFilePath = $this->aProperties['vas_home'] . '/log/engines/' . date($this->aProperties['log_period']) . '/engine_' . $iGtfEngineId . '/engine.log'; + if (!empty($aRunningJob)) { + // Demande en cours -> informations de connexion sur Fme Server dans la liste des traitements asynchrones. + $sFmeServerUrl = $aRunningJob['fme_server_url']; + $sLogin = $aRunningJob['login']; + $sPassword = $aRunningJob['password']; + $sResource = $aRunningJob['resource']; + $sPath = $aRunningJob['path']; + $iJobId = $aRunningJob['job_id']; + } + else { + // Demande en attente ou terminée -> informations de connexion sur Fme Server dans la base. + require $this->sRessourcesFile; + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); + $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getFmeServerOrder'], $aParams); + if (!$this->oConnection->oBd->enErreur()) { + $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult); + require $aOrder['engines_home'] . '/' . 'string.inc'; + // Si Fme Cloud -> l'instance de Fme Server doit être démarrée. + if ($aOrder['fme_engine_type_id'] == 'fme_cloud') { + // Ip de l'instance Fme Server. + $oFmeCloud = new FmeCloud($aOrder['server_url'], $aOrder['fme_cloud_api_token']); + $oFmeCloud->sLogFilePath = $sEngineLogFilePath; + // Adresse Ip publique de l'instance de FME Server. + $aFmeServerInstances = $oFmeCloud->serviceRequest('instances'); + if (!empty($aFmeServerInstances)) { + foreach($aFmeServerInstances as $oInstance) { + if ($oInstance->name == $aOrder['fme_server_instance_name']) + $oFmeServerInstance = $oInstance; + } + if (empty($oFmeServerInstance)) { + // Aucune instace active. + writeToLog(INFO_FME_CLOUD_INSTANCE_NOT_FOUND, $sEngineLogFilePath); + } + else { + // Statut de l'instance. + writeToLog(INFO_FME_CLOUD_INSTANCE_STATUS . $oFmeServerInstance->state, $sEngineLogFilePath); + $sFmeServerUrl = 'https://' . $oFmeServerInstance->public_ip; + // Pas de suppression possible si l'instance n'est pas démarrée. + if ($oFmeServerInstance->state != "RUNNING") + return false; + } + } + } + $sLogin = $aOrder['login']; + $sPassword = $aOrder['password']; + $sResource = 'FME_SHAREDRESOURCE_TEMP'; + if (!empty($aOrder['log_url'])) + $sPath = dirname($this->aProperties["gtf_instance_id"] . '/' . pathinfo($aOrder['log_url'], PATHINFO_DIRNAME)); + $iJobId = $aOrder['pid']; + } + } + // Suppression du traitement et du répertoire sur Fme Server. + if (!empty($sFmeServerUrl) && !empty($sLogin) && !empty($sPassword)) { + $oFmeServer = new FmeServer($sFmeServerUrl, $sLogin, $sPassword); + $oFmeServer->sLogFilePath = $sEngineLogFilePath; + if (!empty($iJobId)) + if ($oFmeServer->deleteJob($iJobId) === false) + return false; + // Supprime le répertoire des ressources de la demande sur Fme Server. + if (!empty($sResource) && !empty($sPath)) + if ($oFmeServer->serviceRequest('resources/connections/' . $sResource . '/filesys/' . $sPath, 'delete') === false) + return false; + } + } + + /** + * function stopFmeOrder + * \param $iOrderId Id of the Gtf order. */ - function stopFmeDesktopOrdersProcess() { + function stopFmeOrder($iOrderId) { require $this->sRessourcesFile; - // Id des moteurs GTF dont au moins une demande est en cours. + // Informations de la demande à stopper. $aParams = array(); $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); - $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getRunningOrders'], $aParams); + $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrderFmeEngineType'], $aParams); if (!$this->oConnection->oBd->enErreur()) { - $aGtfEngineId = array(); - while ($aGtfEngine = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { - // Arrête le processus de la demande. - $this->stopFmeDesktopOrderProcess($aGtfEngine['order_id']); + $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult); + if ($aOrder['fme_engine_type_id'] == 'desktop') { + if ($this->stopFmeDesktopOrderProcess($iOrderId) === false) + $sErrorMessage = ERROR_0037; + } + else { + if ($this->stopFmeServerOrder($iOrderId) === false) + $sErrorMessage = ERROR_0038; + } + // Message de retour pour l'API Rest. + if (empty($sErrorMessage)) { + $aReturn = array('status' => 1, 'message' => ''); + // Mise à jour du statut de la demande (stoppé). + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); + $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); + $aParams['order_status_id'] = array('value' => 7, 'type' => 'number'); + $this->oConnection->oBd->executeWithParams($aSql['updateOrderStatus'], $aParams); } + else + $aReturn = array('status' => 0, 'message' => $sErrorMessage, 'error_code' => 17); + return $aReturn; } } @@ -730,21 +852,30 @@ class Orders extends GTF { $aParams = array(); $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); - $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHome'], $aParams); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromOrderId'], $aParams); if (!$this->oConnection->oBd->enErreur()) { $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult); $sPidFilePath = $aGtfEngineHome['engines_home'] . '/' . 'pid_' . $aGtfEngineHome['gtf_engine_id'] . '.txt'; if (file_exists($sPidFilePath)) { $iPid = file_get_contents($sPidFilePath); if (is_numeric($iPid)) { - // Supprime le processus "engine.exe". - $this->killProcess($iPid); - // Tue tous les processus liés à une demande et un traitement sur Fme Desktop. - $aProcessName = array('cmd.exe', 'php.exe', 'cmd.exe', 'fme.exe'); - foreach ($aProcessName as $sProcessName) { - $iPid = $this->getChildProcess($iPid, $sProcessName); - if ($iPid !== false) - $this->killProcess($iPid); + if (strtolower(substr(PHP_OS, 0, 3)) == 'win') { + // Supprime le processus "engine.exe". + $this->killProcess($iPid); + // Tue tous les processus liés à une demande et un traitement sur Fme Desktop. + $aProcessName = array('cmd.exe', 'php.exe', 'cmd.exe', 'fme.exe'); + foreach ($aProcessName as $sProcessName) { + $iPid = $this->getChildProcess($iPid, $sProcessName); + if ($iPid !== false) + $this->killProcess($iPid); + } + } + else { + // Supprime tous les processus enfants. + $aResult = array(); + $sResultCommande = exec('pkill -9 -P ' . $iPid, $aResult, $iResult); + // Supprime le processus du moteur. + $this->killProcess($iPid); } } // Suppression du fichier contenant le pid du processus "engine.exe". @@ -789,43 +920,6 @@ class Orders extends GTF { return false; } - /** - * function stopFmeOrder - * \param $iOrderId Id of the Gtf order. - */ - function stopFmeOrder($iOrderId) { - require $this->sRessourcesFile; - // Informations de la demande à stopper. - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); - $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); - $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOrderFmeEngineType'], $aParams); - if (!$this->oConnection->oBd->enErreur()) { - $aOrder = $this->oConnection->oBd->ligneSuivante($oPDOresult); - if ($aOrder['fme_engine_type_id'] == 'desktop') { - if ($this->stopFmeDesktopOrderProcess($iOrderId) === false) - $sErrorMessage = ERROR_0037; - } - else { - if ($this->stopFmeServerOrder($iOrderId) === false) - $sErrorMessage = ERROR_0038; - } - // Message de retour pour l'API Rest. - if (empty($sErrorMessage)) { - $aReturn = array('status' => 1, 'message' => ''); - // Mise à jour du statut de la demande (stoppé). - $aParams = array(); - $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); - $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); - $aParams['order_status_id'] = array('value' => 7, 'type' => 'number'); - $this->oConnection->oBd->executeWithParams($aSql['updateOrderStatus'], $aParams); - } - else - $aReturn = array('status' => 0, 'message' => $sErrorMessage, 'error_code' => 17); - return $aReturn; - } - } - /** * function stopFmeServerOrder * \param $iOrderId Id of the Gtf order. @@ -836,7 +930,7 @@ class Orders extends GTF { $aParams = array(); $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); $aParams['order_id'] = array('value' => $iOrderId, 'type' => 'number'); - $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHome'], $aParams); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromOrderId'], $aParams); if (!$this->oConnection->oBd->enErreur()) { $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult); // Stoppe le traitement sur Fme Server. @@ -845,7 +939,9 @@ class Orders extends GTF { $aRunningJobs = unserialize(file_get_contents($sAsyncOrdersFilePath)); $aRunningJob = $this->getFmeServerRunningJob($iOrderId, $aRunningJobs); if ($aRunningJob !== false && !empty($aRunningJob['job_id'])) { + $sEngineLogFilePath = $this->aProperties['vas_home'] . '/log/engines/' . date($this->aProperties['log_period']) . '/engine_' . $aGtfEngineHome['gtf_engine_id'] . '/engine.log'; $oFmeServer = new FmeServer($aRunningJob['fme_server_url'], $aRunningJob['login'], $aRunningJob['password'], 'day', 1); + $oFmeServer->sLogFilePath = $sEngineLogFilePath; $oFmeServer->stopJob($aRunningJob['job_id']); // Supprime le traitement dans la liste des demandes asynchrones. $iJobIndex = null; @@ -862,13 +958,15 @@ class Orders extends GTF { unlink($sAsyncOrdersFilePath); else file_put_contents($sAsyncOrdersFilePath, serialize($aRunningJobs)); + // Log. + require $aGtfEngineHome['engines_home'] . '/' . 'string.inc'; + writeToLog(INFO_FME_SERVER_ASYNCHRONOUS_JOB_REMOVED_FROM_LIST . " (demande $iOrderId).", $sEngineLogFilePath); } } } } } - /** * Retourne les infos d'un traitement asynchrones en cours d'exécution. * @param {number} $iOrderId I de la demande en cours. @@ -882,5 +980,27 @@ class Orders extends GTF { } return false; } + + /** + * Retourne la liste des traitements asynchrones en cours d'exécution d'un moteur GTF. + * @param {number} $iGtfEngineId Id du moteur GTF. + * return array + */ + function getFmeServerRunningJobs($iGtfEngineId) { + require $this->sRessourcesFile; + // Récupère le répertoire des moteurs de GTF. + $aRunningJobs = array(); + $aParams = array(); + $aParams['sSchemaGtf'] = array('value' => $this->aProperties['schema_gtf'], 'type' => 'schema_name'); + $aParams['iGtfEngineId'] = array('value' => $iGtfEngineId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGtfEngineHomeFromEngineId'], $aParams); + if (!$this->oConnection->oBd->enErreur()) { + $aGtfEngineHome = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $sAsyncOrdersFilePath = $aGtfEngineHome['engines_home'] . '/' . 'gtf_engine' . $aGtfEngineHome['gtf_engine_id'] . '_jobid.txt'; + if (file_exists($sAsyncOrdersFilePath)) + $aRunningJobs = unserialize(file_get_contents($sAsyncOrdersFilePath)); + } + return $aRunningJobs; + } } ?> \ No newline at end of file