/** * [submitVersion 撤销版本] * @return [type] [description] */ public function deleteVersion() { //获取post数据 调用 $data = Flight::request()->data->getData(); $errorArray = array('error' => ''); $this->log->info("START FUNCTION " . __FUNCTION__); $data = Flight::request()->query->getData(); $this->log->info('data:' . json_encode($data)); //参数检查 if (!isset($data['product']) || !isset($data['name']) || !isset($data['version'])) { $errorArray['error'] = "missing parameters:product, name, version, last"; Flight::json($errorArray, 400); } $this->log->info(json_encode($data)); $packageProduct = $data['product']; $packageName = $data['name']; $packageVersion = $data['version']; //是否还是要checkout svn路径先 也就是checkoutmethod $checkoutRes = $this->checkOutMethod($packageProduct, $packageName, $packageVersion); if ($checkoutRes['code'] != 0) { $errorArray['error'] = $checkoutRes['error']; $this->log->info("package checkout failed:" . $checkoutRes['error']); Flight::json($errorArray, 400); } //to delete cache $hostIp = Conf::get('file_manage_host'); $hostName = Conf::get('file_manage_hostname'); $url = $hostName . Conf::get('file_manage_mainurl') . Conf::get('file_manage_suburl_deletecache'); $requestData = array('product' => $packageProduct, 'name' => $packageName, 'version' => $packageVersion); $option = array('ip' => $hostIp, 'method' => 'GET', 'data' => $data, 'decode' => true); $magic = new MagicTool(); $deleteCacheResult = $magic->httpRequest($url, $option); //判断delete cache是否成功 if ($deleteCacheResult == null || isset($deleteCacheResult['error']) && !empty($deleteCacheResult['error'])) { $errorArray['error'] = 'delete cache step failed'; if (isset($deleteCacheResult['error'])) { $errorArray['error'] .= $deleteCacheResult['error']; } $this->log->info("package delete cache failed:" . $errorArray['error']); Flight::json($errorArray, 400); } //获取数据库的记录 $packageItem = new Package(); $packageInfo = $packageItem->getInfo($packageProduct, $packageName, $packageVersion); //无该包 if (!is_array($packageInfo) || count($packageInfo) == 0) { $errorArray['error'] = "指定的包不存在 product={$packageProduct}, name={$packageName}, version={$packageVersion}"; $this->log->info("package not exists"); Flight::json($errorArray, 404); } $svnPath = $packageInfo['path']; $instanceItem = new Instance(); $instanceList = $instanceItem->getInstance($svnPath, $packageVersion); if ($instanceList && count($instanceList) > 0) { $errorArray['error'] = "该版本存在已安装的实例,如需撤销,请先到实例管理中卸载或删除相关记录后重试"; $this->log->info("package has instance using it"); Flight::json($errorArray, 400); } $shellRun = new ExecShell('pkg_delete.sh', Conf::get('tool_operate')); $shellRun->run("pkg_path={$svnPath}", "version={$packageVersion}"); $this->log->info('shell run result:' . json_encode($shellRun->getOutput())); $returnCode = $shellRun->rtCode(); if ($returnCode != 0 || $shellRun->result(1) != "success") { $errorArray['error'] = "撤销失败:" . $shellRun->result(2); $this->log->info("run script pkg_delete fail:" . $shellRun->result(2)); Flight::json($errorArray, 400); } $packageId = $packageInfo['packageId']; $svnVersion = $packageInfo['packageId']; // 是否包剩下的唯一版本 $last = $packageItem->isLastPackage($svnPath); if ($last != true) { $this->log->info("not the only valid package"); //撤销时 将包回到上一版本提交 $backupPath = Conf::get('package_backup'); $operateScriptDir = Conf::get('tool_operate'); $svnScriptDir = Conf::get('tool_svn'); $pkgTmpPath = Conf::get('package_tmp'); $srcDir = $this->pkgHome; $srcPath = $srcDir . $svnPath; $tmpSvnExportPath = $pkgTmpPath . $svnPath; $previousPackage = $packageItem->getLastValidPackage($svnPath, $packageId, $packageVersion); if ($previousPackage != null) { //存在上个版本 可以继续 $this->log->info("has a previous version, can do revert "); $previousPackageVersion = $previousPackage['version']; $previousPackageSvnVersion = $previousPackage['svnVersion']; if (intval($previousPackageSvnVersion) == 0) { //上个版本svn版本号不正确 撤销失败 $errorArray['error'] = "撤销失败:上个版本svn版本号不正确"; $this->log->info("revert failed:svn tag incorrect"); Flight::json($errorArray, 400); } $pkgsvn = new PkgSvn(); $svnRunRes = $pkgsvn->export($svnPath, $tmpSvnExportPath, $previousPackageSvnVersion); if ($svnRunRes['code'] != 0) { $errorArray['error'] = "撤销失败:导出上个版本包失败:{$svnRunRes['msg']}"; $this->log->info("导出上个版本包失败"); Flight::json($errorArray, 400); } $commandList = array("cp {$srcPath} {$backupPath} -r -f ; echo \$?", "cd {$srcPath} ; rm -rf `ls|egrep -v '(.svn)'`; echo \$?", "cp {$tmpSvnExportPath}/* {$srcPath}/ -r ; echo \$?"); $stepPass = true; foreach ($commandList as $singleCommand) { // $singleCommand = escapeshellcmd($singleCommand); $runRes = shell_exec($singleCommand); $this->log->info($singleCommand); $this->log->info("result:" . $runRes); if (strpos($runRes, 'fail') !== false) { $stepPass = false; } if (strpos($runRes, 'success') !== false) { $this->log->info("step ok"); } elseif (strpos($runRes, '0') !== false) { $this->log->info("step ok"); } else { $this->log->info("step fail"); $stepPass = false; } if (!$stepPass) { $errorArray['error'] = "撤销失败:恢复上个版本包步骤失败"; Flight::json($errorArray, 400); } } //提交版本 $svnRunRes = $pkgsvn->commit($srcPath, "go back to previous version"); $this->log->info(json_encode($svnRunRes)); if ($svnRunRes['code'] != 0) { $errorArray['error'] = "撤销失败:提交为上个版本包失败:{$svnRunRes['msg']}"; $this->log->info("提交失败"); Flight::json($errorArray, 400); } } } $packageItem->setStatus($packageId, 4); //标记包状态作废 //唯一的包版本被撤销 则删掉关联svn文件夹 if ($last == true && !empty($svnPath)) { $this->log->info("delete the svn dir too"); $pkgSvnScript = new PkgSvn(); $shellRunRes = $pkgSvnScript->allDelete($svnPath); $this->log->info('svn delete' . json_encode($shellRunRes)); if ($shellRunRes['code'] != 0) { $errorArray['error'] = "删除包svn文件失败"; $this->log->info("run script:pkg_all_delete.sh fail"); Flight::json($errorArray, 400); } } $this->log->info("delete version completed"); //成功 Flight::json($errorArray, 200); }