Code

Added FAIprofile selection for Workstations
[gosa.git] / plugins / admin / fai / class_faiPackage.inc
index c48e29ec3435a1655615f021fd2a0e48c124427d..b346ed4442de2a5b5bfe4d67f81a1a6429b53e43 100644 (file)
@@ -37,18 +37,20 @@ class faiPackage extends plugin
   var $FAIdebianRelease          = ""; // The selected release
   var $FAIdebianSection          = ""; // selected section
   var $FAIdebianMirror           = ""; // selected mirror
+  var $mirror                    = ""; // selected mirror
 
   var $servers          = array();  // All available servers
   var $releases         = array();  // All possible releases 
   var $sections         = array();  // All section types
 
-  var $list             = array();
+  var $list             = NULL;
 
   var $mirrors          = array();  // The combination of server/release/section
   var $confDir          = "";
   var $usedPackages     = array();
-  
+  var $buffer           = NULL; 
   var $strID            ="";
+  var $newDialogShown   =false;
 
   function faiPackage ($config, $dn= NULL)
   {
@@ -71,8 +73,23 @@ class faiPackage extends plugin
     }else{
       $this->usedPackages = array();
     }  
+
+    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();
+
+    /* Extract mirror location */
+    $this->mirror= preg_replace("!^[^/]+//([^/]+).*$!", '$1', $this->FAIdebianMirror);
   }
 
   function execute()
@@ -81,98 +98,96 @@ class faiPackage extends plugin
     $smarty= get_smarty();
     $display= "";
 
-    $disableRelease   = false;
-    $disableMirror    = false;
-    $disableOptions   = false;
-    $disableSection   = false;
-
-    /* Assign variables */
-    foreach($this->attributes as $attrs){
-      $smarty->assign($attrs,$this->$attrs);
-    }
+    $this->genMirror();
 
-    /* Post handling for Section, Release and Mirror Setup */
-    if(isset($_POST['SetSection'])){
-      $this->FAIdebianSection = $_POST['FAIdebianSectionS'];
-    }
-    if(isset($_POST['SetRelease'])){
-      $this->FAIdebianRelease = $_POST['FAIdebianReleaseS'];
-    }
-    if(isset($_POST['SetMirror'])){
-      $this->FAIdebianMirror = $_POST['FAIdebianMirrorS'];
+    /* Check if we exist already - no need to ask for revisions, etc. then */
+    if ($this->dn != "new"){
+        $this->newDialogShown= true;
     }
 
-    if(empty($this->FAIdebianRelease)){
-      $disableSection = $disableMirror  = $disableOptions = true;
-      $this->sections=array("---");
-    }elseif(empty($this->FAIdebianSection)){
-      $disableRelease = $disableMirror  = $disableOptions = true;
-    }elseif(empty($this->FAIdebianMirror)){
-      $disableRelease = $disableSection = $disableOptions = true;
-    }else{
-      $disableRelease = $disableSection =  true;
-    }
+    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;
+      }
 
-    $this->genMirror();
+      /* alert possible missconfigurations */ 
+      if((count($this->releases)==0)||(count($this->servers)==0)||(count($this->sections)==0)){
+        print_red(_("There is no useable package list defined."));
+      }
 
