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) { /* * * * */ $funname = explode('_', $item->name); if(sizeof($funname) > 1){ unset($funname[0]); } $funname = implode('_', $funname); 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($funname . '_upgrade')) { echo 'adsdsadasdsadassad'; $this->update_plugin_version($item->name, $item->version); $this->upgrade[] = $item; $this->instaled[$item->name] = $item; unset($this->install[$key]); continue; } $this->instaled[$item->name] = $item; call_user_func($funname . '_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($funname, $item->version)) { if (!function_exists($item->name . '_upgrade')) { $this->update_plugin_version($item->name, $item->version); continue; } call_user_func($funname . '_upgrade', $this->instaled[$item->name]->version); $status = false; } } } $this->save(); } }