Code

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