Code

Updated lvm partition handling
[gosa.git] / gosa-plugins / fai / admin / fai / class_faiPartition.inc
1 <?php
3 class faiPartition extends plugin
4 {
5   var $attributes = array("cn","description","FAIfsCreateOptions","FAIfsOptions","FAIfsTuneOptions",
6       "FAIfsType","FAImountOptions","FAImountPoint","FAIpartitionNr","FAIpartitionFlags","FAIdiskType",
7       "FAIpartitionSize","FAIpartitionType","FAIstate", "bootable","resize", "preserve", "preserveType",
8       "encrypted");
10   var $cn  = "";
11   var $description  = "";
12   var $FAIfsCreateOptions = "";
13   var $FAIfsOptions = "";
14   var $FAIfsTuneOptions = "";
15   var $FAIfsType = "";
16   var $FAImountOptions = "";
17   var $FAImountPoint = "";
18   var $FAIpartitionNr = "";
19   var $FAIpartitionSize = "";
20   var $FAIpartitionType = "";
21   var $FAIstate = "";
22   var $FAIpartitionFlags = "";
23   
24   var $FAIdiskType = "disk";
26   var $FAIpartitionSizeType = "fixed";
27   var $sizeStart = 0;
28   var $sizeStop  = 0;
29   var $sizeStart_Type = "MB";
30   var $sizeStop_Type  = "MB";
31    
32   var $bootable = false; 
33   var $resize = false;
34   var $preserve = false;
35   var $preserveType = "always";
36   var $encrypted = false;
38   var $status = "";
39   var $raidDevices = array();
41   function __construct($config, $object, $parent,$type)
42   {
44     $this->parent = $parent;
46     foreach($this->attributes as $attr){
47       if(isset($object[$attr])){
48         $this->$attr = $object[$attr];
49       }
50     }
52     $this->status = $object['status'];
53     $this->FAIdiskType = $type;
55     if($type == "disk"){
57       /* Prepare size attribute 
58        * This attribute may represent a range, a fixed value 
59        *  or a percentage.
60        * fixed is just a number   * 500MB
61        * range                    * 500MB-1TB
62        * remaining                * -
63        */
64       // Fixed
65       if(preg_match("/^[0-9]*(KB|MB|GB|TB|PB|%)$/",$this->FAIpartitionSize)){
66         $this->sizeStart = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\1",$this->FAIpartitionSize);
67         $this->sizeStart_Type = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\2",$this->FAIpartitionSize);
68         $this->FAIpartitionSizeType = "fixed";
69       }else
71       // Dynamic range
72       if(preg_match("/^[0-9]*(KB|MB|GB|TB|PB|%)-[0-9]*(KB|MB|GB|TB|PB|%)$/",$this->FAIpartitionSize)){
73         $this->sizeStart = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%).*$/","\\1",$this->FAIpartitionSize);
74         $this->sizeStart_Type = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%).*$/","\\2",$this->FAIpartitionSize);
75         $this->sizeStop = preg_replace("/^[^\-]*\-([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\1",$this->FAIpartitionSize);
76         $this->sizeStop_Type = preg_replace("/^[^\-]*\-([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\2",$this->FAIpartitionSize);
77         $this->FAIpartitionSizeType = "dynamic";
78       }else
80       // Dynamic range
81       if(preg_match("/^\-$/",$this->FAIpartitionSize)){
82         $this->FAIpartitionSizeType = "remaining";
84       }
86       /* Check for encrypted partitions
87        */
88       if(preg_match("/:encrypt$/",$this->FAImountPoint)){
89         $this->FAImountPoint = preg_replace("/:encrypt/","",$this->FAImountPoint);
90         $this->encrypted = TRUE;
91       }
92   
93     }elseif($type == "raid"){
94   
95       $usedDisks = split(",",$this->FAIpartitionSize);
96       foreach($usedDisks as $disk){
97         $name = preg_replace("/:.*$/","",$disk);
98         $spare = preg_match("/:spare/",$disk);
99         $missing = preg_match("/:missing/",$disk);
100         $this->raidDevices[$name] = 
101           array(
102               "name" => $name, 
103               "spare" => $spare, 
104               "missing" => $missing);
105       }
106     }
107   }
109   function execute()
110   {
111     plugin::execute();
112     $smarty = get_smarty();
114     // Remove partition
115     if(isset($_POST['addPhysicalPartition']) && isset($_POST['phyiscalPartitionAdd'])){
116       $name = $_POST['phyiscalPartitionAdd'];
117       $this->raidDevices[$name] = array("name" => $name,"spare"=>false,"missing"=>false);     
118     }
120     // Create a list of selectable partition types
121     if($this->FAIdiskType == "disk"){
122       $types  = array(
123           "primary" => _("Primary"),
124           "secondary" => _("Secondary"));
125     }elseif($this->FAIdiskType == "raid"){
126       $types  = array(
127           "raid0" => _("Raid 0"),
128           "raid1" => _("Raid 1"),
129           "raid5" => _("Raid 5"),
130           "raid6" => _("Raid 6"));
131     }else{
132       $types = "";
133     }
134      
135     // Create a list of all size options
136     $partitionSizeTypes  = array(
137         "fixed"     => _("Fixed"),
138         "dynamic"     => _("Dynamic"),
139         "remaining" => _("Use remaining space")
140         );
142     // Create a list of all size options
143     $sizeTypes  = array(
144         "KB"      => _("KB"),
145         "MB"      => _("MB"),
146         "GB"      => _("GB"),
147         "TB"      => _("TB"),
148         "PB"      => _("PB"),
149         "%"      => _("Percent")
150         );
152     // Preserve types 
153     $preserveTypes = array(
154         "always" => _("Always"),
155         "reinstall" => _("Reinstall"));
157     // File system types.  
158     $FAIfsTypes = array(
159         "swap" => _("Swap"),
160         "ext2" => _("Ext 2"),
161         "ext3" => _("Ext 3"),
162         "ext4" => _("Ext 4"),
163         "reiserfs" => _("Reiser fs"),
164         "xfs" => _("Xfs"),
165         "btrfs" => _("Btrfs"));
167     $smarty->assign("partitionTypes", $types);
168     $smarty->assign("partitionSizeTypes", $partitionSizeTypes);
169     $smarty->assign("FAIpartitionSizeType", $this->FAIpartitionSizeType);
170     $smarty->assign("sizeTypes", $sizeTypes);
172     $smarty->assign("sizeStart_Type", $this->sizeStart_Type);
173     $smarty->assign("sizeStop_Type", $this->sizeStop_Type);
174     $smarty->assign("sizeStart", $this->sizeStart);
175     $smarty->assign("sizeStop", $this->sizeStop);
177     $smarty->assign("preserveTypes", $preserveTypes);
178     $smarty->assign("preserveType", $this->preserveType);
180     $smarty->assign("FAIfsTypes", $FAIfsTypes);
182     $smarty->assign("plist",$this->getRaidlist());
183     $smarty->assign("phyiscalPartitionList",$this->getPartitionlist());
185     foreach($this->attributes as $attr){
186       $smarty->assign($attr,$this->$attr);
187     }
188     return($smarty->fetch(get_template_path("faiPartition.tpl", TRUE, dirname(__FILE__))));
189   }
191     
192   function getPartitionList()
193   {
194     $array = array();  
195     foreach($this->parent->parent->disks as $disk){
196       foreach($disk['partitions'] as $key => $part){
197         $name = $disk['cn'].$key;
198         if(!isset($this->raidDevices[$name])){
199           $array[$name] = $name;
200         }
201       }
202     }
203     return($array);
204   }
207   function getRaidList()
208   {
209     $divlist = new divSelectBox("RaidList");
210    
211     $disks = $this->parent->parent->disks;
212     $objs = $disks;
213     foreach($disks as $disk){
214       foreach($disk['partitions'] as $id => $part){
215         $objs[$disk['cn'].$id] = $part;
216       }
217     }
218     
219     $list = array();
220     foreach($this->raidDevices as $device){
221       $list[$device['name']] = $device['name'];
223       if(isset($objs[$device['name']]['FAIpartitionSize'])){
224         $list[$device['name']].= _("Size").":&nbsp;";
225         $list[$device['name']].= $objs[$device['name']]['FAIpartitionSize'];
226       }
228       $list[$device['name']].= " &nbsp; "._("Options").": ";
229       if($device['spare']){
230         $list[$device['name']].= "&nbsp;"._("Spare")."&nbsp;";
231       }
232       if($device['missing']){
233         $list[$device['name']].= "&nbsp;"._("Missing")."&nbsp;";
234       }
235     }
236     return($list);
237   }
239   function save_object()
240   {
241     if(isset($_POST['faiPartition'])){
242       foreach($this->attributes as $attr){
243         if(isset($_POST[$attr])){
244           $this->$attr = get_post($attr);
245         }
246       }
247       foreach(array("FAIpartitionSizeType","sizeStart","sizeStop","sizeStart_Type","sizeStop_Type") as $attr){
248         if(isset($_POST[$attr])){
249           $this->$attr = get_post($attr);
250         }
251       }
252       foreach(array("bootable","preserve","resize","encrypted") as $attr){
253         if(isset($_POST[$attr])){
254           $this->$attr = TRUE;
255         }else{
256           $this->$attr = FALSE;
257         }
258       }
260       // Remove partition
261       if(isset($_POST['delPhysicalPartition']) && isset($_POST['phyiscalPartition'])){
262         unset($this->raidDevices[$_POST['phyiscalPartition']]); 
263       }
265       // Toggle spare flag for partition entries
266       if(isset($_POST['toggleSpare']) && isset($_POST['phyiscalPartition'])){
267         $this->raidDevices[$_POST['phyiscalPartition']]['spare'] = 
268             !$this->raidDevices[$_POST['phyiscalPartition']]['spare'];
269       }
271       // Toggle missing flag for partition entries
272       if(isset($_POST['toggleMissing']) && isset($_POST['phyiscalPartition'])){
273         $this->raidDevices[$_POST['phyiscalPartition']]['missing'] = 
274             !$this->raidDevices[$_POST['phyiscalPartition']]['missing'];
275       }
276     } 
277   }
279   function save()
280   {
281     $ret = array();
282     foreach($this->attributes as $attr){
283       $ret[$attr] = $this->$attr;
284     }
286     // Save partition size
287     if($this->FAIdiskType == "disk"){ 
288       switch($this->FAIpartitionSizeType){
289         case 'fixed' : 
290           $ret['FAIpartitionSize'] = $this->sizeStart.$this->sizeStart_Type;break; 
291         case 'dynamic' : 
292           $ret['FAIpartitionSize'] = $this->sizeStart.$this->sizeStart_Type."-".  
293             $this->sizeStop.$this->sizeStop_Type;break; 
294         case 'remaining' : 
295           $ret['FAIpartitionSize'] = "-";break; 
296         default: trigger_error("Unknown partition size!");
297       }
299       // Add encryption flag to partition mount point
300       if($this->encrypted){
301         $ret['FAImountPoint'] .= ":encrypt";
302       }
304     }elseif($this->FAIdiskType == "raid"){
305       $ret['FAIpartitionSize'] = "";
306       foreach($this->raidDevices as $device){
307         $ret['FAIpartitionSize'] .= $device['name'];
308         if($device['spare']){
309           $ret['FAIpartitionSize'] .= ":spare";
310         }
311         if($device['missing']){
312           $ret['FAIpartitionSize'] .= ":missing";
313         }
314         $ret['FAIpartitionSize'] .= ",";
315       }
316       $ret['FAIpartitionSize'] = trim($ret['FAIpartitionSize'],",");
317     }
318     $ret['status'] = $this->status;
319     return($ret);
320   }
322 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
323 ?>