X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Ffai%2Fclass_faiPackage.inc;h=e98f721e431ccb79c58dc616c9e22bde87661b0f;hb=6cb5be59b017449b99265b7ab8dead4eeab15b19;hp=d760e8e5b2c86854792c9449a7a74c3d5657a5e6;hpb=0b15116ea3bf7c4f0070d27470b2d886785c2790;p=gosa.git diff --git a/plugins/admin/fai/class_faiPackage.inc b/plugins/admin/fai/class_faiPackage.inc index d760e8e5b..e98f721e4 100644 --- a/plugins/admin/fai/class_faiPackage.inc +++ b/plugins/admin/fai/class_faiPackage.inc @@ -11,7 +11,7 @@ class faiPackage extends plugin var $ignore_account = TRUE; /* Attributes for this Object */ - var $attributes = array("cn","description","FAIpackage","FAIdebianSection","FAIdebianRelease","FAIdebianMirror"); + var $attributes = array("cn","description","FAIpackage","FAIdebianRelease","FAIdebianSection", "FAIinstallMethod"); /* ObjectClasses for this Object*/ var $objectclasses = array("top","FAIclass","FAIpackageList","FAIrepository"); @@ -27,6 +27,8 @@ class faiPackage extends plugin var $subAttributes = array("cn","description"); var $sub64coded = array(); + var $ConfiguredPackages = array(); + /* Specific attributes */ var $cn = ""; // The class name for this object var $description = ""; // The description for this set of partitions @@ -34,19 +36,23 @@ class faiPackage extends plugin var $dialog = NULL; // a dialog, e.g. new disk dialog var $SubObjects = array(); // All leafobjects of this object - var $FAIdebianSection = ""; // The selected section - var $FAIdebianRelease = ""; // selected release - var $FAIdebianMirror = ""; // selected mirror + var $FAIdebianRelease = ""; // The selected release + var $FAIdebianSection = ""; // selected section + var $FAIinstallMethod = "aptitude"; // hard coded + var $mirror = ""; // selected mirror var $servers = array(); // All available servers - var $sections = array(); // All possible sections - var $releases = array(); // All release types + var $releases = array(); // All possible releases + var $sections = array(); // All section types - var $disableRepository = false; + var $list = NULL; - var $mirrors = array(); // The combination of server/section/release + var $mirrors = array(); // The combination of server/release/section var $confDir = ""; - var $usedPackages = array(); + var $usedPackages = array(); + var $buffer = NULL; + var $strID =""; + var $newDialogShown =false; function faiPackage ($config, $dn= NULL) { @@ -61,56 +67,132 @@ class faiPackage extends plugin $this->dn =$dn; } - if(isset($this->attrs['FAIdebianRelease'])){ - $this->disableRepository=true; - } - if(isset($this->attrs['FAIpackage'])){ unset($this->attrs['FAIpackage']['count']); foreach($this->attrs['FAIpackage'] as $pkg){ $this->usedPackages[$pkg] = $pkg; } + ksort($this->usedPackages); }else{ - $this->usedPackages = array();; + $this->usedPackages = array(); } + + $ldap = $this->config->get_ldap_link(); + foreach($this->usedPackages as $name){ + $ldap->search("(&(objectClass=FAIdebconfInfo)(FAIpackage=".$name."))",array("FAIvariable","FAIvariableType","FAIvariableContent","FAIpackage","FAIdebianSection","")); + while($attr = $ldap->fetch()){ + + $tmp =array(); + $tmp['Name'] = $attr['FAIvariable'][0]; + $tmp['Type'] = $attr['FAIvariableType'][0]; + + if (isset($attr['FAIvariableContent'][0])){ + if(!in_array($attr['FAIvariableType'],array("multiselect"))){ + $tmp['Value'] = $attr['FAIvariableContent'][0]; + }else{ + $content = array(); + unset($attr['FAIvariableContent']['count']); + foreach($attr['FAIvariableContent'] as $attr){ + $tmp['Value'][] = $attr; + } + } + $this->ConfiguredPackages[$attr['FAIpackage'][0]][$attr['FAIvariable'][0]]=$tmp; + } + } + } + + if (isset($this->attrs['FAIdebianSection']['count'])){ + unset($this->attrs['FAIdebianSection']['count']); + } + if((isset($this->attrs['FAIdebianSection']))&&(is_array($this->attrs['FAIdebianSection']))){ + $this->FAIdebianSection = array(); + foreach($this->attrs['FAIdebianSection'] as $sec){ + $this->FAIdebianSection[$sec]=$sec; + } + } + + if((isset($this->attrs['FAIdebianSection']))&&(is_string($this->attrs['FAIdebianSection']))){ + $this->FAIdebianSection=array($this->attrs['FAIdebianSection']=>$this->attrs['FAIdebianSection']) ; + } $this->confDir = CONFIG_DIR."/fai/"; $this->FAIpackage = array(); } function execute() { + /* Call parent execute */ + + plugin::execute(); + /* Fill templating stuff */ $smarty= get_smarty(); $display= ""; - /* Assign variables */ - foreach($this->attributes as $attrs){ - $smarty->assign($attrs,$this->$attrs); + /* Check if we exist already - no need to ask for revisions, etc. then */ + if ($this->dn != "new"){ + $this->newDialogShown= true; } - $this->genMirror(); + 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; + } + + /* Assign posible changes, for mirror combinations */ + $this->dialog->save_object(); + + /* 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->newDialogShown = true; + } - $availableServer = array(); - foreach($this->mirrors as $mir){ - if(($mir['section'] == $this->FAIdebianSection)&&($mir['release']==$this->FAIdebianRelease)){ - $availableServer[$mir['mirror']]=$mir['mirror']; + /* Draw dialog */ + if($this->dialog){ + $display=$this->dialog->execute(); + return($display); } } + /* Assign variables */ + foreach($this->attributes as $attrs){ + $smarty->assign($attrs,$this->$attrs); + } + + /* Generate package list */ + $this->list=$this->genPkgs(); + + /* + was pressed to open the package dialog */ if(isset($_POST['Addpkg'])){ - $this->dialog = new faiPackageEntry($this->config, $this->dn,$this->confDir.$this->mirror."/".$this->section."/".$this->release,$this->usedPackages); + $this->dialog = new faiPackageEntry($this->config, $this->dn,$this->list,$this->usedPackages); $this->is_dialog =true; } - + + /* Delte selected package */ if(isset($_POST['Delpkg'])){ - unset($this->usedPackages[$_POST['usedPackages']]); + foreach($_POST['usedPackages'] as $del){ + if(isset($this->usedPackages[$del])){ + unset($this->usedPackages[$del]); + } + } } - + + /* Abort package selection dialog */ if(isset($_POST['CancelSubObject'])){ $this->dialog = false; $this->is_dialog=false; } + /* attach new packages */ if(isset($_POST['SaveSubObject'])) { $this->dialog->save_object(); if(count($this->dialog->check())){ @@ -122,94 +204,59 @@ class faiPackage extends plugin $this->usedPackages = $use; $this->dialog = false; $this->is_dialog=false; - $this->disableRepository =true; + ksort($this->usedPackages); } } - + + /* Configuration dialog open*/ + if((isset($_POST['Conpkg']))&&(isset($_POST['usedPackages']))&&(!empty($_POST['usedPackages']))){ + $path = "/etc/gosa/fai/".$this->FAIdebianRelease."/debconf.d"; + $pkg_config = array(); + $pkg = $_POST['usedPackages'][0]; + + if(isset($this->ConfiguredPackages[$pkg])){ + $pkg_config = $this->ConfiguredPackages[$pkg]; + } + + $this->dialog = new faiPackageConfiguration($this->config, $this->dn,$pkg, $path, $pkg_config); + $this->is_dialog =true; + } + + /* Save Configuration */ + if(isset($_POST['SaveObjectConfig'])){ + $this->ConfiguredPackages= array_merge($this->ConfiguredPackages,$this->dialog->save()); + $this->dialog = false; + $this->is_dialog=false; + } + + /* cancel configuration */ + if(isset($_POST['CancelObjectConfig'])){ + $this->dialog = false; + $this->is_dialog=false; + } + + /* Display dialog */ if($this->is_dialog){ return $this->dialog->execute(); } - if($this->disableRepository == true){ - $smarty->assign("mirrorACL" ," disabled "); - $smarty->assign("sectionACL" ," disabled "); - $smarty->assign("releaseACL" ," disabled "); - }else{ - $smarty->assign("mirrorACL" ,""); - $smarty->assign("sectionACL" ,""); - $smarty->assign("releaseACL" ,""); + /* Assign section to smarty */ + $strsec = ""; + foreach($this->FAIdebianSection as $sec){ + $strsec .= $sec." "; } - $smarty->assign("mirrors" ,$availableServer); - $smarty->assign("mirror" ,$this->FAIdebianMirror); - $smarty->assign("sections",$this->sections); - $smarty->assign("section" ,$this->FAIdebianSection); + + $smarty->assign("OptionsACL",""); + $smarty->assign("releases",$this->releases); $smarty->assign("release" ,$this->FAIdebianRelease); + $smarty->assign("sections",$this->sections); + $smarty->assign("section" ,$strsec); $smarty->assign("usedPackages",$this->printUsedPackages()); $display.= $smarty->fetch(get_template_path('faiPackage.tpl', TRUE)); return($display); } - function genMirror(){ - $confDir = $this->confDir; - if(!is_readable($confDir)){ - print_red(sprintf(_("Can't read configuration folder '%s'."),$confDir)); - }else{ - - /* Try to catch all available mirrors - Possibly check if each server is reachable - */ - $this->mirrors= array(); - $fd = opendir($confDir); - while($mirror = readdir($fd)){ - if((is_dir($confDir.$mirror."/"))&&(($mirror != "." )&&($mirror!=".."))){ - - $mirrorDir = $confDir.$mirror."/"; - - $fe = opendir($mirrorDir); - while($section = readdir($fe)){ - if((is_dir($mirrorDir.$section))&&(($section != "." )&&($section!=".."))){ - - $sectionDir = $mirrorDir.$section."/"; - - $ff = opendir($sectionDir); - while($release = readdir($ff)){ - if((is_file($sectionDir.$release))&&(($release != "." )&&($release!="..")&&(!preg_match("/.*\.in$/",$release)))){ - - $this->servers[$mirror]=$mirror; - $this->sections[$section]=$section; - $this->releases[$release]=$release; - - if(empty($this->FAIdebianMirror)){ - $this->FAIdebianMirror= $mirror; - } - if(empty($this->FAIdebianSection)){ - $this->FAIdebianSection = $section; - } - if(empty($this->FAIdebianRelease)){ - $this->FAIdebianRelease = $release; - } - - $arr=array(); - $arr['mirror'] = $mirror; - $arr['section']= $section; - $arr['release']= $release; - - $this->mirrors[] = $arr ; - } - } - fclose($ff); - } - } - fclose($fe); - } - } - fclose($fd); - } - - - } - /* Delete me, and all my subtrees */ function remove_from_parent() @@ -225,6 +272,7 @@ class faiPackage extends plugin */ function save_object() { + plugin::save_object(); foreach($this->attributes as $attrs){ if(isset($_POST[$attrs])){ @@ -238,8 +286,12 @@ class faiPackage extends plugin function check() { $message= array(); - - if((empty($this->FAIdebianSection))||(empty($this->FAIdebianRelease))||(empty($this->FAIdebianMirror))){ + + 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."); } @@ -250,12 +302,67 @@ class faiPackage extends plugin $a_ret=array(); if(is_array($this->usedPackages)) { foreach($this->usedPackages as $usedName){ - $a_ret[$usedName] = $usedName; + + $config = 0; + + foreach($this->ConfiguredPackages as $name => $value){ + if($name == $usedName){ + $config ++; + } + } + + $c_str =""; + if($config){ + $c_str = " - "._("package is configured"); + } + + if(isset($this->list[$usedName][1])){ + $a_ret[$usedName] = $usedName." [".$this->list[$usedName][1]."]".$c_str; + }else{ + $a_ret[$usedName] = $usedName.$c_str; + } } } return($a_ret); } + function genPkgs(){ + /* Generate a list off available packages for this mirror, section and release + */ + /* Only read this file if it wasn't read before */ + if($this->buffer==NULL){ + $this->buffer=array(); + $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); + return(array()); + } + $fp = fopen($strID,"r"); + + /* Parse every line and create an array */ + while(!feof($fp)){ + $str= fgets($fp,512); + $stra= split("\|",$str); + if(count($stra)==4){ + $a_ret[$stra[0]] = $stra; + } + } + fclose($fp); + /* Save our Data, to avoid reading it again */ + } + $this->buffer = $a_ret; + ksort($a_ret); + return($a_ret); + }else{ + return $this->buffer; + } + } + + /* Save to LDAP */ function save() { @@ -267,6 +374,13 @@ class faiPackage extends plugin 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"; $ldap->cat($this->dn); if($ldap->count()!=0){ @@ -281,6 +395,41 @@ class faiPackage extends plugin $ldap->add($this->attrs); } show_ldap_error($ldap->get_error()); + + /* Save Package configurations */ + foreach($this->ConfiguredPackages as $pkgname => $attrs){ + foreach($attrs as $name => $attr){ + + foreach($attr as $n=>$v){ + if(empty($v)) $v = array(); + } + + /* Set attributes */ + $pkgattrs['objectClass'] = "FAIdebconfInfo"; + $pkgattrs['FAIpackage'] = $pkgname; + $pkgattrs['FAIvariable'] = $name; + $pkgattrs['FAIvariableType'] = $attr['Type']; + $pkgattrs['FAIvariableContent'] = $attr['Value']; + $pkgdn = "FAIvariable=".$name.",".$this->dn; + + /* cehck if object already exists */ + $ldap->cat($pkgdn); + if($ldap->count()!=0){ + $ldap->cd($pkgdn); + $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()); + } + } + + + + } }