summaryrefslogtreecommitdiffstats
path: root/application/forms/SelfServiceSettingsForm.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/forms/SelfServiceSettingsForm.php')
-rw-r--r--application/forms/SelfServiceSettingsForm.php306
1 files changed, 306 insertions, 0 deletions
diff --git a/application/forms/SelfServiceSettingsForm.php b/application/forms/SelfServiceSettingsForm.php
new file mode 100644
index 0000000..4471bcf
--- /dev/null
+++ b/application/forms/SelfServiceSettingsForm.php
@@ -0,0 +1,306 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class SelfServiceSettingsForm extends DirectorForm
+{
+ /** @var Settings */
+ protected $settings;
+
+ public function setup()
+ {
+ $settings = $this->settings;
+ $this->addElement('select', 'agent_name', [
+ 'label' => $this->translate('Host Name'),
+ 'description' => $this->translate(
+ 'What to use as your Icinga 2 Agent\'s Host Name'
+ ),
+ 'multiOptions' => [
+ 'fqdn' => $this->translate('Fully qualified domain name (FQDN)'),
+ 'hostname' => $this->translate('Host name (local part, without domain)'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/agent_name')
+ ]);
+
+ $this->addElement('select', 'transform_hostname', [
+ 'label' => $this->translate('Transform Host Name'),
+ 'description' => $this->translate(
+ 'Whether to adjust your host name'
+ ),
+ 'multiOptions' => [
+ '0' => $this->translate('Do not transform at all'),
+ '1' => $this->translate('Transform to lowercase'),
+ '2' => $this->translate('Transform to uppercase'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/transform_hostname')
+ ]);
+ $this->addElement('select', 'resolve_parent_host', [
+ 'label' => $this->translate('Transform Parent Host to IP'),
+ 'description' => $this->translate(
+ 'This is only important in case your master/satellite nodes do not'
+ . ' have IP addresses as their "host" property. The Agent can be'
+ . ' told to issue related DNS lookups on it\' own'
+ ),
+ 'multiOptions' => [
+ '0' => $this->translate("Don't care, my host settings are fine"),
+ '1' => $this->translate('My Agents should use DNS to look up Endpoint names'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/resolve_parent_host')
+ ]);
+
+ $this->addElement('extensibleSet', 'global_zones', [
+ 'label' => $this->translate('Global Zones'),
+ 'description' => $this->translate(
+ 'To ensure downloaded packages are build by the Icinga Team'
+ . ' and not compromised by third parties, you will be able'
+ . ' to provide an array of SHA1 hashes here. In case you have'
+ . ' defined any hashses, the module will not continue with'
+ . ' updating / installing the Agent in case the SHA1 hash of'
+ . ' the downloaded MSI package is not matching one of the'
+ . ' provided hashes of this setting'
+ ),
+ 'multiOptions' => $this->enumGlobalZones(),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/global_zones'),
+ ]);
+
+ $this->addElement('select', 'download_type', [
+ 'label' => $this->translate('Installation Source'),
+ 'description' => $this->translate(
+ 'You might want to let the generated Powershell script install'
+ . ' the Icinga 2 Agent in an automated way. If so, please choose'
+ . ' where your Windows nodes should fetch the Agent installer'
+ ),
+ 'multiOptions' => [
+ null => $this->translate('- no automatic installation -'),
+ // TODO: not yet
+ // 'director' => $this->translate('Download via the Icinga Director'),
+ 'icinga' => $this->translate('Download from packages.icinga.com'),
+ 'url' => $this->translate('Download from a custom url'),
+ 'file' => $this->translate('Use a local file or network share'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/download_type'),
+ 'class' => 'autosubmit'
+ ]);
+
+ $downloadType = $this->getSentValue(
+ 'download_type',
+ $settings->getStoredOrDefaultValue('self-service/download_type')
+ );
+
+ if ($downloadType) {
+ $this->addInstallSettings($downloadType, $settings);
+ }
+
+ $this->addEventuallyConfiguredBoolean('flush_api_dir', [
+ 'label' => $this->translate('Flush API directory'),
+ 'description' => $this->translate(
+ 'In case the Icinga Agent will accept configuration from the parent'
+ . ' Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*.'
+ . ' By setting this parameter to true, all content inside the api directory'
+ . ' will be flushed before an eventual restart of the Icinga 2 Agent'
+ ),
+ 'required' => true,
+ ]);
+ }
+
+ protected function addInstallSettings($downloadType, Settings $settings)
+ {
+ $this->addElement('text', 'download_url', [
+ 'label' => $this->translate('Source Path'),
+ 'description' => $this->translate(
+ 'Define a download Url or local directory from which the a specific'
+ . ' Icinga 2 Agent MSI Installer package should be fetched. Please'
+ . ' ensure to only define the base download Url or Directory. The'
+ . ' Module will generate the MSI file name based on your operating'
+ . ' system architecture and the version to install. The Icinga 2 MSI'
+ . ' Installer name is internally build as follows:'
+ . ' Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example:'
+ . ' Icinga2-v2.6.3-x86_64.msi)'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/download_url'),
+ ]);
+
+ // TODO: offer to check for available versions
+ if ($downloadType === 'icinga') {
+ $el = $this->getElement('download_url');
+ $el->setAttrib('disabled', 'disabled');
+ $value = 'https://packages.icinga.com/windows/';
+ $el->setValue($value);
+ $this->setSentValue('download_url', $value);
+ }
+ if ($downloadType === 'director') {
+ $el = $this->getElement('download_url');
+ $el->setAttrib('disabled', 'disabled');
+
+ $r = $this->getRequest();
+ $scheme = $r->getServer('HTTP_X_FORWARDED_PROTO', $r->getScheme());
+
+ $value = sprintf(
+ '%s://%s%s/director/download/windows/',
+ $scheme,
+ $r->getHttpHost(),
+ $this->getRequest()->getBaseUrl()
+ );
+ $el->setValue($value);
+ $this->setSentValue('download_url', $value);
+ }
+
+ $this->addElement('text', 'agent_version', [
+ 'label' => $this->translate('Agent Version'),
+ 'description' => $this->translate(
+ 'In case the Icinga 2 Agent should be automatically installed,'
+ . ' this has to be a string value like: 2.6.3'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/agent_version'),
+ 'required' => true,
+ ]);
+
+ $hashes = $settings->getStoredOrDefaultValue('self-service/installer_hashes');
+ $this->addElement('extensibleSet', 'installer_hashes', [
+ 'label' => $this->translate('Installer Hashes'),
+ 'description' => $this->translate(
+ 'To ensure downloaded packages are build by the Icinga Team'
+ . ' and not compromised by third parties, you will be able'
+ . ' to provide an array of SHA1 hashes here. In case you have'
+ . ' defined any hashses, the module will not continue with'
+ . ' updating / installing the Agent in case the SHA1 hash of'
+ . ' the downloaded MSI package is not matching one of the'
+ . ' provided hashes of this setting'
+ ),
+ 'value' => $hashes,
+ ]);
+
+ $this->addElement('text', 'icinga_service_user', [
+ 'label' => $this->translate('Service User'),
+ 'description' => $this->translate(
+ 'The user that should run the Icinga 2 service on Windows.'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/icinga_service_user'),
+ ]);
+
+ $this->addEventuallyConfiguredBoolean('allow_updates', [
+ 'label' => $this->translate('Allow Updates'),
+ 'description' => $this->translate(
+ 'In case the Icinga 2 Agent is already installed on the system,'
+ . ' this parameter will allow you to configure if you wish to'
+ . ' upgrade / downgrade to a specified version with the as well.'
+ ),
+ 'required' => true,
+ ]);
+
+ $this->addNscpSettings();
+ }
+
+ protected function addNscpSettings()
+ {
+ $this->addEventuallyConfiguredBoolean('install_nsclient', [
+ 'label' => $this->translate('Install NSClient++'),
+ 'description' => $this->translate(
+ 'Also install NSClient++. It can be used through the Icinga Agent'
+ . ' and comes with a bunch of additional Check Plugins'
+ ),
+ 'required' => true,
+ ]);
+ /*
+ * TODO: eventually add those:
+ if ($settings->get('self-service/install_nsclient') === 'y') {
+ $params['install_nsclient'] = true;
+ $this->addBooleanSettingsToParams($settings, [
+ 'nsclient_add_defaults',
+ 'nsclient_firewall',
+ 'nsclient_service',
+ ], $params);
+
+
+ $this->addStringSettingsToParams($settings, [
+ 'nsclient_directory',
+ 'nsclient_installer_path'
+ ], $params);
+ }
+ */
+ }
+
+ public static function create(Db $db, Settings $settings)
+ {
+ return static::load()->setDb($db)->setSettings($settings);
+ }
+
+ protected function addEventuallyConfiguredBoolean($name, $params)
+ {
+ $key = "self-service/$name";
+ $value = $this->settings->getStoredValue($key);
+ $params['value'] = $value;
+ $params['multiOptions'] = $this->eventuallyConfiguredEnum($name, [
+ 'y' => $this->translate('Yes'),
+ 'n' => $this->translate('No'),
+ ]);
+
+ return $this->addElement('select', $name, $params);
+ }
+
+ protected function eventuallyConfiguredEnum($name, $enum)
+ {
+ $key = "self-service/$name";
+ $default = $this->settings->getDefaultValue($key);
+ if ($default === null) {
+ return [
+ null => $this->translate('- please choose -')
+ ] + $enum;
+ } else {
+ return [
+ null => sprintf($this->translate('%s (default)'), $enum[$default])
+ ] + $enum;
+ }
+ }
+
+ protected function setSentValue($key, $value)
+ {
+ $this->getRequest()->setPost($key, $value);
+ return $this;
+ }
+
+ protected function enumGlobalZones()
+ {
+ $db = $this->getDb()->getDbAdapter();
+ $zones = $db->fetchCol(
+ $db->select()->from('icinga_zone', 'object_name')
+ ->where('disabled = ?', 'n')
+ ->where('is_global = ?', 'y')
+ ->order('object_name')
+ );
+
+ return array_combine($zones, $zones);
+ }
+
+ public function setSettings(Settings $settings)
+ {
+ $this->settings = $settings;
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ try {
+ foreach ($this->getValues() as $key => $value) {
+ if ($value === '') {
+ $value = null;
+ }
+
+ $this->settings->set("self-service/$key", $value);
+ }
+
+ $this->setSuccessMessage($this->translate(
+ 'Self Service Settings have been stored'
+ ));
+
+ parent::onSuccess();
+ } catch (Exception $e) {
+ $this->addException($e);
+ }
+ }
+}