Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package icingaweb2-module-director for 
openSUSE:Factory checked in at 2026-06-27 18:08:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/icingaweb2-module-director (Old)
 and      /work/SRC/openSUSE:Factory/.icingaweb2-module-director.new.11887 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "icingaweb2-module-director"

Sat Jun 27 18:08:14 2026 rev:30 rq:1361991 version:1.11.9

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/icingaweb2-module-director/icingaweb2-module-director.changes
    2026-04-01 19:54:43.139327326 +0200
+++ 
/work/SRC/openSUSE:Factory/.icingaweb2-module-director.new.11887/icingaweb2-module-director.changes
 2026-06-27 18:10:13.116340616 +0200
@@ -1,0 +2,8 @@
+Sat Jun 27 10:31:40 UTC 2026 - ecsos <[email protected]> - 1.11.9
+
+-  Update to 1.11.9
+  * Internals
+    - Fix: Adapt to react/promise v3 and react/event-loop v1.6 (#3043)
+    - Fix: Add PromiseUtil shim for react/promise v2/v3 compatibility (#3081)
+
+-------------------------------------------------------------------

Old:
----
  icingaweb2-module-director-1.11.8.tar.gz

New:
----
  icingaweb2-module-director-1.11.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ icingaweb2-module-director.spec ++++++
--- /var/tmp/diff_new_pack.yTeU7v/_old  2026-06-27 18:10:13.688359987 +0200
+++ /var/tmp/diff_new_pack.yTeU7v/_new  2026-06-27 18:10:13.692360123 +0200
@@ -22,7 +22,7 @@
 %define icingadirector_user icingadirector
 
 Name:           icingaweb2-module-director
-Version:        1.11.8
+Version:        1.11.9
 Release:        0
 Summary:        Config module for Icinga Web 2
 License:        GPL-2.0-or-later
@@ -35,6 +35,8 @@
 BuildRequires:  nagios-rpm-macros
 BuildRequires:  systemd-rpm-macros
 Requires(pre):  pwdutils
+Requires:       icinga-php-library >= 0.14.2
+Requires:       icinga-php-thirdparty >= 0.15.3
 Requires:       icinga2 >= 2.8.0
 Requires:       icingaweb2 >= 2.8.0
 Requires:       icingaweb2-module-incubator >= 0.22.0

++++++ icingaweb2-module-director-1.11.8.tar.gz -> 
icingaweb2-module-director-1.11.9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/application/clicommands/JobsCommand.php 
new/icingaweb2-module-director-1.11.9/application/clicommands/JobsCommand.php
--- 
old/icingaweb2-module-director-1.11.8/application/clicommands/JobsCommand.php   
    2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/application/clicommands/JobsCommand.php   
    2026-06-26 16:16:48.000000000 +0200
@@ -10,7 +10,7 @@
 use Icinga\Module\Director\Daemon\JsonRpcLogWriter as JsonRpcLogWriterAlias;
 use Icinga\Module\Director\Daemon\Logger;
 use Icinga\Module\Director\Objects\DirectorJob;
-use React\EventLoop\Factory as Loop;
+use React\EventLoop\Loop;
 use React\EventLoop\LoopInterface;
 use React\Stream\ReadableResourceStream;
 use React\Stream\WritableResourceStream;
@@ -20,7 +20,7 @@
     public function runAction()
     {
         $this->app->getModuleManager()->loadEnabledModules();
-        $loop = Loop::create();
+        $loop = Loop::get();
         if ($this->params->get('rpc')) {
             $this->enableRpc($loop);
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/application/controllers/PhperrorController.php
 
new/icingaweb2-module-director-1.11.9/application/controllers/PhperrorController.php
--- 
old/icingaweb2-module-director-1.11.8/application/controllers/PhperrorController.php
        2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/application/controllers/PhperrorController.php
        1970-01-01 01:00:00.000000000 +0100
@@ -1,43 +0,0 @@
-<?php
-
-namespace Icinga\Module\Director\Controllers;
-
-use Icinga\Application\Icinga;
-use Icinga\Module\Director\Application\DependencyChecker;
-use Icinga\Module\Director\Web\Table\Dependency\DependencyInfoTable;
-use Icinga\Web\Controller;
-
-class PhperrorController extends Controller
-{
-    public function errorAction()
-    {
-        $this->getTabs()->add('error', array(
-            'label' => $this->translate('Error'),
-            'url'   => $this->getRequest()->getUrl()
-        ))->activate('error');
-        $msg = $this->translate(
-            "PHP version 5.4.x is required for Director >= 1.4.0, you're 
running %s."
-            . ' Please either upgrade PHP or downgrade Icinga Director'
-        );
-        $this->view->title = $this->translate('Unsatisfied dependencies');
-        $this->view->message = sprintf($msg, PHP_VERSION);
-    }
-
-    public function dependenciesAction()
-    {
-        $checker = new DependencyChecker(Icinga::app());
-        if ($checker->satisfiesDependencies($this->Module())) {
-            $this->redirectNow('director');
-        }
-        $this->setAutorefreshInterval(15);
-        $this->getTabs()->add('error', [
-            'label' => $this->translate('Error'),
-            'url'   => $this->getRequest()->getUrl()
-        ])->activate('error');
-        $this->view->title = $this->translate('Unsatisfied dependencies');
-        $this->view->table = (new DependencyInfoTable($checker, 
$this->Module()))->render();
-        $this->view->message = $this->translate(
-            "Icinga Director depends on the following modules, please 
install/upgrade as required"
-        );
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/application/views/scripts/phperror/dependencies.phtml
 
new/icingaweb2-module-director-1.11.9/application/views/scripts/phperror/dependencies.phtml
--- 
old/icingaweb2-module-director-1.11.8/application/views/scripts/phperror/dependencies.phtml
 2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/application/views/scripts/phperror/dependencies.phtml
 1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-<div class="controls">
-<?= $this->tabs ?>
-<h1><?= $this->escape($this->title) ?></h1>
-</div>
-
-<div class="content">
-<p class="legacy-error"><?= $this->escape($this->message) ?></p>
-<?= $this->table ?>
-</div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/application/views/scripts/phperror/error.phtml
 
new/icingaweb2-module-director-1.11.9/application/views/scripts/phperror/error.phtml
--- 
old/icingaweb2-module-director-1.11.8/application/views/scripts/phperror/error.phtml
        2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/application/views/scripts/phperror/error.phtml
        1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +0,0 @@
-<div class="controls">
-<?= $this->tabs ?>
-<h1><?= $this->escape($this->title) ?></h1>
-</div>
-
-<div class="content">
-<p class="legacy-error"><?= $this->escape($this->message) ?></p>
-</div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/doc/02-Installation.md.d/From-Source.md 
new/icingaweb2-module-director-1.11.9/doc/02-Installation.md.d/From-Source.md
--- 
old/icingaweb2-module-director-1.11.8/doc/02-Installation.md.d/From-Source.md   
    2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/doc/02-Installation.md.d/From-Source.md   
    2026-06-26 16:16:48.000000000 +0200
@@ -19,6 +19,9 @@
           nodes
 * [Icinga Web](https://github.com/Icinga/icingaweb2) (≥2.8.0). All versions 
since 2.2 should also work fine, but
   might show smaller UI bugs and are not actively tested
+* The following Icinga PHP libraries must be installed:
+    * [icinga-php-library](https://github.com/Icinga/icinga-php-library) 
(≥0.14.2)
+    * [icinga-php-thirdparty](https://github.com/Icinga/icinga-php-thirdparty) 
(≥0.15.3)
 * The following Icinga modules must be installed and enabled:
     * [incubator](https://github.com/Icinga/icingaweb2-module-incubator) 
(≥0.22.0)
     * If you are using Icinga Web <2.9.0, the following modules are also 
required
@@ -41,7 +44,7 @@
 You might want to use a script as follows for this task:
 
 ```shell
-MODULE_VERSION="1.11.8"
+MODULE_VERSION="1.11.9"
 ICINGAWEB_MODULEPATH="/usr/share/icingaweb2/modules"
 REPO_URL="https://github.com/icinga/icingaweb2-module-director";
 TARGET_DIR="${ICINGAWEB_MODULEPATH}/director"
@@ -60,7 +63,7 @@
 You might want to use a script as follows for this task:
 
 ```shell
-MODULE_VERSION="1.11.8"
+MODULE_VERSION="1.11.9"
 ICINGAWEB_MODULEPATH="/usr/share/icingaweb2/modules"
 REPO_URL="https://github.com/icinga/icingaweb2-module-director";
 TARGET_DIR="${ICINGAWEB_MODULEPATH}/director"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/doc/82-Changelog.md 
new/icingaweb2-module-director-1.11.9/doc/82-Changelog.md
--- old/icingaweb2-module-director-1.11.8/doc/82-Changelog.md   2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/doc/82-Changelog.md   2026-06-26 
16:16:48.000000000 +0200
@@ -4,6 +4,16 @@
 Please make sure to always read our [Upgrading](05-Upgrading.md) documentation
 before switching to a new version.
 
+v1.11.9
+-------
+
+### Internals
+
+- Fix: Adapt to react/promise v3 and react/event-loop v1.6 (#3043)
+- Fix: PromiseUtil shim for react/promise v2/v3 compatibility (#3081)
+
+You can find issues and feature requests related to this release on our 
[roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/45?closed=1)
+
 v1.11.8
 -------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Application/Dependency.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Application/Dependency.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Application/Dependency.php
   2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Application/Dependency.php
   1970-01-01 01:00:00.000000000 +0100
@@ -1,113 +0,0 @@
-<?php
-
-namespace Icinga\Module\Director\Application;
-
-class Dependency
-{
-    /** @var string */
-    protected $name;
-
-    /** @var string|null */
-    protected $installedVersion;
-
-    /** @var bool|null */
-    protected $enabled;
-
-    /** @var string */
-    protected $operator;
-
-    /** @var string */
-    protected $requiredVersion;
-
-    /** @var string */
-    protected $requirement;
-
-    /**
-     * Dependency constructor.
-     * @param string $name         Usually a module name
-     * @param string $requirement  e.g. >=1.7.0
-     * @param string $installedVersion
-     * @param bool $enabled
-     */
-    public function __construct($name, $requirement, $installedVersion = null, 
$enabled = null)
-    {
-        $this->name = $name;
-        $this->setRequirement($requirement);
-        if ($installedVersion !== null) {
-            $this->setInstalledVersion($installedVersion);
-        }
-        if ($enabled !== null) {
-            $this->setEnabled($enabled);
-        }
-    }
-
-    public function setRequirement($requirement)
-    {
-        if (preg_match('/^([<>=]+)\s*v?(\d+\.\d+\.\d+)$/', $requirement, 
$match)) {
-            $this->operator = $match[1];
-            $this->requiredVersion = $match[2];
-            $this->requirement = $requirement;
-        } else {
-            throw new \InvalidArgumentException("'$requirement' is not a valid 
version constraint");
-        }
-    }
-
-    /**
-     * @return bool
-     */
-    public function isInstalled()
-    {
-        return $this->installedVersion !== null;
-    }
-
-    /**
-     * @return string|null
-     */
-    public function getInstalledVersion()
-    {
-        return $this->installedVersion;
-    }
-
-    /**
-     * @param string $version
-     */
-    public function setInstalledVersion($version)
-    {
-        $this->installedVersion = ltrim($version, 'v'); // v0.6.0 VS 0.6.0
-    }
-
-    /**
-     * @return bool
-     */
-    public function isEnabled()
-    {
-        return $this->enabled === true;
-    }
-
-    /**
-     * @param bool $enabled
-     */
-    public function setEnabled($enabled = true)
-    {
-        $this->enabled = $enabled;
-    }
-
-    public function isSatisfied()
-    {
-        if (! $this->isInstalled() || ! $this->isEnabled()) {
-            return false;
-        }
-
-        return version_compare($this->installedVersion, 
$this->requiredVersion, $this->operator);
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function getRequirement()
-    {
-        return $this->requirement;
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Application/DependencyChecker.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Application/DependencyChecker.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Application/DependencyChecker.php
    2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Application/DependencyChecker.php
    1970-01-01 01:00:00.000000000 +0100
@@ -1,70 +0,0 @@
-<?php
-
-namespace Icinga\Module\Director\Application;
-
-use Icinga\Application\ApplicationBootstrap;
-use Icinga\Application\Modules\Module;
-use Icinga\Application\Version;
-
-class DependencyChecker
-{
-    /** @var ApplicationBootstrap */
-    protected $app;
-
-    /** @var \Icinga\Application\Modules\Manager */
-    protected $modules;
-
-    public function __construct(ApplicationBootstrap $app)
-    {
-        $this->app = $app;
-        $this->modules = $app->getModuleManager();
-    }
-
-    /**
-     * @param Module $module
-     * @return Dependency[]
-     */
-    public function getDependencies(Module $module)
-    {
-        $dependencies = [];
-        $isV290 = version_compare(Version::VERSION, '2.9.0', '>=');
-        foreach ($module->getRequiredModules() as $moduleName => $required) {
-            $dependency = new Dependency($moduleName, $required);
-            $dependency->setEnabled($this->modules->hasEnabled($moduleName));
-            if ($this->modules->hasInstalled($moduleName)) {
-                
$dependency->setInstalledVersion($this->modules->getModule($moduleName, 
false)->getVersion());
-            }
-            $dependencies[] = $dependency;
-        }
-        if ($isV290) {
-            $libs = $this->app->getLibraries();
-            foreach ($module->getRequiredLibraries() as $libraryName => 
$required) {
-                $dependency = new Dependency($libraryName, $required);
-                if ($libs->has($libraryName)) {
-                    
$dependency->setInstalledVersion($libs->get($libraryName)->getVersion());
-                    $dependency->setEnabled();
-                }
-                $dependencies[] = $dependency;
-            }
-        }
-
-        return $dependencies;
-    }
-
-    //     if (version_compare(Version::VERSION, '2.9.0', 'ge')) {
-    //    }
-    /**
-     * @param Module $module
-     * @return bool
-     */
-    public function satisfiesDependencies(Module $module)
-    {
-        foreach ($this->getDependencies($module) as $dependency) {
-            if (! $dependency->isSatisfied()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/BackgroundDaemon.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/BackgroundDaemon.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/BackgroundDaemon.php
  2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/BackgroundDaemon.php
  2026-06-26 16:16:48.000000000 +0200
@@ -6,7 +6,7 @@
 use gipfl\Cli\Process;
 use gipfl\IcingaCliDaemon\DbResourceConfigWatch;
 use gipfl\SystemD\NotifySystemD;
-use React\EventLoop\Factory as Loop;
+use React\EventLoop\Loop;
 use React\EventLoop\LoopInterface;
 use Ramsey\Uuid\Uuid;
 
@@ -45,7 +45,7 @@
     public function run(LoopInterface $loop = null)
     {
         if ($ownLoop = ($loop === null)) {
-            $loop = Loop::create();
+            $loop = Loop::get();
         }
         $this->loop = $loop;
         $this->loop->futureTick(function () {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonDb.php 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DaemonDb.php
--- old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonDb.php  
2026-04-01 11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DaemonDb.php  
2026-06-26 16:16:48.000000000 +0200
@@ -11,6 +11,7 @@
 use ipl\Stdlib\EventEmitter;
 use React\EventLoop\LoopInterface;
 use React\Promise\Deferred;
+use React\Promise\PromiseInterface;
 use RuntimeException;
 use SplObjectStorage;
 
@@ -111,7 +112,7 @@
             $this->emitStatus('no configuration');
             $this->dbConfig = $config;
 
-            return resolve();
+            return resolve(null);
         } else {
             $this->emitStatus('configuration loaded');
             $this->dbConfig = $config;
@@ -124,7 +125,7 @@
     {
         if ($this->connection !== null) {
             Logger::error('Trying to establish a connection while being 
connected');
-            return reject();
+            return reject(new RuntimeException());
         }
         $callback = function () use ($config) {
             $this->reallyEstablishConnection($config);
@@ -219,7 +220,7 @@
     }
 
     /**
-     * @return \React\Promise\PromiseInterface
+     * @return PromiseInterface
      */
     protected function reconnect()
     {
@@ -232,7 +233,7 @@
     }
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface
+     * @return PromiseInterface
      */
     public function connect()
     {
@@ -242,16 +243,16 @@
             }
         }
 
-        return resolve();
+        return resolve(null);
     }
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface
+     * @return PromiseInterface
      */
     public function disconnect()
     {
         if (! $this->connection) {
-            return resolve();
+            return resolve(null);
         }
         if ($this->pendingDisconnect) {
             return $this->pendingDisconnect->promise();
@@ -265,7 +266,7 @@
             $resolve = function () use ($pendingComponents, $component) {
                 $pendingComponents->detach($component);
                 if ($pendingComponents->count() === 0) {
-                    $this->pendingDisconnect->resolve();
+                    $this->pendingDisconnect->resolve(null);
                 }
             };
             // TODO: What should we do in case they don't?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DbBasedComponent.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DbBasedComponent.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DbBasedComponent.php
  2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DbBasedComponent.php
  2026-06-26 16:16:48.000000000 +0200
@@ -3,17 +3,19 @@
 namespace Icinga\Module\Director\Daemon;
 
 use Icinga\Module\Director\Db;
+use React\Promise\PromiseInterface;
 
 interface DbBasedComponent
 {
     /**
      * @param Db $db
-     * @return \React\Promise\ExtendedPromiseInterface;
+     *
+     * @return PromiseInterface;
      */
     public function initDb(Db $db);
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface;
+     * @return PromiseInterface;
      */
     public function stopDb();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DeploymentChecker.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DeploymentChecker.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/DeploymentChecker.php
 2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/DeploymentChecker.php
 2026-06-26 16:16:48.000000000 +0200
@@ -6,6 +6,7 @@
 use Icinga\Module\Director\Db;
 use Icinga\Module\Director\Objects\DirectorDeploymentLog;
 use React\EventLoop\LoopInterface;
+use React\Promise\PromiseInterface;
 
 use function React\Promise\resolve;
 
@@ -31,22 +32,23 @@
 
     /**
      * @param Db $connection
-     * @return \React\Promise\ExtendedPromiseInterface
+     *
+     * @return PromiseInterface
      */
     public function initDb(Db $connection)
     {
         $this->connection = $connection;
 
-        return resolve();
+        return resolve(null);
     }
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface
+     * @return PromiseInterface
      */
     public function stopDb()
     {
         $this->connection = null;
 
-        return resolve();
+        return resolve(null);
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/JobRunner.php 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/JobRunner.php
--- old/icingaweb2-module-director-1.11.8/library/Director/Daemon/JobRunner.php 
2026-04-01 11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/library/Director/Daemon/JobRunner.php 
2026-06-26 16:16:48.000000000 +0200
@@ -2,14 +2,14 @@
 
 namespace Icinga\Module\Director\Daemon;
 
-use gipfl\IcingaCliDaemon\FinishedProcessState;
 use gipfl\IcingaCliDaemon\IcingaCliRpc;
 use Icinga\Application\Logger;
 use Icinga\Module\Director\Db;
 use Icinga\Module\Director\Objects\DirectorJob;
 use React\ChildProcess\Process;
 use React\EventLoop\LoopInterface;
-use React\Promise\Promise;
+use React\Promise\PromiseInterface;
+use Icinga\Module\Director\Daemon\PromiseUtil;
 
 use function React\Promise\resolve;
 
@@ -24,7 +24,7 @@
     /** @var int[] */
     protected $scheduledIds = [];
 
-    /** @var Promise[] */
+    /** @var PromiseInterface[] */
     protected $runningIds = [];
 
     protected $checkInterval = 10;
@@ -53,7 +53,8 @@
 
     /**
      * @param Db $db
-     * @return \React\Promise\ExtendedPromiseInterface
+     *
+     * @return PromiseInterface
      */
     public function initDb(Db $db)
     {
@@ -75,11 +76,11 @@
         }
         $this->timer = $this->loop->addPeriodicTimer($this->checkInterval, 
$check);
 
-        return resolve();
+        return resolve(null);
     }
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface
+     * @return PromiseInterface
      */
     public function stopDb()
     {
@@ -201,13 +202,13 @@
             $cli->rpc()->setHandler($logger, 'logger');
         }
         unset($this->scheduledIds[$id]);
-        $this->runningIds[$id] = $cli->run($this->loop)->then(function () use 
($id, $jobName) {
+        $promise = $cli->run($this->loop)->then(function () use ($id, 
$jobName) {
             Logger::debug("Job ($jobName) finished");
-        })->otherwise(function (\Exception $e) use ($id, $jobName) {
+        });
+        $promise = PromiseUtil::catch($promise, function (\Exception $e) use 
($id, $jobName) {
             Logger::error("Job ($jobName) failed: " . $e->getMessage());
-        })->otherwise(function (FinishedProcessState $state) use ($jobName) {
-            Logger::error("Job ($jobName) failed: " . $state->getReason());
-        })->always(function () use ($id) {
+        });
+        $this->runningIds[$id] = PromiseUtil::finally($promise, function () 
use ($id) {
             unset($this->runningIds[$id]);
             $this->loop->futureTick(function () {
                 $this->runNextPendingJob();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/LogProxy.php 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/LogProxy.php
--- old/icingaweb2-module-director-1.11.8/library/Director/Daemon/LogProxy.php  
2026-04-01 11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/library/Director/Daemon/LogProxy.php  
2026-06-26 16:16:48.000000000 +0200
@@ -4,6 +4,7 @@
 
 use Exception;
 use Icinga\Module\Director\Db;
+use React\Promise\PromiseInterface;
 
 use function React\Promise\resolve;
 
@@ -33,25 +34,26 @@
 
     /**
      * @param Db $connection
-     * @return \React\Promise\ExtendedPromiseInterface
+     *
+     * @return PromiseInterface
      */
     public function initDb(Db $connection)
     {
         $this->connection = $connection;
         $this->db = $connection->getDbAdapter();
 
-        return resolve();
+        return resolve(null);
     }
 
     /**
-     * @return \React\Promise\ExtendedPromiseInterface
+     * @return PromiseInterface
      */
     public function stopDb()
     {
         $this->connection = null;
         $this->db = null;
 
-        return resolve();
+        return resolve(null);
     }
 
     public function log($severity, $message)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/ProcessList.php 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/ProcessList.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/ProcessList.php   
    2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/ProcessList.php   
    2026-06-26 16:16:48.000000000 +0200
@@ -8,6 +8,7 @@
 use React\ChildProcess\Process;
 use React\EventLoop\LoopInterface;
 use React\Promise\Deferred;
+use React\Promise\PromiseInterface;
 
 use function React\Promise\resolve;
 
@@ -56,12 +57,13 @@
 
     /**
      * @param int $timeout
-     * @return \React\Promise\ExtendedPromiseInterface
+     *
+     * @return PromiseInterface
      */
     public function killOrTerminate($timeout = 5)
     {
         if ($this->processes->count() === 0) {
-            return resolve();
+            return resolve(null);
         }
         $deferred = new Deferred();
         $killTimer = $this->loop->addTimer($timeout, function () use 
($deferred) {
@@ -74,7 +76,7 @@
 
             // Let's a little bit of delay after KILLing
             $this->loop->addTimer(0.1, function () use ($deferred) {
-                $deferred->resolve();
+                $deferred->resolve(null);
             });
         });
 
@@ -96,7 +98,7 @@
             if ($this->processes->count() === 0) {
                 $this->loop->cancelTimer($timer);
                 $this->loop->cancelTimer($killTimer);
-                $deferred->resolve();
+                $deferred->resolve(null);
             }
         });
         /** @var Process $process */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/PromiseUtil.php 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/PromiseUtil.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Daemon/PromiseUtil.php   
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Daemon/PromiseUtil.php   
    2026-06-26 16:16:48.000000000 +0200
@@ -0,0 +1,49 @@
+<?php
+
+namespace Icinga\Module\Director\Daemon;
+
+use React\Promise\PromiseInterface;
+
+/**
+ * Compatibility shim for react/promise v2 and v3.
+ *
+ * v3 renamed ->otherwise() to ->catch() and ->always() to ->finally().
+ * The runtime version is determined by the icinga-php-thirdparty bundle, so we
+ * probe with method_exists() rather than checking the installed package 
version.
+ */
+class PromiseUtil
+{
+    /**
+     * Calls ->catch() (react/promise v3) or ->otherwise() (react/promise v2)
+     *
+     * @param PromiseInterface $promise
+     * @param callable         $onRejected
+     *
+     * @return PromiseInterface
+     */
+    public static function catch(PromiseInterface $promise, callable 
$onRejected): PromiseInterface
+    {
+        if (method_exists($promise, 'catch')) {
+            return $promise->catch($onRejected);
+        }
+
+        return $promise->otherwise($onRejected);
+    }
+
+    /**
+     * Calls ->finally() (react/promise v3) or ->always() (react/promise v2)
+     *
+     * @param PromiseInterface $promise
+     * @param callable         $onFulfilledOrRejected
+     *
+     * @return PromiseInterface
+     */
+    public static function finally(PromiseInterface $promise, callable 
$onFulfilledOrRejected): PromiseInterface
+    {
+        if (method_exists($promise, 'finally')) {
+            return $promise->finally($onFulfilledOrRejected);
+        }
+
+        return $promise->always($onFulfilledOrRejected);
+    }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/DependencyInfoTable.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Web/Table/Dependency/DependencyInfoTable.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/DependencyInfoTable.php
 2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Web/Table/Dependency/DependencyInfoTable.php
 1970-01-01 01:00:00.000000000 +0100
@@ -1,101 +0,0 @@
-<?php
-
-namespace Icinga\Module\Director\Web\Table\Dependency;
-
-use Icinga\Application\Modules\Module;
-use Icinga\Module\Director\Application\DependencyChecker;
-use Icinga\Web\Url;
-
-class DependencyInfoTable
-{
-    protected $module;
-
-    protected $checker;
-
-    public function __construct(DependencyChecker $checker, Module $module)
-    {
-        $this->module = $module;
-        $this->checker = $checker;
-    }
-
-    protected function linkToModule($name, $icon)
-    {
-        return Html::link(
-            Html::escape($name),
-            Html::webUrl('config/module', ['name' => $name]),
-            [
-                'class' => "icon-$icon"
-            ]
-        );
-    }
-
-    public function render()
-    {
-        $html = '<table class="common-table table-row-selectable">
-<thead>
-<tr>
-    <th>' . Html::escape($this->translate('Module name')) . '</th>
-    <th>' . Html::escape($this->translate('Required')) . '</th>
-    <th>' . Html::escape($this->translate('Installed')) . '</th>
-</tr>
-</thead>
-<tbody data-base-target="_next">
-';
-        foreach ($this->checker->getDependencies($this->module) as 
$dependency) {
-            $name = $dependency->getName();
-            $isLibrary = substr($name, 0, 11) === 'icinga-php-';
-            $rowAttributes = $isLibrary ? ['data-base-target' => '_self'] : 
null;
-            if ($dependency->isSatisfied()) {
-                if ($dependency->isSatisfied()) {
-                    $icon = 'ok';
-                } else {
-                    $icon = 'cancel';
-                }
-                $link = $isLibrary ? $this->noLink($name, $icon) : 
$this->linkToModule($name, $icon);
-                $installed = $dependency->getInstalledVersion();
-            } elseif ($dependency->isInstalled()) {
-                $installed = sprintf('%s (%s)', 
$dependency->getInstalledVersion(), $this->translate('disabled'));
-                $link = $this->linkToModule($name, 'cancel');
-            } else {
-                $installed = $this->translate('missing');
-                $repository = $isLibrary ? $name : "icingaweb2-module-$name";
-                $link = sprintf(
-                    '%s (%s)',
-                    $this->noLink($name, 'cancel'),
-                    Html::linkToGitHub(Html::escape($this->translate('more')), 
'Icinga', $repository)
-                );
-            }
-
-            $html .= $this->htmlRow([
-                $link,
-                Html::escape($dependency->getRequirement()),
-                Html::escape($installed)
-            ], $rowAttributes);
-        }
-
-        return $html . '</tbody>
-</table>
-';
-    }
-
-    protected function noLink($label, $icon)
-    {
-        return Html::link(Html::escape($label), 
Url::fromRequest()->with('rnd', rand(1, 100000)), [
-            'class' => "icon-$icon"
-        ]);
-    }
-
-    protected function translate($string)
-    {
-        return \mt('director', $string);
-    }
-
-    protected function htmlRow(array $cols, $rowAttributes)
-    {
-        $content = '';
-        foreach ($cols as $escapedContent) {
-            $content .= Html::tag('td', null, $escapedContent);
-        }
-        return Html::tag('tr', $rowAttributes, $content);
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/Html.php
 
new/icingaweb2-module-director-1.11.9/library/Director/Web/Table/Dependency/Html.php
--- 
old/icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/Html.php
        2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/library/Director/Web/Table/Dependency/Html.php
        1970-01-01 01:00:00.000000000 +0100
@@ -1,74 +0,0 @@
-<?php
-
-namespace Icinga\Module\Director\Web\Table\Dependency;
-
-use Icinga\Web\Url;
-use InvalidArgumentException;
-
-/**
- * Minimal HTML helper, as we might be forced to run without ipl
- */
-class Html
-{
-    public static function tag($tag, $attributes = [], $escapedContent = null)
-    {
-        $result = "<$tag";
-        if (! empty($attributes)) {
-            foreach ($attributes as $name => $value) {
-                if (! preg_match('/^[a-z][a-z0-9:-]*$/i', $name)) {
-                    throw new InvalidArgumentException("Invalid attribute 
name: '$name'");
-                }
-
-                $result .= " $name=\"" . self::escapeAttributeValue($value) . 
'"';
-            }
-        }
-
-        return "$result>$escapedContent</$tag>";
-    }
-
-    public static function webUrl($path, $params)
-    {
-        return Url::fromPath($path, $params);
-    }
-
-    public static function link($escapedLabel, $url, $attributes = [])
-    {
-        return static::tag('a', [
-            'href' => $url,
-        ] + $attributes, $escapedLabel);
-    }
-
-    public static function linkToGitHub($escapedLabel, $namespace, $repository)
-    {
-        return static::link(
-            $escapedLabel,
-            'https://github.com/' . urlencode($namespace) . '/' . 
urlencode($repository),
-            [
-                'target' => '_blank',
-                'rel'    => 'noreferrer',
-                'class'  => 'icon-forward'
-            ]
-        );
-    }
-
-    protected static function escapeAttributeValue($value)
-    {
-        $value = str_replace('"', '&quot;', $value);
-        // Escape ambiguous ampersands
-        return preg_replace_callback('/&[0-9A-Z]+;/i', function ($match) {
-            $subject = $match[0];
-
-            if (htmlspecialchars_decode($subject, ENT_COMPAT | ENT_HTML5) === 
$subject) {
-                // Ambiguous ampersand
-                return str_replace('&', '&amp;', $subject);
-            }
-
-            return $subject;
-        }, $value);
-    }
-
-    public static function escape($any)
-    {
-        return htmlspecialchars($any);
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icingaweb2-module-director-1.11.8/module.info 
new/icingaweb2-module-director-1.11.9/module.info
--- old/icingaweb2-module-director-1.11.8/module.info   2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/module.info   2026-06-26 
16:16:48.000000000 +0200
@@ -1,7 +1,7 @@
 Name: Icinga Director
-Version: 1.11.8
+Version: 1.11.9
 Requires:
-  Libraries: icinga-php-library (>=0.14.2), icinga-php-thirdparty (>=0.12.1)
+  Libraries: icinga-php-library (>=0.14.2), icinga-php-thirdparty (>=0.15.3)
   Modules: incubator (>=0.22.0)
 Description: Director - Config tool for Icinga 2
  Icinga Director is a configuration tool that has been designed to make
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icingaweb2-module-director-1.11.8/phpcs.xml 
new/icingaweb2-module-director-1.11.9/phpcs.xml
--- old/icingaweb2-module-director-1.11.8/phpcs.xml     2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/phpcs.xml     2026-06-26 
16:16:48.000000000 +0200
@@ -2,7 +2,6 @@
 <ruleset name="PRS12">
     <file>configuration.php</file>
     <file>run.php</file>
-    <file>run-php5.3.php</file>
     <file>application/</file>
     <file>library/Director/</file>
     <file>test/</file>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/run-missingdeps.php 
new/icingaweb2-module-director-1.11.9/run-missingdeps.php
--- old/icingaweb2-module-director-1.11.8/run-missingdeps.php   2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/run-missingdeps.php   1970-01-01 
01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-<?php
-
-use Icinga\Application\Icinga;
-use Icinga\Exception\IcingaException;
-use Icinga\Web\Url;
-
-if (Icinga::app()->isCli()) {
-    throw new IcingaException(
-        "Missing dependencies, please check "
-    );
-} else {
-    $request = Icinga::app()->getRequest();
-    $path = $request->getPathInfo();
-    if (! preg_match('#^/director#', $path)) {
-        return;
-    }
-    if (preg_match('#^/director/phperror/dependencies#', $path)) {
-        return;
-    }
-
-    header('Location: ' . Url::fromPath('director/phperror/dependencies'));
-    exit;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icingaweb2-module-director-1.11.8/run-php5.3.php 
new/icingaweb2-module-director-1.11.9/run-php5.3.php
--- old/icingaweb2-module-director-1.11.8/run-php5.3.php        2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/run-php5.3.php        1970-01-01 
01:00:00.000000000 +0100
@@ -1,25 +0,0 @@
-<?php
-
-use Icinga\Application\Icinga;
-use Icinga\Exception\IcingaException;
-use Icinga\Web\Url;
-
-if (Icinga::app()->isCli()) {
-    throw new IcingaException(
-        "PHP version 5.6.x is required for Director >= 1.7.0, you're running 
%s."
-        . ' Please either upgrade PHP or downgrade Icinga Director',
-        PHP_VERSION
-    );
-} else {
-    $request = Icinga::app()->getRequest();
-    $path = $request->getPathInfo();
-    if (! preg_match('#^/director#', $path)) {
-        return;
-    }
-    if (preg_match('#^/director/phperror/error#', $path)) {
-        return;
-    }
-
-    header('Location: ' . Url::fromPath('director/phperror/error'));
-    exit;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icingaweb2-module-director-1.11.8/run.php 
new/icingaweb2-module-director-1.11.9/run.php
--- old/icingaweb2-module-director-1.11.8/run.php       2026-04-01 
11:25:39.000000000 +0200
+++ new/icingaweb2-module-director-1.11.9/run.php       2026-06-26 
16:16:48.000000000 +0200
@@ -1,18 +1,3 @@
 <?php
 
-use Icinga\Application\Modules\Module;
-use Icinga\Module\Director\Application\DependencyChecker;
-
-if (version_compare(PHP_VERSION, '5.6.0') < 0) {
-    include __DIR__ . '/run-php5.3.php';
-    return;
-}
-
-/** @var Module $this */
-$checker = new DependencyChecker($this->app);
-if (! $checker->satisfiesDependencies($this)) {
-    include __DIR__ . '/run-missingdeps.php';
-    return;
-}
-
 include __DIR__ . '/register-hooks.php';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/icingaweb2-module-director-1.11.8/test/php/library/Director/Application/DependencyTest.php
 
new/icingaweb2-module-director-1.11.9/test/php/library/Director/Application/DependencyTest.php
--- 
old/icingaweb2-module-director-1.11.8/test/php/library/Director/Application/DependencyTest.php
      2026-04-01 11:25:39.000000000 +0200
+++ 
new/icingaweb2-module-director-1.11.9/test/php/library/Director/Application/DependencyTest.php
      1970-01-01 01:00:00.000000000 +0100
@@ -1,72 +0,0 @@
-<?php
-
-namespace Tests\Icinga\Module\Director\Application;
-
-use Icinga\Module\Director\Application\Dependency;
-use Icinga\Module\Director\Test\BaseTestCase;
-
-class DependencyTest extends BaseTestCase
-{
-    public function testIsNotInstalled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $this->assertFalse($dependency->isInstalled());
-    }
-
-    public function testNotSatisfiedWhenNotInstalled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $this->assertFalse($dependency->isSatisfied());
-    }
-
-    public function testIsInstalled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $dependency->setInstalledVersion('1.10.0');
-        $this->assertTrue($dependency->isInstalled());
-    }
-
-    public function testNotEnabled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $this->assertFalse($dependency->isEnabled());
-    }
-
-    public function testIsEnabled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $dependency->setEnabled();
-        $this->assertTrue($dependency->isEnabled());
-    }
-
-    public function testNotSatisfiedWhenNotEnabled()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $dependency->setInstalledVersion('1.10.0');
-        $this->assertFalse($dependency->isSatisfied());
-    }
-
-    public function testSatisfiedWhenEqual()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $dependency->setInstalledVersion('0.3.0');
-        $dependency->setEnabled();
-        $this->assertTrue($dependency->isSatisfied());
-    }
-
-    public function testSatisfiedWhenGreater()
-    {
-        $dependency = new Dependency('something', '>=0.3.0');
-        $dependency->setInstalledVersion('0.10.0');
-        $dependency->setEnabled();
-        $this->assertTrue($dependency->isSatisfied());
-    }
-
-    public function testNotSatisfiedWhenSmaller()
-    {
-        $dependency = new Dependency('something', '>=20.3.0');
-        $dependency->setInstalledVersion('4.999.999');
-        $dependency->setEnabled();
-        $this->assertFalse($dependency->isSatisfied());
-    }
-}

Reply via email to