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('"', '"', $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('&', '&', $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());
- }
-}