/**
* Tencent is pleased to support the open source community by making MSEC available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the GNU General Public License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* https://opensource.org/licenses/GPL-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package beans.service;
import beans.dbaccess.IDL;
import beans.dbaccess.LibraryFile;
import beans.dbaccess.SecondLevelServiceConfigTag;
import beans.dbaccess.SharedobjectTag;
import beans.request.DevPackage;
import beans.request.ReleasePlan;
import ngse.org.*;
import org.apache.log4j.Logger;
import javax.servlet.ServletContext;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/2/16.
* 打开发包,得到一个tar文件
*/
public class PackDevFile implements Runnable {
DevPackage pack;
ServletContext servletContext;
String outputFileName ;
String resultString = "";
public void setOutputFileName(String outputFileName) {
this.outputFileName = outputFileName;
}
public String getResultString() {
return resultString;
}
public void setResultString(String resultString) {
this.resultString = resultString;
}
public String getOutputFileName()
{
return outputFileName;
}
public PackDevFile(DevPackage p, ServletContext context)
{
pack = p;
servletContext = context;
}
private ArrayList<LibraryFile> getLibraryFilesFromDB(String flsn, String slsn)
{
Logger logger = Logger.getLogger(PackDevFile.class);
DBUtil util = new DBUtil();
if (util.getConnection() == null)
{
return null;
}
try {
String sql = "select file_name from t_library_file where first_level_service_name=? and second_level_service_name=?";
List<Object> params = new ArrayList<Object>();
params.add(flsn);
params.add(slsn);
ArrayList<LibraryFile> ret = util.findMoreRefResult(sql, params, LibraryFile.class);
logger.info("get library files from db, file number:"+ret.size());
return ret;
}
catch (Exception e)
{
e.printStackTrace();
logger.error(e.toString());
return null;
}
finally {
util.releaseConn();
}
}
private void mkdirs(String baseDir) throws Exception
{
File f = new File(baseDir);
if (!f.exists()) {f.mkdirs();}
String s = null;
s = baseDir+File.separator+"bin";
f = new File(s);
if (!f.exists()) {f.mkdirs();}
s = baseDir+File.separator+"cnf";
f = new File(s);
if (!f.exists()) {f.mkdirs();}
s = baseDir+File.separator+"lib";
f = new File(s);
if (!f.exists()) {f.mkdirs();}
s = baseDir+File.separator+"so";
f = new File(s);
if (!f.exists()) {f.mkdirs();}
}
private boolean copyFile(File frm, File to)
{
try {
FileInputStream in = new FileInputStream(frm);
FileOutputStream out = new FileOutputStream(to);
byte[] buf = new byte[1024*8];
while (true)
{
int len = in.read(buf);
if (len <= 0)
{
break;
}
out.write(buf, 0, len);
}
in.close();
out.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private void copyCnfFile(String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
String destFile = baseDir+File.separator+"etc"+File.separator+"service.yaml";
String srcFile = SecondLevelServiceConfigTag.getConfigFileName(pack.getFirst_level_service_name(),
pack.getSecond_level_service_name(), pack.getConfig_tag());
if (copyFile(new File(srcFile), new File(destFile)))
{
logger.info("copy file successfully."+srcFile+" "+destFile);
}
else
{
logger.error("failed to copy file:"+srcFile+" "+destFile);
throw new Exception("failed to copy file:"+srcFile+" "+destFile);
}
}
private void copyLibraryFile(String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
ArrayList<LibraryFile> libraryFiles = getLibraryFilesFromDB(pack.getFirst_level_service_name(), pack.getSecond_level_service_name());
for (int i = 0; i < libraryFiles.size(); i++) {
String destFile = baseDir+"/lib/"+libraryFiles.get(i).getFile_name();
String srcFile = LibraryFile.getLibraryFileName(pack.getFirst_level_service_name(),
pack.getSecond_level_service_name(), libraryFiles.get(i).getFile_name());
if (copyFile(new File(srcFile), new File(destFile)))
{
logger.info("copy file successfully."+srcFile+" "+destFile);
continue;
}
else
{
logger.error("failed to copy file:"+srcFile+" "+destFile);
throw new Exception("failed to copy file:"+srcFile+" "+destFile);
}
}
}
private void copySharedobject(String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
String suffix = "so";
String destFile = baseDir+"/bin/msec.so";
String srcFile = SharedobjectTag.getSharedobjectName(pack.getFirst_level_service_name(),
pack.getSecond_level_service_name(), pack.getSharedobject_tag(), suffix);
if (copyFile(new File(srcFile), new File(destFile)))
{
logger.info("copy file successfully."+srcFile+" "+destFile);
}
else
{
logger.error("failed to copy file:"+srcFile+" "+destFile);
throw new Exception("failed to copy file:"+srcFile+" "+destFile);
}
}
private void copyIDLFile(String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
// String destFile = baseDir+"/"+pack.getIdl_tag()+".proto";
String destFile = baseDir+"/msec.proto";
String srcFile = IDL.getIDLFileName(pack.getFirst_level_service_name(),
pack.getSecond_level_service_name(),
pack.getIdl_tag());
if (copyFile(new File(srcFile), new File(destFile)))
{
logger.info("copy file successfully."+srcFile+" "+destFile);
}
else
{
logger.error("failed to copy file:"+srcFile+" "+destFile);
throw new Exception("failed to copy file:"+srcFile+" "+destFile);
}
}
private void mktar(String baseDir, String tarFileName) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
TarUtil.archive(baseDir, tarFileName);
logger.info("tar successfully." + tarFileName);
}
private void getSppFromResource(String rnd, String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
//将war包资源中的spp.tar解压到目录baseDir
InputStream inputStream = servletContext.getResourceAsStream("/resource/spp_dev.tar");
String tmpTarFile = ServletConfig.fileServerRootDir + "/tmp/spp_dev_"+rnd+".tar";
logger.info("copy spp from resource to "+tmpTarFile);
File f = null;
//将资源文件拷贝到文件系统中的普通文件,并解压缩为目录baseDir
OutputStream outputStream = new FileOutputStream(tmpTarFile);
byte[] buf = new byte[10240];
int len;
while (true) {
len = inputStream.read(buf);
if (len <= 0) {
break;
}
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
//把普通文件解包到目录baseDir
TarUtil.dearchive(new File(tmpTarFile), new File(baseDir));
logger.info("dearchive tar to " + baseDir);
//删除普通文件
new File(tmpTarFile).delete();
}
private void getJavaFrameworkFromResource(String rnd, String baseDir) throws Exception
{
Logger logger = Logger.getLogger(PackDevFile.class);
InputStream inputStream = servletContext.getResourceAsStream("/resource/java_dev.tar");
String tmpTarFile = ServletConfig.fileServerRootDir + "/tmp/java_dev_"+rnd+".tar";
logger.info("copy java framework from resource to "+tmpTarFile);
File f = null;
//将资源文件拷贝到文件系统中的普通文件,并解压缩为目录baseDir
byte[] buf = new byte[10240];
int len;
OutputStream outputStream = new FileOutputStream(tmpTarFile);
while (true) {
len = inputStream.read(buf);
if (len <= 0) {
break;
}
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
//把普通文件解包到目录baseDir
TarUtil.dearchive(new File(tmpTarFile), new File(baseDir));
logger.info("dearchive tar to " + baseDir);
//删除普通文件
new File(tmpTarFile).delete();
}
@Override
public void run() {
Logger logger = Logger.getLogger(PackDevFile.class);
String rnd = Tools.nowString("yyyyMMddHHmmss");
String baseDir = ServletConfig.fileServerRootDir+ File.separator+"tmp"+File.separator+"DevPackage_"+pack.getSecond_level_service_name()+rnd;
String tarFileName = baseDir +".tar";
String gzFileName = tarFileName +".gz";
String result;
try {
if (pack.getDev_lang().equals("c++")) {
getSppFromResource(rnd, baseDir);
} else if (pack.getDev_lang().equals("java")) {
getJavaFrameworkFromResource(rnd, baseDir);
} else if (pack.getDev_lang().equals("php")) {
getSppFromResource(rnd, baseDir);
} else if (pack.getDev_lang().equals("python")) {
getSppFromResource(rnd, baseDir);
} else {
throw new Exception("invalid dev lang " + pack.getDev_lang());
}
copyLibraryFile(baseDir);
copyIDLFile(baseDir);
//执行python脚本,生成目录
String[] cmd = new String[4];
String pythonScript;
String outputDir;
if (pack.getDev_lang().equals("c++")) {
pythonScript = baseDir + "/rpc/template/create_rpc.py";
new File(pythonScript).setExecutable(true);
cmd[0] = pythonScript;
cmd[1] = baseDir + "/msec.proto";
cmd[2] = baseDir;
outputDir = baseDir + "/"+pack.getFirst_level_service_name()+"."+pack.getSecond_level_service_name();
cmd[3] = outputDir;
}
else if (pack.getDev_lang().equals("java"))
{
pythonScript = baseDir + "/create_rpc.py";
new File(pythonScript).setExecutable(true);
cmd[0] = pythonScript;
cmd[1] = "msec.proto";
cmd[2] = baseDir;
outputDir = baseDir;
cmd[3] = pack.getFirst_level_service_name()+"."+pack.getSecond_level_service_name();;
}
else if (pack.getDev_lang().equals("php"))
{
pythonScript = baseDir + "/rpc/php_template/create_rpc.py";
new File(pythonScript).setExecutable(true);
cmd[0] = pythonScript;
cmd[1] = baseDir + "/msec.proto";
cmd[2] = baseDir;
outputDir = baseDir + "/"+pack.getFirst_level_service_name()+"."+pack.getSecond_level_service_name();
cmd[3] = outputDir;
}
else if (pack.getDev_lang().equals("python"))
{
pythonScript = baseDir + "/rpc/py_template/create_rpc.py";
new File(pythonScript).setExecutable(true);
cmd[0] = pythonScript;
cmd[1] = baseDir + "/msec.proto";
cmd[2] = baseDir;
outputDir = baseDir + "/"+pack.getFirst_level_service_name()+"."+pack.getSecond_level_service_name();
cmd[3] = outputDir;
}
else
{
throw new Exception("invalid dev lang"+pack.getDev_lang());
}
StringBuffer cmdResult = new StringBuffer();
if (Tools.runCommand(cmd, cmdResult, true) != 0)
{
logger.error(cmdResult.toString());
throw new Exception("create_rpc.py failed:"+cmdResult.toString());
}
logger.info("run python script successfully.");
mktar(outputDir, tarFileName);
GzipUtil.zip(tarFileName, gzFileName);
logger.info("make tar file successfully.");
outputFileName = gzFileName;
setResultString("success");
}
catch (Exception e)
{
e.printStackTrace();
logger.error(e.getMessage());
setResultString(e.getMessage());
}
finally {
Tools.deleteDirectory(new File(baseDir));
}
}
}