function commitModules($unlink = false, $type = 'module') { require_once 'ModuleInstall/ModuleInstaller.php'; require_once 'include/entryPoint.php'; global $mod_strings; global $base_upgrade_dir; global $base_tmp_upgrade_dir; global $db; $GLOBALS['db'] = $db; $errors = array(); $files = array(); global $current_user; $current_user = new User(); $current_user->is_admin = '1'; $old_mod_strings = $mod_strings; if (is_dir(sugar_cached("upload/upgrades"))) { $files = findAllFiles(sugar_cached("upload/upgrades/{$type}"), $files); $mi = new ModuleInstaller(); $mi->silent = true; $mod_strings = return_module_language('en', "Administration"); foreach ($files as $file) { if (!preg_match('#.*\\.zip\\$', $file)) { continue; } $lic_name = 'accept_lic_' . str_replace('.', '_', urlencode(basename($file))); $can_install = true; if (isset($_REQUEST[$lic_name])) { if ($_REQUEST[$lic_name] == 'yes') { $can_install = true; } else { $can_install = false; } } if ($can_install) { // handle manifest.php $target_manifest = remove_file_extension($file) . '-manifest.php'; if ($type == 'langpack') { $_REQUEST['manifest'] = $target_manifest; $_REQUEST['zipFile'] = $file; commitLanguagePack(); continue; } include $target_manifest; $unzip_dir = mk_temp_dir($base_tmp_upgrade_dir); unzip($file, $unzip_dir); $_REQUEST['install_file'] = $file; $mi->install($unzip_dir); $new_upgrade = new UpgradeHistory(); $new_upgrade->filename = $file; $new_upgrade->md5sum = md5_file($file); $new_upgrade->type = $manifest['type']; $new_upgrade->version = $manifest['version']; $new_upgrade->status = "installed"; // $new_upgrade->author = $manifest['author']; $new_upgrade->name = $manifest['name']; $new_upgrade->description = $manifest['description']; $new_upgrade->id_name = isset($installdefs['id_name']) ? $installdefs['id_name'] : ''; $serial_manifest = array(); $serial_manifest['manifest'] = isset($manifest) ? $manifest : ''; $serial_manifest['installdefs'] = isset($installdefs) ? $installdefs : ''; $serial_manifest['upgrade_manifest'] = isset($upgrade_manifest) ? $upgrade_manifest : ''; $new_upgrade->manifest = base64_encode(serialize($serial_manifest)); $new_upgrade->save(); //unlink($file); } //fi } //rof } //fi $mod_strings = $old_mod_strings; }
function performInstall($file, $silent = true) { global $sugar_config; global $mod_strings; global $current_language; $base_upgrade_dir = sugar_cached("/upgrades"); $base_tmp_upgrade_dir = "{$base_upgrade_dir}/temp"; if (!file_exists($base_tmp_upgrade_dir)) { mkdir_recursive($base_tmp_upgrade_dir, true); } $GLOBALS['log']->debug("INSTALLING: " . $file); $mi = new ModuleInstaller(); $mi->silent = $silent; $mod_strings = return_module_language($current_language, "Administration"); $GLOBALS['log']->debug("ABOUT TO INSTALL: " . $file); if (preg_match("#.*\\.zip\$#", $file)) { $GLOBALS['log']->debug("1: " . $file); // handle manifest.php $target_manifest = remove_file_extension($file) . '-manifest.php'; include $target_manifest; $GLOBALS['log']->debug("2: " . $file); $unzip_dir = mk_temp_dir($base_tmp_upgrade_dir); unzip($file, $unzip_dir); $GLOBALS['log']->debug("3: " . $unzip_dir); $id_name = $installdefs['id']; $version = $manifest['version']; $uh = new UpgradeHistory(); $previous_install = array(); if (!empty($id_name) & !empty($version)) { $previous_install = $uh->determineIfUpgrade($id_name, $version); } $previous_version = empty($previous_install['version']) ? '' : $previous_install['version']; $previous_id = empty($previous_install['id']) ? '' : $previous_install['id']; if (!empty($previous_version)) { $mi->install($unzip_dir, true, $previous_version); } else { $mi->install($unzip_dir); } $GLOBALS['log']->debug("INSTALLED: " . $file); $new_upgrade = new UpgradeHistory(); $new_upgrade->filename = $file; $new_upgrade->md5sum = md5_file($file); $new_upgrade->type = $manifest['type']; $new_upgrade->version = $manifest['version']; $new_upgrade->status = "installed"; //$new_upgrade->author = $manifest['author']; $new_upgrade->name = $manifest['name']; $new_upgrade->description = $manifest['description']; $new_upgrade->id_name = $id_name; $serial_manifest = array(); $serial_manifest['manifest'] = isset($manifest) ? $manifest : ''; $serial_manifest['installdefs'] = isset($installdefs) ? $installdefs : ''; $serial_manifest['upgrade_manifest'] = isset($upgrade_manifest) ? $upgrade_manifest : ''; $new_upgrade->manifest = base64_encode(serialize($serial_manifest)); //$new_upgrade->unique_key = (isset($manifest['unique_key'])) ? $manifest['unique_key'] : ''; $new_upgrade->save(); //unlink($file); } //fi }
} } } ksort($sugar_config); if (!write_array_to_file("sugar_config", $sugar_config, "config.php")) { die($mod_strings['ERR_UW_CONFIG_FAILED']); } break; case "module": require_once "ModuleInstall/ModuleInstaller.php"; $mi = new ModuleInstaller(); switch ($mode) { case "Install": //here we can determine if this is an upgrade or a new version if (!empty($previous_version)) { $mi->install("{$unzip_dir}", true, $previous_version); } else { $mi->install("{$unzip_dir}"); } break; case "Uninstall": if ($remove_tables == 'false') { $GLOBALS['mi_remove_tables'] = false; } else { $GLOBALS['mi_remove_tables'] = true; } $mi->uninstall("{$unzip_dir}"); break; case "Disable": if (!$overwrite_files) { $GLOBALS['mi_overwrite_files'] = false;
/** * 系统模块管理功能,用于从商店自动部署模块、移除模块 */ public function Item() { $this->rest(["model" => "System/ModuleItem", "post" => function ($res) { $zip = "{$res["request"]["module"]}.zip"; $path = APP_PATH . $res["request"]["module"]; if (!APP_DEBUG) { /*从服务器下载模块压缩包*/ \Org\Util\Downloader::transfer(C("ENTERTILE") . C("ENTERTILE_STORE_PATH") . $zip, TEMP_PATH . $zip); /*创建模块目录*/ \Org\Util\Directory::create($path); /*解压ZIP文件*/ \Org\Util\Zip::extract(TEMP_PATH . $zip, $path); } /*加载模块配置类并初始化*/ include "{$path}/install.php"; $moduleInstaller = new \ModuleInstaller(); $config = $moduleInstaller->config; /*准备配置数据(格式化处理)*/ $rules = []; for ($i = 0, $l = count($config["menus"]); $i < $l; $i++) { $menu = $config["menus"][$i]; $menu["rules"] = []; for ($j = 0, $m = count($menu["permits"]); $j < $m; $j++) { $permit = $menu["permits"][$j]; for ($k = 0, $n = count($permit["methods"]); $k < $n; $k++) { $rule = strtolower("{$permit["methods"][$k]}{$permit["path"]}"); $rules[] = $menu["rules"][] = $rule; } } $config["menus"][$i] = $menu; } /*增加模块信息*/ $config["id"] = D("System/ModuleItem")->add(["name" => $config["name"], "title" => $config["title"], "abstract" => $config["abstract"]]); /*增加相关权限规则(如果已存在,则不添加)*/ //读取当前规则信息 $modelPermits = D("System/AuthenticationPermit")->select(); //移除已经存在的权限规则 $rules = join($rules, ";"); for ($i = 0, $l = count($modelPermits); $i < $l; $i++) { $rules = str_replace($modelPermits[$i]["name"], "", $rules); } $rules = preg_replace("/^;|;\$/", "", preg_replace("/;{2,}/", ";", $rules)); //解析新增RULE并保存到数据库 if ($rules !== "") { $rules = '[{"name":"' . str_replace(";", '"},{"name":"', $rules) . '"}]'; } D("System/AuthenticationPermit")->addAll(json_decode($rules, true)); /*将规则信息与菜单相关联*/ //读取最新规则信息 $rules = []; $modelPermits = D("System/AuthenticationPermit")->select(); for ($i = 0, $l = count($modelPermits); $i < $l; $i++) { $rules[$modelPermits[$i]["name"]] = $modelPermits[$i]["id"]; } //关联菜单权限 for ($i = 0, $l = count($config["menus"]); $i < $l; $i++) { $tPermits = []; $menu = $config["menus"][$i]; //添加菜单页面可访问权限 $menu["rules"][] = ["path" => $menu["page"], "methods" => ["GET"]]; for ($j = 0, $m = count($menu["rules"]); $j < $m; $j++) { $tPermits[] = $rules[$menu["rules"][$j]]; } //创建菜单记录 unset($config["menus"][$i]["permits"]); unset($config["menus"][$i]["rules"]); $config["menus"][$i]["title"] = $menu["menu"]; $config["menus"][$i]["module_id"] = $config["id"]; $config["menus"][$i]["rule_ids"] = join($tPermits, ","); } D("SystemModuleMenu")->addAll($config["menus"]); /*运行自定义安装脚本*/ $moduleInstaller->install(); /*返回输出*/ $res["response"] = $config; return $res; }, "delete" => function ($res) { $path = APP_PATH . $res["request"]["module"]; //执行自定义卸载脚本 include "{$path}/install.php"; $moduleInstaller = new \ModuleInstaller(); $moduleInstaller->uninstall(); /*移除模块相关文件及记录*/ $mod = new \Think\Model(); //移除对应菜单项 $mod->execute("delete from think_system_module_menu where module_id in(select id from think_system_module_item where name='%s')", [$res["request"]["module"]]); //移除模块主体 $mod->execute("delete from think_system_module_item where name='%s'", [$res["request"]["module"]]); if (!APP_DEBUG) { //移除代码 \Org\Util\Directory::unlink($path); } /*返回输出*/ return $res; }]); }
} } $sugar_config['languages'] = $new_langs; } } ksort($sugar_config); if (!write_array_to_file("sugar_config", $sugar_config, "config.php")) { die($mod_strings['ERR_UW_CONFIG_FAILED']); } break; case "module": require_once "ModuleInstall/ModuleInstaller.php"; $mi = new ModuleInstaller(); switch ($mode) { case "Install": $mi->install("{$unzip_dir}"); break; case "Uninstall": $mi->uninstall("{$unzip_dir}"); break; default: break; } $file = "{$unzip_dir}/" . constant('SUGARCRM_POST_INSTALL_FILE'); if (is_file($file)) { print "{$mod_strings['LBL_UW_INCLUDING']}: {$file} <br>\n"; include $file; post_install(); } break; case "full":