summaryrefslogtreecommitdiffstats
path: root/library/Director/Application
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Application')
-rw-r--r--library/Director/Application/Dependency.php113
-rw-r--r--library/Director/Application/DependencyChecker.php73
-rw-r--r--library/Director/Application/MemoryLimit.php53
3 files changed, 239 insertions, 0 deletions
diff --git a/library/Director/Application/Dependency.php b/library/Director/Application/Dependency.php
new file mode 100644
index 0000000..0100e69
--- /dev/null
+++ b/library/Director/Application/Dependency.php
@@ -0,0 +1,113 @@
+<?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 --git a/library/Director/Application/DependencyChecker.php b/library/Director/Application/DependencyChecker.php
new file mode 100644
index 0000000..d726b0b
--- /dev/null
+++ b/library/Director/Application/DependencyChecker.php
@@ -0,0 +1,73 @@
+<?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->getDependencies() as $moduleName => $required) {
+ if ($isV290 && in_array($moduleName, ['ipl', 'reactbundle'], true)) {
+ continue;
+ }
+ $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 --git a/library/Director/Application/MemoryLimit.php b/library/Director/Application/MemoryLimit.php
new file mode 100644
index 0000000..beb0460
--- /dev/null
+++ b/library/Director/Application/MemoryLimit.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Icinga\Module\Director\Application;
+
+class MemoryLimit
+{
+ public static function raiseTo($string)
+ {
+ $current = static::getBytes();
+ $desired = static::parsePhpIniByteString($string);
+ if ($current !== -1 && $current < $desired) {
+ ini_set('memory_limit', $string);
+ }
+ }
+
+ public static function getBytes()
+ {
+ return static::parsePhpIniByteString((string) ini_get('memory_limit'));
+ }
+
+ /**
+ * Return Bytes from PHP shorthand bytes notation
+ *
+ * http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
+ *
+ * > The available options are K (for Kilobytes), M (for Megabytes) and G
+ * > (for Gigabytes), and are all case-insensitive. Anything else assumes
+ * > bytes.
+ *
+ * @param $string
+ * @return int
+ */
+ public static function parsePhpIniByteString($string)
+ {
+ $val = trim($string);
+
+ if (preg_match('/^(\d+)([KMG])$/', $val, $m)) {
+ $val = $m[1];
+ switch ($m[2]) {
+ case 'G':
+ $val *= 1024;
+ // Intentional fall-through
+ case 'M':
+ $val *= 1024;
+ // Intentional fall-through
+ case 'K':
+ $val *= 1024;
+ }
+ }
+
+ return intval($val);
+ }
+}