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 @@