PageRenderTime 41ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/oiclient/lib/hardware/partitionTableOppClass.php

http://openirudi.googlecode.com/
PHP | 228 lines | 168 code | 43 blank | 17 comment | 29 complexity | 83fea1a5d1439601fc7a954368d45eee MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0
  1. <?php
  2. class partitionTableOppClass {
  3. private $disk;
  4. private $table;
  5. /************************************************************************
  6. * ESPECIAL FUNCTIONS
  7. **********************************************************************/
  8. function __construct($disk) {
  9. $this->disk = $disk;
  10. $this->set_table();
  11. }
  12. function __get($propertyName) {
  13. try {
  14. if (property_exists('partitionTableOppClass', $propertyName)) {
  15. if (empty ($this-> $propertyName)) {
  16. $this->__set($propertyName, '');
  17. }
  18. return $this-> $propertyName;
  19. }
  20. throw new Exception("ooInvalid property name \"{$propertyName}\"");
  21. } catch (Exception $e) {
  22. exceptionHandlerClass :: saveError($e->getMessage());
  23. }
  24. }
  25. function __set($propertyName, $value) {
  26. try {
  27. if (!property_exists('partitionTableOppClass', $propertyName)) {
  28. throw new Exception("Invalid property value \"{$propertyName}\"");
  29. }
  30. if (method_exists($this, 'set_' . $propertyName)) {
  31. call_user_func(array (
  32. $this,
  33. 'set_' . $propertyName
  34. ), $value);
  35. } else {
  36. throw new Exception("*Invalid property value \"{$propertyName}\"");
  37. }
  38. } catch (Exception $e) {
  39. exceptionHandlerClass :: saveError($e->getMessage());
  40. }
  41. }
  42. /************************************************************************
  43. * SET FUNCTIONS
  44. **********************************************************************/
  45. function set_table($table='') {
  46. if (!empty ($this->disk)) {
  47. if(empty($table)) {
  48. $this->table = $this->parseTable();
  49. }else {
  50. if($this->validateTable($table)) {
  51. $this->table=$table;
  52. }else {
  53. exceptionHandlerClass :: saveError("<br>WRONG TABLE INFORMATION");
  54. return false;
  55. }
  56. }
  57. } else {
  58. exceptionHandlerClass :: saveError("<br>Disk not selected !!!");
  59. }
  60. }
  61. function partitions2table($partitions) {
  62. $table=array();
  63. foreach($partitions as $partition) {
  64. $table[$partition->partitionName]['start']=$partition->startSector;
  65. $table[$partition->partitionName]['size']=$partition->sectors;
  66. $table[$partition->partitionName]['id']=$partition->partitionTypeId;
  67. $table[$partition->partitionName]['bootable']=$partition->bootable;
  68. }
  69. if($this->validateTable($table)) {
  70. return $table;
  71. }else {
  72. return false;
  73. }
  74. }
  75. /************************************************************************
  76. * OPP FUNCTIONS
  77. **********************************************************************/
  78. function validateTable($newPartitionTable) {
  79. $extend_kont=0;
  80. $xtable=$newPartitionTable;
  81. foreach($newPartitionTable as $n1=>$p1) {
  82. if($extend_kont>1) {
  83. exceptionHandlerClass :: saveError("Partition extend exists !!!");
  84. return false;
  85. }
  86. if($p1['id']==5) {
  87. $extend_kont++;
  88. }
  89. //ereg("[a-z]{2}([1-9]+)",$n1,$pn1);
  90. $pn1=$this->ereg_pn($n1);
  91. foreach($xtable as $nx=> $px ) {
  92. //ereg("[a-z]{2}([1-9]+)",$nx,$pnx);
  93. $pnx=$this->ereg_pn($nx);
  94. if($n1==$nx) continue;
  95. if(empty($p1['start']) || empty($px['start'])) continue;
  96. if(($pn1[1]<=4 && $pnx[1]<=4) &&
  97. ($p1['start']<$px['start']+$px['size']&&
  98. $p1['start']+$p1['size']>$px['start'])
  99. ) {
  100. exceptionHandlerClass :: saveError("<br>overlap partition between $n1 and $nx !!!");
  101. return false;
  102. }
  103. if(($p1['id']==5 && $pnx[1]>=5) &&
  104. ($p1['start']>$px['start'] ||
  105. $p1['start']+$p1['size']<$px['start']+$px['size'])
  106. ) {
  107. exceptionHandlerClass :: saveError("<br> $nx logic unit out of $n1 extends partition !!!");
  108. return false;
  109. }
  110. //overlap errorea ematen du partizio primarioetan bezela baldintza bat gorago dagoena begiratu
  111. if(($pn1[1]>=5 && $pnx[1]>=5) &&
  112. ($p1['start']<$px['start']+$px['size']&&
  113. $p1['start']+$p1['size']>$px['start'])
  114. ) {
  115. exceptionHandlerClass :: saveError("<br>overlap partition between $n1 and $nx !!!");
  116. return false;
  117. }
  118. }
  119. unset($xtable[$n1]);
  120. }
  121. return true;
  122. }
  123. function addPartition($partitions) {
  124. }
  125. function changePartition($partition) {
  126. }
  127. function removePartition($partition) {
  128. }
  129. /************************************************************************
  130. * EXEC-PARSE FUNCTIONS
  131. **********************************************************************/
  132. function writeTable() {
  133. }
  134. function parseTable() {
  135. if (empty ($this->disk)) {
  136. exceptionHandlerClass :: saveError("<br>Disk not selected !!!");
  137. return;
  138. }
  139. $cmd=str_replace('$disk', $this->disk, sfConfig::get('app_command_partitionTable'));
  140. $l = executeClass :: execute($cmd);
  141. $out= implode("\n",$l['output']);
  142. $g1=explode('!@@@',$out);
  143. if($l['return'] !=0 || strpos($out,'!@@@')===false || !isset($g1[1]) ) {
  144. exceptionHandlerClass::saveMessage('Error detecting partition table');
  145. return;
  146. }
  147. $partitions=explode("\n",$g1[1]);
  148. if (empty ($partitions)) {
  149. //exceptionHandlerClass :: saveError("<br>*Not detect any partition in ".$this->disk." !!!");
  150. return;
  151. }
  152. $partitionsT=array();
  153. foreach ($partitions as $row) {
  154. $partition=explode(' ', $row);
  155. if(isset($partition[1]) && !empty($partition)){
  156. $dev=str_replace('/dev/','',$partition[0]);
  157. if(is_numeric($partition[1])) {
  158. $partitionsT[$dev]['start']=$partition[1];
  159. $partitionsT[$dev]['size']=$partition[2] - $partitionsT[$dev]['start'];
  160. $partitionsT[$dev]['id']=$partition[4];
  161. }else {
  162. $partitionsT[$dev]['start']=$partition[2];
  163. $partitionsT[$dev]['size']=$partition[3] - $partitionsT[$dev]['start'];
  164. $partitionsT[$dev]['id']=$partition[5];
  165. $partitionsT[$dev]['bootable']='*';
  166. }
  167. }
  168. }
  169. return $partitionsT;
  170. }
  171. /***************************************FUNTZIOAK**********************************************/
  172. function ereg_pn($in) {
  173. $cfg[0]=substr($in,1);
  174. $cfg[1]=substr($in,3);
  175. return $cfg;
  176. }
  177. function partSingleToTable($partition) {
  178. $cfg=array();
  179. $cfg['start']=$partition->startSector;
  180. $cfg['size']=$partition->sectors;
  181. $cfg['id']=$partition->partitionTypeId;
  182. $cfg['bootable']=$partition->bootable;
  183. return $cfg;
  184. }
  185. }?>