diff --git a/modules/setup/library/Setup/ModuleDependency.php b/modules/setup/library/Setup/ModuleDependency.php new file mode 100644 index 000000000..0810a1cc0 --- /dev/null +++ b/modules/setup/library/Setup/ModuleDependency.php @@ -0,0 +1,99 @@ +module = $module; + $this->checkedModules = $checkedModules; + } + + /** + * Get the module dependency requirements + * + * @return RequirementSet + */ + public function getRequirements() + { + $icingadbAndMonitoring = []; + $set = new RequirementSet(); + + foreach ($this->module->getRequiredModules() as $name => $requiredVersion) { + if ($name === 'monitoring' || $name === 'icingadb') { + $icingadbAndMonitoring[$name] = $requiredVersion; + + continue; + } + + $options = [ + 'alias' => $name, + 'description' => sprintf( + t('Module %s (%s) is required.'), + $name, + $requiredVersion + ) + ]; + + if (! in_array($name, $this->checkedModules)) { + $set->add(new ModuleMissingRequirement($options)); + } else { + $options['condition'] = [$name, $requiredVersion]; + $set->add(new WebModuleRequirement($options)); + } + } + + if (! empty($icingadbAndMonitoring)) { + $icingadbOrMonitoring = new RequirementSet(false, RequirementSet::MODE_OR); + foreach ($icingadbAndMonitoring as $name => $requiredVersion) { + $options = [ + 'alias' => $name, + 'optional' => true, + 'description' => sprintf( + t('Module %s (%s) is required.'), + $name, + $requiredVersion + ) + ]; + + if (! in_array($name, $this->checkedModules)) { + $icingadbOrMonitoring->add(new ModuleMissingRequirement($options)); + } else { + $options['condition'] = [$name, $requiredVersion]; + $icingadbOrMonitoring->add(new WebModuleRequirement($options)); + } + } + + $set->merge($icingadbOrMonitoring); + + $requirement = (new SetRequirement([ + 'title' =>'Base Module', + 'alias' => 'Monitoring OR Icingadb', + 'optional' => false, + 'condition' => $icingadbOrMonitoring, + 'description' => t('Module Monitoring OR Icingadb is required.') + ])); + + $set->add($requirement); + } + + return $set; + } +}