MigratorController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace App\Core\Sanity;
  3. class MigratorController {
  4. private static $instance;
  5. private $instaled;
  6. private $phisical;
  7. private $uninstall = Array();
  8. private $downgrade = Array();
  9. private $upgrade = Array();
  10. private $install = Array();
  11. private function __construct() {
  12. $this->load_installed_plugins();
  13. $this->load_physical_plugins();
  14. }
  15. private static function newObj() {
  16. if (!isset(self::$instance)) {
  17. self::$instance = new MigratorController();
  18. }
  19. return self::$instance;
  20. }
  21. public static function getInstance() {
  22. if (!isset(self::$instance)) {
  23. return self::newObj();
  24. }
  25. return self::$instance;
  26. }
  27. public function sentinel() {
  28. global $ROUTE;
  29. if (!is_file(DIR_CONFIG . 'modules.ini')) {
  30. if (INSTALL_REQUIRE) {
  31. $ROUTE->doBlock()->setHttpError(500);
  32. }
  33. file_put_contents(DIR_CONFIG . 'modules.ini', '');
  34. }
  35. }
  36. private function save() {
  37. $out = '';
  38. foreach ($this->instaled as $instaled) {
  39. $out .= "[$instaled->name]\n";
  40. $out .= "name=$instaled->name\n";
  41. $out .= "version=$instaled->version\n\n";
  42. }
  43. file_put_contents(DIR_CONFIG . '/modules.ini', $out);
  44. }
  45. private function is_satisfy($name, $version) {
  46. if (!isset($this->instaled[$name])) {
  47. return false;
  48. }
  49. if ($this->instaled[$name]->version >= $version) {
  50. return true;
  51. }
  52. return false;
  53. }
  54. private function is_satisfy_array($array) {
  55. foreach ($array as $item) {
  56. if (!self::is_satisfy($item->name, $item->version)) {
  57. return false;
  58. }
  59. }
  60. return true;
  61. }
  62. public function update_plugin_version($name, $version) {
  63. echo "Atualizando $name para versão $version\n";
  64. if (isset($this->instaled[$name])) {
  65. $this->instaled[$name]->version = $version;
  66. return;
  67. }
  68. $this->instaled[$name] = new \stdClass();
  69. $this->instaled[$name]->name = $name;
  70. $this->instaled[$name]->version = $version;
  71. }
  72. private function load_installed_plugins() {
  73. $installed = parse_ini_file(DIR_CONFIG . 'modules.ini', true);
  74. foreach ($installed as $key => $item) {
  75. $installed[$key] = (object) $item;
  76. }
  77. return $this->instaled = $installed;
  78. }
  79. private function load_physical_plugins() {
  80. $module_configs = Array();
  81. $plugins = Array();
  82. $rdi = new \RecursiveDirectoryIterator(DIR_APP);
  83. foreach (new \RecursiveIteratorIterator($rdi) as $file) {
  84. if (strpos($file, 'version.php')) {
  85. $module_configs[] = str_replace('version.php', '', $file);
  86. }
  87. }
  88. foreach ($module_configs as $module_config) {
  89. $plugin = new \stdClass();
  90. include $module_config . 'version.php';
  91. $plugins[$plugin->name] = $plugin;
  92. if (is_file($module_config . 'db/Migrate.php')) {
  93. include $module_config . 'db/Migrate.php';
  94. }
  95. }
  96. $this->phisical = $plugins;
  97. }
  98. public function physical_list() {
  99. return $this->phisical;
  100. }
  101. public function installed_list() {
  102. return $this->instaled;
  103. }
  104. public function instal_list() {
  105. return $this->install;
  106. }
  107. public function uninstal_list() {
  108. return $this->uninstall;
  109. }
  110. public function sort_plugins() {
  111. foreach ($this->phisical as $key => $plugin) {
  112. if (!isset($this->instaled[$key])) {
  113. $this->install[] = $plugin;
  114. continue;
  115. }
  116. if ($this->instaled[$key]->version < $plugin->version) {
  117. $this->upgrade[] = $plugin;
  118. continue;
  119. }
  120. if ($this->instaled[$key]->version > $plugin->version) {
  121. $this->downgrade[] = $plugin;
  122. continue;
  123. }
  124. $this->uninstall[] = $plugin;
  125. }
  126. }
  127. public function execute_plan() {
  128. $status = false;
  129. while (!$status) {
  130. $this->sort_plugins();
  131. $status = true;
  132. foreach ($this->install as $key => $item) {
  133. /*
  134. *
  135. *
  136. *
  137. */
  138. $funname = explode('_', $item->name);
  139. if(sizeof($funname) > 1){ unset($funname[0]); }
  140. $funname = implode('_', $funname);
  141. if (isset($item->require)) {
  142. if (!self::is_satisfy_array($item->require)) {
  143. $status = false;
  144. continue;
  145. }
  146. }
  147. if (!self::is_satisfy($item->name, $item->version)) {
  148. if (!function_exists($funname . '_upgrade')) {
  149. echo 'adsdsadasdsadassad';
  150. $this->update_plugin_version($item->name, $item->version);
  151. $this->upgrade[] = $item;
  152. $this->instaled[$item->name] = $item;
  153. unset($this->install[$key]);
  154. continue;
  155. }
  156. $this->instaled[$item->name] = $item;
  157. call_user_func($funname . '_upgrade', '0');
  158. $this->upgrade[] = $this->instaled[$item->name];
  159. unset($this->install[$key]);
  160. $status = false;
  161. }
  162. }
  163. foreach ($this->upgrade as $item) {
  164. if (isset($item->require)) {
  165. if (!self::is_satisfy_array($item->require)) {
  166. $status = false;
  167. continue;
  168. }
  169. }
  170. if (!self::is_satisfy($funname, $item->version)) {
  171. if (!function_exists($item->name . '_upgrade')) {
  172. $this->update_plugin_version($item->name, $item->version);
  173. continue;
  174. }
  175. call_user_func($funname . '_upgrade', $this->instaled[$item->name]->version);
  176. $status = false;
  177. }
  178. }
  179. }
  180. $this->save();
  181. }
  182. }