From 00866cab6ca13b3791e9d86ae78383e02ca52906 Mon Sep 17 00:00:00 2001 From: cajus Date: Fri, 10 Jul 2009 10:18:21 +0000 Subject: [PATCH] Added new classes git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@13921 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-plugins/fai/admin/fai/class_FAI.inc | 7 +- .../fai/admin/fai/class_faiDiskEntry.inc | 493 ++++++++++++++++++ .../fai/admin/fai/class_faiPartitionTable.inc | 25 +- gosa-plugins/fai/admin/fai/faiDiskEntry.tpl | 87 ++++ 4 files changed, 603 insertions(+), 9 deletions(-) create mode 100644 gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc create mode 100644 gosa-plugins/fai/admin/fai/faiDiskEntry.tpl diff --git a/gosa-plugins/fai/admin/fai/class_FAI.inc b/gosa-plugins/fai/admin/fai/class_FAI.inc index 112368104..78861fb18 100644 --- a/gosa-plugins/fai/admin/fai/class_FAI.inc +++ b/gosa-plugins/fai/admin/fai/class_FAI.inc @@ -63,7 +63,7 @@ class FAI foreach($deps_to_search as $fai_base){ /* Ldap search for fai classes specified in this release */ - $attributes = array("dn","objectClass","FAIstate","cn","FAIdiskType","FAIlvmDevice"); + $attributes = array("dn","objectClass","FAIstate","cn","FAIdiskType","FAIlvmDevice","FAIdiskOption"); $res_tmp = get_list($filter,"fai",$fai_base,$attributes,GL_SUBSEARCH | GL_SIZELIMIT); /* check the returned objects, and add/replace them in our return variable */ @@ -103,6 +103,11 @@ class FAI $buffer['FAIdiskType'] = "old"; } + if(isset($attr['FAIdiskOption'])){ + $buffer['FAIdiskOption'] = $attr['FAIdiskOption']; + } else { + $buffer['FAIdiskOption'] = null; + } if(isset($attr['FAIlvmDevice'])){ $buffer['FAIlvmDevice'] = $attr['FAIlvmDevice']; } diff --git a/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc b/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc new file mode 100644 index 000000000..eee815772 --- /dev/null +++ b/gosa-plugins/fai/admin/fai/class_faiDiskEntry.inc @@ -0,0 +1,493 @@ +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']; + } + } + + + function execute() + { + /* Call parent execute */ + plugin::execute(); + + /* Fill templating stuff */ + $smarty = get_smarty(); + $s_action = ""; + $s_entry = ""; + $display = ""; + + /* 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", "device"); + $smarty->assign("disklabel", "msdos"); + + /* 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; + + /* 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((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 de7f3cdc6..83d24b2bb 100644 --- a/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc +++ b/gosa-plugins/fai/admin/fai/class_faiPartitionTable.inc @@ -50,14 +50,15 @@ class faiPartitionTable extends plugin // Transform disk type into image later... if (!isset($obj['FAIdiskType'])){ - $objects['type'] = "old"; + $objects['FAIdiskType'] = "old"; } else { - $objects['type'] = $obj['FAIdiskType']; + $objects['FAIdiskType'] = $obj['FAIdiskType']; } + $objects['FAIdiskOption'] = $obj['FAIdiskOption']; // Transform potential lvm information if (isset($obj['FAIlvmDevice'])){ - $objects['vg'] = $obj['FAIlvmDevice']; + $objects['FAIlvmDevice'] = $obj['FAIlvmDevice']; } $objects['dn'] = $obj['dn']; @@ -129,7 +130,11 @@ class faiPartitionTable extends plugin foreach($this->disks as $key=>$disk){ $usedDiskNames[]= $key; } - $this->dialog = new faiPartitionTableEntry($this->config,$this->dn,$usedDiskNames); + if ($this->FAIpartitionMethod == "setup-storage") { + $this->dialog = new faiDiskEntry($this->config,$this->dn,$usedDiskNames); + } else { + $this->dialog = new faiPartitionTableEntry($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; @@ -191,8 +196,8 @@ class faiPartitionTable extends plugin } // Used by volgroup? - if (isset($this->disks[$name]["vg"])){ - foreach ($this->disks[$name]["vg"] as $vg_element) { + if (isset($this->disks[$name]["FAIlvmDevice"])){ + foreach ($this->disks[$name]["FAIlvmDevice"] as $vg_element) { if (preg_match("/^${device}\.?[0-9]+$/", $vg_element)){ $ignore = true; break 2; @@ -246,7 +251,11 @@ class faiPartitionTable extends plugin $dn = "new"; } - $this->dialog = new faiPartitionTableEntry($this->config,$this->dn,$usedDiskNames,$this->disks[$Udisk]); + if ($this->FAIpartitionMethod == "setup-storage") { + $this->dialog = new faiDiskEntry($this->config,$this->dn,$usedDiskNames,$this->disks[$Udisk]); + } else { + $this->dialog = new faiPartitionTableEntry($this->config,$this->dn,$usedDiskNames,$this->disks[$Udisk]); + } $this->dialog->set_acl_base($this->acl_base_for_current_object($dn)); $this->dialog->set_acl_category("fai"); $this->dialog->FAIstate = $this->FAIstate; @@ -385,7 +394,7 @@ class faiPartitionTable extends plugin $edit_link = "".$key.""; $types= array("old" => "plugins/fai/images/fai_partitionTable.png", "disk" => "plugins/fai/images/fai_partitionTable.png", "raid" => "plugins/fai/images/raid.png", "lvm" => "plugins/ogroups/images/list_ogroup.png"); - $type = isset($disk['type'])?$types[$disk['type']]:$types['old']; + $type = isset($disk['FAIdiskType'])?$types[$disk['FAIdiskType']]:$types['old']; $divlist->AddEntry(array( array("string"=> "", "attach"=>"style='width:16px'"), array("string"=> $edit_link, "attach"=>"style='width:100px'"), diff --git a/gosa-plugins/fai/admin/fai/faiDiskEntry.tpl b/gosa-plugins/fai/admin/fai/faiDiskEntry.tpl new file mode 100644 index 000000000..3de13c88e --- /dev/null +++ b/gosa-plugins/fai/admin/fai/faiDiskEntry.tpl @@ -0,0 +1,87 @@ + +

 {t}Device{/t}

+ + + + +
+ + + + + + + +
+ {$must}  + +{render acl=$DISKcnACL} + +{/render} +
+{render acl=$DISKFAIdiskOptionACL} + +{/render} +
+
+ + + + + + + +
+  + +{render acl=$DISKdescriptionACL} + +{/render} +
+{render acl=$DISKFAIdiskOptionACL} + +{/render} +
+
+
+

 

+
+

 {t}Partition entries{/t}

+{$setup} +
+{if !$freeze} + {if $sub_object_is_createable} + + {else} + + {/if} +{/if} +
+
+

 

+
+
+{if !$freeze} + +{/if} + +
+ + + -- 2.30.2