From 64961b757461295cfdd6f4d66e72d3993e22dbf3 Mon Sep 17 00:00:00 2001 From: Jamie Snape Date: Mon, 24 Nov 2014 14:44:38 -0500 Subject: [PATCH] Migrate dicomserver module settings to database --- modules/dicomserver/configs/module.ini | 22 +- modules/dicomserver/constant/module.php | 39 +++- .../controllers/AdminController.php | 73 ++++++ .../controllers/ConfigController.php | 96 -------- .../components/ApiserverComponent.php | 22 +- .../components/ServerComponent.php | 126 ++++++----- .../controllers/forms/ConfigForm.php | 65 ------ .../dicomserver/database/InstallScript.php | 46 ++++ .../database/mysql/{1.0.1.sql => 1.1.0.sql} | 2 +- .../database/pgsql/{1.0.1.sql => 1.1.0.sql} | 2 +- .../database/sqlite/{1.0.1.sql => 1.1.0.sql} | 2 +- .../dicomserver/database/upgrade/1.1.0.php | 79 +++++++ modules/dicomserver/forms/Admin.php | 103 +++++++++ .../admin.index.css} | 0 .../config.index.js => admin/admin.index.js} | 119 +++------- .../admin.index.scss} | 5 - modules/dicomserver/views/admin/index.phtml | 129 +++++++++++ modules/dicomserver/views/config/index.phtml | 212 ------------------ 18 files changed, 577 insertions(+), 565 deletions(-) create mode 100644 modules/dicomserver/controllers/AdminController.php delete mode 100644 modules/dicomserver/controllers/ConfigController.php delete mode 100644 modules/dicomserver/controllers/forms/ConfigForm.php create mode 100644 modules/dicomserver/database/InstallScript.php rename modules/dicomserver/database/mysql/{1.0.1.sql => 1.1.0.sql} (82%) rename modules/dicomserver/database/pgsql/{1.0.1.sql => 1.1.0.sql} (81%) rename modules/dicomserver/database/sqlite/{1.0.1.sql => 1.1.0.sql} (79%) create mode 100644 modules/dicomserver/database/upgrade/1.1.0.php create mode 100644 modules/dicomserver/forms/Admin.php rename modules/dicomserver/public/css/{config/config.index.css => admin/admin.index.css} (100%) rename modules/dicomserver/public/js/{config/config.index.js => admin/admin.index.js} (70%) rename modules/dicomserver/public/scss/{config/config.index.scss => admin/admin.index.scss} (89%) create mode 100644 modules/dicomserver/views/admin/index.phtml delete mode 100644 modules/dicomserver/views/config/index.phtml diff --git a/modules/dicomserver/configs/module.ini b/modules/dicomserver/configs/module.ini index 7e9d973cd..f3c172455 100644 --- a/modules/dicomserver/configs/module.ini +++ b/modules/dicomserver/configs/module.ini @@ -6,24 +6,4 @@ description = "Receive and upload DICOM files and provide DICOM query/retrieve s category = "DICOM" dependencies = api,dicomextractor uuid = "f850b92d-3f22-4560-bca6-dfbade51a181" -version = "1.0.1" - -; uploader DCMTK command -dcm2xml = "dcm2xml" -storescp = "storescp" -dcmqrscp = "dcmqrscp" -dcmqridx = "dcmqridx" -; uploader reception directory -receptiondir = "" -; storescp configuration -storescp_port = "55555" -; seconds -storescp_study_timeout = "15" -; pydas destnation folder -pydas_dest_folder = "Public" -; dcmqrscp configuration -dcmqrscp_port = "9885" -; server AE title -server_ae_title = "MIDAS_PACS" -; remote AEs -peer_aes = "" +version = "1.1.0" diff --git a/modules/dicomserver/constant/module.php b/modules/dicomserver/constant/module.php index 0befcc62b..c375d0743 100644 --- a/modules/dicomserver/constant/module.php +++ b/modules/dicomserver/constant/module.php @@ -18,14 +18,37 @@ limitations under the License. =========================================================================*/ +define('MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY', 'dcm2xml_command'); +define('MIDAS_DICOMSERVER_DCM2XML_COMMAND_DEFAULT_VALUE', 'dcm2xml'); +define('MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY', 'storescp_command'); +define('MIDAS_DICOMSERVER_STORESCP_COMMAND_DEFAULT_VALUE', 'storescp'); +define('MIDAS_DICOMSERVER_STORESCP_PORT_KEY', 'storescp_port'); +define('MIDAS_DICOMSERVER_STORESCP_PORT_DEFAULT_VALUE', 55555); +define('MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_KEY', 'storescp_study_timeout'); +define('MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_DEFAULT_VALUE', 15); +define('MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY', 'reception_directory'); +define('MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_DEFAULT_VALUE', ''); +define('MIDAS_DICOMSERVER_DESTINATION_FOLDER_KEY', 'destination_folder'); +define('MIDAS_DICOMSERVER_DESTINATION_FOLDER_DEFAULT_VALUE', 'Public'); +define('MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY', 'dcmqrscp_command'); +define('MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_DEFAULT_VALUE', 'dcmqrscp'); +define('MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY', 'dcmqrscp_port'); +define('MIDAS_DICOMSERVER_DCMQRSCP_PORT_DEFAULT_VALUE', 9885); +define('MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY', 'dcmqridx_command'); +define('MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_DEFAULT_VALUE', 'dcmqridx'); +define('MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY', 'server_ae_title'); +define('MIDAS_DICOMSERVER_SERVER_AE_TITLE_DEFAULT_VALUE', 'MIDAS_PACS'); +define('MIDAS_DICOMSERVER_PEER_AES_KEY', 'peer_aes'); +define('MIDAS_DICOMSERVER_PEER_AES_DEFAULT_VALUE', ''); + // server status -define('MIDAS_DICOM_STORESCP_IS_RUNNING', 1); -define('MIDAS_DICOM_DCMQRSCP_IS_RUNNING', 2); -define('MIDAS_DICOM_SERVER_NOT_RUNNING', 0); -define('MIDAS_DICOM_SERVER_NOT_SUPPORTED', -1); +define('MIDAS_DICOMSERVER_STORESCP_IS_RUNNING', 1); +define('MIDAS_DICOMSERVER_DCMQRSCP_IS_RUNNING', 2); +define('MIDAS_DICOMSERVER_SERVER_NOT_RUNNING', 0); +define('MIDAS_DICOMSERVER_SERVER_NOT_SUPPORTED', -1); // default subdirectories and files -define('LOG_DIR', '/logs'); -define('PROCESSING_DIR', '/processing'); -define('PACS_DIR', '/pacs'); -define('DCMQRSCP_CFG_FILE', '/dcmqrscp_midas.cfg'); +define('MIDAS_DICOMSERVER_LOGS_DIRECTORY', '/logs'); +define('MIDAS_DICOMSERVER_PROCESSING_DIRECTORY', '/processing'); +define('MIDAS_DICOMSERVER_PACS_DIRECTORY', '/pacs'); +define('MIDAS_DICOMSERVER_DCMQRSCP_CFG_FILE', '/dcmqrscp_midas.cfg'); diff --git a/modules/dicomserver/controllers/AdminController.php b/modules/dicomserver/controllers/AdminController.php new file mode 100644 index 000000000..83b98703c --- /dev/null +++ b/modules/dicomserver/controllers/AdminController.php @@ -0,0 +1,73 @@ +requireAdminPrivileges(); + + $this->view->pageTitle = 'DICOM Server Module Configuration'; + $form = new Dicomserver_Form_Admin(); + + if ($this->getRequest()->isPost()) { + $data = $this->getRequest()->getPost(); + + if ($form->isValid($data)) { + $values = $form->getValues(); + + foreach ($values as $key => $value) { + $this->Setting->setConfig($key, $value, $this->moduleName); + } + } + + $form->populate($data); + } else { + $elements = $form->getElements(); + + foreach ($elements as $element) { + $name = $element->getName(); + + if ($name != 'csrf' && $name !== 'submit') { + $value = $this->Setting->getValueByName($name, $this->moduleName); + + if (!is_null($value)) { + $form->setDefault($name, $value); + } + } + } + } + + $this->view->form = $form; + + $dashboard = $this->ModuleComponent->Server->isDICOMServerWorking(); + unset($dashboard['Status']); + $this->view->dashboard = $dashboard; + session_start(); + } +} diff --git a/modules/dicomserver/controllers/ConfigController.php b/modules/dicomserver/controllers/ConfigController.php deleted file mode 100644 index 7a1f2b4c2..000000000 --- a/modules/dicomserver/controllers/ConfigController.php +++ /dev/null @@ -1,96 +0,0 @@ -requireAdminPrivileges(); - - $options = array('allowModifications' => true); - if (file_exists(LOCAL_CONFIGS_PATH.'/'.$this->moduleName.'.local.ini')) { - $config = new Zend_Config_Ini( - LOCAL_CONFIGS_PATH.'/'.$this->moduleName.'.local.ini', - 'global', - $options - ); - } else { - $config = new Zend_Config_Ini( - BASE_PATH.'/modules/'.$this->moduleName.'/configs/module.ini', - 'global', - $options - ); - } - - $configForm = $this->ModuleForm->Config->createConfigForm(); - $formArray = $this->getFormAsArray($configForm); - $formArray['dcm2xml']->setValue($config->dcm2xml); - $formArray['dcmqridx']->setValue($config->dcmqridx); - $formArray['dcmqrscp_port']->setValue($config->dcmqrscp_port); - $formArray['dcmqrscp']->setValue($config->dcmqrscp); - $formArray['peer_aes']->setValue($config->peer_aes); - $formArray['pydas_dest_folder']->setValue($config->pydas_dest_folder); - $formArray['server_ae_title']->setValue($config->server_ae_title); - $formArray['storescp_port']->setValue($config->storescp_port); - $formArray['storescp_study_timeout']->setValue($config->storescp_study_timeout); - $formArray['storescp']->setValue($config->storescp); - if (empty($config->receptiondir)) { - $formArray['receptiondir']->setValue($this->ModuleComponent->Server->getDefaultReceptionDir()); - } else { - $formArray['receptiondir']->setValue($config->receptiondir); - } - $this->view->configForm = $formArray; - - if ($this->_request->isPost()) { - $this->_helper->layout->disableLayout(); - $this->_helper->viewRenderer->setNoRender(); - $submitConfig = $this->getParam('submitConfig'); - if (isset($submitConfig)) { - $config->dcm2xml = $this->getParam('dcm2xml'); - $config->dcmqridx = $this->getParam('dcmqridx'); - $config->dcmqrscp_port = $this->getParam('dcmqrscp_port'); - $config->dcmqrscp = $this->getParam('dcmqrscp'); - $config->peer_aes = $this->getParam('peer_aes'); - $config->pydas_dest_folder = $this->getParam('pydas_dest_folder'); - $config->receptiondir = $this->getParam('receptiondir'); - $config->server_ae_title = $this->getParam('server_ae_title'); - $config->storescp_port = $this->getParam('storescp_port'); - $config->storescp_study_timeout = $this->getParam('storescp_study_timeout'); - $config->storescp = $this->getParam('storescp'); - - $writer = new Zend_Config_Writer_Ini(); - $writer->setConfig($config); - $writer->setFilename(LOCAL_CONFIGS_PATH.'/'.$this->moduleName.'.local.ini'); - $writer->write(); - echo JsonComponent::encode(array(true, 'Changed saved')); - } - } - $dashboard_array = $this->ModuleComponent->Server->isDICOMServerWorking(); - // has shown status separately; remove it from the dashboard to avoid redundancy - unset($dashboard_array['Status']); - $this->view->dashboard = $dashboard_array; - } -} diff --git a/modules/dicomserver/controllers/components/ApiserverComponent.php b/modules/dicomserver/controllers/components/ApiserverComponent.php index 4513e92fd..e4da7b4c7 100644 --- a/modules/dicomserver/controllers/components/ApiserverComponent.php +++ b/modules/dicomserver/controllers/components/ApiserverComponent.php @@ -58,7 +58,7 @@ public function start($args) $status_args['dcmqrscp_cmd'] = $args['dcmqrscp_cmd']; } $running_status = $this->status($status_args); - if ($running_status['status'] > MIDAS_DICOM_SERVER_NOT_RUNNING && !array_key_exists('get_command', $args) + if ($running_status['status'] > MIDAS_DICOMSERVER_SERVER_NOT_RUNNING && !array_key_exists('get_command', $args) ) { throw new Exception( 'At least one DICOM service is already running. Please stop all services first before start them again!', @@ -105,11 +105,11 @@ public function start($args) $serverComponent = MidasLoader::loadComponent('Server', 'dicomserver'); $incoming_dir = $serverComponent->getDefaultReceptionDir(); } - $processing_dir = $incoming_dir.PROCESSING_DIR; + $processing_dir = $incoming_dir.MIDAS_DICOMSERVER_PROCESSING_DIRECTORY; if (!file_exists($processing_dir)) { KWUtils::mkDir($processing_dir, 0777); } - $log_dir = $incoming_dir.LOG_DIR; + $log_dir = $incoming_dir.MIDAS_DICOMSERVER_LOGS_DIRECTORY; if (!file_exists($log_dir)) { KWUtils::mkDir($log_dir, 0777); } @@ -117,7 +117,7 @@ public function start($args) if (!empty($args['dcmqrscp_cmd'])) { $dcmqrscp_cmd = $args['dcmqrscp_cmd']; } - $dcmqrscp_pacs_dir = $incoming_dir.PACS_DIR; + $dcmqrscp_pacs_dir = $incoming_dir.MIDAS_DICOMSERVER_PACS_DIRECTORY; if (!file_exists($dcmqrscp_pacs_dir)) { KWUtils::mkDir($dcmqrscp_pacs_dir, 0777); } @@ -140,7 +140,7 @@ public function start($args) $python_params[] = '-d '.$dest_folder; // used by dcmqrscp $python_params[] = '-q '.$dcmqrscp_cmd; - $python_params[] = '-f '.$dcmqrscp_pacs_dir.DCMQRSCP_CFG_FILE; + $python_params[] = '-f '.$dcmqrscp_pacs_dir.MIDAS_DICOMSERVER_DCMQRSCP_CFG_FILE; $start_server_command = KWUtils::prepareExeccommand($python_cmd, $python_params); if (array_key_exists('get_command', $args)) { $start_server_command_string = str_replace("'", "", $start_server_command); @@ -197,11 +197,11 @@ public function status($args) $ret = array(); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { // currently not supported in windows - $ret['status'] = MIDAS_DICOM_SERVER_NOT_SUPPORTED; + $ret['status'] = MIDAS_DICOMSERVER_SERVER_NOT_SUPPORTED; return $ret; } else { - $ret['status'] = MIDAS_DICOM_SERVER_NOT_RUNNING; + $ret['status'] = MIDAS_DICOMSERVER_SERVER_NOT_RUNNING; } $ps_cmd = 'ps'; $cmd_params = array(); @@ -214,7 +214,7 @@ public function status($args) $fields = preg_split("/\s+/", trim($line)); $process = $fields[4]; if (!strcmp($process, $storescp_cmd)) { - $ret['status'] = MIDAS_DICOM_STORESCP_IS_RUNNING; + $ret['status'] = MIDAS_DICOMSERVER_STORESCP_IS_RUNNING; // need to be updated if python script is changed $ret['user_email'] = $fields[21]; $runningSCPs += 1; @@ -222,7 +222,7 @@ public function status($args) break; } } elseif (!strcmp($process, $dcmqrscp_cmd)) { - $ret['status'] += MIDAS_DICOM_DCMQRSCP_IS_RUNNING; + $ret['status'] += MIDAS_DICOMSERVER_DCMQRSCP_IS_RUNNING; $runningSCPs += 1; if ($runningSCPs == $totalSCPs) { break; @@ -261,7 +261,7 @@ public function stop($args) } $running_status = $this->status($status_args); - if ($running_status['status'] == MIDAS_DICOM_SERVER_NOT_RUNNING && !array_key_exists('get_command', $args) + if ($running_status['status'] == MIDAS_DICOMSERVER_SERVER_NOT_RUNNING && !array_key_exists('get_command', $args) ) { $ret['message'] = 'DICOM server is not running now!'; @@ -282,7 +282,7 @@ public function stop($args) $serverComponent = MidasLoader::loadComponent('Server', 'dicomserver'); $incoming_dir = $serverComponent->getDefaultReceptionDir(); } - $log_dir = $incoming_dir.LOG_DIR; + $log_dir = $incoming_dir.MIDAS_DICOMSERVER_LOGS_DIRECTORY; if (!file_exists($log_dir)) { KWUtils::mkDir($log_dir, 0777); } diff --git a/modules/dicomserver/controllers/components/ServerComponent.php b/modules/dicomserver/controllers/components/ServerComponent.php index f1e266648..a7e006e7b 100644 --- a/modules/dicomserver/controllers/components/ServerComponent.php +++ b/modules/dicomserver/controllers/components/ServerComponent.php @@ -23,53 +23,64 @@ /** Upload dicom files */ class Dicomserver_ServerComponent extends AppComponent { + /** @var string */ + public $moduleName = 'dicomserver'; + /** * Verify that DICOM server is setup properly */ public function isDICOMServerWorking() { - $ret = array(); - $modulesConfig = Zend_Registry::get('configsModules'); - $dcm2xmlCommand = $modulesConfig['dicomserver']->dcm2xml; - $storescpCommand = $modulesConfig['dicomserver']->storescp; - $dcmqrscpCommand = $modulesConfig['dicomserver']->dcmqrscp; - $dcmqridxCommand = $modulesConfig['dicomserver']->dcmqridx; + /** @var SettingModel $settingModel */ + $settingModel = MidasLoader::loadModel('Setting'); + $dcm2xmlCommand = $settingModel->getValueByName(MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY, $this->moduleName); + $storescpCommand = $settingModel->getValueByName(MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY, $this->moduleName); + $dcmqrscpCommand = $settingModel->getValueByName(MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY, $this->moduleName); + $dcmqridxCommand = $settingModel->getValueByName(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY, $this->moduleName); + $kwdicomextractorComponent = MidasLoader::loadComponent('Extractor', 'dicomextractor'); + $ret = array(); $ret['dcm2xml'] = $kwdicomextractorComponent->getApplicationStatus($dcm2xmlCommand, 'dcm2xml'); $ret['storescp'] = $kwdicomextractorComponent->getApplicationStatus($storescpCommand, 'storescp'); $ret['dcmqrscp'] = $kwdicomextractorComponent->getApplicationStatus($dcmqrscpCommand, 'dcmqrscp'); $ret['dcmqridx'] = $kwdicomextractorComponent->getApplicationStatus($dcmqridxCommand, 'dcmqridx'); - $receptionDir = $modulesConfig['dicomserver']->receptiondir; + + $receptionDir = $settingModel->getValueByName(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, $this->moduleName); + if (empty($receptionDir)) { $receptionDir = $this->getDefaultReceptionDir(); } $ret['Reception Directory Writable'] = array(is_writable($receptionDir)); - $peer_aes = $modulesConfig['dicomserver']->peer_aes; - if (!empty($peer_aes) && strpos($peer_aes, '(') !== false && strpos($peer_aes, ')') !== false + + $peerAes = $settingModel->getValueByName(MIDAS_DICOMSERVER_PEER_AES_KEY, $this->moduleName); + + if (!empty($peerAes) && strpos($peerAes, '(') !== false && strpos($peerAes, ')') !== false ) { $ret['Peer AE List Not Empty'] = array(true, "At least one peer AE is given"); } else { $ret['Peer AE List Not Empty'] = array(false, "Please input your peer AEs!"); } + + /** @var Dicomserver_ApiComponent $apiComponent */ $apiComponent = MidasLoader::loadComponent('Api', 'dicomserver'); $status_args['storescp_cmd'] = $storescpCommand; $status_args['dcmqrscp_cmd'] = $dcmqrscpCommand; $status_results = $apiComponent->status($status_args); - if ($status_results['status'] == MIDAS_DICOM_STORESCP_IS_RUNNING + MIDAS_DICOM_DCMQRSCP_IS_RUNNING) { + if ($status_results['status'] == MIDAS_DICOMSERVER_STORESCP_IS_RUNNING + MIDAS_DICOMSERVER_DCMQRSCP_IS_RUNNING) { $ret['Status'] = array(true, "DICOM Server is running"); - } elseif ($status_results['status'] == MIDAS_DICOM_STORESCP_IS_RUNNING) { + } elseif ($status_results['status'] == MIDAS_DICOMSERVER_STORESCP_IS_RUNNING) { $ret['Status'] = array( false, 'DICOM C-STORE receiver is running, but DICOM Query/Retrieve service are NOT running', ); - } elseif ($status_results['status'] == MIDAS_DICOM_DCMQRSCP_IS_RUNNING) { + } elseif ($status_results['status'] == MIDAS_DICOMSERVER_DCMQRSCP_IS_RUNNING) { $ret['Status'] = array( false, 'DICOM Query/Retrieve services are running, but DICOM C-STORE receiver is NOT running', ); - } elseif ($status_results['status'] == MIDAS_DICOM_SERVER_NOT_RUNNING) { + } elseif ($status_results['status'] == MIDAS_DICOMSERVER_SERVER_NOT_RUNNING) { $ret['Status'] = array(false, "DICOM Server is not running"); - } else { // MIDAS_DICOM_SERVER_NOT_SUPPORTED + } else { // MIDAS_DICOMSERVER_SERVER_NOT_SUPPORTED $ret['Status'] = array(false, 'This module is currently not supported in Windows.'); } @@ -81,18 +92,11 @@ public function isDICOMServerWorking() */ public function getDefaultReceptionDir() { + /** @var UtilityComponent $utilityComponent */ $utilityComponent = MidasLoader::loadComponent('Utility'); - $default_reception_dir = $utilityComponent->getTempDirectory(''); - if (substr($default_reception_dir, -1) == '/') { - $default_reception_dir = substr($default_reception_dir, 0, -1); - } - $default_reception_dir .= 'dicomserver'; - if (!file_exists($default_reception_dir) && !KWUtils::mkDir($default_reception_dir, 0777) - ) { - throw new Zend_Exception("couldn't create dir ".$default_reception_dir); - } + $defaultReceptionDirectory = $utilityComponent->getTempDirectory('dicomserver'); - return $default_reception_dir; + return $defaultReceptionDirectory; } /** @@ -100,28 +104,32 @@ public function getDefaultReceptionDir() */ public function generateDcmqrscpConfig() { - $modulesConfig = Zend_Registry::get('configsModules'); - $pacs_dir = $modulesConfig['dicomserver']->receptiondir.PACS_DIR; - $cfg_file = $pacs_dir.DCMQRSCP_CFG_FILE; - $cfg_file_content = "NetworkTCPPort = ".$modulesConfig['dicomserver']->dcmqrscp_port."\n"; - $cfg_file_content .= "MaxPDUSize = 16384\n"; - $cfg_file_content .= "MaxAssociations = 16\n\n"; - $cfg_file_content .= "HostTable BEGIN\n"; - $peer_aes = $modulesConfig['dicomserver']->peer_aes; - $peer_aes_arr = explode(";", $peer_aes); - $symblic_name_arr = array(); - foreach ($peer_aes_arr as $index => $peer_ae) { - $cfg_file_content .= "ae".$index." = ".$peer_ae."\n"; - $symblic_name_arr[] = "ae".$index; + /** @var SettingModel $settingModel */ + $settingModel = MidasLoader::loadModel('Setting'); + $receptionDirectory = $settingModel->getValueByName(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, $this->moduleName); + $dcmqrscpPort = $settingModel->getValueByName(MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY, $this->moduleName); + $pacsDirectory = $receptionDirectory.MIDAS_DICOMSERVER_PACS_DIRECTORY; + $cfgFile = $pacsDirectory.MIDAS_DICOMSERVER_DCMQRSCP_CFG_FILE; + $cfgFileContent = "NetworkTCPPort = ".$dcmqrscpPort."\n"; + $cfgFileContent .= "MaxPDUSize = 16384\n"; + $cfgFileContent .= "MaxAssociations = 16\n\n"; + $cfgFileContent .= "HostTable BEGIN\n"; + $peerAes = $settingModel->getValueByName(MIDAS_DICOMSERVER_PEER_AES_KEY, $this->moduleName); + $peerAesArray = explode(";", $peerAes); + $symbolicNameArray = array(); + foreach ($peerAesArray as $index => $peer_ae) { + $cfgFileContent .= "ae".$index." = ".$peer_ae."\n"; + $symbolicNameArray[] = "ae".$index; } - $cfg_file_content .= "AES = ".implode(",", $symblic_name_arr)."\n"; - $cfg_file_content .= "HostTable END\n\n"; - $cfg_file_content .= "VendorTable BEGIN\n"; - $cfg_file_content .= "VendorTable END\n\n"; - $cfg_file_content .= "AETable BEGIN\n"; - $cfg_file_content .= $modulesConfig['dicomserver']->server_ae_title." ".$pacs_dir." R (200, 1024mb) AES\n"; - $cfg_file_content .= "AETable END\n"; - file_put_contents($cfg_file, $cfg_file_content); + $serverAeTitle = $settingModel->getValueByName(MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY, $this->moduleName); + $cfgFileContent .= "AES = ".implode(",", $symbolicNameArray)."\n"; + $cfgFileContent .= "HostTable END\n\n"; + $cfgFileContent .= "VendorTable BEGIN\n"; + $cfgFileContent .= "VendorTable END\n\n"; + $cfgFileContent .= "AETable BEGIN\n"; + $cfgFileContent .= $serverAeTitle." ".$pacsDirectory." R (200, 1024mb) AES\n"; + $cfgFileContent .= "AETable END\n"; + file_put_contents($cfgFile, $cfgFileContent); } /** @@ -133,30 +141,34 @@ public function register($revision) if (count($bitstreams) < 1) { return; } - $modulesConfig = Zend_Registry::get('configsModules'); - $command = $modulesConfig['dicomserver']->dcmqridx; + + /** @var SettingModel $settingModel */ + $settingModel = MidasLoader::loadModel('Setting'); + $command = $settingModel->getValueByName(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY, $this->moduleName); $command = str_replace("'", '', $command); - $command_params = array(); - $reciptionDir = $modulesConfig['dicomserver']->receptiondir; - if (!is_writable($reciptionDir)) { + $commandParams = array(); + $receptionDirectory = $settingModel->getValueByName(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, $this->moduleName); + if (!is_writable($receptionDirectory)) { throw new Zend_Exception( "Please configure Dicom Server module correctly. Its reception directory is NOT writable!", MIDAS_INVALID_POLICY ); } - $aeStorage = $reciptionDir.PACS_DIR; + $aeStorage = $receptionDirectory.MIDAS_DICOMSERVER_PACS_DIRECTORY; $aeStorage = str_replace("'", '', $aeStorage); - $command_params[] = $aeStorage; + $commandParams[] = $aeStorage; foreach ($bitstreams as $bitstream) { - $command_params[] = $bitstream->getFullPath(); - $regisgterCommand = KWUtils::prepareExeccommand($command, $command_params); + $commandParams[] = $bitstream->getFullPath(); + $registerCommand = KWUtils::prepareExeccommand($command, $commandParams); array_pop($command_params); // prepare for next iteration in the loop - KWUtils::exec($regisgterCommand, $output, '', $returnVal); + KWUtils::exec($registerCommand, $output, '', $returnVal); if ($returnVal) { - $exception_string = "Failed to register DICOM images! \n Reason:".implode("\n", $output); - throw new Zend_Exception(htmlspecialchars($exception_string, ENT_QUOTES), MIDAS_INVALID_POLICY); + $exceptionString = "Failed to register DICOM images! \n Reason:".implode("\n", $output); + throw new Zend_Exception(htmlspecialchars($exceptionString, ENT_QUOTES), MIDAS_INVALID_POLICY); } } + + /** @var Dicomserver_RegistrationModel $registrationModel */ $registrationModel = MidasLoader::loadModel('Registration', 'dicomserver'); $itemId = $revision->getItemId(); if (!$registrationModel->checkByItemId($itemId)) { diff --git a/modules/dicomserver/controllers/forms/ConfigForm.php b/modules/dicomserver/controllers/forms/ConfigForm.php deleted file mode 100644 index b2d250cc2..000000000 --- a/modules/dicomserver/controllers/forms/ConfigForm.php +++ /dev/null @@ -1,65 +0,0 @@ -setAction($this->webroot.'/dicomserver/config/index')->setMethod('post'); - - $dcm2xml = new Zend_Form_Element_Text('dcm2xml'); - $storescp = new Zend_Form_Element_Text('storescp'); - $storescp_port = new Zend_Form_Element_Text('storescp_port'); - $storescp_study_timeout = new Zend_Form_Element_Text('storescp_study_timeout'); - $receptiondir = new Zend_Form_Element_Text('receptiondir'); - $receptiondir->setRequired(true)->addValidator('NotEmpty', true); - $pydas_dest_folder = new Zend_Form_Element_Text('pydas_dest_folder'); - $dcmqrscp = new Zend_Form_Element_Text('dcmqrscp'); - $dcmqridx = new Zend_Form_Element_Text('dcmqridx'); - $dcmqrscp_port = new Zend_Form_Element_Text('dcmqrscp_port'); - $server_ae_title = new Zend_Form_Element_Text('server_ae_title'); - $peer_aes = new Zend_Form_Element_Textarea('peer_aes'); - $submit = new Zend_Form_Element_Submit('submitConfig'); - $submit->setLabel('Save configuration'); - - $form->addElements( - array( - $dcm2xml, - $storescp, - $storescp_port, - $storescp_study_timeout, - $receptiondir, - $pydas_dest_folder, - $dcmqrscp, - $dcmqridx, - $dcmqrscp_port, - $server_ae_title, - $peer_aes, - $submit, - ) - ); - - return $form; - } -} diff --git a/modules/dicomserver/database/InstallScript.php b/modules/dicomserver/database/InstallScript.php new file mode 100644 index 000000000..9cab58e2e --- /dev/null +++ b/modules/dicomserver/database/InstallScript.php @@ -0,0 +1,46 @@ +setConfig(MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY, MIDAS_DICOMSERVER_DCM2XML_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY, MIDAS_DICOMSERVER_STORESCP_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_PORT_KEY, MIDAS_DICOMSERVER_STORESCP_PORT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_KEY, MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DESTINATION_FOLDER_KEY, MIDAS_DICOMSERVER_DESTINATION_FOLDER_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY, MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY, MIDAS_DICOMSERVER_DCMQRSCP_PORT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY, MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY, MIDAS_DICOMSERVER_SERVER_AE_TITLE_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_PEER_AES_KEY, MIDAS_DICOMSERVER_PEER_AES_DEFAULT_VALUE, $this->moduleName); + } +} diff --git a/modules/dicomserver/database/mysql/1.0.1.sql b/modules/dicomserver/database/mysql/1.1.0.sql similarity index 82% rename from modules/dicomserver/database/mysql/1.0.1.sql rename to modules/dicomserver/database/mysql/1.1.0.sql index 72ab143ff..a1f067148 100644 --- a/modules/dicomserver/database/mysql/1.0.1.sql +++ b/modules/dicomserver/database/mysql/1.1.0.sql @@ -1,6 +1,6 @@ -- MIDAS Server. Copyright Kitware SAS. Licensed under the Apache License 2.0. --- MySQL database for the dicomserver module, version 1.0.1 +-- MySQL database for the dicomserver module, version 1.1.0 CREATE TABLE IF NOT EXISTS `dicomserver_registration` ( `registration_id` bigint(20) NOT NULL AUTO_INCREMENT, diff --git a/modules/dicomserver/database/pgsql/1.0.1.sql b/modules/dicomserver/database/pgsql/1.1.0.sql similarity index 81% rename from modules/dicomserver/database/pgsql/1.0.1.sql rename to modules/dicomserver/database/pgsql/1.1.0.sql index 8593ccaff..a7e1c557b 100644 --- a/modules/dicomserver/database/pgsql/1.0.1.sql +++ b/modules/dicomserver/database/pgsql/1.1.0.sql @@ -1,6 +1,6 @@ -- MIDAS Server. Copyright Kitware SAS. Licensed under the Apache License 2.0. --- PostgreSQL database for the dicomserver module, version 1.0.1 +-- PostgreSQL database for the dicomserver module, version 1.1.0 SET client_encoding = 'UTF8'; SET default_with_oids = FALSE; diff --git a/modules/dicomserver/database/sqlite/1.0.1.sql b/modules/dicomserver/database/sqlite/1.1.0.sql similarity index 79% rename from modules/dicomserver/database/sqlite/1.0.1.sql rename to modules/dicomserver/database/sqlite/1.1.0.sql index 2d3f43a4e..f913b73b4 100644 --- a/modules/dicomserver/database/sqlite/1.0.1.sql +++ b/modules/dicomserver/database/sqlite/1.1.0.sql @@ -1,6 +1,6 @@ -- MIDAS Server. Copyright Kitware SAS. Licensed under the Apache License 2.0. --- SQLite database for the dicomserver module, version 1.0.1 +-- SQLite database for the dicomserver module, version 1.1.0 CREATE TABLE IF NOT EXISTS "dicomserver_registration" ( "registration_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, diff --git a/modules/dicomserver/database/upgrade/1.1.0.php b/modules/dicomserver/database/upgrade/1.1.0.php new file mode 100644 index 000000000..4b27e5e60 --- /dev/null +++ b/modules/dicomserver/database/upgrade/1.1.0.php @@ -0,0 +1,79 @@ +moduleName.'.local.ini'; + + if (file_exists($configPath)) { + $config = new Zend_Config_Ini($configPath, 'global'); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY, $config->get('dcm2xml', MIDAS_DICOMSERVER_DCM2XML_COMMAND_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY, $config->get('storescp', MIDAS_DICOMSERVER_STORESCP_COMMAND_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_PORT_KEY, $config->get('storescp_port', MIDAS_DICOMSERVER_STORESCP_PORT_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_KEY, $config->get('storescp_study_timeout', MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, $config->get('receptiondir', MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DESTINATION_FOLDER_KEY, $config->get('pydas_dest_folder', MIDAS_DICOMSERVER_DESTINATION_FOLDER_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY, $config->get('dcmqrscp', MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY, $config->get('dcmqrscp_port', MIDAS_DICOMSERVER_DCMQRSCP_PORT_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY, $config->get('dcmqridx', MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY, $config->get('server_ae_title', MIDAS_DICOMSERVER_SERVER_AE_TITLE_DEFAULT_VALUE), $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_PEER_AES_KEY, $config->get('peer_aes', MIDAS_DICOMSERVER_PEER_AES_DEFAULT_VALUE), $this->moduleName); + + $config = new Zend_Config_Ini($configPath, null, true); + unset($config->global->dcm2xml); + unset($config->global->storescp); + unset($config->global->storescp_port); + unset($config->global->storescp_study_timeout); + unset($config->global->receptiondir); + unset($config->global->pydas_dest_folder); + unset($config->global->dcmqrscp); + unset($config->global->dcmqrscp_port); + unset($config->global->dcmqridx); + unset($config->global->server_ae_title); + unset($config->global->peer_aes); + + $writer = new Zend_Config_Writer_Ini(); + $writer->setConfig($config); + $writer->setFilename($configPath); + $writer->write(); + } else { + $settingModel->setConfig(MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY, MIDAS_DICOMSERVER_DCM2XML_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY, MIDAS_DICOMSERVER_STORESCP_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_PORT_KEY, MIDAS_DICOMSERVER_STORESCP_PORT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_KEY, MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY, MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DESTINATION_FOLDER_KEY, MIDAS_DICOMSERVER_DESTINATION_FOLDER_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY, MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY, MIDAS_DICOMSERVER_DCMQRSCP_PORT_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY, MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY, MIDAS_DICOMSERVER_SERVER_AE_TITLE_DEFAULT_VALUE, $this->moduleName); + $settingModel->setConfig(MIDAS_DICOMSERVER_PEER_AES_KEY, MIDAS_DICOMSERVER_PEER_AES_DEFAULT_VALUE, $this->moduleName); + } + } +} diff --git a/modules/dicomserver/forms/Admin.php b/modules/dicomserver/forms/Admin.php new file mode 100644 index 000000000..2c5016794 --- /dev/null +++ b/modules/dicomserver/forms/Admin.php @@ -0,0 +1,103 @@ +setName('dicomserver_admin'); + $this->setMethod('POST'); + + $csrf = new Midas_Form_Element_Hash('csrf'); + $csrf->setSalt('sAfDFebTDemATWR4gGrYGMSE'); + $csrf->setDecorators(array('ViewHelper')); + + $dcm2xmlCommand = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_DCM2XML_COMMAND_KEY); + $dcm2xmlCommand->setLabel('dcm2xml Command'); + $dcm2xmlCommand->setRequired(true); + $dcm2xmlCommand->addValidator('NotEmpty', true); + + $storescpCommand = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_STORESCP_COMMAND_KEY); + $storescpCommand->setLabel('storescp Command'); + $storescpCommand->setRequired(true); + $storescpCommand->addValidator('NotEmpty', true); + + $storescpPort = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_STORESCP_PORT_KEY); + $storescpPort->setLabel('storescp Port'); + $storescpPort->setRequired(true); + $storescpPort->addValidator('NotEmpty', true); + $storescpPort->addValidator('Digits', true); + $storescpPort->addValidator('Between', true, array('min' => 1, 'max' => 65535)); + $storescpPort->setAttrib('maxlength', 5); + + $storescpStudyTimeout = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_STORESCP_STUDY_TIMEOUT_KEY); + $storescpStudyTimeout->setLabel('storescp Study Timeout (in Seconds)'); + $storescpStudyTimeout->setRequired(true); + $storescpStudyTimeout->addValidator('NotEmpty', true); + $storescpStudyTimeout->addValidator('Digits', true); + $storescpStudyTimeout->addValidator('GreaterThan', true, array('min' => 0)); + + $receptionDirectory = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_RECEPTION_DIRECTORY_KEY); + $receptionDirectory->setLabel('Reception Directory for DICOM Files'); + $receptionDirectory->setRequired(true); + $receptionDirectory->addValidator('NotEmpty', true); + + $destinationFolder = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_DESTINATION_FOLDER_KEY); + $destinationFolder->setLabel('Upload Destination Folder'); + $destinationFolder->setRequired(true); + $destinationFolder->addValidator('NotEmpty', true); + + $dcmqrscpCommand = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_DCMQRSCP_COMMAND_KEY); + $dcmqrscpCommand->setLabel('dcmqrscp Command'); + $dcmqrscpCommand->setRequired(true); + $dcmqrscpCommand->addValidator('NotEmpty', true); + + $dcmqrscpPort = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_DCMQRSCP_PORT_KEY); + $dcmqrscpPort->setLabel('dcmqrscp Port'); + $dcmqrscpPort->setRequired(true); + $dcmqrscpPort->addValidator('NotEmpty', true); + $dcmqrscpPort->addValidator('Digits', true); + $dcmqrscpPort->addValidator('Between', true, array('min' => 1, 'max' => 65535)); + $dcmqrscpPort->setAttrib('maxlength', 5); + + $dcmqridxCommand = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_DCMQRIDX_COMMAND_KEY); + $dcmqridxCommand->setLabel('dcmqridx Command'); + $dcmqridxCommand->setRequired(true); + $dcmqridxCommand->addValidator('NotEmpty', true); + + $serverAeTitle = new Zend_Form_Element_Text(MIDAS_DICOMSERVER_SERVER_AE_TITLE_KEY); + $serverAeTitle->setLabel('Server Application Entity Title'); + $serverAeTitle->setRequired(true); + $serverAeTitle->addValidator('NotEmpty', true); + + $peerAes = new Zend_Form_Element_Textarea(MIDAS_DICOMSERVER_PEER_AES_KEY); + $peerAes->setLabel('Peer Application Entities Allowed to Use Query/Retrieve Services'); + $peerAes->addValidator('NotEmpty', true); + + $this->addDisplayGroup(array($dcm2xmlCommand, $storescpCommand, $storescpPort, $storescpStudyTimeout, $receptionDirectory, $destinationFolder, $dcmqrscpCommand, $dcmqrscpPort, $dcmqridxCommand, $serverAeTitle, $peerAes), 'global'); + + $submit = new Zend_Form_Element_Submit('submit'); + $submit->setLabel('Save'); + + $this->addElements(array($csrf, $dcm2xmlCommand, $storescpCommand, $storescpPort, $storescpStudyTimeout, $receptionDirectory, $destinationFolder, $dcmqrscpCommand, $dcmqrscpPort, $dcmqridxCommand, $serverAeTitle, $peerAes, $submit)); + } +} diff --git a/modules/dicomserver/public/css/config/config.index.css b/modules/dicomserver/public/css/admin/admin.index.css similarity index 100% rename from modules/dicomserver/public/css/config/config.index.css rename to modules/dicomserver/public/css/admin/admin.index.css diff --git a/modules/dicomserver/public/js/config/config.index.js b/modules/dicomserver/public/js/admin/admin.index.js similarity index 70% rename from modules/dicomserver/public/js/config/config.index.js rename to modules/dicomserver/public/js/admin/admin.index.js index 58d8cd6fd..896010c68 100644 --- a/modules/dicomserver/public/js/config/config.index.js +++ b/modules/dicomserver/public/js/admin/admin.index.js @@ -10,13 +10,13 @@ midas.dicomserver.start = function (email, apikey) { 'use strict'; var email_val = typeof email !== 'undefined' ? email : ''; var apikey_val = typeof email !== 'undefined' ? apikey : ''; - var dcm2xml_val = $(document).find('#dcm2xml').val(); - var storescp_val = $(document).find('#storescp').val(); + var dcm2xml_val = $(document).find('#dcm2xml_command').val(); + var storescp_val = $(document).find('#storescp_command').val(); var port_val = $(document).find('#storescp_port').val(); var timeout_val = $(document).find('#storescp_study_timeout').val(); - var incoming_dir_val = $(document).find('#receptiondir').val(); - var dest_folder_val = $(document).find('#pydas_dest_folder').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); + var incoming_dir_val = $(document).find('#reception_directory').val(); + var dest_folder_val = $(document).find('#destination_folder').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); ajaxWebApi.ajax({ method: 'midas.dicomserver.start', args: 'email=' + email_val + @@ -48,13 +48,13 @@ midas.dicomserver.manualstart = function (email, apikey) { 'use strict'; var email_val = typeof email !== 'undefined' ? email : ''; var apikey_val = typeof email !== 'undefined' ? apikey : ''; - var dcm2xml_val = $(document).find('#dcm2xml').val(); - var storescp_val = $(document).find('#storescp').val(); + var dcm2xml_val = $(document).find('#dcm2xml_command').val(); + var storescp_val = $(document).find('#storescp_command').val(); var port_val = $(document).find('#storescp_port').val(); var timeout_val = $(document).find('#storescp_study_timeout').val(); - var incoming_dir_val = $(document).find('#receptiondir').val(); - var dest_folder_val = $(document).find('#pydas_dest_folder').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); + var incoming_dir_val = $(document).find('#reception_directory').val(); + var dest_folder_val = $(document).find('#destination_folder').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); ajaxWebApi.ajax({ method: 'midas.dicomserver.start', args: 'email=' + email_val + @@ -76,9 +76,9 @@ midas.dicomserver.manualstart = function (email, apikey) { midas.dicomserver.stop = function () { 'use strict'; - var storescp_val = $(document).find('#storescp').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); - var incoming_dir_val = $(document).find('#receptiondir').val(); + var storescp_val = $(document).find('#storescp_command').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); + var incoming_dir_val = $(document).find('#reception_directory').val(); ajaxWebApi.ajax({ method: 'midas.dicomserver.stop', args: 'storescp_cmd=' + storescp_val + @@ -102,9 +102,9 @@ midas.dicomserver.stop = function () { midas.dicomserver.manualstop = function () { 'use strict'; - var storescp_val = $(document).find('#storescp').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); - var incoming_dir_val = $(document).find('#receptiondir').val(); + var storescp_val = $(document).find('#storescp_command').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); + var incoming_dir_val = $(document).find('#reception_directory').val(); ajaxWebApi.ajax({ method: 'midas.dicomserver.stop', args: 'storescp_cmd=' + storescp_val + @@ -120,8 +120,8 @@ midas.dicomserver.manualstop = function () { midas.dicomserver.checkStatus = function () { 'use strict'; - var storescp_val = $(document).find('#storescp').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); + var storescp_val = $(document).find('#storescp_command').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); ajaxWebApi.ajax({ method: 'midas.dicomserver.status', args: 'storescp_cmd=' + storescp_val + @@ -174,69 +174,15 @@ midas.dicomserver.checkStatus = function () { }); }; -midas.dicomserver.validateConfig = function (formData, jqForm, options) {}; - -midas.dicomserver.successConfig = function (responseText, statusText, xhr, form) { - 'use strict'; - var jsonResponse; - try { - jsonResponse = $.parseJSON(responseText); - } - catch (e) { - midas.createNotice("An error occured. Please check the logs.", 4000, 'error'); - return false; - } - if (jsonResponse === null) { - midas.createNotice('Error', 4000, 'error'); - return; - } - if (jsonResponse[0]) { - midas.createNotice(jsonResponse[1], 4000); - window.location.reload(); - } - else { - midas.createNotice(jsonResponse[1], 4000, 'error'); - } -}; - $(document).ready(function () { 'use strict'; - $("div#receptiondir").qtip({ - content: 'The file-system location of the DICOM server work directory. (required)', - show: 'mouseover', - hide: 'mouseout', - position: { - target: 'mouse', - my: 'bottom left', - viewport: $(window), // Keep the qtip on-screen at all times - effect: true // Disable positioning animation - } - }); - - $("div#peer_aes").qtip({ - content: 'Please follow the above instructions to define your Peer AE list and it cannot be empty. (required)', - show: 'mouseover', - hide: 'mouseout', - position: { - target: 'mouse', - my: 'bottom left', - viewport: $(window), // Keep the qtip on-screen at all times - effect: true // Disable positioning animation - } - }); - - $('#configForm').ajaxForm({ - beforeSubmit: midas.dicomserver.validateConfig, - success: midas.dicomserver.successConfig - }); - midas.dicomserver.checkStatus(); $('div#startServer').click(function () { var html = ''; html += 'Do you want to use current logged-in user to start DICOM server?'; - html += '
'; - html += '
'; + html += '
'; + html += '
'; html += ''; html += ''; midas.showDialogWithContent('Start DICOM server', html, false); @@ -253,8 +199,8 @@ $(document).ready(function () { $('div#stopServer').click(function () { var html = ''; html += 'Do you really want to stop DICOM server?'; - html += '
'; - html += '
'; + html += '
'; + html += '
'; html += ''; html += ''; midas.showDialogWithContent('Stop DICOM server', html, false); @@ -279,19 +225,18 @@ $(document).ready(function () { active: false, autoHeight: false, change: function () { - var dcm2xml_val = $(document).find('#dcm2xml').val(); - var storescp_val = $(document).find('#storescp').val(); - var dcmqrscp_val = $(document).find('#dcmqrscp').val(); - var dcmqridx_val = $(document).find('#dcmqridx').val(); - var incoming_dir_val = $(document).find('#receptiondir').val(); - $('span#dcm2xml_command').html(dcm2xml_val); - $('span#storescp_command').html(storescp_val); - $('span#dcmqrscp_command').html(dcmqrscp_val); - $('span#dcmqridx_command').html(dcmqridx_val); - $('span#reception_dir').html(incoming_dir_val); + var dcm2xml_val = $(document).find('#dcm2xml_command').val(); + var storescp_val = $(document).find('#storescp_command').val(); + var dcmqrscp_val = $(document).find('#dcmqrscp_command').val(); + var dcmqridx_val = $(document).find('#dcmqridx_command').val(); + var incoming_dir_val = $(document).find('#reception_directory').val(); + $('span#manual_dcm2xml_command').html(dcm2xml_val); + $('span#manual_storescp_command').html(storescp_val); + $('span#manual_dcmqrscp_command').html(dcmqrscp_val); + $('span#manual_dcmqridx_command').html(dcmqridx_val); + $('span#manual_reception_directory').html(incoming_dir_val); midas.dicomserver.manualstart(); midas.dicomserver.manualstop(); } }).show(); - }); diff --git a/modules/dicomserver/public/scss/config/config.index.scss b/modules/dicomserver/public/scss/admin/admin.index.scss similarity index 89% rename from modules/dicomserver/public/scss/config/config.index.scss rename to modules/dicomserver/public/scss/admin/admin.index.scss index 9b8e090b6..8efa63c9b 100644 --- a/modules/dicomserver/public/scss/config/config.index.scss +++ b/modules/dicomserver/public/scss/admin/admin.index.scss @@ -23,8 +23,3 @@ div.manualCommandsWrapper li { span.set_bold { font-weight: bold; } - -textarea#peer_aes { - height: 50px; - width: 460px; -} diff --git a/modules/dicomserver/views/admin/index.phtml b/modules/dicomserver/views/admin/index.phtml new file mode 100644 index 000000000..39c08c4c2 --- /dev/null +++ b/modules/dicomserver/views/admin/index.phtml @@ -0,0 +1,129 @@ +declareVars('form', 'pageTitle'); +$this->headTitle($this->escape($this->pageTitle)); +?> + +
+

escape($this->pageTitle); ?>

+

+ This module requires dcm2xml and storescp from DCMTK to implement a DICOM Store service (C-STORE) + receiver. It also requires dcmqrscp and dcmqridx from DCMTK to implement DICOM Query/Retrieve + services (C-FIND and C-MOVE). To install DCMTK:
+ support.dcmtk.org/redmine/projects/dcmtk/wiki/howto. +

+

+ This module requires pydas to upload DICOM files to the server. To install pydas:
+ pydas.readthedocs.org. +

+ form; ?> +

DICOM Server Module Dashboard

+ + dashboard as $name => $status) { + echo ''; + echo ''; + if ($status[0]) { + echo ''; + } else { + echo ''; + } + if (isset($status[1])) { + echo ''; + } + echo ''; + } + ?> +
'.$this->escape($name).''.$this->escape($status[1]).'
+

Start/Stop DICOM Server

+ +

Please restart the DICOM server after each configuration change.

+ +
+
Start
+
Stop
+
+

Status: + + + + + +

+
+ +
+ + + +
+ +

« Back to Modules Administration

+
diff --git a/modules/dicomserver/views/config/index.phtml b/modules/dicomserver/views/config/index.phtml deleted file mode 100644 index f59c26069..000000000 --- a/modules/dicomserver/views/config/index.phtml +++ /dev/null @@ -1,212 +0,0 @@ -headScript()->appendFile($this->coreWebroot.'/public/js/jquery/jquery.form.js'); -$this->headScript()->appendFile($this->apiWebroot.'/public/js/common/common.ajaxapi.js'); -$this->headScript()->appendFile($this->moduleWebroot.'/public/js/config/config.index.js'); -?> - - -
-
- '; - echo ""; - echo $this->t('Back'); - echo ""; - echo '
'; - - ?> -
-

Requirements

- This module requires dcm2xml and storescp from - DCMTK to implement a DICOM Store service (C-STORE) receiver. - It also requires dcmqrscp and dcmqridx from - DCMTK to implement DICOM Query/Retrieve services (C-FIND and C-MOVE).
- To install DCMTK: - http://support.dcmtk.org/redmine/projects/dcmtk/wiki/howto

- - This module requires Pydas to upload DICOM files to Midas.
- To install Pydas: - https://pydas.readthedocs.org/
- - configForm['method']}' action='{$this->configForm['action']}'> -

DICOM Server configuration:

-
-

DICOM Store service (C-STORE) receiver:

-
- - {$this->configForm['dcm2xml']} -
-
-
- - {$this->configForm['storescp']} -
-
- - {$this->configForm['storescp_port']} -
-
- - {$this->configForm['storescp_study_timeout']} -
-
-
-
- - {$this->configForm['receptiondir']} -
-
-
- - {$this->configForm['pydas_dest_folder']} -
-
-
-

DICOM Query/Retrieve services (C-FIND and C-MOVE):

-
- - {$this->configForm['dcmqrscp']} -
-
- - {$this->configForm['dcmqridx']} -
-
- - {$this->configForm['dcmqrscp_port']} -
-
- - {$this->configForm['server_ae_title']} -
-
-
- Peer AE (Application Entity) list allowed to use Query/Retrieve serices.
- Each peer AE is defined as a 3-element tuple (3 comma-delimited elements enclosed in parentheses). - These 3 elements are in the strict order as AETitle, HostName, PortNumber, and cannot be empty.
- Different peer AEs are delimited with semicolons. - Sample list: (AE, localhost, 10001); (AE2, host2, 19530) -
-
- {$this->configForm['peer_aes']} -
-
-
-
- {$this->configForm['submitConfig']} -
- "; - ?> - -

Use this dashboard to verify current configuration:

- "; - foreach ($this->dashboard as $name => $status) { - echo ""; - echo " $name "; - if ($status[0]) { - echo " "; - } else { - echo " "; - } - if (isset($status[1])) { - echo " $status[1]"; - } - echo ""; - } - echo ""; - ?> - -

Start/Stop DICOM server:

- Please restart DICOM server after each configuration change. -
-
Start
-
Stop
-
-

Status: - - - - - -

-
- -
- - - -
- - -