X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_configRegistry.inc;h=ee68d2ed46836ec343471604dde32eb23770a94c;hb=60bab946cd1e3436fd789f56707a5137d20a86f1;hp=6bf66a195988f402c2fdede98b8d5e897695d81f;hpb=95ac595f2472f40f2ca424bc5d86c27fa384a4f4;p=gosa.git
diff --git a/gosa-core/include/class_configRegistry.inc b/gosa-core/include/class_configRegistry.inc
index 6bf66a195..ee68d2ed4 100644
--- a/gosa-core/include/class_configRegistry.inc
+++ b/gosa-core/include/class_configRegistry.inc
@@ -20,8 +20,19 @@ class configRegistry{
public $objectClasses = array();
+ public $detectedSchemaIssues = array();
+ public $schemaCheckFailed = FALSE;
public $schemaCheckFinished = FALSE;
+ public $pluginsDeactivated = array();
+ // Name of enabled plugins found in gosa.conf.
+ private $activePlugins = array();
+
+
+ /*! \brief Constructs the config registry
+ * @param config The configuration object
+ * @return
+ */
function __construct($config)
{
$this->config = &$config;
@@ -46,60 +57,211 @@ class configRegistry{
$this->reload();
}
+
+ /*! \brief Returns a list of plugins used by GOsa.
+ @return Array An array containing all plugins with theis plInfo data.
+ */
+ function getListOfPlugins()
+ {
+ return($this->classesWithInfo);
+ }
- function validateSchemata($force = FALSE, $disableIncompatiblePlugins = FALSE,$displayMessage = FALSE)
+
+ /*! \brief Checks whether the schema check was called in the current session or not.
+ * @return Boolean True if check was already called
+ */
+ function schemaCheckFinished()
{
- // We can check the schemata only with a valid LDAP connection
- if(empty($this->config->current['CONFIG'])){
- return(TRUE);
- }
+ return($this->schemaCheckFinished);
+ }
- // Don't do things twice unless forced
- if($this->schemaCheckFinished && !$force) return;
+ /*! \brief Starts the schema validation
+ * @param Boolean 'force' Force a re-check.
+ * @param Boolean 'disableIncompatiblePlugins' Disables of incompatible GOsa-plugins.
+ * @return Boolean True on success else FALSE
+ */
+ function validateSchemata($force = FALSE, $disableIncompatiblePlugins = FALSE, $objectClassesToUse = array())
+ {
// Read objectClasses from ldap
- if(!count($this->objectClasses)){
+ if(count($objectClassesToUse)){
+ $this->setObjectClasses($objectClassesToUse);
+ }elseif(!count($this->objectClasses)){
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->config->current['BASE']);
- $this->objectClasses = $ldap->get_objectclasses();
+ $this->setObjectClasses($ldap->get_objectclasses());
+ }
+
+ return($this->_validateSchemata($force, $disableIncompatiblePlugins));
+ }
+
+
+ /*! \brief Sets the list object classes to use while validation the schema. (See 'validateSchemata')
+ * This is called from the GOsa-Setup
+ * @param Array The list of object classes (usually LDAP::get_objectlclasses()).
+ * @return void
+ */
+ function setObjectClasses($ocs)
+ {
+ $this->objectClasses = $ocs;
+ }
+
+
+ /*! \brief Returns an array which contains all unresolved schemata requirements.
+ * @return Array An array containing all errors/issues
+ */
+ function getSchemaResults()
+ {
+ return($this->detectedSchemaIssues);
+ }
+
+
+ /*! \brief This method checks if the installed ldap-schemata matches the plugin requirements.
+ * @param Boolean 'force' Force a re-check.
+ * @param Boolean 'disableIncompatiblePlugins' Disables of incompatible GOsa-plugins.
+ * @return String
+ */
+ private function _validateSchemata($force = FALSE, $disableIncompatiblePlugins = FALSE)
+ {
+ // We cannot check without readable schema info
+ if(!count($this->objectClasses)){
+ return(TRUE);
}
+ // Don't do things twice unless forced
+ if($this->schemaCheckFinished && !$force) return($this->schemaCheckFailed);
+
+ // Prepare result array
+ $this->detectedSchemaIssues = array();
+ $this->detectedSchemaIssues['missing'] = array();
+ $this->detectedSchemaIssues['versionMismatch'] = array();
+
+ // Clear last results
+ $this->pluginsDeactivated = array();
+
// Collect required schema infos
$this->pluginRequirements = array('ldapSchema' => array());
$this->categoryToClass = array();
+
+ // Walk through plugins with requirements, but only check for active plugins.
foreach($this->classesWithInfo as $cname => $defs){
- if(isset($defs['plRequirements']['ldapSchema'])){
- $this->pluginRequirements['ldapSchema'][$cname] = $defs['plRequirements']['ldapSchema'];
+ if(isset($defs['plRequirements'])){
+
+ // Check only if required plugin is enabled in gosa.conf
+ // Normally this is the class name itself, but may be overridden
+ // in plInfo using the plRequirements::activePlugin statement.
+ $requiresActivePlugin = $cname;
+ if(isset($defs['plRequirements']['activePlugin'])){
+ $requiresActivePlugin = $defs['plRequirements']['activePlugin'];
+ }
+
+ // Only queue checks for active plugins.
+ if(isset($this->activePlugins[strtolower($requiresActivePlugin)])){
+ $this->pluginRequirements[$cname] = $defs['plRequirements'];
+ }else{
+ if($cname == $requiresActivePlugin){
+ new log("debug","","Skipped schema check for '{$cname}' plugin is inactive!",
+ array(),'');
+ }else{
+ new log("debug","","Skipped schema check for class '{$cname}' skipped,".
+ " required plugin '{$requiresActivePlugin}' is inactive!",
+ array(),'');
+ }
+ }
}
}
- // Check schema requirements now
- foreach($this->pluginRequirements['ldapSchema'] as $cname => $requirements){
- foreach($requirements as $oc => $version){
- if(!$this->ocAvailable($oc)){
- if($displayMessage){
- msg_dialog::display(_("Schema validation error"),
- sprintf(_("The objectClass '%s' which is required for plugin '%s' is not availabe!"),
- bold($oc),bold($cname)),
- ERROR_DIALOG);
- }
- }elseif(!empty($version)){
-
- $currentVersion = $this->getObjectClassVersion($oc);
- if(!empty($currentVersion) && !$this->ocVersionMatch($version, $currentVersion)){
- if($displayMessage){
- msg_dialog::display(_("Schema validation error"),
- sprintf(_("The objectClass '%s' which is required for plugin '%s' has version %s but %s is required!"),bold($oc),bold($cname),bold($currentVersion),bold($version)),
- ERROR_DIALOG);
+ // Check schema requirements now $missing = $invalid = array();
+ foreach($this->pluginRequirements as $cname => $requirements){
+
+ // Check LDAP schema requirements for this plugins
+ $failure = FALSE;
+ if(isset($requirements['ldapSchema'])){
+ foreach($requirements['ldapSchema'] as $oc => $version){
+ if(!$this->ocAvailable($oc)){
+ $this->detectedSchemaIssues['missing'][$oc] = $oc;
+
+ $this->schemaCheckFailed = TRUE;
+ $failure = TRUE;
+
+ new log("debug","","LDAP objectClass missing '{$oc}'!",
+ array(),'');
+
+ }elseif(!empty($version)){
+ $currentVersion = $this->getObjectClassVersion($oc);
+ if(!empty($currentVersion) && !$this->ocVersionMatch($version, $currentVersion)){
+ if($currentVersion == -1){
+ $currentVersion = _("unknown");
+ }
+ $this->detectedSchemaIssues['versionMismatch'][$oc] =
+ sprintf(_("%s has version %s but %s is required!"), bold($oc),bold($currentVersion),bold($version));
+ $this->schemaCheckFailed = TRUE;
+ $failure = TRUE;
+
+ new log("debug","","LDAP objectClass version mismatch '{$oc}' ".
+ "has '{$currentVersion}' but {$version} required!",
+ array(),'');
}
}
}
}
+
+ // Display corresponding plugins now
+ if($disableIncompatiblePlugins && $failure && isset($requirements['onFailureDisablePlugin'])){
+ foreach($requirements['onFailureDisablePlugin'] as $name){
+ $this->pluginsDeactivated[$name] = $name;
+ }
+ }
}
$this->schemaCheckFinished =TRUE;
+ session::un_set('plist');
+ return(!$this->schemaCheckFailed);
}
- function ocVersionMatch($required, $installed)
+
+ /*! \brief The function 'validateSchemata' may has disabled some GOsa-Plugins,
+ * the list of disabled plugins will be returned here.
+ * @return Array The list of plugins disabled by 'validateSchemata'
+ */
+ function getDisabledPlugins()
+ {
+ return($this->pluginsDeactivated);
+ }
+
+
+ /*! \brief Displays an error message with all issues detect during the schema validation.
+ */
+ function displayRequirementErrors()
+ {
+ $message = "";
+ if(count($this->detectedSchemaIssues['missing'])){
+ $message.= "
".
+ _("The following object classes are missing:").
+ "