Code

Backport from trunk
[gosa.git] / gosa-plugins / fai / admin / fai / class_faiDiskEntry.inc
index aa0dec8a6900ba02a20c57e69dfa8cb1b789f38b..0c63bf53617c2b2e1e475eee21044d765655c28d 100644 (file)
@@ -19,8 +19,6 @@ class faiDiskEntry extends plugin
   var $partitions          = array();
   var $is_edit             = false;
   var $old_cn              = "";
-  var $status              = "new";
-  var $deletePartitions    = array();
   var $fstabkey            = "device";
   var $disklabel           = "msdos";
   var $FAIstate            = "";
@@ -35,7 +33,6 @@ class faiDiskEntry extends plugin
     // Set default attributes 
     $this->parent = $parent;
     $this->FAIdiskType = $type;
-    $this->status = "new";    
 
     // If disk is not empty, then we are going to edit 
     //  an existing disk, load disk info now. 
@@ -46,9 +43,6 @@ class faiDiskEntry extends plugin
         $this->lvmDevices = $disk['FAIlvmDevice'];
       }
 
-      // Get disk status
-      $this->status = $disk['status'];
-
       // Load default attributes 
       $this->DISKcn          = $disk['cn'];
       $this->DISKdescription = $disk['description'];
@@ -56,40 +50,29 @@ class faiDiskEntry extends plugin
       $this->old_cn          = $disk['cn'];
 
       // Load partition info 
