From 91b5523b8139fc3f9388e09d95e8af181fecf62e Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sat, 13 Feb 2016 14:29:41 +0000 Subject: [PATCH] allow to enforce classes --- lam/lib/modules/puppetClient.inc | 68 ++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/lam/lib/modules/puppetClient.inc b/lam/lib/modules/puppetClient.inc index ce3f7a03..c8c4a661 100644 --- a/lam/lib/modules/puppetClient.inc +++ b/lam/lib/modules/puppetClient.inc @@ -121,12 +121,16 @@ class puppetClient extends baseModule { "Headline" => _('Predefined environments'), "Text" => _('These environments will be available as autocompletion hints when setting the environment.') ), + 'enforceClasses' => array( + "Headline" => _('Enforce classes'), + "Text" => _('If set then only these classes are allowed. One class per line.') + ), ); - // config options - $configContainer = new htmlTable(); - $configContainer->addElement(new htmlTableExtendedInputTextarea('puppetClient_environments', "production\r\ntesting", 30, 5, _('Predefined environments'), 'predefinedEnvironments'), true); - $return['config_options']['all'] = $configContainer; // upload fields + $allowedClasses = ''; + if (!empty($this->moduleSettings['puppetClient_enforceClasses'][0])) { + $allowedClasses = implode(', ', $this->moduleSettings['puppetClient_enforceClasses']); + } $return['upload_columns'] = array( array( 'name' => 'puppetClient_environment', @@ -144,7 +148,8 @@ class puppetClient extends baseModule { 'name' => 'puppetClient_puppetclass', 'description' => _('Classes'), 'help' => 'puppetclassList', - 'example' => 'ntp;exim' + 'example' => 'ntp;exim', + 'values' => $allowedClasses ), array( 'name' => 'puppetClient_puppetvar', @@ -190,6 +195,7 @@ class puppetClient extends baseModule { $this->messages['environment'][1] = array('ERROR', _('Account %s:') . ' puppetClient_environment', _('The environment name may only contain ASCII characters.')); $this->messages['puppetclass'][0] = array('ERROR', _('The class names may only contain ASCII characters.')); $this->messages['puppetclass'][1] = array('ERROR', _('Account %s:') . ' puppetClient_puppetclass', _('The class names may only contain ASCII characters.')); + $this->messages['puppetclass'][2] = array('ERROR', _('Account %s:') . ' puppetClient_puppetclass', _('The class names contain invalid values.')); $this->messages['puppetvar'][0] = array('ERROR', _('The variables may only contain ASCII characters.')); $this->messages['puppetvar'][1] = array('ERROR', _('Account %s:') . ' puppetClient_puppetvar', _('The variables may only contain ASCII characters.')); $this->messages['parentnode'][0] = array('ERROR', _('Account %s:') . ' puppetClient_parentnode', _('Parent node not found.')); @@ -270,7 +276,12 @@ class puppetClient extends baseModule { } $return->addElement(new htmlTableExtendedSelect('parentnode', $possibleParentNodes, array($parentnode), _('Parent node'), 'parentnode'), true); // classes - $this->addMultiValueInputTextField($return, 'puppetclass', _('Classes'), false, null, false, $this->classCache); + if (empty($this->moduleSettings['puppetClient_enforceClasses'][0])) { + $this->addMultiValueInputTextField($return, 'puppetclass', _('Classes'), false, null, false, $this->classCache); + } + else { + $this->addMultiValueSelectField($return, 'puppetclass', _('Classes'), $this->moduleSettings['puppetClient_enforceClasses']); + } // variables $this->addMultiValueInputTextField($return, 'puppetvar', _('Variables'), false, null, false, $this->variablesCache); @@ -324,7 +335,12 @@ class puppetClient extends baseModule { $this->attributes['parentnode'][0] = $_POST['parentnode']; } // classes - $this->processMultiValueInputTextField('puppetclass', $errors, 'ascii'); + if (empty($this->moduleSettings['puppetClient_enforceClasses'][0])) { + $this->processMultiValueInputTextField('puppetclass', $errors, 'ascii'); + } + else { + $this->processMultiValueSelectField('puppetclass'); + } // variables $this->processMultiValueInputTextField('puppetvar', $errors, 'ascii'); @@ -358,6 +374,20 @@ class puppetClient extends baseModule { $this->mapSimpleUploadField($rawAccounts, $ids, $partialAccounts, $i, 'puppetClient_environment', 'environment', 'ascii', $this->messages['environment'][1], $messages, '/;[ ]*/'); // classes $this->mapSimpleUploadField($rawAccounts, $ids, $partialAccounts, $i, 'puppetClient_puppetclass', 'puppetclass', 'ascii', $this->messages['puppetclass'][1], $messages, '/;[ ]*/'); + if (!empty($this->moduleSettings['puppetClient_enforceClasses'][0]) && !empty($partialAccounts[$i]['puppetclass'])) { + $invalidClassFound = false; + foreach ($partialAccounts[$i]['puppetclass'] as $singleClass) { + if (!in_array($singleClass, $this->moduleSettings['puppetClient_enforceClasses'])) { + $invalidClassFound = true; + break; + } + } + if ($invalidClassFound) { + $msg = $this->messages['puppetclass'][2]; + $msg[] = $i; + $messages[] = $msg; + } + } // variables $this->mapSimpleUploadField($rawAccounts, $ids, $partialAccounts, $i, 'puppetClient_puppetvar', 'puppetvar', 'ascii', $this->messages['puppetvar'][1], $messages, '/;[ ]*/'); } @@ -501,6 +531,30 @@ class puppetClient extends baseModule { $this->variablesCache = array_values(array_unique($variables)); } + /** + * Returns a list of configuration options. + * + * Calling this method does not require the existence of an enclosing {@link accountContainer}.
+ *
+ * The field names are used as keywords to load and save settings. + * We recommend to use the module name as prefix for them (e.g. posixAccount_homeDirectory) to avoid naming conflicts. + * + * @param array $scopes account types (user, group, host) + * @param array $allScopes list of all active account modules and their scopes (module => array(scopes)) + * @return mixed htmlElement or array of htmlElement + * + * @see htmlElement + */ + public function get_configOptions($scopes, $allScopes) { + $return = parent::get_configOptions($scopes, $allScopes); + // config options + $configContainer = new htmlTable(); + $configContainer->addElement(new htmlTableExtendedInputTextarea('puppetClient_environments', "production\r\ntesting", 30, 5, _('Predefined environments'), 'predefinedEnvironments'), true); + $configContainer->addElement(new htmlTableExtendedInputTextarea('puppetClient_enforceClasses', '', 30, 5, _('Enforce classes'), 'enforceClasses'), true); + $return[] = $configContainer; + return $return; + } + } ?>