Example #1
0
 /**
  * [uploadPackage 上传包]
  * @return [type] [description]
  */
 public function uploadPackage()
 {
     $this->log->info("START FUNCTION " . __FUNCTION__);
     $errorArray = array('error' => '');
     $data = Flight::request()->data->getData();
     $this->log->info('data:' . json_encode($data));
     if ($this->open == true) {
         //开源不需要上传多地
         Flight::json($errorArray, 200);
     }
     //参数检查
     $needPara = array('product', 'name', 'version', 'toVersion', 'type', 'region');
     $optionalPara = array();
     $error = $this->checkParameter($needPara, $data, $optionalPara);
     $pkgPath = $this->pkgPath;
     $uploadPkgPath = $this->updatePkgPath;
     $product = $data['product'];
     $name = $data['name'];
     $version = $data['version'];
     $type = $data['type'];
     $toVersion = $data['toVersion'];
     $region = $data['region'];
     //深圳本地 不用调用
     if ($region == 'sz') {
         Flight::json($errorArray, 200);
     }
     //地域的一整套 上传到各地 参数
     $uploadConf = PrivateConf::$upload;
     $uploadCmdConf = PrivateConf::$uploadCmd;
     $destIp = $uploadConf[$region]['ip'];
     $destPort = $uploadConf[$region]['port'];
     $url = 'http://' . $uploadCmdConf[$region]['host'] . '/services/tools/mkdir.php';
     $option = array();
     $option['ip'] = $uploadCmdConf[$region]['ip'];
     //分类处理  pkg  upd_pkg
     $magic = new MagicTool();
     if ($type == 'pkg') {
         $fileName = "/{$product}/{$name}/{$name}-{$version}--install.tar.gz";
         $option['data'] = 'rsync_dir=pkg_home/pkg' . $fileName;
         $mkdirResult = $magic->httpRequest($url, $option);
         $this->log->info('mkdir request result:' . $mkdirResult);
         //跑命令拉取
         $command = "/usr/bin/rsync -a --port={$destPort} {$pkgPath}{$fileName} " . "user_00@{$destIp}::pkg_home/pkg{$fileName};echo '###'\$?'###'";
         $this->log->info('command\\n' . $command);
         $result = shell_exec($command);
         //结果匹配
         $matchCount = preg_match('/###(\\d+)###/', $result, $matches);
         if ($matchCount > 0 && $matches[1] == 0) {
             Flight::json($errorArray, 200);
         } else {
             $errorArray['error'] = $result;
             Flight::json($errorArray, 400);
         }
     } elseif ($type == 'upd_pkg') {
         $fileName = "/{$product}/{$name}/{$name}" . "_update-{$version}-{$toVersion}-{$name}.tar.gz";
         $option['data'] = 'rsync_dir=pkg_home/upd_pkg' . $fileName;
         $mkdirResult = $magic->httpRequest($url, $option);
         $this->log->info('mkdir request result:' . $mkdirResult);
         $command = "/usr/bin/rsync -a --port={$destPort} {$uploadPkgPath}{$fileName} " . "user_00@{$destIp}::pkg_home/upd_pkg{$fileName};echo '###'\$?'###'";
         $this->log->info('command\\n' . $command);
         $result = shell_exec($command);
         //结果匹配
         $matchCount = preg_match('/###(\\d+)###/', $result, $matches);
         if ($matchCount > 0 && $matches[1] == 0) {
             Flight::json($errorArray, 200);
         } else {
             $errorArray['error'] = $result;
             Flight::json($errorArray, 400);
         }
     }
     $errorArray['error'] = 'unknown error';
     Flight::json($errorArray, 400);
 }
Example #2
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);
 }
Example #3
0
 /**
  * [reportToLogSystem 上报变更日志]
  * @param  [type] $ipList      [description]
  * @param  [type] $object      [description]
  * @param  [type] $operator    [description]
  * @param  [type] $description [description]
  * @return [type]              [description]
  */
 public function reportToLogSystem($ipList, $object, $operator, $description)
 {
     if (Conf::get('open')) {
         return;
     }
     $this->log->info("START REPORT FUNCTION " . __FUNCTION__);
     $logInfo = array('modifiedIps' => implode(',', $ipList), 'operator' => $operator, 'modifiedObj' => $object, 'modifyDesc' => $description, 'passiveSystem' => 'pkg', 'logType' => '', 'startTime' => time());
     $this->log->info(json_encode($logInfo));
     $hostIp = Conf::get('report_host');
     $reportUrl = Conf::get('report_url');
     $magic = new MagicTool();
     $option = array('ip' => $hostIp, 'method' => 'POST', 'data' => $logInfo);
     ///先不上报
     $reportResult = $magic->httpRequest($reportUrl, $option);
     $this->log->info($reportResult);
 }