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 = "";
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";
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";
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 }
97 }elseif($type == "raid"){
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 }
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 }
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");
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 }
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").": ";
231 $list[$device['name']].= $objs[$device['name']]['FAIpartitionSize'];
232 }
234 $list[$device['name']].= " "._("Options").": ";
235 if($device['spare']){
236 $list[$device['name']].= " "._("Spare")." ";
237 }
238 if($device['missing']){
239 $list[$device['name']].= " "._("Missing")." ";
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();
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 }
373 return($ret);
374 }
375 }
376 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
377 ?>