-      foreach($disk['partitions'] as $name => $values){
+      foreach($disk['partitions'] as $values){
 
-        // Do not load removed partitions 
-        if($values['status'] == "delete"){
-          unset($disk['partitions'][$name]);
-          $this->deletePartitions[]=$values;
-        }else{
+        $name = $values['FAIpartitionNr'];
 
-          /* If status is not new, set to edit mode. 
-           * New means that this partition currently wasn't saved to ldap.
-           */
-          if($disk['partitions'][$name]['status']!="new"){
-            $disk['partitions'][$name]['status']="edited";
-          }
-    
-          // Load partition attributes  
-          $disk['partitions'][$name]['old_cn']= $disk['partitions'][$name]['cn'];
-          $disk['partitions'][$name]['FAIdiskType']= $this->FAIdiskType;
-          foreach($this->UsedAttrs as $attr){
-            if(!isset($values[$attr])){
-              $disk['partitions'][$name][$attr]="";  
-            }
-          }
-          if (preg_match('/^_/', $disk['partitions'][$name]['FAIfsType'])){
-            $disk['partitions'][$name]['FAIfsType']= 
-              preg_replace('/^_/', '', $disk['partitions'][$name]['FAIfsType']);
+        // Load partition attributes  
+        $disk['partitions'][$name]['old_cn']= $disk['partitions'][$name]['cn'];
+        $disk['partitions'][$name]['FAIdiskType']= $this->FAIdiskType;
+        foreach($this->UsedAttrs as $attr){
+          if(!isset($values[$attr])){
+            $disk['partitions'][$name][$attr]="";  
           }
         }
+
+        if (preg_match('/^_/', $disk['partitions'][$name]['FAIfsType'])){
+          $disk['partitions'][$name]['FAIfsType']= 
+            preg_replace('/^_/', '', $disk['partitions'][$name]['FAIfsType']);
+        }
       }
 
       $this->partitions      = $disk['partitions'];
 
       /* Load FAIdiskOptions.
-       * Some options are disk related and some are used for partitions.
+       * Some options are disk related and others are used for partitions.
        *  - fstabkey    -> disk
        *  - disklabel   -> disk
        *  - bootable    -> partition
@@ -113,7 +96,7 @@ class faiDiskEntry extends plugin
 
           // Load bootable flag for partitions 
           if (preg_match("/^bootable:/", $option)){
-            $bootable = split(",", trim(preg_replace("/^bootable:/","",$option),","));
+            $bootable = explode(",", trim(preg_replace("/^bootable:/","",$option),","));
             foreach($bootable as $bootflag){
               if(isset($this->partitions[$bootflag])){
                 $this->partitions[$bootflag]['bootable'] = TRUE;  
@@ -124,9 +107,9 @@ class faiDiskEntry extends plugin
 
           // Load resize flag for partitions 
           if (preg_match("/^resize:/", $option)){
-            $resize = split(",", trim(preg_replace("/^resize:/","",$option),","));
+            $resize = explode(",", trim(preg_replace("/^resize:/","",$option),","));
             foreach($resize as $id){
-              if(isset($this->partitions[$bootflag])){
+              if(isset($this->partitions[$id])){
                 $this->partitions[$id]['resize'] = TRUE;  
               }
             }
@@ -135,9 +118,9 @@ class faiDiskEntry extends plugin
 
           // Load preserve_always flag for partitions 
           if (preg_match("/^preserve_always:/", $option)){
-            $preserve = split(",", trim(preg_replace("/^preserve_always:/","",$option),","));
+            $preserve = explode(",", trim(preg_replace("/^preserve_always:/","",$option),","));
             foreach($preserve as $presflag){
-              if(isset($this->partitions[$bootflag])){
+              if(isset($this->partitions[$presflag])){
                 $this->partitions[$presflag]['preserve'] = TRUE;  
                 $this->partitions[$presflag]['preserveType'] = 'always';  
               }
@@ -147,7 +130,7 @@ class faiDiskEntry extends plugin
 
           // Load preserve_reinstall flag for partitions 
           if (preg_match("/^preserve_reinstall:/", $option)){
-            $preserve = split(",", trim(preg_replace("/^preserve_reinstall:/","",$option),","));
+            $preserve = explode(",", trim(preg_replace("/^preserve_reinstall:/","",$option),","));
             foreach($preserve as $presflag){
               if(isset($this->partitions[$bootflag])){
                 $this->partitions[$presflag]['preserve'] = TRUE;  
@@ -161,6 +144,17 @@ class faiDiskEntry extends plugin
         $this->fstabkey= "device";
       }
     }
+
+    // Prepare lists
+    $this->diskList = new sortableListing();
+    $this->diskList->setDeleteable(true);
+    $this->diskList->setEditable(true);
+    $this->diskList->setWidth("100%");
+    $this->diskList->setHeight("400px");
+    $this->diskList->setColspecs(array('200px','*'));
+    $this->diskList->setHeader(array("Name",_("Description"),_("Type"),_("Mount point"),_("Options")));
+    $this->diskList->setDefaultSortColumn(1);
+    $this->diskList->setAcl('rwcdm'); // All ACLs, we filter on our own here.
   }
 
 
@@ -175,32 +169,36 @@ class faiDiskEntry extends plugin
     $s_entry    = "";
     $display    = "";
 
-    // Remove partition
+    // Add partition to lvm compilation.
     if(isset($_POST['addLvmPartition']) && isset($_POST['lvmPartitionAdd'])){
-      $name = $_POST['lvmPartitionAdd'];
+      $name = get_post('lvmPartitionAdd');
       $this->lvmDevices[$name] = $name;
     }
 
-    /* Check all Posts if there is something usefull for us,
-     * For example : Delete is posted as Delete_1 
-     * The number specifies the index we want to delete
-     */
-    foreach($_POST as $name => $value){
-      if((preg_match("/RemovePartition_/",$name)) && 
-          $this->acl_is_removeable() && 
-          !preg_match("/freeze/i",$this->FAIstate)){
-        $tmp = split("_",$name);
-        $this->removePartition($tmp[1]);
-        break;
+    // Remove partition from lvm compilation.
+    if(isset($_POST['delLvmPartition']) && isset($_POST['physicalPartition'])){
+      $names = get_post('physicalPartition');
+      foreach($names as $name){
+        if(isset($this->lvmDevices[$name])){
+          unset($this->lvmDevices[$name]);
+        }
       }
-      if(preg_match("/^EditPartition_/",$name)){
-        $id = preg_replace("/^EditPartition_/","",$name);
-        $id = preg_replace("/_.*$/","",$id);
+    }
+
+    // Get list actions
+    $this->diskList->save_object();
+    $action = $this->diskList->getAction();
+    if($action['action'] == 'edit'){
+        $id = $this->diskList->getKey($action['targets'][0]);
+        if(isset($this->partitions[$id])){
+            $this->dialog = new faiPartition($this->config,$this->partitions[$id], $this,$this->FAIdiskType);
+        }
+    }
+    if($action['action'] == 'delete'){
+        $id = $this->diskList->getKey($action['targets'][0]);
         if(isset($this->partitions[$id])){
-          $this->dialog = new faiPartition($this->config,$this->partitions[$id], $this,$this->FAIdiskType);
-          break;
+            $this->removePartition($id);
         }
-      } 
     }
 
     /* Create a new partition for this disk.
@@ -217,9 +215,13 @@ class faiDiskEntry extends plugin
     if($this->dialog instanceOf plugin && isset($_POST['PartitionSave'])){
       $this->dialog->save_object();
 
+      // Validate new partition
+      $new_partition = $this->dialog->save(); 
       $msgs = $this->dialog->check();
+      $msgs = array_merge($msgs,$this->check_disks($new_partition));
+
       if(!count($msgs)){
-        $this->updatePartition($this->dialog->save());
+        $this->updatePartition($new_partition);
         $this->dialog = null;
       }else{
         msg_dialog::displayChecks($msgs);
@@ -232,7 +234,7 @@ class faiDiskEntry extends plugin
 
     // Assign checkbox related values.
     foreach($this->attributes as $attrs){
-      $smarty->assign($attrs,$this->$attrs);
+      $smarty->assign($attrs,set_post($this->$attrs));
       if($this->$attrs){
         $smarty->assign($attrs."CHK"," ");
       }else{
@@ -247,15 +249,11 @@ class faiDiskEntry extends plugin
     $smarty->assign("fstabkeys", array("device" => _("Device"), "label" => _("Label"), "uuid" => _("UUID")));
     $smarty->assign("disklabels", array("msdos" => "MSDOS", "gpt" => "GPT"));
     $smarty->assign("fstabkey", $this->fstabkey);
-    $smarty->assign("disklabel", $this->disklabel);
+    $smarty->assign("disklabel", set_post($this->disklabel));
     $smarty->assign("FAIdiskType", $this->FAIdiskType);
     $smarty->assign("plist", $this->getPartitionList());
     $smarty->assign("physicalPartitionList", $this->getAvailablePartitions());
 
-    foreach($this->attributes as $attr){
-      $smarty->assign($attr,$this->$attr);
-    }
-
     // Assign partitions
     $tmp = $this->plInfo();
     $sacl = "";
@@ -268,134 +266,267 @@ class faiDiskEntry extends plugin
     return($display);
   }
 
+
+  /* Creates a human readable list, that contains all physical 
+   *  devices that are used by the volume group.
+   * This list will then be displayed in a html select box.
+   * (lvm)
+   */
   function getPartitionList()
   {
-    $divlist = new divSelectBox("RaidList");
+    /* Create a list of all available disks and partitions. 
+     * This list will then be used to display detailed info.
+     */
     $disks = $this->parent->disks;
-    $objs = $disks;
-    foreach($disks as $disk){
+    foreach($disks as $dname => $disk){
+
+      // Skip currently edited disk 
+      if($disk['cn'] == $this->old_cn) continue;
+   
+      // Add disk 
+      $objs[$dname] = $disk;
+
+      // Add disk partitions
       foreach($disk['partitions'] as $id => $part){
-        $objs[$disk['cn']] = $part;
+        $part['parentDisk'] = $disk;
+        $objs[$part['cn']] = $part;
       }
     }
 
+    // Attach current disk setup to the details list.
+    $data = $this->save();
+    $objs[$data['cn']] = $data;
+    foreach($data['partitions'] as $part){
+      $part['parentDisk'] = $data;
+      $objs[$part['cn']] = $part;
+    }
+
+    // Walk through physical partition combinations and build up 
+    //  user friendly list with partition details.
     $list = array();
     foreach($this->lvmDevices as $device){
-      $list[$device] = $device;
 
-      if(isset($objs[$device]['FAIpartitionSize'])){
-        $list[$device].= _("Size").": ";
-        $list[$device].= $objs[$device]['FAIpartitionSize'];
+      // We've a html select box here, add spaces for better readability
+      $str = $device;
+      $str = preg_replace("/ /"," ",str_pad($str,20," "));
+
+      // Add disk/partition details.
+      if(isset($objs[$device])){
+        if(isset($objs[$device]['FAIpartitionSize'])){
+          if($objs[$device]['parentDisk']['FAIdiskType'] == "raid"){
+            $str .= _("Disks").": ";
+            $str .= preg_replace("/(:spare|:missing)/i","",$objs[$device]['FAIpartitionSize']);
+          }else{
+            $str .= _("Size").": ";
+            $str .= $objs[$device]['FAIpartitionSize'];
+          } 
+        }
       }
+      $list[$device] = $str;
     }
     return($list);
   }
 
-  
-  function getAvailablePartitions(){
-    $array = array();
+  /* Returns a list of available partitions that are useable in 
+   *  lvm disk setups.
+   */ 
+  function getAvailablePartitions()
+  {
+    $may = $used = array();
     foreach($this->parent->disks as $disk){
+
+      // Skip ourselves
+      if($disk['cn'] == $this->DISKcn) continue;
+
+      // Add partition from lvm combinations
+      if($disk['FAIdiskType'] == "lvm"){
+        $used = array_merge($used,$disk['FAIlvmDevice']);
+      }
+
       foreach($disk['partitions'] as $key => $part){
-        $name = $disk['cn'];
-        if(!isset($this->lvmDevices[$name])){
-          $array[$name] = $name;
+
+        // Add disks of raid arrays, to the used list.
+        if($disk['FAIdiskType'] == "raid"){
+          foreach(explode(",",$part['FAIpartitionSize']) as $rDevice){
+            $used[] = preg_replace("/:.*$/i","",$rDevice);
+          }
+        }
+
+        // Collect all available partitions
+        if($disk['FAIdiskType'] == "disk" || $disk['FAIdiskType'] == "raid"){
+          $name = $part['cn'];
+          if(!isset($this->lvmDevices[$name])){
+            $may[] = $name;
+          }
         }
       }
     }
-    return($array);
 
+    // Check which of the available disks are unused.
+    $ret = array();
+    foreach($may as $val){
+      if(!in_array_strict($val,$used)){
+        $ret[$val] = $val;
+      }
+    }
+    return($ret);
   }
 
 
   /* Remove the selected partition and shift the following partitions 
-   *  to fill gap.
+   *  to fill the gap.
    * Additionally update the partition numbers correspondingly.
+   *  (Checks if the partition is in use, too)
    */
   function removePartition($id)
   {
     $start = false;
-    foreach($this->partitions as $key => $part){
-      if($id == $key){
-        $start = true;
-      }
-      if($start){
-        if($this->partitions[$key]['status'] == "edited"){
-          $this->deletePartitions[$key]= $this->partitions[$key];
-          $this->deletePartitions[$key]['FAIpartitionNr']=$key;
-          unset($this->partitions[$key]);
-        }else{
-          unset($this->partitions[$key]);
+
+    /* Create a list of all partitions that are used in
+     *  lvm or raid compilations.
+     */
+    $list = array();
+    foreach($this->parent->disks as $dname => $disk){
+      if($disk['FAIdiskType'] != "disk"){
+        if($disk['FAIdiskType'] == "lvm"){
+          foreach($disk['FAIlvmDevice'] as $partname){
+            $list[preg_replace("/:.*$/","",$partname)][] = $disk;
+          }
         }
-        if(isset($this->partitions[($key+1)])){
-          if(isset($this->deletePartitions[$key])){
-            unset($this->deletePartitions[$key]);
+        foreach($disk['partitions'] as $partkey => $part){
+          if($disk['FAIdiskType'] == "raid"){
+            foreach(explode(",",$part['FAIpartitionSize']) as $partname){
+              $list[preg_replace("/:.*$/","",$partname)][] = $disk;
+            }
           }
-          $this->partitions[$key] = $this->partitions[($key+1)];
-          $this->partitions[$key]['FAIpartitionNr'] = $key;
-          $this->partitions[$key]['status'] = "new";
         }
       }
     }
-    $tmp= array();
-    foreach($this->partitions as $part){
-      $tmp[count($tmp)+1]=$part;
+
+    /* Now that we've a list of all partition references, lets check if
+     *  one of the partitions we are going to remove is still in use.
+     */
+    if(isset($list[$this->partitions[$id]['cn']])){
+      $used = array();
+      foreach($list[$this->partitions[$id]['cn']] as $disk){
+        $used[$disk['cn']] = $disk['cn'];
+      }
+      $used = implode(",",$used);
+      msg_dialog::display(_("Error"),
+          sprintf(_("The disk cannot be deleted while it is used in the '%s' disk definition!"),
+            $used), ERROR_DIALOG);
+    }else{
+      unset($this->partitions[$id]);
+    }
+  }
+
+  
+  function get_free_partition_number()
+  {
+    $used = array();
+    foreach($this->partitions as $key => $part){
+      $used[$key] = $part['FAIpartitionNr'];
+    }
+    $id = 1;
+    while(in_array_strict($id,$used) && $id < 16 ){
+      $id++;
     }
-    $this->partitions = $tmp;
+    return($id);
   }
 
 
+
   /* Add or update a partition 
    */
   function updatePartition($part)
   {
     if(!isset($part['FAIpartitionNr']) || $part['FAIpartitionNr'] == "undefined"){
-      $part['FAIpartitionNr'] = count($this->partitions) + 1;
+      $part['FAIpartitionNr'] = $this->get_free_partition_number();
+    }
+
+    /* Update the disk cn -       
+     * Do NOT touch the partition 'cn' in case of lvm or raid devices. 
+     */
+    if($this->FAIdiskType == "disk"){
       $part['cn'] = $this->DISKcn.$part['FAIpartitionNr'];
     }
-    $part['cn'] = $this->DISKcn.$part['FAIpartitionNr'];
+
+    /* Check if we've to update partition names of lvm compilations.
+     */ 
+    if($this->FAIdiskType == "lvm"){
+      if(isset($this->partitions[$part['FAIpartitionNr']])){
+        $old_cn = $this->partitions[$part['FAIpartitionNr']]['cn'];
+        $new_cn = $part['cn'];
+        if(isset($this->lvmDevices[$old_cn])){
+          unset($this->lvmDevices[$old_cn]);
+          $this->lvmDevices[$new_cn] = $new_cn;
+        }
+      }
+    }
+
+    /* Set raid names to md#
+     */ 
+    if($this->FAIdiskType == "raid"){
+      $part['cn'] = 'md'.$part['FAIpartitionNr'];
+    }
+
     $this->partitions[$part['FAIpartitionNr']] = $part;
   }
 
 
+  /* This method generates the partition listing with all necessary info,
+   *  depending on the disk type.
+   */
   function generateParts()
   {
-
-    $divlist = new divSelectBox("DiskEntries"); 
+    $data = $lData = array();
     foreach($this->partitions as $key => $part){
-      $number =array(
-          "string" => $part['FAIpartitionNr'],
-          "attach" => "style='width:20px;'");
-      $size   =array(
-          "string" => $part['FAIpartitionSize'],
-          "attach" => "style='width:100px;'");
-      $fstype =array(
-          "string" => $part['FAIfsType'],
-          "attach" => "style='width:60px;'");
-      $type   =array(
-          "string" => $part['FAIpartitionType'],
-          "attach" => "style='width:80px;'");
-      $opt    =array(
-          "string" => $part['FAImountOptions'],
-          "attach" => "style='width:80px;'");
-      $fsopt  =array(
-          "string" => $part['FAIfsOptions'],
-          "attach" => "style='width:80px;'");
-      $flags  =array(
-          "string" => $part['FAIpartitionFlags'],
-          "attach" => "style='width:80px;'");
-      $mntp   =array("string" => $part['FAImountPoint']);
-
-   
-      $action =array(
-          "string" => "<input type='image' src='images/lists/edit.png' name='EditPartition_".$key."'>".
-                      "<input type='image' src='images/lists/trash.png' name='RemovePartition_".$key."'>",
-          "attach" => "style='width:40px;'");
+    
+      $cn       = $part['cn'];
+      $desc     = $part['description'];
+      $number   = $part['FAIpartitionNr'];
+      $size     = $part['FAIpartitionSize'];
+      $type     = $part['FAIpartitionType'];
+
+      // Remove encryption info from the mount point.
+      $mnt = $part['FAImountPoint'];
+      if(preg_match("/:encrypt/", $mnt)){
+        $mnt = preg_replace("/:encrypt/","",$mnt);
+      }
 
-      $fields = array($number,$type,$mntp,$size,$fstype, $opt,$fsopt,$flags,$action);
-      $divlist->AddEntry($fields);
+      // create human readable strings out of the flags.
+      $opt = "";
+      if(isset($part['encrypted']) && $part['encrypted']){
+        $opt.= "&nbsp;"._("encrypted").", ";
+      }      
+      if(isset($part['bootable']) && $part['bootable']){
+        $opt.= "&nbsp;"._("boot able").", ";
+      }      
+      if(isset($part['preserve']) && $part['preserve']){
+        $opt.= "&nbsp;"._("preserve").":&nbsp;".$part['preserveType'].", ";
+      }     
+
+      // Combine options to a single table col. 
+      $opt = "<i>".preg_replace('/, $/',"",$opt)."&nbsp;</i>";
+
+      // Build up info table, depending on the disk type. 
+      $data[$key]=$key;
+      if($this->FAIdiskType == "lvm"){
+        $lData[$key]=array('data' => array($cn,$desc,"",$mnt,$opt,$size));
+      }elseif($this->FAIdiskType == "raid"){
+        $raid = $part['FAIpartitionType']." (".$part['FAIpartitionSize'].")";
+        $lData[$key]=array('data' => array($cn,$desc,$raid,$mnt,$opt));
+      }else{
+        $lData[$key]=array('data' => array("",$desc,$type,$mnt,$opt,$size));
+      }
     }
-    return($divlist->DrawList());    
+    $this->diskList->setListData($data,$lData);
+    $acl = "rwcdm";
+    if(preg_match("/freeze/", $this->FAIstate)) $acl = "r";
+    $this->diskList->setAcl($acl);;
+    $this->diskList->update();
+    return($this->diskList->render());
   }
 
 
@@ -404,23 +535,23 @@ class faiDiskEntry extends plugin
     $tmp = array();
     $tmp['cn']          = $this->DISKcn;
 
-    /* Attach partitions */
+    /* Attach partitions. 
+     * And prepare names and numbers.
+     */
     foreach($this->partitions as $key=>$val) {
       $this->partitions[$key]['FAIpartitionNr']=$key;
-      $this->partitions[$key]['cn'] = $this->DISKcn.$key;
-    }
-
-    /* Attach deleted */
-    foreach($this->deletePartitions as $key=>$val) {
-      $this->partitions[$key."-delete"]=$val;
-      $this->partitions[$key."-delete"]['status']="delete";
+      if($this->FAIdiskType == "disk"){
+        $this->partitions[$key]['cn'] = $this->DISKcn.$key;
+      }elseif($this->FAIdiskType == "lvm"){
+        $this->partitions[$key]['FAIpartitionType'] = 'lvm';
+      }
     }
 
     $tmp['description'] = $this->DISKdescription;
     $tmp['partitions']  = $this->partitions;
-    $tmp['status']      = $this->status;
     $tmp['FAIdiskType'] = $this->FAIdiskType;
 
+    // Add lvm devices if available.
     $tmp['FAIlvmDevice'] = array();
     foreach($this->lvmDevices as $dev){
       $tmp['FAIlvmDevice'][] = $dev;
@@ -441,6 +572,8 @@ class faiDiskEntry extends plugin
     $preserve_always = "";
     $preserve_reinstall = "";
 
+    /* Assemble boot, resize and preserve flags 
+     */
     foreach($tmp['partitions'] as $id => $part){
       if(isset($part['bootable']) && $part['bootable']){
         $bootable .= $id.",";
@@ -455,7 +588,6 @@ class faiDiskEntry extends plugin
           $preserve_reinstall .= $id.",";
         }
       }
-      $tmp['partitions'][$id]['status'] = $part['status'];
 
       // Unset non valid attributes 
       foreach(array("bootable","encrypted","preserve","preserveType","resize","FAIdiskType") as $attr){
@@ -465,6 +597,8 @@ class faiDiskEntry extends plugin
       }
     }    
 
+    /* Assembe disk flags
+     */
     if(!empty($bootable)){
       $tmp['FAIdiskOption'][] = "bootable:".trim($bootable,",");
     }
@@ -478,7 +612,6 @@ class faiDiskEntry extends plugin
       $tmp['FAIdiskOption'][] = "preserve_reinstall:".trim($preserve_reinstall,",");
     }
 
-    $tmp['status'] = $this->status;
     return($tmp);
   }
 
@@ -491,10 +624,10 @@ class faiDiskEntry extends plugin
 
       // Save posted disk label and fstab key
       if (isset($_POST['disklabel']) && preg_match("/^(msdos|gpt)$/", $_POST['disklabel'])){
-        $this->disklabel= $_POST['disklabel'];
+        $this->disklabel= get_post('disklabel');
       }
       if (isset($_POST['fstabkey']) && preg_match("/^(device|label|uuid)$/", $_POST['fstabkey'])){
-        $this->fstabkey= $_POST['fstabkey'];
+        $this->fstabkey= get_post('fstabkey');
       }
     }
   }
@@ -514,31 +647,46 @@ class faiDiskEntry extends plugin
     if(preg_match("/[^a-z0-9_\-]/i",$d)){
       $message[] = msgPool::invalid(_("Name"),$d,"/[a-z0-9_\-]/i");
     }
-       
-    /* check every partition.
-     * if there is an invalid value defined, append an errorstr to message
-     */
 
-    /* Array that contain every partitionname mountpoint etc already assigned */
-    $alreadyUsed    = array();
-    foreach($this->UsedAttrs as $attrs){
-      $alreadyUsed[$attrs] = array();
-    }      
+    return ($message);
+  }
+
 
-    $cnt = 0;
-    foreach($this->partitions as $key => $part){
-      if($part['FAIpartitionType'] == "primary"){
-        $cnt ++ ; 
+  /* Checks the disk combinations.
+   * 
+   */  
+  function check_disks($disk_to_add = array())
+  {
+    $msgs = array();
+
+    /* Check 'disk' combinations. 
+     *  - There can be four primary partitions.
+     *  - If there is at least one 'logical' partition, then there can be only 
+     *     three 'primary' partitions.
+     */    
+    if($this->FAIdiskType == "disk"){
+     
+      $types = array('logical' => array(), 'primary' => array());
+      $types[$disk_to_add['FAIpartitionType']][$disk_to_add['FAIpartitionNr']] = 1;
+      foreach($this->partitions as $key => $part){
+        $types[$part['FAIpartitionType']][$part['FAIpartitionNr']] = 1;
+      }
+
+      // There can only be four primary partitions per disk - without any logical partition.
+      if(count($types['logical']) == 0){
+        if(count($types['primary']) > 4){
+          $msgs[] = _("You have more than four primary partition table entries in your configuration, please check your configuration twice.");
+        }
+      }else{
+        if(count($types['primary']) > 3){
+          $msgs[] = _("You cannot have more than three primary partition while using logical partitions, please check your configuration twice.");
+        }
       }
-    }
-    if($cnt > 3){
-      $message[] = _("You have more than 3 primary partition table entries in your configuration, please check your configuration twice.");
     }
 
-    return ($message);
-  }
+    return($msgs);
+  }  
 
-  
 
   /* Return plugin informations for acl handling */
   static function plInfo()
@@ -565,7 +713,6 @@ class faiDiskEntry extends plugin
             "FAIpartitionFlags" => _("Partition flags"))
           ));
   }
-
  
 }