mirror of
https://gitee.com/BDWare/router-backend
synced 2025-04-27 14:32:20 +00:00
add data-manager-backend
This commit is contained in:
parent
e94dfe3998
commit
6b8e2320be
@ -12,9 +12,7 @@ application {
|
||||
|
||||
dependencies {
|
||||
implementation project(":front-base")
|
||||
implementation project(":test-tool")
|
||||
implementation project(":sdk-java")
|
||||
|
||||
// https://mvnrepository.com/artifact/com.jianggujin/IKAnalyzer-lucene
|
||||
implementation 'com.jianggujin:IKAnalyzer-lucene:8.0.0'
|
||||
// https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common
|
||||
@ -26,9 +24,7 @@ dependencies {
|
||||
implementation 'org.apache.lucene:lucene-core:8.10.1'
|
||||
// https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser
|
||||
implementation 'org.apache.lucene:lucene-queryparser:8.10.1'
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
|
||||
implementation 'com.jcraft:jsch:0.1.55'
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,9 @@ import org.bdware.server.nodecenter.*;
|
||||
import org.bdware.server.ws.DelimiterCodec;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
@ -46,6 +49,7 @@ public class NodeCenterServer {
|
||||
public static ScheduledExecutorService scheduledThreadPool =
|
||||
Executors.newScheduledThreadPool(8);
|
||||
static SslContext sslContext = null;
|
||||
public static URLClassLoader pluginLoader;
|
||||
// static byte[] delimiter = "wonbifoodie".getBytes();
|
||||
|
||||
static {
|
||||
@ -99,6 +103,14 @@ public class NodeCenterServer {
|
||||
if (cmdConf.overwrite) {
|
||||
cmdConf.write(CONFIG_PATH);
|
||||
}
|
||||
NodeCenterWSFrameHandler.wsPluginActions = parseStrAsList(cmdConf.wsPluginActions);
|
||||
}
|
||||
|
||||
private static String[] parseStrAsList(String str) {
|
||||
if (str == null) {
|
||||
return new String[]{};
|
||||
}
|
||||
return str.split(",");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
@ -156,7 +168,25 @@ public class NodeCenterServer {
|
||||
}
|
||||
|
||||
public static void startHttp(int port) {
|
||||
File[] pluginJar = new File("./pluginLib/")
|
||||
.listFiles(pathname -> pathname.getName().endsWith(".jar"));
|
||||
URL[] urls;
|
||||
if (pluginJar != null && pluginJar.length > 0) {
|
||||
urls = new URL[pluginJar.length];
|
||||
for (int i = 0; i < pluginJar.length; i++) {
|
||||
try {
|
||||
urls[i] = pluginJar[i].toURI().toURL();
|
||||
LOGGER.info("add plugin:" + pluginJar[i].getName());
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
urls = new URL[]{};
|
||||
}
|
||||
pluginLoader = new URLClassLoader(urls, NodeCenterServer.class.getClassLoader());
|
||||
LOGGER.info("start at: " + port);
|
||||
|
||||
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||
try {
|
||||
|
@ -22,7 +22,8 @@ import org.bdware.sc.http.HttpUtil;
|
||||
import org.bdware.sc.util.FileUtil;
|
||||
import org.bdware.sc.util.JsonUtil;
|
||||
import org.bdware.server.action.Action;
|
||||
import org.bdware.server.autoinstall.NodeConfig;
|
||||
|
||||
|
||||
import org.bdware.server.http.HttpMethod;
|
||||
import org.bdware.server.http.URIPath;
|
||||
import org.bdware.server.permission.Role;
|
||||
@ -30,7 +31,6 @@ import org.bouncycastle.crypto.CryptoException;
|
||||
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
|
||||
import org.zz.gmhelper.SM2KeyPair;
|
||||
import org.zz.gmhelper.SM2Util;
|
||||
import org.bdware.server.SSHTool;
|
||||
import org.bdware.client.SmartContractClient;
|
||||
|
||||
|
||||
@ -49,8 +49,7 @@ public class FileActions {
|
||||
|
||||
static NodeCenterWSFrameHandler handler;
|
||||
|
||||
SmartContractClient clusterClient;
|
||||
SmartContractClient nodeClient;
|
||||
|
||||
|
||||
public FileActions(NodeCenterWSFrameHandler nodeCenterWSFrameHandler) {
|
||||
handler = nodeCenterWSFrameHandler;
|
||||
@ -479,423 +478,4 @@ public class FileActions {
|
||||
List<FileItem> subFiles;
|
||||
}
|
||||
|
||||
@Action(userPermission = 0)
|
||||
public void initBDServer(JsonObject args, ResultCallback resultCallback) {
|
||||
Response response = new Response();
|
||||
JsonObject result = new JsonObject();
|
||||
response.action = "onInitBDServer";
|
||||
response.responseID = args.get("requestID").getAsString();
|
||||
response.data = result;
|
||||
// 登录参数
|
||||
String host = args.get("host").getAsString();
|
||||
int sshPort = 22;
|
||||
String username = args.get("username").getAsString();
|
||||
String password = args.get("password").getAsString();
|
||||
String name = args.get("name").getAsString();
|
||||
// 域参数
|
||||
String sm2Key = args.get("sm2Key").getAsString();
|
||||
String clusterHost = args.get("clusterHost").getAsString();
|
||||
// bdserverzip的打开路径和目标服务器的解压路径
|
||||
String defaultAgentPath = "/data/agent-datanet/";
|
||||
String defaultBdserverPath = defaultAgentPath + "bdserver/";
|
||||
String bdserverzip = "bdserver.zip";
|
||||
String localPath = "./NodeCenterDB/";
|
||||
String bdserverZipPath = localPath + bdserverzip;
|
||||
// String bdserverZipPath = defaultAgentPath + bdserverzip;
|
||||
try {
|
||||
Session session = SSHTool.getSession(host, sshPort, username, password);
|
||||
if (session != null) {
|
||||
// 1.检查JDK version
|
||||
String jdk = SSHTool.checkJDK(session);
|
||||
result.addProperty("jdk", jdk);
|
||||
LOGGER.info("[checkJDK done] " + jdk);
|
||||
if (!jdk.isEmpty()) {
|
||||
// 2.创建defaultAgentPath,设置所有者为当前用户,关闭可能正在运行的bdserver,删除bdserver目录
|
||||
String mkdirCmd = "mkdir -p " + defaultAgentPath + "; ";
|
||||
String chownCmd = "chown -R " + session.getUserName() + " " + defaultAgentPath + "; ";
|
||||
String cdCmd = "cd " + defaultBdserverPath + "; ";
|
||||
String stopCmd = "bash ./cmstop.sh; ";
|
||||
String rmCmd = "rm -rf " + defaultBdserverPath;
|
||||
SSHTool.executeSh(session, mkdirCmd + chownCmd + cdCmd + stopCmd + rmCmd, true);
|
||||
LOGGER.info("[mkdir done] " + defaultAgentPath);
|
||||
// 3.检查zip相同则不传输
|
||||
if (!SSHTool.testISTheSame(session, new File(bdserverZipPath).getAbsolutePath(), defaultAgentPath + bdserverzip)) {
|
||||
SSHTool.copyLocalToRemote(session, new File(bdserverZipPath).getAbsolutePath(), defaultAgentPath, new SSHTool.CopyProgress() {
|
||||
@Override
|
||||
public void onProgress(long len, long total) {
|
||||
Map<String, Object> progress = new HashMap<>();
|
||||
progress.put("responseID", response.responseID);
|
||||
if (total > 0)
|
||||
progress.put("progress", String.format("%.2f", len * 100F / total));
|
||||
else
|
||||
progress.put("progress", -1);
|
||||
progress.put("action", "onInitBDServer");
|
||||
resultCallback.onResult(progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
onProgress(100, 100);
|
||||
}
|
||||
});
|
||||
LOGGER.info("[copyLocalToRemote done] " + host);
|
||||
}
|
||||
// 4.解压,配置ip,启动
|
||||
String unzipCmd = "unzip -q -d " + defaultBdserverPath + " -o " + defaultAgentPath + bdserverzip;
|
||||
SSHTool.executeSh(session, unzipCmd);
|
||||
LOGGER.info("[unzip done] " + host);
|
||||
String startCmd = "echo $?; cd " + defaultBdserverPath + "; ";
|
||||
startCmd += "cp cmconfig.json.template cmconfig.json; ";
|
||||
startCmd += ("sed -i 's/\"ip\": \"127.0.0.1\"/\"ip\": \"" + host + "\"/g' cmconfig.json; ");
|
||||
startCmd += "sh cmstart.sh";
|
||||
SSHTool.executeSh(session, startCmd, false);
|
||||
LOGGER.info("[cmstart.sh done] " + host);
|
||||
// 5.cmstart后检测server是否已启动,启动后用manager的Key去登录,为节点配置参数
|
||||
for (int count = 0; count < 10; ++count) {
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
LOGGER.info("[Connecting agent... ] " + host);
|
||||
Map<String, Object> httpResult = HttpUtil.httpGet("http://" + host + ":" + NodeConfig.nodePort);
|
||||
if (httpResult.containsKey("responseCode") && Integer.valueOf(httpResult.get("responseCode").toString()) == 200) {
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
String nodeAddress = "ws://" + host + ":" + NodeConfig.nodePort + "/SCIDE/SCExecutor";
|
||||
SM2KeyPair nodeKeyPair = SM2KeyPair.fromJson(sm2Key);
|
||||
String clusterAddress = "ws://" + clusterHost + ":" + (NodeConfig.clusterPort + 1);
|
||||
nodeClient =
|
||||
new SmartContractClient(nodeAddress, nodeKeyPair) {
|
||||
public void onLogin(JsonObject obj) {
|
||||
LOGGER.info("[nodeClient onLogin] " + nodeKeyPair.toJson());
|
||||
this.setName(name);
|
||||
LOGGER.info("[setName] " + name);
|
||||
String bdledgerAddr = "022.node.internetapi.cn:21121";
|
||||
this.setBDLedger(bdledgerAddr);
|
||||
this.setMasterAddress(host + ":" + (NodeConfig.nodePort + 1));
|
||||
String apply =
|
||||
"{\"action\":\"applyNodeRole\",\"role\":\"_ROLE_\",\"pubKey\":\"" + nodeKeyPair.getPublicKeyStr() + "\"}";
|
||||
this.sendMsg(apply.replaceAll("_ROLE_", "ContractProvider"));
|
||||
this.sendMsg(apply.replaceAll("_ROLE_", "ContractUser"));
|
||||
this.sendMsg(apply.replaceAll("_ROLE_", "ContractInstanceManager"));
|
||||
LOGGER.info("[applyNodeRole] " + apply);
|
||||
this.setClusterAddress(clusterAddress);
|
||||
LOGGER.info("[setClusterAddress] " + clusterAddress);
|
||||
String yjsPath = defaultBdserverPath + "yjs.jar";
|
||||
String setYjsPath = "{\"action\":\"changeYJSPath\",\"data\":\"" + yjsPath + "\"}";
|
||||
this.sendMsg(setYjsPath);
|
||||
LOGGER.info("[setYjsPath] " + yjsPath);
|
||||
this.sendMsg("{\"action\":\"loadNodeConfig\"}");
|
||||
}
|
||||
|
||||
@Action
|
||||
public void onApplyRole(JsonObject obj) {
|
||||
String data = obj.get("data").getAsString();
|
||||
LOGGER.info("[onApplyRole] " + data);
|
||||
if (data.equals("success")) {
|
||||
String auth =
|
||||
"{\"action\":\"authNodeRole\",\"pubKey\":\"" + nodeKeyPair.getPublicKeyStr() + "\",\"isAccept\":true}";
|
||||
this.sendMsg(auth);
|
||||
LOGGER.info("[authNodeRole] " + auth);
|
||||
}
|
||||
}
|
||||
|
||||
@Action
|
||||
public void onLoadNodeConfig(JsonObject obj) {
|
||||
JsonObject jsonObject = obj.get("data").getAsJsonObject();
|
||||
String nodePubKey = jsonObject.get("nodePubKey").getAsString();
|
||||
result.addProperty("nodePubKey", nodePubKey);
|
||||
result.addProperty("status", "success");
|
||||
resultCallback.onResult(JsonUtil.toJson(response));
|
||||
LOGGER.info("[onLoadNodeConfig] " + jsonObject);
|
||||
}
|
||||
};
|
||||
nodeClient.waitForConnect();
|
||||
nodeClient.login();
|
||||
result.addProperty("status", "success");
|
||||
} else {
|
||||
result.addProperty("status", "wrong jdk version");
|
||||
resultCallback.onResult(JsonUtil.toJson(response));
|
||||
}
|
||||
} else {
|
||||
result.addProperty("status", "Session failed");
|
||||
resultCallback.onResult(JsonUtil.toJson(response));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Action(userPermission = 0)
|
||||
public void initBDCluster(JsonObject args, ResultCallback resultCallback) {
|
||||
Response response = new Response();
|
||||
JsonObject result = new JsonObject();
|
||||
response.action = "onInitBDCluster";
|
||||
response.responseID = args.get("requestID").getAsString();
|
||||
// 登录参数
|
||||
String host = args.get("host").getAsString();
|
||||
int sshPort = 22;
|
||||
String username = args.get("username").getAsString();
|
||||
String password = args.get("password").getAsString();
|
||||
String name = args.get("name").getAsString();
|
||||
// 域参数
|
||||
String sm2Key = args.get("sm2Key").getAsString();
|
||||
JsonArray agents = args.get("agents").getAsJsonArray();
|
||||
// bdclusterzip的打开路径和目标服务器的解压路径
|
||||
String defaultManagerPath = "/data/manager-datanet/";
|
||||
String defaultBDClusterPath = defaultManagerPath + "bdcluster/";
|
||||
String bdclusterzip = "bdcluster.zip";
|
||||
String localPath = "./NodeCenterDB/";
|
||||
String bdclusterZipPath = localPath + bdclusterzip;
|
||||
// String bdclusterZipPath = defaultManagerPath + bdclusterzip;
|
||||
|
||||
try {
|
||||
Session session = SSHTool.getSession(host, sshPort, username, password);
|
||||
if (session != null) {
|
||||
// 1.检查JDK version
|
||||
String jdk = SSHTool.checkJDK(session);
|
||||
result.addProperty("jdk", jdk);
|
||||
LOGGER.info("[checkJDK done] " + jdk);
|
||||
if (!jdk.isEmpty()) {
|
||||
// 2.创建defaultManagerPath,设置所有者为当前用户,关闭可能正在运行的bdcluster,删除bdcluster目录
|
||||
String mkdirCmd = "mkdir -p " + defaultManagerPath + "; ";
|
||||
String chownCmd = "chown -R " + session.getUserName() + " " + defaultManagerPath + "; ";
|
||||
String cdCmd = "cd " + defaultBDClusterPath + "; ";
|
||||
String stopCmd = "bash ./ncstop.sh; ";
|
||||
String rmCmd = "rm -rf " + defaultBDClusterPath;
|
||||
SSHTool.executeSh(session, mkdirCmd + chownCmd + cdCmd + stopCmd + rmCmd, true);
|
||||
LOGGER.info("[mkdir done] " + defaultManagerPath);
|
||||
// 3.检查zip相同则不传输
|
||||
if (!SSHTool.testISTheSame(session, new File(bdclusterZipPath).getAbsolutePath(), defaultManagerPath + bdclusterzip)) {
|
||||
SSHTool.copyLocalToRemote(session, new File(bdclusterZipPath).getAbsolutePath(), defaultManagerPath, new SSHTool.CopyProgress() {
|
||||
@Override
|
||||
public void onProgress(long len, long total) {
|
||||
Map<String, Object> progress = new HashMap<>();
|
||||
progress.put("responseID", response.responseID);
|
||||
if (total > 0)
|
||||
progress.put("progress", String.format("%.2f", len * 100F / total));
|
||||
else
|
||||
progress.put("progress", -1);
|
||||
progress.put("action", "onInitBDCluster");
|
||||
resultCallback.onResult(progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
onProgress(100, 100);
|
||||
}
|
||||
});
|
||||
LOGGER.info("[bdcluster.zip copyLocalToRemote done] " + host);
|
||||
}
|
||||
// 4.解压,配置ip,启动
|
||||
String unzipCmd = "unzip -q -d " + defaultBDClusterPath + " -o " + defaultManagerPath + bdclusterzip;
|
||||
SSHTool.executeSh(session, unzipCmd);
|
||||
LOGGER.info("[unzip bdcluster.zip done] " + host);
|
||||
String startCmd = "echo $?; cd " + defaultBDClusterPath + "; ";
|
||||
startCmd += "cp ncconfig.json.template ncconfig.json; ";
|
||||
startCmd += ("sed -i 's/\"ip\": \"127.0.0.1\"/\"ip\": \"" + host + "\"/g' ncconfig.json; ");
|
||||
startCmd += "sh ncstart.sh";
|
||||
SSHTool.executeSh(session, startCmd, false);
|
||||
LOGGER.info("[ncstart.sh done] " + host);
|
||||
|
||||
// 5.部署成功后检测server是否已启动,启动后登录,为节点配置参数
|
||||
for (int count = 0; count < 10; ++count) {
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
LOGGER.info("[Connecting Manager... ] " + host);
|
||||
Map<String, Object> httpResult = HttpUtil.httpGet("http://" + host + ":" + NodeConfig.clusterPort);
|
||||
if (httpResult.containsKey("responseCode") && Integer.valueOf(httpResult.get("responseCode").toString()) == 200) {
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
// 6.启动cluster后发送YPK包并解压到NodeCenterDB
|
||||
String ypkZip = "NC_YPKs.zip";
|
||||
String ypkZipPath = localPath + ypkZip;
|
||||
// String ypkZipPath = defaultManagerPath + ypkZip;
|
||||
if (!SSHTool.testISTheSame(session, new File(ypkZipPath).getAbsolutePath(), defaultManagerPath + ypkZip)) {
|
||||
SSHTool.copyLocalToRemote(session, new File(ypkZipPath).getAbsolutePath(), defaultManagerPath, new SSHTool.CopyProgress() {
|
||||
@Override
|
||||
public void onProgress(long len, long total) {
|
||||
Map<String, Object> progress = new HashMap<>();
|
||||
progress.put("responseID", response.responseID);
|
||||
if (total > 0)
|
||||
progress.put("progress", String.format("%.2f", len * 100F / total));
|
||||
else
|
||||
progress.put("progress", -1);
|
||||
progress.put("action", "onInitBDCluster");
|
||||
progress.put("operation", "copyYPK");
|
||||
resultCallback.onResult(progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
onProgress(100, 100);
|
||||
}
|
||||
});
|
||||
LOGGER.info("[NC_YPKs.zip copyLocalToRemote done] " + host);
|
||||
}
|
||||
String ypkUnzipPath = defaultBDClusterPath + "NodeCenterDB/NC_YPKs";
|
||||
unzipCmd = "unzip -q -d " + ypkUnzipPath + " -o " + defaultManagerPath + ypkZip;
|
||||
SSHTool.executeSh(session, unzipCmd);
|
||||
LOGGER.info("[unzip NC_YPKs.zip done] " + host);
|
||||
|
||||
String clusterAddress = "ws://" + host + ":" + NodeConfig.clusterPort + "/NodeCenterWS";
|
||||
SM2KeyPair clusterKeyPair = SM2KeyPair.fromJson(sm2Key);
|
||||
clusterClient =
|
||||
new SmartContractClient(clusterAddress, clusterKeyPair) {
|
||||
int agentIndex = 0;
|
||||
|
||||
public void onLogin(JsonObject obj) {
|
||||
LOGGER.info("[new clusterClient] " + clusterKeyPair.toJson());
|
||||
String setClusterName = "{\"action\":\"setClusterName\",\"name\":\"" + name + "\"}";
|
||||
sendMsg(setClusterName);
|
||||
LOGGER.info("[setClusterName] " + name);
|
||||
LOGGER.info("[initBDServer] start...");
|
||||
if (agents.size() > 0) {
|
||||
for (int i = 0; i < agents.size(); ++i) {
|
||||
JsonObject agent = agents.get(i).getAsJsonObject();
|
||||
agent.addProperty("action", "initBDServer");
|
||||
agent.addProperty("requestID", response.responseID);
|
||||
agent.addProperty("sm2Key", sm2Key);
|
||||
agent.addProperty("clusterHost", host);
|
||||
this.sendMsg(JsonUtil.toJson(agent));
|
||||
LOGGER.info("[initBDServer] " + i + ": " + agent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onInitBDServer(JsonObject obj) {
|
||||
if (obj.has("progress")) {
|
||||
String progress = obj.get("progress").getAsString();
|
||||
LOGGER.info("[onInitBDServer agent] " + agentIndex + " " + progress);
|
||||
}
|
||||
obj.addProperty("agentIndex", agentIndex);
|
||||
if (obj.has("data")) {
|
||||
++agentIndex;
|
||||
JsonObject data = obj.get("data").getAsJsonObject();
|
||||
if (data.get("status").getAsString().equals("success")) {
|
||||
// 根据节点的type分发ypk,然后依次启动
|
||||
LOGGER.info("[onInitBDServer] " + data);
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("action", "distributeYPK");
|
||||
jsonObject.addProperty("requestID", response.responseID);
|
||||
String projectName = "Router_1.0.ypk";
|
||||
jsonObject.addProperty("projectName", projectName);
|
||||
jsonObject.addProperty("pubKey", clusterKeyPair.getPublicKeyStr());
|
||||
String content =
|
||||
String.format("DistributeYPK|%s|%s", projectName, clusterKeyPair.getPublicKeyStr());
|
||||
try {
|
||||
String sig =
|
||||
ByteUtils.toHexString(
|
||||
SM2Util.sign(
|
||||
clusterKeyPair.getPrivateKeyParameter(), content.getBytes()));
|
||||
jsonObject.addProperty("signature", sig);
|
||||
} catch (CryptoException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
String nodePubKey = data.get("nodePubKey").getAsString();
|
||||
jsonObject.addProperty("nodeIDs", nodePubKey + ",");
|
||||
try {
|
||||
Thread.sleep(10000);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
this.sendMsg(JsonUtil.toJson(jsonObject));
|
||||
LOGGER.info("[DistributeYPK] " + jsonObject);
|
||||
}
|
||||
}
|
||||
resultCallback.onResult(JsonUtil.toJson(obj));
|
||||
}
|
||||
|
||||
public void onDistributeYPK(JsonObject obj) {
|
||||
// 分发ypk成功后启动该合约
|
||||
LOGGER.info("[onDistributeYPK]" + obj);
|
||||
resultCallback.onResult(JsonUtil.toJson(obj));
|
||||
if (obj.get("progress").getAsString().equals("100.00")) {
|
||||
String nodeIP = obj.get("nodeIP").getAsString();
|
||||
String nodeAddress = "ws://" + nodeIP + "/SCIDE/SCExecutor";
|
||||
SmartContractClient nodeClient = new SmartContractClient(nodeAddress, clusterKeyPair) {
|
||||
public void onLogin(JsonObject obj) {
|
||||
LOGGER.info("[onDistributeYPK: nodeClient onLogin] " + nodeAddress);
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("action", "startContractByYPK");
|
||||
jsonObject.addProperty("isPrivate", true);
|
||||
jsonObject.addProperty("requestID", response.responseID);
|
||||
jsonObject.addProperty("owner", clusterKeyPair.getPublicKeyStr());
|
||||
String ypkName = "Router_1.0.ypk";
|
||||
jsonObject.addProperty("path", "/" + ypkName);
|
||||
String content =
|
||||
String.format("Fixed|%s|%s", ypkName, getKeyPair().getPublicKeyStr());
|
||||
try {
|
||||
String sig =
|
||||
ByteUtils.toHexString(
|
||||
SM2Util.sign(
|
||||
clusterKeyPair.getPrivateKeyParameter(), content.getBytes()));
|
||||
jsonObject.addProperty("signature", sig);
|
||||
} catch (CryptoException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
this.sendMsg(JsonUtil.toJson(jsonObject));
|
||||
LOGGER.info("[startContractByYPK] " + jsonObject);
|
||||
}
|
||||
|
||||
public void onStartContract(JsonObject obj) {
|
||||
resultCallback.onResult(JsonUtil.toJson(obj));
|
||||
String dataStr = obj.get("data").getAsString();
|
||||
JsonObject data = JsonParser.parseString(dataStr).getAsJsonObject();
|
||||
LOGGER.info("[onStartContract] " + data);
|
||||
// 若router启动成功,调用合约set前缀接口
|
||||
if (data.get("status").getAsString().equals("Success")) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
String contractID = "id";
|
||||
String operation = "set";
|
||||
String arg = "prevCode";
|
||||
jsonObject.addProperty("requestID", response.responseID);
|
||||
jsonObject.addProperty("action", "executeContract");
|
||||
jsonObject.addProperty("contractID", contractID);
|
||||
jsonObject.addProperty("operation", operation);
|
||||
jsonObject.addProperty("arg", arg);
|
||||
jsonObject.addProperty("pubkey", "set");
|
||||
String content = String.format("%s|%s|%s|%s", contractID, operation, arg, getKeyPair().getPublicKeyStr());
|
||||
try {
|
||||
String sig =
|
||||
ByteUtils.toHexString(
|
||||
SM2Util.sign(
|
||||
clusterKeyPair.getPrivateKeyParameter(), content.getBytes()));
|
||||
jsonObject.addProperty("signature", sig);
|
||||
} catch (CryptoException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
this.sendMsg(JsonUtil.toJson(jsonObject));
|
||||
LOGGER.info("[executeContract] " + jsonObject);
|
||||
}
|
||||
}
|
||||
};
|
||||
nodeClient.waitForConnect();
|
||||
nodeClient.login();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
clusterClient.waitForConnect();
|
||||
clusterClient.login();
|
||||
result.addProperty("status", "success");
|
||||
} else {
|
||||
result.addProperty("status", "wrong jdk version");
|
||||
}
|
||||
} else {
|
||||
result.addProperty("status", "Session failed");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
response.data = result;
|
||||
resultCallback.onResult(JsonUtil.toJson(response));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,9 +20,12 @@ import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import static org.bdware.server.NodeCenterServer.pluginLoader;
|
||||
|
||||
public class NodeCenterWSFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
|
||||
public static ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
private static final Logger LOGGER = LogManager.getLogger(NodeCenterWSFrameHandler.class);
|
||||
public static String[] wsPluginActions;
|
||||
StringBuilder dataCache = new StringBuilder();
|
||||
ActionExecutor<ResultCallback, JsonObject> ae;
|
||||
private ChannelHandlerContext ctx;
|
||||
@ -65,8 +68,19 @@ public class NodeCenterWSFrameHandler extends SimpleChannelInboundHandler<WebSoc
|
||||
} else return false;
|
||||
}
|
||||
};
|
||||
for (String str : wsPluginActions) {
|
||||
Object obj = createInstanceByClzName(str);
|
||||
ae.appendHandler(obj);
|
||||
}
|
||||
}
|
||||
private Object createInstanceByClzName(String clzName) {
|
||||
try {
|
||||
Class<?> clz = Class.forName(clzName, true, pluginLoader);
|
||||
return clz.newInstance();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public ActionExecutor getAE() {
|
||||
return ae;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user