X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Ffai%2Fclass_faiPackage.inc;h=825a50e5efd17ac0a0e48663c3d0f70a533c364e;hb=bf9fd071bad641f7fce6d3e3ed61f866841ec183;hp=92860db3269ce2c370a29afdf70fead0774af7de;hpb=e31df777708d2f5a8dbe64266331e206885edd00;p=gosa.git diff --git a/plugins/admin/fai/class_faiPackage.inc b/plugins/admin/fai/class_faiPackage.inc index 92860db32..825a50e5e 100644 --- a/plugins/admin/fai/class_faiPackage.inc +++ b/plugins/admin/fai/class_faiPackage.inc @@ -54,17 +54,47 @@ class faiPackage extends plugin var $strID =""; var $newDialogShown =false; + var $FAIstate = ""; + + var $FAIinstallMethods = array( "install", "ninstall", "remove", + "dselect-upgrade", "taskinst", "taskrm", + "hold", "clean", "aptitude", "aptitude-r", + "pending", "dpkgc" ); + + var $base = ""; + var $release = ""; + var $copy_paste_mode = false; + var $cut_paste_mode = false; + + var $CopyPasteVars = array("ConfiguredPackages","FAIdebianRelease","FAIdebianSection","FAIinstallMethod","mirror","servers","releases","sections","list","mirrors","usedPackages"); + + function faiPackage ($config, $dn= NULL) { /* Load Attributes */ plugin::plugin ($config, $dn); + $this->acl ="#all#"; + /* If "dn==new" we try to create a new entry * Else we must read all objects from ldap which belong to this entry. * First read SubObjects from ldap ... and then the partition definitions for the SubObjects. */ if($dn != "new"){ $this->dn =$dn; + + /* Set acls + */ + $ui = get_userinfo(); + $acl = get_permissions ($this->dn, $ui->subtreeACL); + $acli = get_module_permission($acl, "FAIclass", $this->dn); + $this->acl=$acli; + + /* Get FAIstate + */ + if(isset($this->attrs['FAIstate'][0])){ + $this->FAIstate = $this->attrs['FAIstate'][0]; + } } if(isset($this->attrs['FAIpackage'])){ @@ -76,12 +106,26 @@ class faiPackage extends plugin }else{ $this->usedPackages = array(); } - - $ldap = $this->config->get_ldap_link(); - foreach($this->usedPackages as $name){ - $ldap->search("(&(objectClass=FAIdebconfInfo)(FAIpackage=".$name."))"); + + + if($dn != "new"){ + + /* Create one filter with all package names, + instead of calling $ldap->search for every single package + */ + $PackageFilter = ""; + foreach($this->usedPackages as $name){ + $PackageFilter .= "(FAIpackage=".$name.")"; + } + $PackageFilter = "(&(objectClass=FAIdebconfInfo)(|".$PackageFilter."))"; + + /* Search for configuration objects */ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->dn); + $ldap->search($PackageFilter,array("FAIvariable","FAIvariableType","FAIvariableContent","FAIpackage","FAIdebianSection")); + + /* Walk through configurations and append them to our list of ConfiguredPackages */ while($attr = $ldap->fetch()){ - $tmp =array(); $tmp['Name'] = $attr['FAIvariable'][0]; $tmp['Type'] = $attr['FAIvariableType'][0]; @@ -116,25 +160,34 @@ class faiPackage extends plugin } $this->confDir = CONFIG_DIR."/fai/"; $this->FAIpackage = array(); + + + $methods = array(); + foreach($this->FAIinstallMethods as $method){ + $methods[$method] = $method; + } + $this->FAIinstallMethods = $methods; + /* Check if we exist already - no need to ask for revisions, etc. then */ + if ($this->dn != "new"){ + $this->newDialogShown= true; + } + } function execute() { - /* Call parent execute */ + /* Call parent execute */ - plugin::execute(); + plugin::execute(); /* Fill templating stuff */ $smarty= get_smarty(); $display= ""; - /* Check if we exist already - no need to ask for revisions, etc. then */ - if ($this->dn != "new"){ - $this->newDialogShown= true; - } + $smarty->assign( "FAIinstallMethods", $this->FAIinstallMethods ); if((!$this->is_account)&&(!$this->newDialogShown)){ - + if($this->dialog==NULL){ $this->dialog = new faiPackageNew($this->config, $this->dn,$this->mirrors,$this->servers,$this->sections,$this->releases); $this->is_dialog =true; @@ -146,14 +199,15 @@ class faiPackage extends plugin /* Assign Repository settings*/ if(isset($_POST['SaveObjectNew'])){ $obj = $this->dialog->save(); - + $this->FAIdebianSection = $obj['FAIdebianSection']; $this->FAIdebianRelease = $obj['FAIdebianRelease']; - + unset($this->dialog); - $this->dialog = false; - $this->is_dialog=false; + $this->dialog = false; + $this->is_dialog = false; $this->newDialogShown = true; + $this->is_account = true; } /* Draw dialog */ @@ -167,7 +221,7 @@ class faiPackage extends plugin foreach($this->attributes as $attrs){ $smarty->assign($attrs,$this->$attrs); } - + /* Generate package list */ $this->list=$this->genPkgs(); @@ -179,7 +233,13 @@ class faiPackage extends plugin /* Delte selected package */ if(isset($_POST['Delpkg'])){ - unset($this->usedPackages[$_POST['usedPackages']]); + if($this->FAIstate != "freeze"){ + foreach($_POST['usedPackages'] as $del){ + if(isset($this->usedPackages[$del])){ + unset($this->usedPackages[$del]); + } + } + } } /* Abort package selection dialog */ @@ -190,17 +250,22 @@ class faiPackage extends plugin /* attach new packages */ if(isset($_POST['SaveSubObject'])) { - $this->dialog->save_object(); - if(count($this->dialog->check())){ - foreach($this->dialog->check() as $msgs){ - print_red($msgs); + if($this->FAIstate != "freeze"){ + $this->dialog->save_object(); + if(count($this->dialog->check())){ + foreach($this->dialog->check() as $msgs){ + print_red($msgs); + } + }else{ + $use = $this->dialog->save(); + $this->usedPackages = $use; + $this->dialog = false; + $this->is_dialog=false; + ksort($this->usedPackages); } }else{ - $use = $this->dialog->save(); - $this->usedPackages = $use; $this->dialog = false; $this->is_dialog=false; - ksort($this->usedPackages); } } @@ -208,17 +273,39 @@ class faiPackage extends plugin if((isset($_POST['Conpkg']))&&(isset($_POST['usedPackages']))&&(!empty($_POST['usedPackages']))){ $path = "/etc/gosa/fai/".$this->FAIdebianRelease."/debconf.d"; $pkg_config = array(); - if(isset($this->ConfiguredPackages[$_POST['usedPackages']])){ - $pkg_config = $this->ConfiguredPackages[$_POST['usedPackages']]; + $pkg = $_POST['usedPackages'][0]; + + if(isset($this->ConfiguredPackages[$pkg])){ + $pkg_config = $this->ConfiguredPackages[$pkg]; } - - $this->dialog = new faiPackageConfiguration($this->config, $this->dn,$_POST['usedPackages'], $path, $pkg_config); + + $this->dialog = new faiPackageConfiguration($this->config, $this->dn,$pkg, $path, $pkg_config); + $this->dialog ->acl = $this->acl; $this->is_dialog =true; } - + + /* Configuration dialog open*/ + if($this->FAIstate != "freeze"){ + if((isset($_POST['Markpkg']))&&(isset($_POST['usedPackages']))&&(!empty($_POST['usedPackages']))){ + foreach($_POST['usedPackages'] as $pkg){ + if (isset($this->usedPackages[$pkg])){ + unset($this->usedPackages[$pkg]); + if (preg_match('/^-/', $pkg)){ + $pkg= preg_replace('/^-/', '', $pkg); + } else { + $pkg= preg_replace('/^/', '-', $pkg); + } + $this->usedPackages[$pkg]= $pkg; + } + } + } + } + /* Save Configuration */ if(isset($_POST['SaveObjectConfig'])){ - $this->ConfiguredPackages= array_merge($this->ConfiguredPackages,$this->dialog->save()); + if($this->FAIstate != "freeze"){ + $this->ConfiguredPackages= array_merge($this->ConfiguredPackages,$this->dialog->save()); + } $this->dialog = false; $this->is_dialog=false; } @@ -237,7 +324,11 @@ class faiPackage extends plugin /* Assign section to smarty */ $strsec = ""; foreach($this->FAIdebianSection as $sec){ - $strsec .= $sec." "; + $strsec .= $sec." "; + } + + foreach($this->attributes as $attr){ + $smarty->assign($attr."ACL",chkacl($this->acl,$attr)); } $smarty->assign("OptionsACL",""); @@ -258,6 +349,7 @@ class faiPackage extends plugin $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); $ldap->rmdir_recursive($this->dn); + show_ldap_error($ldap->get_error(), _("Removing FAI package base failed")); $this->handle_post_events("remove"); } @@ -266,8 +358,11 @@ class faiPackage extends plugin */ function save_object() { - + + if($this->FAIstate == "freeze") return; plugin::save_object(); + + foreach($this->attributes as $attrs){ if(isset($_POST[$attrs])){ $this->$attrs = $_POST[$attrs]; @@ -279,48 +374,70 @@ class faiPackage extends plugin /* Check supplied data */ function check() { - $message= array(); - + /* Call common method to give check the hook */ + $message= plugin::check(); + if(count($this->usedPackages)==0){ $message[]=_("Please select a least one Package."); } - + if((empty($this->FAIdebianRelease))||(empty($this->FAIdebianSection))){ $message[]=_("Please choose a valid combination for your repository setup."); } + /* If this is a new script, check if a script with this name already exists */ + if(!empty($this->release) && ($this->copy_paste_mode || $this->cut_paste_mode) ){ + + /* Check if current name is already used for fai scripts in selected release */ + $dn = 'cn='.$this->cn.",ou=packages,".$this->release; + $ldap = $this->config->get_ldap_link(); + $ldap->cat($dn); + if($ldap->count()){ + + $r =convert_department_dn($this->release);; + $message[] = sprintf(_("Can't insert a fai package list named '%s' in '%s' there is already a package list with the given name."),$this->cn,$r); + } + } return ($message); } + function printUsedPackages(){ $a_ret=array(); if(is_array($this->usedPackages)) { foreach($this->usedPackages as $usedName){ - + $config = 0; - + foreach($this->ConfiguredPackages as $name => $value){ if($name == $usedName){ $config ++; } } - + $c_str =""; if($config){ $c_str = " - "._("package is configured"); } - + + /* Adapt used name if we're marked for removal */ + $dsc= ""; + if (preg_match('/^-/', $usedName)){ + $dsc= " - "._("Package marked for removal"); + $usedName= preg_replace('/^-/', '! ', $usedName); + } + if(isset($this->list[$usedName][1])){ - $a_ret[$usedName] = $usedName." [".$this->list[$usedName][1]."]".$c_str; + $a_ret[$usedName] = $usedName." [".$this->list[$usedName][1]."]".$c_str.$dsc; }else{ - $a_ret[$usedName] = $usedName.$c_str; + $a_ret[$usedName] = $usedName.$c_str.$dsc; } } } return($a_ret); } - function genPkgs(){ + function genPkgs(){ /* Generate a list off available packages for this mirror, section and release */ /* Only read this file if it wasn't read before */ @@ -329,7 +446,7 @@ class faiPackage extends plugin $a_ret = array(); foreach($this->FAIdebianSection as $sec){ $strID= "/etc/gosa/fai/".$this->FAIdebianRelease."/".$sec; - + if(!is_file($strID)){ print_red(sprintf(_("Package file '%s' does not exist."),$strID)); unset($this->buffer); @@ -346,7 +463,7 @@ class faiPackage extends plugin } } fclose($fp); - /* Save our Data, to avoid reading it again */ + /* Save our Data, to avoid reading it again */ } $this->buffer = $a_ret; ksort($a_ret); @@ -361,26 +478,33 @@ class faiPackage extends plugin function save() { plugin::save(); - + $ldap = $this->config->get_ldap_link(); + /* Copy & Paste : Ensure that FAIstate is copied too */ + if($this->copy_paste_mode && preg_match("/freeze/",$this->FAIstate)){ + $this->attrs['FAIstate'] = $this->FAIstate; + } + $this->attrs['FAIpackage'] = array(); foreach($this->usedPackages as $pkg => $obj){ $this->attrs['FAIpackage'][] = $pkg; } - + $this->attrs['FAIdebianSection'] = array(); foreach($this->FAIdebianSection as $sec){ $this->attrs['FAIdebianSection'][] = $sec; } - $this->attrs["FAIinstallMethod"]= "aptitude"; + // $this->attrs["FAIinstallMethod"]= "aptitude"; - $ldap->cat($this->dn); + $ldap->cat($this->dn, array('dn')); if($ldap->count()!=0){ /* Write FAIscript to ldap*/ $ldap->cd($this->dn); - $ldap->modify($this->attrs); + $this->cleanup(); + $ldap->modify ($this->attrs); + }else{ /* Write FAIscript to ldap*/ $ldap->cd($this->config->current['BASE']); @@ -388,18 +512,25 @@ class faiPackage extends plugin $ldap->cd($this->dn); $ldap->add($this->attrs); } - show_ldap_error($ldap->get_error()); + show_ldap_error($ldap->get_error(), _("Saving FAI package base failed")); + + /* Do object tagging */ + $this->handle_object_tagging(); + $ldap->cd($this->dn); - /* Save Package configurations */ + /* Save Package configurations */ foreach($this->ConfiguredPackages as $pkgname => $attrs){ foreach($attrs as $name => $attr){ + + $pkgattrs = array(); foreach($attr as $n=>$v){ if(empty($v)) $v = array(); } /* Set attributes */ - $pkgattrs['objectClass'] = "FAIdebconfInfo"; + $pkgattrs['objectClass'][] = "FAIdebconfInfo"; + $pkgattrs['FAIpackage'] = $pkgname; $pkgattrs['FAIvariable'] = $name; $pkgattrs['FAIvariableType'] = $attr['Type']; @@ -407,23 +538,53 @@ class faiPackage extends plugin $pkgdn = "FAIvariable=".$name.",".$this->dn; /* cehck if object already exists */ - $ldap->cat($pkgdn); + $ldap->cat($pkgdn,array("objectClass")); + + /* Workaround for missing "gosaAdministrativeUnitTag" */ + $attrs = $ldap->fetch(); + if((isset($attrs['objectClass'])) && (in_array_ics("gosaAdministrativeUnitTag",$attrs['objectClass']))){ + $pkgattrs['objectClass'][] = "gosaAdministrativeUnitTag"; + } + if($ldap->count()!=0){ $ldap->cd($pkgdn); - $ldap->modify($pkgattrs); + $this->cleanup(); + $ldap->modify ($pkgattrs); + }else{ $ldap->cd($this->config->current['BASE']); $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $pkgdn)); $ldap->cd($pkgdn); $ldap->add($pkgattrs); } - show_ldap_error($ldap->get_error()); + show_ldap_error($ldap->get_error(), _("Saving FAI package entry failed")); + + /* Handle tagging */ + $this->handle_object_tagging($pkgdn, $this->gosaUnitTag); } } + } + + /* return copy & paste dialog + */ + function getCopyDialog() + { + /* Ask for cn */ + $smarty = get_smarty(); + $smarty->assign("cn" ,$this->cn); + $str = $smarty->fetch(get_template_path("paste_fai_object.tpl",TRUE)); + $ret = array(); + $ret['string'] = $str; + $ret['status'] = ""; + return($ret); + } - - - + /* Get posted cn */ + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; + } } }