| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace App\Core\Sanity;
- class MigratorController {
- private static $instance;
- private $instaled;
- private $phisical;
- private $uninstall = Array();
- private $downgrade = Array();
- private $upgrade = Array();
- private $install = Array();
- private function __construct() {
- $this->load_installed_plugins();
- $this->load_physical_plugins();
- }
- private static function newObj() {
- if (!isset(self::$instance)) {
- self::$instance = new MigratorController();
- }
- return self::$instance;
- }
- public static function getInstance() {
- if (!isset(self::$instance)) {
- return self::newObj();
- }
- return self::$instance;
- }
- public function sentinel() {
- global $ROUTE;
- if (!is_file(DIR_CONFIG . 'modules.ini')) {
- if (INSTALL_REQUIRE) {
- $ROUTE->doBlock()->setHttpError(500);
- }
- file_put_contents(DIR_CONFIG . 'modules.ini', '');
- }
- }
- private function save() {
- $out = '';
- foreach ($this->instaled as $instaled) {
- $out .= "[$instaled->name]\n";
- $out .= "name=$instaled->name\n";
- $out .= "version=$instaled->version\n\n";
- }
- file_put_contents(DIR_CONFIG . '/modules.ini', $out);
- }
- private function is_satisfy($name, $version) {
- if (!isset($this->instaled[$name])) {
- return false;
- }
- if ($this->instaled[$name]->version >= $version) {
- return true;
- }
- return false;
- }
- private function is_satisfy_array($array) {
- foreach ($array as $item) {
- if (!self::is_satisfy($item->name, $item->version)) {
- return false;
- }
- }
- return true;
- }
- public function update_plugin_version($name, $version) {
- echo "Atualizando $name para versão $version\n";
- if (isset($this->instaled[$name])) {
- $this->instaled[$name]->version = $version;
- return;
- }
- $this->instaled[$name] = new \stdClass();
- $this->instaled[$name]->name = $name;
- $this->instaled[$name]->version = $version;
- }
- private function load_installed_plugins() {
- $installed = parse_ini_file(DIR_CONFIG . 'modules.ini', true);
- foreach ($installed as $key => $item) {
- $installed[$key] = (object) $item;
- }
- return $this->instaled = $installed;
- }
- private function load_physical_plugins() {
- $module_configs = Array();
- $plugins = Array();
- $rdi = new \RecursiveDirectoryIterator(DIR_APP);
- foreach (new \RecursiveIteratorIterator($rdi) as $file) {
- if (strpos($file, 'version.php')) {
- $module_configs[] = str_replace('version.php', '', $file);
- }
- }
- foreach ($module_configs as $module_config) {
- $plugin = new \stdClass();
- include $module_config . 'version.php';
- $plugins[$plugin->name] = $plugin;
- if (is_file($module_config . 'db/Migrate.php')) {
- include $module_config . 'db/Migrate.php';
- }
- }
- $this->phisical = $plugins;
- }
- public function physical_list() {
- return $this->phisical;
- }
- public function installed_list() {
- return $this->instaled;
- }
- public function instal_list() {
- return $this->install;
- }
- public function uninstal_list() {
- return $this->uninstall;
- }
- public function sort_plugins() {
- foreach ($this->phisical as $key => $plugin) {
- if (!isset($this->instaled[$key])) {
- $this->install[] = $plugin;
- continue;
- }
- if ($this->instaled[$key]->version < $plugin->version) {
- $this->upgrade[] = $plugin;
- continue;
- }
- if ($this->instaled[$key]->version > $plugin->version) {
- $this->downgrade[] = $plugin;
- continue;
- }
- $this->uninstall[] = $plugin;
- }
- }
- public function execute_plan() {
- $status = false;
- while (!$status) {
- $this->sort_plugins();
- $status = true;
- foreach ($this->install as $key => $item) {
- if (isset($item->require)) {
- if (!self::is_satisfy_array($item->require)) {
- $status = false;
- continue;
- }
- }
- if (!self::is_satisfy($item->name, $item->version)) {
- if (!function_exists($item->name . '_upgrade')) {
- $this->update_plugin_version($item->name, $item->version);
- $this->upgrade[] = $item;
- unset($this->install[$key]);
- continue;
- }
- call_user_func($item->name . '_upgrade', 0);
- $this->upgrade[] = $this->instaled[$item->name];
- unset($this->install[$key]);
- $status = false;
- }
- }
- foreach ($this->upgrade as $item) {
- if (isset($item->require)) {
- if (!self::is_satisfy_array($item->require)) {
- $status = false;
- continue;
- }
- }
- if (!self::is_satisfy($item->name, $item->version)) {
- if (!function_exists($item->name . '_upgrade')) {
- $this->update_plugin_version($item->name, $item->version);
- continue;
- }
- call_user_func($item->name . '_upgrade', $this->instaled[$item->name]->version);
- $status = false;
- }
- }
- }
- $this->save();
- }
- }
|