f305a3d4462b12f63cd12ec1cf47bc1f2682d0d6
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";
46 $this->FAIdiskType = $type;
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 }
98 }elseif($type == "raid"){
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" => _("Logical"));
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 }
141 // Create a list of all size options
142 $partitionSizeTypes = array(
143 "fixed" => _("fixed"),
144 "dynamic" => _("dynamic"),
145 "remaining" => _("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 "%" => _("%")
156 );
158 // Preserve types
159 $preserveTypes = array(
160 "always" => _("always"),
161 "reinstall" => _("reinstall"));
163 // File system types.
164 $FAIfsTypes = array(
165 "swap" => _("swap space"),
166 "ext2" => _("ext2"),
167 "ext3" => _("ext3"),
168 "ext4" => _("ext4"),
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 }
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");
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 }
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").": ";
236 $list[$device['name']].= $objs[$device['name']]['FAIpartitionSize'];
237 }
239 $list[$device['name']].= " "._("Options").": ";
240 if($device['spare']){
241 $list[$device['name']].= " "._("spare")." ";
242 }
243 if($device['missing']){
244 $list[$device['name']].= " "._("missing")." ";
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();
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(_("Minimum partition size"), "'"._("Maximum partition 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 }
382 return($ret);
383 }
384 }
385 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
386 ?>