X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_ldap.inc;h=2662f02db9754f30344e24b14d9f36adc66a7f48;hb=b130a469e86d937a382fac5864219c190f2a6e36;hp=677f7f459025e90075dbff282d84a4f2e14e357e;hpb=723b7899aaf78eebc147043cb1014a5f708a7306;p=gosa.git diff --git a/include/class_ldap.inc b/include/class_ldap.inc index 677f7f459..2662f02db 100644 --- a/include/class_ldap.inc +++ b/include/class_ldap.inc @@ -30,16 +30,24 @@ class LDAP{ var $hostname = ""; var $follow_referral = FALSE; var $referrals= array(); - + var $max_ldap_query_time = 0; // 0, empty or negative values will disable this check function LDAP($binddn,$bindpw, $hostname, $follow_referral= FALSE, $tls= FALSE) { + global $config; $this->follow_referral= $follow_referral; $this->tls=$tls; $this->binddn=$this->convert($binddn); $this->bindpw=$bindpw; $this->hostname=$hostname; + + /* Check if MAX_LDAP_QUERY_TIME is defined */ + if(isset($config->data['MAIN']['MAX_LDAP_QUERY_TIME'])){ + $str = $config->data['MAIN']['MAX_LDAP_QUERY_TIME']; + $this->max_ldap_query_time = (float)($str); + } + $this->connect(); } @@ -57,9 +65,10 @@ class LDAP{ function convert($dn) { if (SPECIALS_OVERRIDE == TRUE){ - return (preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//"), + $tmp= preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//"), array("\001CO", "\001CO", "\001OB", "\001CB", "\001SL"), - $dn)); + $dn); + return (preg_replace('/,\s+/', ',', $tmp)); } else { return ($dn); } @@ -171,12 +180,23 @@ class LDAP{ { if($this->hascon){ if ($this->reconnect) $this->connect(); + + $start = microtime(); + $this->clearResult(); $this->sr = @ldap_search($this->cid, $this->fix($this->basedn), $filter, $attrs); $this->error = @ldap_error($this->cid); $this->resetResult(); $this->hasres=true; - + + /* Check if query took longer as specified in max_ldap_query_time */ + if($this->max_ldap_query_time){ + $diff = get_MicroTimeDiff($start,microtime()); + if($diff > $this->max_ldap_query_time){ + print_red(sprintf(_("The LDAP server is slow (%.2fs for the last query). This may be responsible for performance breakdowns."),$diff)) ; + } + } + return($this->sr); }else{ $this->error = "Could not connect to LDAP server"; @@ -193,10 +213,22 @@ class LDAP{ $basedn = $this->basedn; else $basedn= $this->convert($basedn); + + $start = microtime(); + $this->sr = @ldap_list($this->cid, $this->fix($basedn), $filter,$attrs); $this->error = @ldap_error($this->cid); $this->resetResult(); $this->hasres=true; + + /* Check if query took longer as specified in max_ldap_query_time */ + if($this->max_ldap_query_time){ + $diff = get_MicroTimeDiff($start,microtime()); + if($diff > $this->max_ldap_query_time){ + print_red(sprintf(_("The ldapserver is answering very slow (%.2f), this may be responsible for performance breakdowns."),$diff)) ; + } + } + return($this->sr); }else{ $this->error = "Could not connect to LDAP server"; @@ -236,6 +268,7 @@ class LDAP{ function fetch() { + $att= array(); if($this->hascon){ if($this->hasres){ if ($this->start == 0) @@ -407,21 +440,21 @@ class LDAP{ /* Copy given attributes and sub-dns with attributes to destination dn */ - function copy_FAI_resource_recursive($sourcedn,$destinationdn,$type="branch",$is_first = true,$depth=0) + function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0) { error_reporting(E_ALL); if($is_first){ - echo "

".sprintf(_("Creating copy of %s"),"".$sourcedn."")."

"; + echo "

".sprintf(_("Creating copy of %s"),"".@LDAP::fix($sourcedn)."")."

"; }else{ if(preg_match("/^ou=/",$sourcedn)){ - echo "

"._("Processing")." $destinationdn

"; + echo "

"._("Processing")." ".@LDAP::fix($destinationdn)."

"; }else{ $tmp = split(",",$sourcedn); echo " "._("Object").": "; - $deststr = $destinationdn; + $deststr = @LDAP::fix($destinationdn); if(strlen($deststr) > 96){ $deststr = substr($deststr,0,96)."..."; } @@ -522,6 +555,11 @@ class LDAP{ } } + /* Replace FAIdebianRelease with new release name */ + if(in_array("FAIpackageList" , $attr['objectClass'])){ + $attr['FAIdebianRelease'] = $destinationName; + } + /* Add entry */ $this->cd($destinationdn); $this->cat($destinationdn); @@ -556,7 +594,7 @@ class LDAP{ $this->cd($basedn); $item = $this->fetch($this->cat($dn)); if(!in_array("FAIbranch",$item['objectClass'])){ - $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$type,false,$depth); + $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$destinationName,$type,false,$depth); } } } @@ -607,6 +645,7 @@ class LDAP{ $l= array_reverse(ldap_explode_dn($real_path,0)); unset($l['count']); $cdn= $this->basedn; + $tag= ""; foreach ($l as $part){ $cdn= "$part,$cdn"; @@ -628,18 +667,35 @@ class LDAP{ $attrs= $this->fetch(); /* Create missing entry? */ - if (!count ($attrs)){ + if (count ($attrs)){ + + /* Catch the tag - if present */ + if (isset($attrs['gosaUnitTag'][0])){ + $tag= $attrs['gosaUnitTag'][0]; + } + + } else { $type= preg_replace('/^([^=]+)=.*$/', '\\1', $cdn); $param= preg_replace('/^[^=]+=([^,]+),.*$/', '\\1', $cdn); $na= array(); switch ($type){ case 'ou': - $na["objectClass"]= "organizationalUnit"; + if ($tag != ""){ + $na["objectClass"]= array("organizationalUnit", "gosaAdministrativeUnitTag"); + $na["gosaUnitTag"]= $tag; + } else { + $na["objectClass"]= "organizationalUnit"; + } $na["ou"]= $param; break; case 'dc': - $na["objectClass"]= array("dcObject", "top", "locality"); + if ($tag != ""){ + $na["objectClass"]= array("dcObject", "top", "locality", "gosaAdministrativeUnitTag"); + $na["gosaUnitTag"]= $tag; + } else { + $na["objectClass"]= array("dcObject", "top", "locality"); + } $na["dc"]= $param; break; default: @@ -710,7 +766,12 @@ class LDAP{ if ($this->error == 'Success'){ return $this->error; } else { - $error= $this->error." (".$this->get_additional_error().")"; + $adderror= $this->get_additional_error(); + if ($adderror != ""){ + $error= $this->error." (".$this->get_additional_error().", ".sprintf(_("while operating on '%s' using LDAP server '%s'"), $this->basedn, $this->hostname).")"; + } else { + $error= $this->error." (".sprintf(_("while operating on LDAP server %s"), $this->hostname).")"; + } return $error; } } @@ -999,7 +1060,7 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec /* Delete existing entry */ if($delete){ - $this->rmdir($data['dn']); + $this->rmdir_recursive($data['dn']); } /* Create missing trees */ @@ -1013,7 +1074,7 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec $ret = $this->modify($data); } } - + show_ldap_error($this->get_error(),_("Ldap import failed")); return($ret); }