package cn.linkey.rulelib.FBLC;
import java.lang.reflect.Array;
import java.util.*;
import cn.linkey.dao.*;
import cn.linkey.util.*;
import cn.linkey.doc.*;
import cn.linkey.factory.*;
import cn.linkey.wf.*;
import cn.linkey.rule.LinkeyRule;
import cn.linkey.org.LinkeyUser;
import cn.linkey.factory.BeanCtx;
import cn.linkey.util.Tools;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.net.*;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
/**
* @Title: <p>R_FBLC_B003_downloadTarFromProductionLib</p>
* @Description: <p>从制品库下载war</p>
* @author:
* @Date: 2019/8/22 19:18
* @version: 1.0
* @Copyright: . All rights reserved.
*/
final public class R_FBLC_B003_downloadTarFromProductionLib implements LinkeyRule {
// 设置连接超时时间,单位毫秒。
private static final int CONNECT_TIMEOUT = 6000;
// 请求获取数据的超时时间(即响应时间),单位毫秒。
private static final int SOCKET_TIMEOUT = 6000;
//请求指定验证的用户名
private String userName;
//请求指定验证的密码
private String password;
//保存目录 "/usr/local/okit/bpmfiles/"
private String filePath;
//办公网段ip
private String officeSegment;
//日志前缀
private String logPre = "[从制品库下载war]<R_FBLC_B003_downloadTarFromProductionLib>";
/**
* @Title: <p>run</p>
* @Description: <p>从制品库下载war</p>
* @param params
* @return: java.lang.String
* @author:
* @Date: 2019/8/22 19:18
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
@Override
public String run(HashMap<String, Object> params) throws Exception {
/**
* 1.返回值准备
*/
JSONObject obj = new JSONObject();
obj.put("result", true);
obj.put("message", "下载完成!");
/**
* 2.参数校验
*/
String objStr = init();
if (null != objStr) {
return objStr;
}
/**
* 3.网段校验
*/
objStr = isOfficeSegment();
if (null != objStr) {
return objStr;
}
/**
* 4.数据准备
*/
//String fileName = "IPDO_20190807165725.tar";
String fileName = BeanCtx.g("fileName");
//String openUrl = "http://22.5.104.1:8081/artifactory/IPDO-JFROG-DEV/sprint--deploy-20190807/69/IPDO_20190807165725.tar"; //文件URL地址
String openUrl = BeanCtx.g("openUrl");
BeanCtx.out(logPre + "入参:fileName=" + fileName + ",openUrl=" + openUrl);
/**
* 5.开始从制品库下载到本地
*/
boolean success = getWarByGetMathod(openUrl, fileName);
/**
* 6.返回值校验
*/
if(!success){
obj.put("result", false);
obj.put("message", "从制品库下载失败!");
BeanCtx.out(logPre + "出参:obj=" + obj.toString());
return obj.toString();
}
/**
* 7.bpm从本地下载
*/
Tools tools = new Tools();
tools.downloadFile(filePath + fileName, fileName);
BeanCtx.out("success");
/**
* 8.出参日志
*/
BeanCtx.out(logPre + "出参:obj=" + obj.toString());
/**
* 9.数据返回
*/
//BeanCtx.p(obj.toString());
return obj.toString();
}
/**
* @Title: <p>isOfficeSegment</p>
* @Description: <p>校验请求ip是否处于办公网段</p>
* @param
* @return: java.lang.String
* @author:
* @Date: 2019/9/18 16:30
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public String isOfficeSegment() {
JSONObject obj = new JSONObject();
HttpServletRequest request = BeanCtx.getRequest();
String requestIp = getIpAddr(request);
BeanCtx.out(logPre + "客户端请求的ip=" + requestIp);
String[] officeSegmentArr = officeSegment.split(",");
BeanCtx.out(logPre + "办公网段=" + Arrays.toString(officeSegmentArr));
for (String officeSeg : officeSegmentArr) {
if (isInRange(requestIp, officeSeg)) {
obj.put("result", false);
obj.put("message", "您所处在办公网段!无法下载!请到开发测试网段进行下载!");
BeanCtx.out(logPre + "出参:obj=" + obj.toString());
return obj.toString();
}
}
BeanCtx.out(logPre + "出参:obj=null");
return null;
}
/**
* @Title: <p>isInRange</p>
* @Description: <p>判断某个IP是否在某个网段内</p>
* @param ip
* @param cidr
* @return: boolean
* @author:
* @Date: 2019/10/11 15:15
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public static boolean isInRange(String ip, String cidr) {
String[] ips = ip.split("\\.");
int ipAddr = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = cidr.replaceAll("/.*", "");
String[] cidrIps = cidrIp.split("\\.");
int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
| (Integer.parseInt(cidrIps[1]) << 16)
| (Integer.parseInt(cidrIps[2]) << 8)
| Integer.parseInt(cidrIps[3]);
return (ipAddr & mask) == (cidrIpAddr & mask);
}
/**
* @Title: <p>init</p>
* @Description: <p>数据初始化</p>
* @param
* @return: String
* @author:
* @Date: 2019/9/18 16:26
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public String init() {
JSONObject obj = new JSONObject();
try {
officeSegment = getInterfaceValueByInterfaceKey("transfer.officeSegment");
BeanCtx.out(logPre + " officeSegment=" + officeSegment);
userName = getInterfaceValueByInterfaceKey("transfer.productLibUserName");
BeanCtx.out(logPre + " userName=" + userName);
password = getInterfaceValueByInterfaceKey("transfer.productLibUserPwd");
BeanCtx.out(logPre + " password=" + password);
filePath = getInterfaceValueByInterfaceKey("transfer.productLibFilePath");
BeanCtx.out(logPre + " filePath=" + filePath);
return null;
} catch (Exception e) {
BeanCtx.out(logPre + "init方法发生异常: " + e);
obj.put("result", false);
obj.put("message", "数据初始化异常!请联系管理员查看后台日志解决问题!");
BeanCtx.out(logPre + "出参:obj=" + obj.toString());
return obj.toString();
}
}
/**
* @Title: <p>getIpAddr</p>
* @Description: <p>获取请求ip</p>
* @param request
* @return: java.lang.String
* @author:
* @Date: 2019/9/18 16:24
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
* @Title: <p>run</p>
* @Description: <p>根据关键字查询interface_config表对应的属性值</p>
* @param interfaceKey
* @return: java.lang.String
* @author:
* @Date: 2019/9/4 17:50
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public String getInterfaceValueByInterfaceKey(String interfaceKey) throws Exception {
/**
* 1.入参日志:获取系统唯一id
*/
String logPre = "[根据关键字查询制品库的测试ip与端口]<getInterfaceValueByInterfaceKey>";
BeanCtx.out(logPre + "入参:interfaceKey = " + interfaceKey);
/**
* 2.参数校验
*/
if (StringUtils.isEmpty(interfaceKey)) {
BeanCtx.out(logPre + "入参为空,直接返回!interfaceKey = " + interfaceKey);
return "";
}
/**
* 3.查询流程数据:根据关键字查询interface_config表对应的属性值
*/
String sql = "select interface_value from pms.interface_config where interface_key = '" + interfaceKey + "' limit 1 ";
BeanCtx.out(logPre + " 执行的sql = " + sql);
String interfaceValue = Rdb.getValueBySql(sql);
/**
* 4.出参日志
*/
BeanCtx.out(logPre + "出参(制品库的测试ip与端口): interfaceValue = " + interfaceValue);
/**
* 5.数据返回
*/
return interfaceValue;
}
/**
* @Title: <p>getWarByGetMathod</p>
* @Description: <p>从指定URL下载文件并保存到指定目录</p>
* @return: boolean
* true:下载成功
* false:下载失败
* @param url 请求的路径
* @param fileName 文件名称
* @throws
* @author:
* @Date: 2019/8/19 15:16
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public boolean getWarByGetMathod(String url, String fileName) {
/**
* 1.入参日志
*/
String logPre = "[从制定URL下载文件并保存到指定目录]<getWarByGetMathod>";
BeanCtx.out(logPre + "入参日志:url=" + url + ",保存目录=" + filePath + ",fileName=" + fileName + ",请求指定验证的用户名=" + userName + ",请求指定验证的密码=" + password);
/**
* 2.校验
*/
//创建不同的文件夹目录
File file = new File(filePath);
//判断文件夹是否存在
if (!file.exists()) {
//如果文件夹不存在,则创建新的的文件夹
file.mkdirs();
}
/**
* 3.参数准备
*/
FileOutputStream fileOut = null;
InputStream inputStream = null;
boolean result = false;
/**
* 4.开始下载
*/
try {
//发送get请求获取返回的数据流
inputStream = doGet(url);
//数据校验
if (null == inputStream ||0 == inputStream.available()) {
BeanCtx.out(logPre + "发送get请求获取数据为空!war包不存在");
return result;
}
BufferedInputStream bis = new BufferedInputStream(inputStream);
//判断文件的保存路径后面是否以/结尾
if (!filePath.endsWith("/")) {
filePath += "/";
}
//写入到文件(注意文件保存路径的后面一定要加上文件的名称)
fileOut = new FileOutputStream(filePath + fileName);
BufferedOutputStream bos = new BufferedOutputStream(fileOut);
byte[] buf = new byte[4096];
int length = bis.read(buf);
//保存文件
while (length != -1) {
bos.write(buf, 0, length);
length = bis.read(buf);
}
bos.close();
bis.close();
result = true;
} catch (Exception e) {
/**
* 5.异常捕捉
*/
BeanCtx.out(logPre + "抛出异常!" + e);
}
/**
* 6.出参日志
*/
BeanCtx.out(logPre + "(true:下载成功 false:下载失败)出参日志:result=" + result);
/**
* 7.数据返回
*/
return result;
}
/**
* @Title: <p>doGet</p>
* @Description: <p>发送get请求</p>
* @param url 请求地址
* @return: java.io.InputStream
* @author:
* @Date: 2019/8/22 19:05
* @throws
* @version: 1.0
* @Copyright: . All rights reserved.
*/
public InputStream doGet(String url) throws IOException {
/**
* 1.入参日志
*/
BeanCtx.out("[发送get请求]<doGet>Get请求转发URL:" + url + ",请求指定验证的用户名:" + userName + ",请求指定验证的密码:" + password);
/**
* 2.参数准备
*/
// 创建httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建http对象
HttpGet httpGet = new HttpGet(url);
/**
* setConnectTimeout:设置连接超时时间,单位毫秒。
* setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection
* 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。
* setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
*/
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
httpGet.setConfig(requestConfig);
//该网页需要认证(用户名、密码)
HttpClientContext context = new HttpClientContext();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
context.setCredentialsProvider(credentialsProvider);
/**
* 3.发送请求
*/
CloseableHttpResponse execute = httpClient.execute(httpGet, context);
/**
* 4.返回值校验
*/
if (200 != execute.getStatusLine().getStatusCode()) {
return null;
}
/**
* 5.返回数据准备
*/
HttpEntity entity = execute.getEntity();
InputStream in = entity.getContent();
/**
* 6.出参日志
*/
BeanCtx.out("[发送get请求]<doGet>Get请求返回的数据流为:" + in);
/**
* 7.入参日志
*/
return in;
}
}