From 3cb25071ac73e5ea76b6b3f660ccffc014d7a369 Mon Sep 17 00:00:00 2001 From: hickert Date: Tue, 28 Jul 2009 09:25:23 +0000 Subject: [PATCH] Updated lvm handling - Fai partitions. -We can now save raids and volume groups. git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@13955 594d385d-05f5-0310-b6e9-bd551577e9d8 --- .../fai/admin/fai/class_faiDiskEntry.inc | 2 + .../fai/admin/fai/class_faiLvmEntry.inc | 526 ++++++++++++++++++ .../fai/admin/fai/class_faiPartitionTable.inc | 47 +- .../fai/admin/fai/class_faiRaidEntry.inc | 526 ++++++++++++++++++ .../fai/admin/fai/faiPartitionTable.tpl | 1 + 5 files changed, 1101 insertions(+), 1 deletion(-) create mode 100644 gosa-plugins/fai/admin/fai/class_faiLvmEntry.inc create mode 100644 gosa-plugins/fai/admin/fai/class_faiRaidEntry.inc diff --git a/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc b/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc index 03d3e062e..19f85219c 100644 --- a/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc +++ b/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc @@ -21,6 +21,7 @@ class faiDiskEntry extends plugin var $disklabel = "msdos"; var $FAIstate = ""; + var $FAIdiskType = "disk"; function faiDiskEntry (&$config, $dn= NULL,$usedDiskNames=array(),$disk=false) { @@ -353,6 +354,7 @@ class faiDiskEntry extends plugin $tmp['description'] = $this->DISKdescription; $tmp['partitions'] = $this->partitions; $tmp['status'] = $this->status; + $tmp['FAIdiskType'] = $this->FAIdiskType; /* Assemble flags */ $tmp['FAIdiskOption'] = array("fstabkey:".$this->fstabkey, "disklabel:".$this->disklabel); diff --git a/gosa-plugins/fai/admin/fai/class_faiLvmEntry.inc b/gosa-plugins/fai/admin/fai/class_faiLvmEntry.inc new file mode 100644 index 000000000..23ae1066c --- /dev/null +++ b/gosa-plugins/fai/admin/fai/class_faiLvmEntry.inc @@ -0,0 +1,526 @@ +UsedAttrs = array("cn","description","FAIpartitionType","FAIpartitionNr","FAIfsType","FAImountPoint","FAIpartitionSize", + "FAImountOptions","FAIfsOptions","FAIpartitionFlags"); + + /* Default status is new */ + $this->status = "new"; + + /* We want to edit an entry */ + if($disk){ + + /* Set disk status */ + $this->status = $disk['status']; + + /* Walk through partitions */ + foreach($disk['partitions'] as $name => $values){ + + /* If a partition is already marked as delete, attach it to deletePartitions only. */ + if($values['status'] == "delete"){ + unset($disk['partitions'][$name]); + $this->deletePartitions[]=$values; + }else{ + + /* Set status, to know which partition must be deleted from ldap + new : Neu partition entry // save + edited : Update partition entry in ldap + deleted: Remove partition from ldap + */ + + /* 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"; + } + + $disk['partitions'][$name]['old_cn']= $disk['partitions'][$name]['cn']; + + /* Assign empty attributes, if attribute is missing */ + 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']); + } + } + } + + /* Set default attributes */ + $this->DISKcn = $disk['cn']; + $this->DISKdescription = $disk['description']; + $this->partitions = $disk['partitions']; + $this->is_edit = true; + $this->old_cn = $disk['cn']; + + /* Move faiDiskOption */ + if (isset($disk['FAIdiskOption'])){ + foreach($disk['FAIdiskOption'] as $option) { + if (preg_match("/fstabkey:(device|label|uuid)/", $option)){ + $this->fstabkey= preg_replace("/^.*fstabkey:(device|label|uuid).*$/", "$1", $option); + break; + } + if (preg_match("/disklabel:(msdos|gpt)/", $option)){ + $this->disklabel= preg_replace("/^.*disklabel:(msdos|gpt).*$/", "$1", $option); + break; + } + } + } else { + $this->fstabkey= "device"; + } + + } + } + + + function execute() + { + /* Call parent execute */ + plugin::execute(); + + /* Fill templating stuff */ + $smarty = get_smarty(); + $s_action = ""; + $s_entry = ""; + $display = ""; + + /* Load parameters */ + if (isset($_POST['disklabel']) && preg_match("/^(msdos|gpt)$/", $_POST['disklabel'])){ + $this->disklabel= $_POST['disklabel']; + } + if (isset($_POST['fstabkey']) && preg_match("/^(device|label|uuid)$/", $_POST['fstabkey'])){ + $this->fstabkey= $_POST['fstabkey']; + } + + /* Assign values + * And Checkbox selection + */ + foreach($this->attributes as $attrs){ + $smarty->assign($attrs,$this->$attrs); + if($this->$attrs){ + $smarty->assign($attrs."CHK"," "); + }else{ + $smarty->assign($attrs."CHK"," disabled "); + } + } + + /* 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("/Delete_.*/",$name)) && $this->acl_is_removeable() && !preg_match("/freeze/i",$this->FAIstate)){ + $tmp = split("_",$name); + $s_action = "remove"; + $s_entry = $tmp[1]; + } + } + + /* To remove a partition we unset the index posted. + * We must sort the index again, else we possibly got problems + * with partitions order. + */ + if($s_action == "remove" && $this->acl_is_removeable() && !preg_match("/freeze/i",$this->FAIstate)){ + if($this->partitions[$s_entry]['status'] == "edited"){ + $this->deletePartitions[$s_entry]= $this->partitions[$s_entry]; + $this->deletePartitions[$s_entry]['FAIpartitionNr']=$s_entry; + unset($this->partitions[$s_entry]); + }else{ + unset($this->partitions[$s_entry]); + } + $tmp= array(); + foreach($this->partitions as $part){ + $tmp[count($tmp)+1]=$part; + } + $this->partitions = $tmp; + } + + /* To add a partitions we only append an empty + * array to the already defined partitions. + */ + if(isset($_POST['AddPartition']) && $this->acl_is_createable() && !preg_match("/freeze/i",$this->FAIstate)){ + foreach($this->UsedAttrs as $attr){ + $tmp[$attr] = ""; + } + $tmp["old_cn"] = ""; + $tmp['status']="new"; + $this->partitions[count($this->partitions)+1]=$tmp; + } + + /* $setup contains a table with the partitions. + */ + $smarty->assign("setup", $this->generateParts()); + foreach($this->attributes as $attr){ + $smarty->assign($attr,$this->$attr); + } + + $tmp = $this->plInfo(); + $sacl = ""; + foreach($tmp['plProvidedAcls'] as $name => $translated){ + $acl = $this->getacl($name, preg_match("/freeze/i",$this->FAIstate)); + $smarty->assign($name."ACL",$acl); + } + + $smarty->assign("sub_object_is_createable",$this->acl_is_createable()); + $smarty->assign("freeze",preg_match("/freeze/i",$this->FAIstate)); + + // Fill boxes + $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); + + /* Fetch template and show the result + */ + $display.= $smarty->fetch(get_template_path('faiDiskEntry.tpl', TRUE)); + return($display); + } + + function generateParts() + { + /* Define Arrays with allowed syntax */ + $PartitionTypes = array("primary"=>_("primary"),"logical"=>_("logical")); + $FAIfsTypes = array("ext2","ext3","xfs","swap","reiser","dosfat16","winfat32"); + + /* Display Header */ + $str = ""; + if (count($this->partitions)){ + $str .= ""; + $str .= ""._("Type").""; + $str .= ""._("FS type").""; + $str .= ""._("Mount point").""; + $str .= ""._("Size in MB").""; + $str .= ""._("Mount options").""; + $str .= ""._("FS option").""; + $str .= ""._("Preserve").""; + $str .= " "; + $str .= ""; + } + + /* Walk through all defined partitions. + * Create a new row for each partition and append it to + * the header defined above. + * To be able to check the posts later, we append a key to each single postfield. like cn_1 ... cn_2 + */ + foreach($this->partitions as $key => $part){ + + $dis = ""; + if($part['FAIpartitionFlags'] == "preserve"){ + $dis = " disabled "; + } + + $disableALL = ""; + if (preg_match("/freeze/", $this->FAIstate)){ + $disableALL = " disabled "; + } + + if($part['status']!="delete"){ + + /* Generate Partition select box + */ + $PartitionType = ""; + if($this->acl_is_writeable("FAIpartitionType")){ + $PartitionType = ""; + }elseif($this->acl_is_readable("FAIpartitionType")){ + $PartitionType = $part['FAIpartitionType']; + } + + + /* Generate fsType select box + */ + $FAIfsType= ""; + if($this->acl_is_writeable("FAIfsType")){ + $FAIfsType= ""; + }elseif($this->acl_is_readable("FAIfsType")){ + $FAIfsType = $part['FAIfsType']; + } + + foreach(array("FAImountPoint","FAIpartitionSize","FAImountOptions","FAIfsOptions") as $attr){ + $$attr = ""; + if($this->acl_is_writeable($attr)){ + $$attr = ""; + + }elseif($this->acl_is_readable($attr)){ + $$attr = $part[$attr]; + } + } + + + $str .= "\n"; + $str .= "\n".$PartitionType.""; + $str .= "\n".$FAIfsType.""; + $str .= "\n".$FAImountPoint.""; + $str .= "\n".$FAIpartitionSize.""; + $str .= "\n".$FAImountOptions.""; + $str .= "\n".$FAIfsOptions.""; + + $changeState = "onClick=\"changeState('FAImountPoint_".$key."') ; ". + "changeState('FAIpartitionSize_".$key."') ; ". + "changeState('FAImountOptions_".$key."') ; ". + "changeState('FAIfsType_".$key."') ; ". + "changeState('FAIfsOptions_".$key."') ; \""; + + if($this->acl_is_writeable("FAIpartitionFlags")){ + if($part['FAIpartitionFlags']!=false){ + $str .= "\n"; + }else{ + $str .= "\n"; + } + }else{ + if($part['FAIpartitionFlags']!=false){ + $str .= ""._("False").""; + }else{ + $str .= ""._("True").""; + } + } + if($this->acl_is_removeable()){ + $str .= "\n"; + }else{ + $str .= "\n"; + } + $str .= "\n"; + } + } + + if(!empty($str)){ + $str = "".$str."
"; + } + return($str); + + } + + function save() + { + $tmp = array(); + $tmp['cn'] = $this->DISKcn; + + /* Attach partitions */ + foreach($this->partitions as $key=>$val) { + $this->partitions[$key]['FAIpartitionNr']=$key; + } + + /* Attach deleted */ + foreach($this->deletePartitions as $key=>$val) { + $this->partitions[$key."-delete"]=$val; + $this->partitions[$key."-delete"]['status']="delete"; + } + + $tmp['description'] = $this->DISKdescription; + $tmp['partitions'] = $this->partitions; + $tmp['status'] = $this->status; + $tmp['FAIdiskType'] = $this->FAIdiskType; + + /* Assemble flags */ + $tmp['FAIdiskOption'] = array("fstabkey:".$this->fstabkey, "disklabel:".$this->disklabel); + + /* If hdd name has changed, tell partitionTable to rename it */ + if(($this->is_edit)&&($this->old_cn != $this->DISKcn)){ + $tmp['rename']['from'] = $this->old_cn; + $tmp['rename']['to'] = $this->DISKcn; + } + return($tmp); + } + + + /* Save data to object */ + function save_object() + { + if((isset($_POST['TableEntryFrameSubmitted'])) && !preg_match("/freeze/", $this->FAIstate) ){ + plugin::save_object(); + + foreach($this->partitions as $key => $part){ + foreach($this->UsedAttrs as $attrs){ + + if($this->acl_is_writeable($attrs)){ + + if(isset($_POST[$attrs."_".$key])){ + $this->partitions[$key][$attrs] = $_POST[$attrs."_".$key]; + }else{ + $this->partitions[$key][$attrs] = false; + } + } + } + + /* Adapt ext3 to have -j option */ + if ($this->partitions[$key]["FAIfsType"] == "ext3") { + $this->partitions[$key]["FAIfsOptions"]= preg_replace('/\s*-j\s*/', '', $this->partitions[$key]["FAIfsOptions"]); + $this->partitions[$key]["FAIfsOptions"]= "-j ".$this->partitions[$key]["FAIfsOptions"]; + } + } + + } + } + + + /* Check supplied data */ + function check() + { + /* Call common method to give check the hook */ + $message= plugin::check(); + + /* Check for an empty disk name */ + $d = trim($this->DISKcn); + if($d == "" ){ + $message[] = msgPool::required(_("Name")); + } + 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(); + } + + foreach($this->partitions as $key => $part){ + + /* Skip all checks, if preserve is set */ + if($part['FAIpartitionFlags'] == "preserve"){ + $this->partitions[$key]['FAIfsType'] = "preserve"; + $this->partitions[$key]['FAIpartitionSize'] = "preserve"; + continue; + } + + if($part['FAImountPoint'] != "-" && (in_array($part['FAImountPoint'],$alreadyUsed['FAImountPoint']))&&($part['FAIfsType']!="swap")){ + $message[]=sprintf(_("Please enter a unique mount point for partition %s"),($key)); + } + + if($part['FAIfsType']!="swap" && $part['FAImountPoint'] != "-"){ + if((empty($part['FAImountPoint']))||(!((preg_match("/^\/.*/",$part['FAImountPoint']))||(preg_match("/^swap$/",$part['FAImountPoint']))))){ + $message[]= msgPool::invalid(sprintf(_("partition %s mount point"),$key)); + } + } + if($part['FAIfsType'] == "swap"){ + if(in_array($part['FAIfsType'],$alreadyUsed['FAIfsType'])){ + $message[]=sprintf(_("File system type 'swap' is already used, change file system type for partition %s."),$key); + } + } + if(($part['FAIfsType'] == "swap")&&(!empty($part['FAImountPoint']))&&($part['FAImountPoint']!="swap")){ + $message[]=_("Please use 'swap' as mount point, if 'swap' is used as fs-type."); + } + + $tmp = split("-",$part['FAIpartitionSize']); + switch (count($tmp)){ + case 0: + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + break; + case 1: + if (!tests::is_id($tmp[0]) &&(!empty($tmp[1]))){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + break; + + case 2: + if( !tests::is_id($tmp[0]) && !tests::is_id($tmp[1]) && !empty($tmp[1]) ){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + }elseif(!empty($tmp[1]) && $tmp[0]>=$tmp[1]){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + break; + + default: + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + + foreach($this->UsedAttrs as $attrs){ + $alreadyUsed[$attrs][$key] = $part[$attrs]; + } + } + + $cnt = 0; + foreach($this->partitions as $key => $part){ + if($part['FAIpartitionType'] == "primary"){ + $cnt ++ ; + } + } + if($cnt > 3){ + $message[] = _("You have more than 3 primary partition table entries in your configuration, please check your configuration twice."); + } + + return ($message); + } + + + + /* Return plugin informations for acl handling */ + static function plInfo() + { + return (array( + "plShortName" => _("Partition table entry"), + "plDescription" => _("FAI partition table entry"), + "plSelfModify" => FALSE, + "plDepends" => array(), + "plPriority" => 27, + "plSection" => array("administration"), + "plCategory" => array("fai"), + "plProvidedAcls" => array( + "DISKcn" => _("Name"), + "DISKdescription" => _("Description"), + "DISKFAIdiskOption" => _("Disk options"), + "FAIpartitionType" => _("Partition type"), + "FAIpartitionNr" => _("Partition no."), + "FAIfsType" => _("File system type"), + "FAImountPoint" => _("Mount point"), + "FAIpartitionSize" => _("Partition size"), + "FAImountOptions" => _("Mount options"), + "FAIfsOptions" => _("File system options"), + "FAIpartitionFlags" => _("Partition flags")) + )); + } + + +} + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc b/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc index 83d24b2bb..866ff64a2 100644 --- a/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc +++ b/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc @@ -141,6 +141,38 @@ class faiPartitionTable extends plugin $this->is_dialog = true; } + /* Add Disk to this Partitionset + * This code adds a new HDD to the disks + * A new Dialog will be opened + */ + if(isset($_POST['AddRaid']) && !preg_match("/freeze/i",$this->FAIstate)){ + $usedDiskNames =array(); + foreach($this->disks as $key=>$disk){ + $usedDiskNames[]= $key; + } + $this->dialog = new faiRaidEntry($this->config,$this->dn,$usedDiskNames); + $this->dialog->set_acl_base($this->acl_base_for_current_object($this->dn)); + $this->dialog->set_acl_category("fai"); + $this->dialog->FAIstate = $this->FAIstate; + $this->is_dialog = true; + } + + /* Add Disk to this Partitionset + * This code adds a new HDD to the disks + * A new Dialog will be opened + */ + if(isset($_POST['AddVolgroup']) && !preg_match("/freeze/i",$this->FAIstate)){ + $usedDiskNames =array(); + foreach($this->disks as $key=>$disk){ + $usedDiskNames[]= $key; + } + $this->dialog = new faiLvmEntry($this->config,$this->dn,$usedDiskNames); + $this->dialog->set_acl_base($this->acl_base_for_current_object($this->dn)); + $this->dialog->set_acl_category("fai"); + $this->dialog->FAIstate = $this->FAIstate; + $this->is_dialog = true; + } + /* Edit disk. * Open dialog which allows us to edit the selected entry */ @@ -449,6 +481,15 @@ class faiPartitionTable extends plugin $this->$attrs = $_POST[$attrs]; } } + if(isset($_POST['faiPartitionTable'])){ + if(!count($this->disks)){ + if(isset($_POST['mode'])){ + $this->FAIpartitionMethod = "setup-storage"; + }else{ + $this->FAIpartitionMethod = ""; + } + } + } } @@ -510,7 +551,11 @@ class faiPartitionTable extends plugin foreach($order as $cn=>$disk){ $disk_dn = "cn=".$disk['cn'].",".$this->dn; $disk_attrs['cn'] = $disk['cn']; - $disk_attrs['description'] = $disk['description']; + $disk_attrs['description'] = $disk['description']; + + if(isset($disk['FAIdiskType'])){ + $disk_attrs['FAIdiskType'] = $disk['FAIdiskType']; + } if(empty($disk_attrs['description']) && $disk['status'] == "edited"){ $disk_attrs['description'] = array(); diff --git a/gosa-plugins/fai/admin/fai/class_faiRaidEntry.inc b/gosa-plugins/fai/admin/fai/class_faiRaidEntry.inc new file mode 100644 index 000000000..d47a58325 --- /dev/null +++ b/gosa-plugins/fai/admin/fai/class_faiRaidEntry.inc @@ -0,0 +1,526 @@ +UsedAttrs = array("cn","description","FAIpartitionType","FAIpartitionNr","FAIfsType","FAImountPoint","FAIpartitionSize", + "FAImountOptions","FAIfsOptions","FAIpartitionFlags"); + + /* Default status is new */ + $this->status = "new"; + + /* We want to edit an entry */ + if($disk){ + + /* Set disk status */ + $this->status = $disk['status']; + + /* Walk through partitions */ + foreach($disk['partitions'] as $name => $values){ + + /* If a partition is already marked as delete, attach it to deletePartitions only. */ + if($values['status'] == "delete"){ + unset($disk['partitions'][$name]); + $this->deletePartitions[]=$values; + }else{ + + /* Set status, to know which partition must be deleted from ldap + new : Neu partition entry // save + edited : Update partition entry in ldap + deleted: Remove partition from ldap + */ + + /* 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"; + } + + $disk['partitions'][$name]['old_cn']= $disk['partitions'][$name]['cn']; + + /* Assign empty attributes, if attribute is missing */ + 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']); + } + } + } + + /* Set default attributes */ + $this->DISKcn = $disk['cn']; + $this->DISKdescription = $disk['description']; + $this->partitions = $disk['partitions']; + $this->is_edit = true; + $this->old_cn = $disk['cn']; + + /* Move faiDiskOption */ + if (isset($disk['FAIdiskOption'])){ + foreach($disk['FAIdiskOption'] as $option) { + if (preg_match("/fstabkey:(device|label|uuid)/", $option)){ + $this->fstabkey= preg_replace("/^.*fstabkey:(device|label|uuid).*$/", "$1", $option); + break; + } + if (preg_match("/disklabel:(msdos|gpt)/", $option)){ + $this->disklabel= preg_replace("/^.*disklabel:(msdos|gpt).*$/", "$1", $option); + break; + } + } + } else { + $this->fstabkey= "device"; + } + + } + } + + + function execute() + { + /* Call parent execute */ + plugin::execute(); + + /* Fill templating stuff */ + $smarty = get_smarty(); + $s_action = ""; + $s_entry = ""; + $display = ""; + + /* Load parameters */ + if (isset($_POST['disklabel']) && preg_match("/^(msdos|gpt)$/", $_POST['disklabel'])){ + $this->disklabel= $_POST['disklabel']; + } + if (isset($_POST['fstabkey']) && preg_match("/^(device|label|uuid)$/", $_POST['fstabkey'])){ + $this->fstabkey= $_POST['fstabkey']; + } + + /* Assign values + * And Checkbox selection + */ + foreach($this->attributes as $attrs){ + $smarty->assign($attrs,$this->$attrs); + if($this->$attrs){ + $smarty->assign($attrs."CHK"," "); + }else{ + $smarty->assign($attrs."CHK"," disabled "); + } + } + + /* 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("/Delete_.*/",$name)) && $this->acl_is_removeable() && !preg_match("/freeze/i",$this->FAIstate)){ + $tmp = split("_",$name); + $s_action = "remove"; + $s_entry = $tmp[1]; + } + } + + /* To remove a partition we unset the index posted. + * We must sort the index again, else we possibly got problems + * with partitions order. + */ + if($s_action == "remove" && $this->acl_is_removeable() && !preg_match("/freeze/i",$this->FAIstate)){ + if($this->partitions[$s_entry]['status'] == "edited"){ + $this->deletePartitions[$s_entry]= $this->partitions[$s_entry]; + $this->deletePartitions[$s_entry]['FAIpartitionNr']=$s_entry; + unset($this->partitions[$s_entry]); + }else{ + unset($this->partitions[$s_entry]); + } + $tmp= array(); + foreach($this->partitions as $part){ + $tmp[count($tmp)+1]=$part; + } + $this->partitions = $tmp; + } + + /* To add a partitions we only append an empty + * array to the already defined partitions. + */ + if(isset($_POST['AddPartition']) && $this->acl_is_createable() && !preg_match("/freeze/i",$this->FAIstate)){ + foreach($this->UsedAttrs as $attr){ + $tmp[$attr] = ""; + } + $tmp["old_cn"] = ""; + $tmp['status']="new"; + $this->partitions[count($this->partitions)+1]=$tmp; + } + + /* $setup contains a table with the partitions. + */ + $smarty->assign("setup", $this->generateParts()); + foreach($this->attributes as $attr){ + $smarty->assign($attr,$this->$attr); + } + + $tmp = $this->plInfo(); + $sacl = ""; + foreach($tmp['plProvidedAcls'] as $name => $translated){ + $acl = $this->getacl($name, preg_match("/freeze/i",$this->FAIstate)); + $smarty->assign($name."ACL",$acl); + } + + $smarty->assign("sub_object_is_createable",$this->acl_is_createable()); + $smarty->assign("freeze",preg_match("/freeze/i",$this->FAIstate)); + + // Fill boxes + $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); + + /* Fetch template and show the result + */ + $display.= $smarty->fetch(get_template_path('faiDiskEntry.tpl', TRUE)); + return($display); + } + + function generateParts() + { + /* Define Arrays with allowed syntax */ + $PartitionTypes = array("primary"=>_("primary"),"logical"=>_("logical")); + $FAIfsTypes = array("ext2","ext3","xfs","swap","reiser","dosfat16","winfat32"); + + /* Display Header */ + $str = ""; + if (count($this->partitions)){ + $str .= ""; + $str .= ""._("Type").""; + $str .= ""._("FS type").""; + $str .= ""._("Mount point").""; + $str .= ""._("Size in MB").""; + $str .= ""._("Mount options").""; + $str .= ""._("FS option").""; + $str .= ""._("Preserve").""; + $str .= " "; + $str .= ""; + } + + /* Walk through all defined partitions. + * Create a new row for each partition and append it to + * the header defined above. + * To be able to check the posts later, we append a key to each single postfield. like cn_1 ... cn_2 + */ + foreach($this->partitions as $key => $part){ + + $dis = ""; + if($part['FAIpartitionFlags'] == "preserve"){ + $dis = " disabled "; + } + + $disableALL = ""; + if (preg_match("/freeze/", $this->FAIstate)){ + $disableALL = " disabled "; + } + + if($part['status']!="delete"){ + + /* Generate Partition select box + */ + $PartitionType = ""; + if($this->acl_is_writeable("FAIpartitionType")){ + $PartitionType = ""; + }elseif($this->acl_is_readable("FAIpartitionType")){ + $PartitionType = $part['FAIpartitionType']; + } + + + /* Generate fsType select box + */ + $FAIfsType= ""; + if($this->acl_is_writeable("FAIfsType")){ + $FAIfsType= ""; + }elseif($this->acl_is_readable("FAIfsType")){ + $FAIfsType = $part['FAIfsType']; + } + + foreach(array("FAImountPoint","FAIpartitionSize","FAImountOptions","FAIfsOptions") as $attr){ + $$attr = ""; + if($this->acl_is_writeable($attr)){ + $$attr = ""; + + }elseif($this->acl_is_readable($attr)){ + $$attr = $part[$attr]; + } + } + + + $str .= "\n"; + $str .= "\n".$PartitionType.""; + $str .= "\n".$FAIfsType.""; + $str .= "\n".$FAImountPoint.""; + $str .= "\n".$FAIpartitionSize.""; + $str .= "\n".$FAImountOptions.""; + $str .= "\n".$FAIfsOptions.""; + + $changeState = "onClick=\"changeState('FAImountPoint_".$key."') ; ". + "changeState('FAIpartitionSize_".$key."') ; ". + "changeState('FAImountOptions_".$key."') ; ". + "changeState('FAIfsType_".$key."') ; ". + "changeState('FAIfsOptions_".$key."') ; \""; + + if($this->acl_is_writeable("FAIpartitionFlags")){ + if($part['FAIpartitionFlags']!=false){ + $str .= "\n"; + }else{ + $str .= "\n"; + } + }else{ + if($part['FAIpartitionFlags']!=false){ + $str .= ""._("False").""; + }else{ + $str .= ""._("True").""; + } + } + if($this->acl_is_removeable()){ + $str .= "\n"; + }else{ + $str .= "\n"; + } + $str .= "\n"; + } + } + + if(!empty($str)){ + $str = "".$str."
"; + } + return($str); + + } + + function save() + { + $tmp = array(); + $tmp['cn'] = $this->DISKcn; + + /* Attach partitions */ + foreach($this->partitions as $key=>$val) { + $this->partitions[$key]['FAIpartitionNr']=$key; + } + + /* Attach deleted */ + foreach($this->deletePartitions as $key=>$val) { + $this->partitions[$key."-delete"]=$val; + $this->partitions[$key."-delete"]['status']="delete"; + } + + $tmp['description'] = $this->DISKdescription; + $tmp['partitions'] = $this->partitions; + $tmp['status'] = $this->status; + $tmp['FAIdiskType'] = $this->FAIdiskType; + + /* Assemble flags */ + $tmp['FAIdiskOption'] = array("fstabkey:".$this->fstabkey, "disklabel:".$this->disklabel); + + /* If hdd name has changed, tell partitionTable to rename it */ + if(($this->is_edit)&&($this->old_cn != $this->DISKcn)){ + $tmp['rename']['from'] = $this->old_cn; + $tmp['rename']['to'] = $this->DISKcn; + } + return($tmp); + } + + + /* Save data to object */ + function save_object() + { + if((isset($_POST['TableEntryFrameSubmitted'])) && !preg_match("/freeze/", $this->FAIstate) ){ + plugin::save_object(); + + foreach($this->partitions as $key => $part){ + foreach($this->UsedAttrs as $attrs){ + + if($this->acl_is_writeable($attrs)){ + + if(isset($_POST[$attrs."_".$key])){ + $this->partitions[$key][$attrs] = $_POST[$attrs."_".$key]; + }else{ + $this->partitions[$key][$attrs] = false; + } + } + } + + /* Adapt ext3 to have -j option */ + if ($this->partitions[$key]["FAIfsType"] == "ext3") { + $this->partitions[$key]["FAIfsOptions"]= preg_replace('/\s*-j\s*/', '', $this->partitions[$key]["FAIfsOptions"]); + $this->partitions[$key]["FAIfsOptions"]= "-j ".$this->partitions[$key]["FAIfsOptions"]; + } + } + + } + } + + + /* Check supplied data */ + function check() + { + /* Call common method to give check the hook */ + $message= plugin::check(); + + /* Check for an empty disk name */ + $d = trim($this->DISKcn); + if($d == "" ){ + $message[] = msgPool::required(_("Name")); + } + 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(); + } + + foreach($this->partitions as $key => $part){ + + /* Skip all checks, if preserve is set */ + if($part['FAIpartitionFlags'] == "preserve"){ + $this->partitions[$key]['FAIfsType'] = "preserve"; + $this->partitions[$key]['FAIpartitionSize'] = "preserve"; + continue; + } + + if($part['FAImountPoint'] != "-" && (in_array($part['FAImountPoint'],$alreadyUsed['FAImountPoint']))&&($part['FAIfsType']!="swap")){ + $message[]=sprintf(_("Please enter a unique mount point for partition %s"),($key)); + } + + if($part['FAIfsType']!="swap" && $part['FAImountPoint'] != "-"){ + if((empty($part['FAImountPoint']))||(!((preg_match("/^\/.*/",$part['FAImountPoint']))||(preg_match("/^swap$/",$part['FAImountPoint']))))){ + $message[]= msgPool::invalid(sprintf(_("partition %s mount point"),$key)); + } + } + if($part['FAIfsType'] == "swap"){ + if(in_array($part['FAIfsType'],$alreadyUsed['FAIfsType'])){ + $message[]=sprintf(_("File system type 'swap' is already used, change file system type for partition %s."),$key); + } + } + if(($part['FAIfsType'] == "swap")&&(!empty($part['FAImountPoint']))&&($part['FAImountPoint']!="swap")){ + $message[]=_("Please use 'swap' as mount point, if 'swap' is used as fs-type."); + } + + $tmp = split("-",$part['FAIpartitionSize']); + switch (count($tmp)){ + case 0: + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + break; + case 1: + if (!tests::is_id($tmp[0]) &&(!empty($tmp[1]))){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + break; + + case 2: + if( !tests::is_id($tmp[0]) && !tests::is_id($tmp[1]) && !empty($tmp[1]) ){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + }elseif(!empty($tmp[1]) && $tmp[0]>=$tmp[1]){ + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + break; + + default: + $message[]= msgPool::invalid(sprintf(_("partition %s size"),$key)); + } + + foreach($this->UsedAttrs as $attrs){ + $alreadyUsed[$attrs][$key] = $part[$attrs]; + } + } + + $cnt = 0; + foreach($this->partitions as $key => $part){ + if($part['FAIpartitionType'] == "primary"){ + $cnt ++ ; + } + } + if($cnt > 3){ + $message[] = _("You have more than 3 primary partition table entries in your configuration, please check your configuration twice."); + } + + return ($message); + } + + + + /* Return plugin informations for acl handling */ + static function plInfo() + { + return (array( + "plShortName" => _("Partition table entry"), + "plDescription" => _("FAI partition table entry"), + "plSelfModify" => FALSE, + "plDepends" => array(), + "plPriority" => 27, + "plSection" => array("administration"), + "plCategory" => array("fai"), + "plProvidedAcls" => array( + "DISKcn" => _("Name"), + "DISKdescription" => _("Description"), + "DISKFAIdiskOption" => _("Disk options"), + "FAIpartitionType" => _("Partition type"), + "FAIpartitionNr" => _("Partition no."), + "FAIfsType" => _("File system type"), + "FAImountPoint" => _("Mount point"), + "FAIpartitionSize" => _("Partition size"), + "FAImountOptions" => _("Mount options"), + "FAIfsOptions" => _("File system options"), + "FAIpartitionFlags" => _("Partition flags")) + )); + } + + +} + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/gosa-plugins/fai/admin/fai/faiPartitionTable.tpl b/gosa-plugins/fai/admin/fai/faiPartitionTable.tpl index d7ff43f58..4e976aec0 100644 --- a/gosa-plugins/fai/admin/fai/faiPartitionTable.tpl +++ b/gosa-plugins/fai/admin/fai/faiPartitionTable.tpl @@ -55,6 +55,7 @@ +