Esempio n. 1
0
 /**
  * [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);
 }
Esempio n. 2
0
 /**
  * [copyMethod 拷贝包]
  * @param  [type] $srcPath    [description]
  * @param  [type] $srcVersion [description]
  * @param  [type] $targetPath [description]
  * @return [array]             [resukt:bool-true/false error:string]
  */
 public function copyMethod($srcPath, $srcVersion, $targetPath)
 {
     $packageItem = new Package();
     $srcInfo = $packageItem->getInfoByPath($srcPath, $srcVersion);
     $targetInfo = $packageItem->getLastValidPackageByPath($targetPath);
     if (empty($srcInfo) || empty($targetInfo)) {
         $resultArray['error'] = '包不存在';
         $resultArray['result'] = false;
         return $resultArray;
     }
     $svnVersion = $srcInfo['svnVersion'];
     $svnBase = $this->svnBase;
     $tmpPath = $this->svnBaseTmp . $srcPath;
     $targetPackageArray = explode('/', trim($targetPath, '/'));
     if (count($targetPackageArray) == 3) {
         $targetName = $targetPackageArray[2];
     } else {
         $targetName = $targetPackageArray[1];
     }
     $targetProduct = $targetPackageArray[0];
     $srcPackageArray = explode('/', trim($srcPath, '/'));
     if (count($srcPackageArray) == 3) {
         $srcName = $srcPackageArray[2];
     } else {
         $srcName = $srcPackageArray[1];
     }
     $srcProduct = $srcPackageArray[0];
     //版本号处理
     $targetVersion = $targetInfo['version'];
     $versionArray = explode('.', $targetVersion);
     $versionArray[count($versionArray) - 1]++;
     $targetVersion = implode('.', $versionArray);
     $baseVersion = $versionArray;
     unset($baseVersion[count($versionArray) - 1]);
     $baseVersion = implode('.', $baseVersion);
     $cmdArray = array();
     $cmdArray[] = "rm {$tmpPath} -r ;" . "/usr/local/bin/svn export --config-dir /etc/subversion -r {$svnVersion} svn://" . $this->svnServer . rtrim($srcPath, '/') . "/ {$tmpPath} --force >/dev/null 2>&1;echo \$?";
     $cmdArray[] = '/usr/bin/sed -i s:^name=\\"' . $srcName . '\\":name=\\"' . $targetName . '\\": ' . $tmpPath . '/init.xml; echo $?';
     $cmdArray[] = '/usr/bin/sed -i s:^product=\\"' . $srcProduct . '\\":product=\\"' . $targetProduct . '\\": ' . $tmpPath . '/init.xml; echo $?';
     $cmdArray[] = '/usr/bin/sed -i s:^version=\\"[0-9.]*\\":version=\\"' . $baseVersion . '\\": ' . $tmpPath . '/init.xml; echo $?';
     $cmdArray[] = "/usr/bin/rsync -a --delete --exclude=.svn " . rtrim($tmpPath, '/') . "/ {$svnBase}{$targetPath}  2>&1;echo \$?";
     foreach ($cmdArray as $index => $singleCommand) {
         $singleCommand = escapeshellcmd($singleCommand);
         $this->log($singleCommand);
         $shellRunResult = shell_exec($singleCommand);
         $this->log($shellRunResult);
         if ($shellRunResult != '0') {
             $resultArray['error'] = '执行命令出错:命令' . ($index + 1);
             $resultArray['result'] = false;
             return $resultArray;
         }
     }
     //修改包数据信息
     $packageItem = new Package();
     $packageItem->packageInfo['product'] = $targetInfo['product'];
     $packageItem->packageInfo['name'] = $targetInfo['name'];
     $packageItem->packageInfo['version'] = $targetVersion;
     $packageItem->packageInfo['path'] = $targetInfo['path'];
     $packageItem->packageInfo['user'] = $srcInfo['version'];
     $packageItem->packageInfo['remark'] = "从{$srcPath} {$srcVersion} " . "{$srcInfo['remark']} 拷贝";
     $packageItem->packageInfo['author'] = $srcInfo['author'];
     $packageItem->packageInfo['status'] = 1;
     $packageItem->packageInfo['frameworkType'] = $srcInfo['frameworkType'];
     $packageItem->packageInfo['stateless'] = $srcInfo['stateless'];
     $packageItem->packageInfo['os'] = $srcInfo['os'];
     //运行升级脚本
     $shellRun = new ExecShell('update_package.sh');
     $shellRun->run($this->pkgHome . $targetPath, $targetProduct, $targetName, $targetVersion);
     $resultArray = array();
     $shellRunCode = $shellRun->rtCode();
     if ($shellRun->result(0) != 'result' || $shellRun->result(1) != 'success' && $shellRun->result(1) != 'failed') {
         $resultArray['error'] = '后台异常返回';
         $resultArray['result'] = false;
         return $resultArray;
     }
     if ($shellRun->result(1) === 'success') {
         $packageItem->packageInfo['svnVersion'] = $shellRun->result(3);
         $packageItem->savePackage();
     } else {
         $resultArray['error'] = '升级失败' . $shellRun->result(2);
         $resultArray['result'] = false;
         return $resultArray;
     }
     $resultArray['error'] = '';
     $resultArray['result'] = true;
     return $resultArray;
 }
Esempio n. 3
0
 /**
  * [deleteCache 清除缓存]
  * @return [type] [description]
  */
 public function deleteCache()
 {
     $this->log->info("START FUNCTION " . __FUNCTION__);
     $errorArray = array('error' => '');
     $data = Flight::request()->query->getData();
     //参数检查
     $needPara = array('product', 'name', 'version');
     $optionalPara = array();
     $error = $this->checkParameter($needPara, $data, $optionalPara);
     $this->log->info('data:' . json_encode($data));
     $product = $data['product'];
     $name = $data['name'];
     $version = $data['version'];
     $packageItem = new Package();
     $packageInfo = $packageItem->getInfo($product, $name, $version);
     if ($packageInfo == null) {
         $errorArray['error'] = "package not exists";
         Flight::json($errorArray, 404);
     }
     //run scripts
     $svnPath = $packageInfo['path'];
     $shellRun = new ExecShell('pkg_delete.sh', Conf::get('tool_operate'));
     $shellRun->run('version=' . $version, 'pkg_path=' . $svnPath);
     $this->log->info('shell run result:' . json_encode($shellRun->getOutput()));
     if ($shellRun->rtCode() != 0) {
         $errorArray['error'] = $shellRun->result(2);
         Flight::json($errorArray, 400);
     }
     //success
     Flight::json($errorArray, 200);
 }