-    $availableServer = array();
-    foreach($this->mirrors as $mir){
-      if(($mir['release'] == $this->FAIdebianRelease)&&($mir['section']==$this->FAIdebianSection)){
-        $availableServer[$mir['mirror']]=$mir['mirror'];
+      /* Assign posible changes, for mirror combinations */
+      $this->dialog->releases = $this->releases;
+      $this->dialog->servers  = $this->servers;
+      $this->dialog->sections = $this->sections;
+      $this->dialog->mirrors  = $this->mirrors;
+
+      /* Assign Repository settings*/ 
+      if(isset($_POST['SaveObjectNew'])){
+        $this->FAIdebianRelease = $this->dialog->FAIdebianRelease;
+        $this->FAIdebianSection = $this->dialog->FAIdebianSection;
+        $this->FAIdebianMirror  = $this->dialog->FAIdebianMirror;
+        unset($this->dialog);
+        $this->dialog = false;
+        $this->is_dialog=false;
+        $this->newDialogShown = true;
       }
-    }
 
-    if(($disableMirror==false)&&(count($availableServer)==0)){
-      $this->FAIdebianRelease = $this->FAIdebianSection = $this->FAIdebianMirror = "";
-      $disableSection = $disableMirror  = $disableOptions = true;
-      $disableRelease = false;
+      /* Draw dialog */
+      if($this->dialog){
+        $display=$this->dialog->execute();
+        return($display); 
+      }
     }
 
-    if(count($availableServer)==0){
-      $availableServer=array("---");
+    /* Assign variables */
+    foreach($this->attributes as $attrs){
+      $smarty->assign($attrs,$this->$attrs);
     }
 
-    $smarty->assign("ReleaseACL"  , "");
-    $smarty->assign("MirrorACL"   , "");
-    $smarty->assign("OptionACL"   , "");
-    $smarty->assign("SectionACL"  , "");
-
-    if($disableOptions){
-      $smarty->assign("OptionACL"," disabled ");
-    } 
-    if($disableRelease){
-      $smarty->assign("ReleaseACL"," disabled ");
-    } 
-    if($disableMirror){
-      $smarty->assign("MirrorACL"," disabled ");
+    /* Set mirror if changed */
+    if((isset($_POST['FAIdebianMirrorS']))&&(!empty($_POST['FAIdebianMirrorS']))){
+      $this->FAIdebianMirror = $_POST['FAIdebianMirrorS'];
     }
-    if($disableSection){
-      $smarty->assign("SectionACL"," disabled ");
-    } 
 
-    $this->strID = $this->confDir.$this->FAIdebianMirror."/".$this->FAIdebianRelease."/".$this->FAIdebianSection;
-    if(!$disableOptions){
-      if(!isset($this->list[$this->strID])){
-        $tmp = new faiPackageEntry($this->config, $this->dn,$this->strID,$this->usedPackages);
-        $this->list[$this->strID]=$tmp->genPkgs();
+    /* check servers matching release and section settings */
+    $availableServer = array();
+    foreach($this->mirrors as $mir){
+      if($mir['release'] == $this->FAIdebianRelease){
+        $pass = true;
+        foreach($this->FAIdebianSection as $sec){
+          if($sec != $mir['section']){
+            $pass = false;
+          }
+        if($pass){
+            $availableServer[$mir['mirror']]=$mir['mirror'];
+          }
+        }
       }
     }
+    
+    /* 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->strID,$this->usedPackages);
-      $this->dialog->buffer[$this->strID]= $this->list[$this->strID];
+      $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']]);
     }
+
+    /* 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())){
@@ -187,31 +202,46 @@ class faiPackage extends plugin
       }
     }
 
+    /* Configuration dialog open*/
     if(isset($_POST['Conpkg'])){
       $this->dialog = new faiPackageConfiguration($this->config, $this->dn,"none");
       $this->is_dialog =true;
     }
    
+    /* Save Configuration */
     if(isset($_POST['SaveObjectConfig'])){
       $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();
     }
 
+    /* Assign section to smarty */
+    $strsec = "";
+    foreach($this->FAIdebianSection as $sec){
+       $strsec .= $sec." ";
+    }
+
+    $smarty->assign("OptionsACL","");
+    if(empty($this->FAIdebianMirror)){
+      $smarty->assign("OptionsACL"," disabled ");
+    }
+
     $smarty->assign("mirrors" ,$availableServer);
     $smarty->assign("mirror"  ,$this->FAIdebianMirror);
     $smarty->assign("releases",$this->releases);
     $smarty->assign("release" ,$this->FAIdebianRelease);
     $smarty->assign("sections",$this->sections);
-    $smarty->assign("section" ,$this->FAIdebianSection);
+    $smarty->assign("section" ,$strsec);
     $smarty->assign("usedPackages",$this->printUsedPackages());
     $display.= $smarty->fetch(get_template_path('faiPackage.tpl', TRUE));
     return($display);
@@ -251,10 +281,6 @@ class faiPackage extends plugin
                   $this->releases[$release]=$release;
                   $this->sections[$section]=$section;
 
-                  if(empty($this->FAIdebianRelease)){
-                    $this->sections= array("---");
-                  }
-
                   $arr=array();
                   $arr['mirror'] = $mirror;
                   $arr['release']= $release; 
@@ -320,8 +346,8 @@ class faiPackage extends plugin
     $a_ret=array(); 
     if(is_array($this->usedPackages)) {
       foreach($this->usedPackages as $usedName){
-        if(isset($this->list[$this->strID][$usedName][1])){
-          $a_ret[$usedName] = $usedName." [".$this->list[$this->strID][$usedName][1]."]";
+        if(isset($this->list[$usedName][1])){
+          $a_ret[$usedName] = $usedName." [".$this->list[$usedName][1]."]";
         }else{
           $a_ret[$usedName] = $usedName;
         }
@@ -330,6 +356,44 @@ class faiPackage extends plugin
     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->mirror."/".$this->FAIdebianRelease."/".$sec;
+        
+        if(!is_file($strID)){
+          print_red(sprintf(_("Package file don't exists '%s'."),$strID));
+          $this->FAIdebianMirror="";
+          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()
   {
@@ -341,6 +405,11 @@ 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;
+    }
 
     $ldap->cat($this->dn);
     if($ldap->count()!=0){