Code

e3ed5dac8dd8bb6f2b900034f0f497eb7410d6b1
[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 = "undefined"; // Initial value for new partitions
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;
45     $this->status = "new";
46    
47     // Load attributes from existing partition 
48     if($object){
50       foreach($this->attributes as $attr){
51         if(isset($object[$attr])){
52           $this->$attr = $object[$attr];
53         }
54       }
56       $this->status = $object['status'];
57       $this->FAIdiskType = $type;
59       if($type == "disk" || $type =="lvm"){
61         /* Prepare size attribute 
62          * This attribute may represent a range, a fixed value 
63          *  or a percentage.
64          * fixed is just a number   * 500MB
65          * range                    * 500MB-1TB
66          * remaining                * -
67          */
68         // Fixed
69         if(preg_match("/^[0-9]*(KB|MB|GB|TB|PB|%)$/",$this->FAIpartitionSize)){
70           $this->sizeStart = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\1",$this->FAIpartitionSize);
71           $this->sizeStart_Type = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\2",$this->FAIpartitionSize);
72           $this->FAIpartitionSizeType = "fixed";
73         }else
75         // Dynamic range
76         if(preg_match("/^[0-9]*(KB|MB|GB|TB|PB|%)-[0-9]*(KB|MB|GB|TB|PB|%)$/",$this->FAIpartitionSize)){
77           $this->sizeStart = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%).*$/","\\1",$this->FAIpartitionSize);
78           $this->sizeStart_Type = preg_replace("/^([0-9]*)(KB|MB|GB|TB|PB|%).*$/","\\2",$this->FAIpartitionSize);
79           $this->sizeStop = preg_replace("/^[^\-]*\-([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\1",$this->FAIpartitionSize);
80           $this->sizeStop_Type = preg_replace("/^[^\-]*\-([0-9]*)(KB|MB|GB|TB|PB|%)$/","\\2",$this->FAIpartitionSize);
81           $this->FAIpartitionSizeType = "dynamic";
82         }else
84         // Dynamic range
85         if(preg_match("/^\-$/",$this->FAIpartitionSize)){
86           $this->FAIpartitionSizeType = "remaining";
88         }
90         /* Check for encrypted partitions
91          */
92         if(preg_match("/:encrypt$/",$this->FAImountPoint)){
93           $this->FAImountPoint = preg_replace("/:encrypt/","",$this->FAImountPoint);
94           $this->encrypted = TRUE;
95         }
96     
97       }elseif($type == "raid"){
98     
99         $usedDisks = split(",",$this->FAIpartitionSize);
100         foreach($usedDisks as $disk){
101           $name = preg_replace("/:.*$/","",$disk);
102           $spare = preg_match("/:spare/",$disk);
103           $missing = preg_match("/:missing/",$disk);
104           $this->raidDevices[$name] = 
105             array(
106                 "name" => $name, 
107                 "spare" => $spare, 
108                 "missing" => $missing);
109         }
110       }
111     }
112   }
114   function execute()
115   {
116     plugin::execute();
117     $smarty = get_smarty();
119     // Remove partition
120     if(isset($_POST['addPhysicalPartition']) && isset($_POST['physicalPartitionAdd'])){
121       $name = $_POST['physicalPartitionAdd'];
122       $this->raidDevices[$name] = array("name" => $name,"spare"=>false,"missing"=>false);     
123     }
125     // Create a list of selectable partition types
126     if($this->FAIdiskType == "disk"){
127       $types  = array(
128           "primary" => _("Primary"),
129           "secondary" => _("Secondary"));
130     }elseif($this->FAIdiskType == "raid"){
131       $types  = array(
132           "raid0" => _("Raid 0"),
133           "raid1" => _("Raid 1"),
134           "raid5" => _("Raid 5"),
135           "raid6" => _("Raid 6"));
136     }else{
137       $types = "";
138     }
139      
140     // Create a list of all size options
141     $partitionSizeTypes  = array(
142         "fixed"     => _("Fixed"),
143         "dynamic"     => _("Dynamic"),
144         "remaining" => _("Use remaining space")
145         );
147     // Create a list of all size options
148     $sizeTypes  = array(
149         "KB"      => _("KB"),
150         "MB"      => _("MB"),
151         "GB"      => _("GB"),
152         "TB"      => _("TB"),
153         "PB"      => _("PB"),
154         "%"      => _("Percent")
155         );
157     // Preserve types 
158     $preserveTypes = array(
159         "always" => _("Always"),
160         "reinstall" => _("Reinstall"));
162     // File system types.  
163     $FAIfsTypes = array(
164         "swap" => _("Swap"),
165         "ext2" => _("Ext 2"),
166         "ext3" => _("Ext 3"),
167         "ext4" => _("Ext 4"),
168         "reiserfs" => _("Reiser fs"),
169         "xfs" => _("Xfs"),
170         "btrfs" => _("Btrfs"));
172     $smarty->assign("partitionTypes", $types);
173     $smarty->assign("partitionSizeTypes", $partitionSizeTypes);
174     $smarty->assign("FAIpartitionSizeType", $this->FAIpartitionSizeType);
175     $smarty->assign("sizeTypes", $sizeTypes);
177     $smarty->assign("sizeStart_Type", $this->sizeStart_Type);
178     $smarty->assign("sizeStop_Type", $this->sizeStop_Type);
179     $smarty->assign("sizeStart", $this->sizeStart);
180     $smarty->assign("sizeStop", $this->sizeStop);
182     $smarty->assign("preserveTypes", $preserveTypes);
183     $smarty->assign("preserveType", $this->preserveType);
185     $smarty->assign("FAIfsTypes", $FAIfsTypes);
186     $smarty->assign("cn", $this->cn);
188     $smarty->assign("plist",$this->getRaidlist());
189     $smarty->assign("physicalPartitionList",$this->getPartitionlist());
191     foreach($this->attributes as $attr){
192       $smarty->assign($attr,$this->$attr);
193     }
194     return($smarty->fetch(get_template_path("faiPartition.tpl", TRUE, dirname(__FILE__))));
195   }
197     
198   function getPartitionList()
199   {
200     $array = array();  
201     foreach($this->parent->parent->disks as $disk){
202       foreach($disk['partitions'] as $key => $part){
203         $name = $disk['cn'];
204         if(!isset($this->raidDevices[$name])){
205           $array[$name] = $name;
206         }
207       }
208     }
209     return($array);
210   }
213   function getRaidList()
214   {
215     $divlist = new divSelectBox("RaidList");
216    
217     $disks = $this->parent->parent->disks;
218     $objs = $disks;
219     foreach($disks as $disk){
220       foreach($disk['partitions'] as $id => $part){
221         $objs[$disk['cn']] = $part;
222       }
223     }
224     
225     $list = array();
226     foreach($this->raidDevices as $device){
227       $list[$device['name']] = $device['name'];
229       if(isset($objs[$device['name']]['FAIpartitionSize'])){
230         $list[$device['name']].= _("Size").":&nbsp;";
231         $list[$device['name']].= $objs[$device['name']]['FAIpartitionSize'];
232       }
234       $list[$device['name']].= " &nbsp; "._("Options").": ";
235       if($device['spare']){
236         $list[$device['name']].= "&nbsp;"._("Spare")."&nbsp;";
237       }
238       if($device['missing']){
239         $list[$device['name']].= "&nbsp;"._("Missing")."&nbsp;";
240       }
241     }
242     return($list);
243   }
245   function save_object()
246   {
247     if(isset($_POST['faiPartition'])){
248       foreach($this->attributes as $attr){
249         if(isset($_POST[$attr])){
250           $this->$attr = get_post($attr);
251         }
252       }
253       foreach(array("FAIpartitionSizeType","sizeStart","sizeStop","sizeStart_Type","sizeStop_Type") as $attr){
254         if(isset($_POST[$attr])){
255           $this->$attr = get_post($attr);
256         }
257       }
258       foreach(array("bootable","preserve","resize","encrypted") as $attr){
259         if(isset($_POST[$attr])){
260           $this->$attr = TRUE;
261         }else{
262           $this->$attr = FALSE;
263         }
264       }
266       // Remove partition
267       if(isset($_POST['delPhysicalPartition']) && isset($_POST['physicalPartition'])){
268         unset($this->raidDevices[$_POST['physicalPartition']]); 
269       }
271       // Toggle spare flag for partition entries
272       if(isset($_POST['toggleSpare']) && isset($_POST['physicalPartition'])){
273         $this->raidDevices[$_POST['physicalPartition']]['spare'] = 
274             !$this->raidDevices[$_POST['physicalPartition']]['spare'];
275       }
277       // Toggle missing flag for partition entries
278       if(isset($_POST['toggleMissing']) && isset($_POST['physicalPartition'])){
279         $this->raidDevices[$_POST['physicalPartition']]['missing'] = 
280             !$this->raidDevices[$_POST['physicalPartition']]['missing'];
281       }
282     } 
283   }
286   function check()
287   {
288     $msgs = plugin::check();
289     
290     // Check the given partition size.
291     if($this->FAIdiskType == "disk" || $this->FAIdiskType == "lvm"){
292       if($this->FAIpartitionSizeType == "fixed" || $this->FAIpartitionSizeType == "dynamic"){ 
293         if(!is_numeric($this->sizeStart)){
294           $msgs[] = msgPool::invalid(_("Partition size"),$this->sizeStart,"/[0-9]/i");
295         }
296       }
297       if($this->FAIpartitionSizeType == "dynamic"){ 
298         if(!is_numeric($this->sizeStop)){
299           $msgs[] = msgPool::invalid(_("Partition size"),$this->sizeStop,"/[0-9]/i");
300         }
302         $mp = array(
303                     "%"  => 1,
304                     "KB" => pow(1024,0),
305                     "MB" => pow(1024,1),
306                     "GB" => pow(1024,2),
307                     "TB" => pow(1024,3),
308                     "PB" => pow(1024,4));
309         $res1 = $this->sizeStart * $mp[$this->sizeStart_Type];
310         $res2 = $this->sizeStop * $mp[$this->sizeStop_Type];
311         if($res1 > $res2){
312           $msgs[] = msgPool::toobig(_("Partition start size"), "'"._("Partition stop size")."'");
313         }
314       }
315     }
317     // check mount point 
318     if($this->FAIfsType != "swap"){
319       if(!preg_match("#^/#",$this->FAImountPoint)){
320         $msgs[] = msgPool::invalid(_("Mount point"));
321       }
322     }
324     return($msgs);
325   }
328   function save()
329   {
330     $ret = array();
331     foreach($this->attributes as $attr){
332       $ret[$attr] = $this->$attr;
333     }
335     // Save partition size
336     if($this->FAIdiskType == "disk" || $this->FAIdiskType == "lvm"){ 
337       switch($this->FAIpartitionSizeType){
338         case 'fixed' : 
339           $ret['FAIpartitionSize'] = $this->sizeStart.$this->sizeStart_Type;break; 
340         case 'dynamic' : 
341           $ret['FAIpartitionSize'] = $this->sizeStart.$this->sizeStart_Type."-".  
342             $this->sizeStop.$this->sizeStop_Type;break; 
343         case 'remaining' : 
344           $ret['FAIpartitionSize'] = "-";break; 
345         default: trigger_error("Unknown partition size!");
346       }
348       // Add encryption flag to partition mount point
349       if($this->encrypted){
350         $ret['FAImountPoint'] .= ":encrypt";
351       }
353     }elseif($this->FAIdiskType == "raid"){
354       $ret['FAIpartitionSize'] = "";
355       foreach($this->raidDevices as $device){
356         $ret['FAIpartitionSize'] .= $device['name'];
357         if($device['spare']){
358           $ret['FAIpartitionSize'] .= ":spare";
359         }
360         if($device['missing']){
361           $ret['FAIpartitionSize'] .= ":missing";
362         }
363         $ret['FAIpartitionSize'] .= ",";
364       }
365       $ret['FAIpartitionSize'] = trim($ret['FAIpartitionSize'],",");
366     }
367     $ret['status'] = $this->status;
369     if($this->FAIfsType == "swap"){
370       $ret['FAImountPoint'] = "swap";
371     }
372   
373     return($ret);
374   }
376 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
377 ?>