diff --git a/include/tool_registry.inc.php b/include/tool_registry.inc.php index 97ae8de..7e68617 100644 --- a/include/tool_registry.inc.php +++ b/include/tool_registry.inc.php @@ -6,7 +6,7 @@ if (!defined('PHPWG_ROOT_PATH')) if (isset($GLOBALS['template']) && is_object($GLOBALS['template']) && method_exists($GLOBALS['template'], 'func_combine_script')) { - $script_version = function_exists('bratonien_tools_current_version') ? bratonien_tools_current_version() : '0.9.6.24'; + $script_version = function_exists('bratonien_tools_current_version') ? bratonien_tools_current_version() : '0.9.6.27'; $GLOBALS['template']->func_combine_script(array( 'id'=>'bratonien_nc_connector_edit_v2', 'path'=>BRATONIEN_TOOLS_PATH.'js/nc_connector_edit_v2.js', @@ -41,6 +41,58 @@ require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_delete_safe.inc.php'); require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_webdav.inc.php'); require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_wizard_webdav_flow.inc.php'); require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_edit.inc.php'); +require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_system.inc.php'); + +function bratonien_tools_nc_connector_run_now() +{ + $service = 'bratonien-nc-connector.service'; + $active = bratonien_tools_nc_connector_systemctl_value(array('is-active', $service)); + if ($active === 'active' || $active === 'activating') + { + return array('message'=>'Der NC-Abgleich läuft bereits.'); + } + + if (!function_exists('proc_open')) + { + throw new RuntimeException('Der NC-Abgleich konnte nicht gestartet werden: proc_open ist nicht verfügbar.'); + } + + $commands = array( + array('/usr/bin/sudo', '-n', '/usr/bin/systemctl', 'start', '--no-block', $service), + array('/usr/bin/systemctl', 'start', '--no-block', $service), + ); + $last_error = ''; + + foreach ($commands as $command) + { + if (!is_executable($command[0])) + { + continue; + } + $spec = array( + 0=>array('file','/dev/null','r'), + 1=>array('pipe','w'), + 2=>array('pipe','w'), + ); + $process = @proc_open($command, $spec, $pipes, null, array_merge($_ENV, array('LC_ALL'=>'C','LANG'=>'C'))); + if (!is_resource($process)) + { + continue; + } + $stdout = trim((string)stream_get_contents($pipes[1])); + $stderr = trim((string)stream_get_contents($pipes[2])); + fclose($pipes[1]); + fclose($pipes[2]); + $exit = proc_close($process); + if ($exit === 0) + { + return array('message'=>'NC-Abgleich wurde gestartet.'); + } + $last_error = $stderr !== '' ? $stderr : $stdout; + } + + throw new RuntimeException('Der NC-Abgleich konnte nicht gestartet werden'.($last_error !== '' ? ': '.$last_error : '.')); +} function bratonien_tools_get_tools() { @@ -65,13 +117,13 @@ function bratonien_tools_get_tools() 'album_share_create' => array('handler' => 'bratonien_tools_create_album_share'), 'album_share_regenerate_link' => array('handler' => 'bratonien_tools_regenerate_album_share_link'), 'album_share_revoke' => array('handler' => 'bratonien_tools_revoke_album_share'), - 'nc_connector_create_local' => array('handler' => 'bratonien_tools_nc_connector_create_local_api_first'), 'nc_connector_create_webdav_parallel' => array('handler' => 'bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard'), 'nc_connector_edit_start' => array('handler' => 'bratonien_tools_nc_connector_edit_start'), 'nc_connector_update_local' => array('handler' => 'bratonien_tools_nc_connector_update_local_friendly'), 'nc_connector_delete' => array('handler' => 'bratonien_tools_nc_connector_delete_safe'), 'nc_connector_update_name' => array('handler' => 'bratonien_tools_nc_connector_update_name'), 'nc_connector_update_technical' => array('handler' => 'bratonien_tools_nc_connector_update_technical'), + 'nc_connector_run_now' => array('handler' => 'bratonien_tools_nc_connector_run_now'), 'nc_connector_wizard_scan' => array('handler' => 'bratonien_tools_nc_wizard_scan_webdav_first'), 'nc_connector_wizard_save_technical' => array('handler' => 'bratonien_tools_nc_wizard_save_technical_flow'), 'nc_connector_wizard_directory_browse' => array('handler' => 'bratonien_tools_nc_wizard_directory_browse'), diff --git a/js/nc_connector_edit_v2.js b/js/nc_connector_edit_v2.js index 2d866bc..a2d4c01 100644 --- a/js/nc_connector_edit_v2.js +++ b/js/nc_connector_edit_v2.js @@ -13,6 +13,33 @@ var tokenInput = section.querySelector('input[name="pwg_token"]'); var pwgToken = tokenInput ? tokenInput.value : ''; + var technicalButton = document.getElementById('bratonien-nc-technical-open'); + if (technicalButton) technicalButton.remove(); + var technicalCreate = document.getElementById('bratonien-nc-technical-create'); + if (technicalCreate) technicalCreate.remove(); + + var statusHeading = Array.prototype.find.call(section.querySelectorAll('h4'), function (heading) { + return heading.textContent.trim() === 'Status'; + }); + var statusCard = statusHeading ? statusHeading.closest('.bratonien-card') : null; + if (statusCard && pwgToken && !statusCard.querySelector('[data-nc-run-now]')) { + var runForm = document.createElement('form'); + runForm.method = 'post'; + runForm.className = 'bratonien-actions'; + runForm.style.marginTop = '1rem'; + runForm.setAttribute('data-nc-run-now', '1'); + runForm.innerHTML = '' + + ''; + runForm.addEventListener('submit', function () { + var button = runForm.querySelector('button'); + if (button) { + button.disabled = true; + button.textContent = 'Abgleich wird gestartet …'; + } + }); + statusCard.appendChild(runForm); + } + function escapeHtml(value) { return String(value == null ? '' : value).replace(/[&<>"']/g, function (c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; diff --git a/main.inc.php b/main.inc.php index b0063c1..467fd7b 100644 --- a/main.inc.php +++ b/main.inc.php @@ -1,7 +1,7 @@