From 22532666ddf3d534f6099022212bc065d35fe5ea Mon Sep 17 00:00:00 2001 From: CaiHQ Date: Fri, 15 Dec 2023 16:40:55 +0800 Subject: [PATCH] update doip-sdk --- build.gradle | 7 +- .../java/org/bdware/server/CMHttpServer.java | 206 ++++---- .../java/org/bdware/server/GlobalConf.java | 135 ++--- .../org/bdware/server/action/CMActions.java | 1 - .../org/bdware/server/action/FileActions.java | 470 ++++++++++-------- .../bdware/server/action/ManagerActions.java | 6 +- .../org/bdware/server/doip/BCOManager.java | 12 +- .../doip/ContractRepositoryHandler.java | 280 ++++++----- .../server/doip/ContractRepositoryMain.java | 27 +- .../client/NodeCenterClientController.java | 128 ++--- .../java/org/bdware/units/NetworkManager.java | 188 ++++--- src/test/java/org/bdware/server/ByteTest.java | 7 + 12 files changed, 837 insertions(+), 630 deletions(-) diff --git a/build.gradle b/build.gradle index ccd414a..0c202e3 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,6 @@ plugins { mainClassName = 'org.bdware.server.CMHttpServer' -apply from: '../spotless.gradle' application { mainClass = mainClassName @@ -41,9 +40,9 @@ dependencies { implementation 'io.grpc:grpc-all:1.43.1' implementation 'org.apache.velocity:velocity-engine-core:2.3' implementation 'com.nimbusds:nimbus-jose-jwt:9.10' - implementation 'org.bdware.doip:doip-sdk:1.4.2' - implementation 'org.bdware.doip:doip-audit-tool:1.2.6' - implementation 'org.bdware.doip:bdosclient:0.0.7' + implementation 'org.bdware.doip:doip-sdk:1.5.1' + implementation 'org.bdware.doip:doip-audit-tool:1.4.3' + implementation 'org.bdware.doip:bdosclient:0.1.0' implementation fileTree(dir: 'lib', include: '*.jar') testImplementation 'junit:junit:4.13.2' implementation 'io.netty:netty-tcnative-boringssl-static:2.0.59.Final' diff --git a/src/main/java/org/bdware/server/CMHttpServer.java b/src/main/java/org/bdware/server/CMHttpServer.java index 7917516..08926a0 100644 --- a/src/main/java/org/bdware/server/CMHttpServer.java +++ b/src/main/java/org/bdware/server/CMHttpServer.java @@ -57,10 +57,12 @@ public class CMHttpServer { private static final Logger LOGGER = LogManager.getLogger(CMHttpServer.class); private static final String CONFIG_PATH = "cmconfig.json"; public static EventLoopGroup workerGroup = new NioEventLoopGroup(); - public static MultiIndexTimeRocksDBUtil nodeLogDB = new MultiIndexTimeRocksDBUtil( - "./ContractManagerDB", CMTables.LocalNodeLogDB.toString()); + public static MultiIndexTimeRocksDBUtil nodeLogDB = + new MultiIndexTimeRocksDBUtil( + "./ContractManagerDB", CMTables.LocalNodeLogDB.toString()); public static URLClassLoader pluginLoader; private static SslContext sslContext = null; + private static CMDConf cmdConf; final String PATH = "/SCIDE/SCExecutor"; private final int port; @@ -87,21 +89,23 @@ public class CMHttpServer { GlobalConf.initDOAConfig(doaConf); if (cmdConf.withBdledgerServer) { - ContractManager.threadPool - .execute(() -> NetworkManager.instance.initP2P(cmdConf.servicePort + 4)); + ContractManager.threadPool.execute( + () -> NetworkManager.instance.initP2P(cmdConf.servicePort + 4)); } // 可自动运行bdledger可执行文件,也可在shell脚步中运行和停止 if (!cmdConf.withBdledgerClient.isEmpty()) { - ContractManager.scheduledThreadPool.schedule(() -> { - File ledgerClient = new File(cmdConf.withBdledgerClient); - LOGGER.debug("canRead=" + ledgerClient.canRead() + " path=" - + ledgerClient.getAbsolutePath()); - try { - Runtime.getRuntime().exec(ledgerClient.getAbsolutePath()); - } catch (IOException e) { - LOGGER.warn("start bdledger client failed: " + e.getMessage()); - } - }, 1, TimeUnit.SECONDS); + ContractManager.scheduledThreadPool.schedule( + () -> { + File ledgerClient = new File(cmdConf.withBdledgerClient); + LOGGER.debug("canRead=" + ledgerClient.canRead() + + " path=" + ledgerClient.getAbsolutePath()); + try { + Runtime.getRuntime().exec(ledgerClient.getAbsolutePath()); + } catch (IOException e) { + LOGGER.warn("start bdledger client failed: " + e.getMessage()); + } + }, + 1, TimeUnit.SECONDS); } if (cmdConf.enableEventPersistence) { ContractManager.eventPersistenceEnabled = true; @@ -111,12 +115,15 @@ public class CMHttpServer { String[] filePaths = cmdConf.enableSsl.split(":"); File chainedFile = new File(filePaths[0]), keyFile = new File(filePaths[1]); if (chainedFile.exists() && keyFile.exists()) { - sslContext = SslContextBuilder.forServer(chainedFile, keyFile) - .ciphers(null, - (ciphers, defaultCiphers, supportedCiphers) -> defaultCiphers - .stream().filter(x -> null != x && !x.contains("RC4")) - .toArray(String[]::new)) - .build(); + sslContext = + SslContextBuilder.forServer(chainedFile, keyFile) + .ciphers( + null, + (ciphers, defaultCiphers, supportedCiphers) -> + defaultCiphers.stream() + .filter(x -> null != x && !x.contains("RC4")) + .toArray(String[]::new)) + .build(); LOGGER.info("openssl isAvailable:" + OpenSsl.isAvailable()); } } catch (Exception e) { @@ -136,8 +143,7 @@ public class CMHttpServer { // plugins CMHttpHandler.wsPluginActions = parseStrAsList(cmdConf.wsPluginActions); TCPClientFrameHandler.clientToAgentPlugins = parseStrAsList(cmdConf.clientToAgentPlugins); - NodeCenterClientHandler.clientToClusterPlugins = - parseStrAsList(cmdConf.clientToClusterPlugins); + NodeCenterClientHandler.clientToClusterPlugins = parseStrAsList(cmdConf.clientToClusterPlugins); org.bdware.units.tcp.TCPClientFrameHandler.tcpPlugins = parseStrAsList(cmdConf.tcpPlugins); if (!StringUtil.isNullOrEmpty(cmdConf.debug)) { try { @@ -154,39 +160,6 @@ public class CMHttpServer { LOGGER.warn(e.getMessage()); } } - - if (cmdConf.startContract != null && cmdConf.startContract.size() > 0) { - ContractManager.scheduledThreadPool.schedule(() -> { - try { - for (JsonElement je : cmdConf.startContract) { - JsonObject jo = je.getAsJsonObject(); - if (!jo.has("path")) - continue; - - String path = jo.get("path").getAsString(); - File f = new File(path); - if (!f.getName().endsWith(".ypk") || !f.exists()) - continue; - Contract c = new Contract(); - c.setScript(f.getAbsolutePath()); - c.setType(ContractExecType.Sole); - if (jo.has("killBeforeStart")) { - ContractManager.instance - .stopContract(jo.get("killBeforeStart").getAsString()); - } - if (jo.has("owner")) - c.setOwner(jo.get("owner").getAsString()); - else - c.setOwner(UserManagerAction.getNodeManager()); - if (jo.has("createParam")) - c.setCreateParam(jo.get("createParam")); - ContractManager.instance.startContract(c); - } - } catch (Exception e) { - e.printStackTrace(); - } - }, 10, TimeUnit.SECONDS); - } if (cmdConf.datachainConf != null) { GlobalConf.resetDataChain(cmdConf.datachainConf); } @@ -196,9 +169,26 @@ public class CMHttpServer { } + private static void startByPath(JsonObject jo) { + String path = jo.get("path").getAsString(); + File f = new File(path); + if (!f.getName().endsWith(".ypk") || !f.exists()) + return; + Contract c = new Contract(); + c.setScript(f.getAbsolutePath()); + c.setType(ContractExecType.Sole); + if (jo.has("owner")) + c.setOwner(jo.get("owner").getAsString()); + else + c.setOwner(UserManagerAction.getNodeManager()); + if (jo.has("createParam")) + c.setCreateParam(jo.get("createParam")); + ContractManager.instance.startContract(c); + } + private static String[] parseStrAsList(String str) { if (str == null) { - return new String[] {}; + return new String[]{}; } return str.split(","); } @@ -206,7 +196,7 @@ public class CMHttpServer { private static void addDirToPath(String s) { try { LOGGER.info("add to path: " + s); - // Field field = ClassLoader.class.getDeclaredField("sys_paths"); + // Field field = ClassLoader.class.getDeclaredField("sys_paths"); Field field = ClassLoader.class.getDeclaredField("usr_paths"); field.setAccessible(true); String[] path = (String[]) field.get(null); @@ -231,7 +221,7 @@ public class CMHttpServer { if (!confFile.exists() && confTemplate.exists()) { FileUtils.copyFile(confTemplate, confFile); } - CMDConf cmdConf = CMDConf.parseFile(CONFIG_PATH); + cmdConf = CMDConf.parseFile(CONFIG_PATH); // addDirToPath(new File("./dynamicLibrary").getAbsolutePath()); @@ -256,15 +246,19 @@ public class CMHttpServer { try { BufferedReader br = new BufferedReader(new FileReader(keyFile)); String pubKey = br.readLine(); - String nowManager = KeyValueDBUtil.instance.getValue(CMTables.ConfigDB.toString(), - "__NodeManager__"); + String nowManager = + KeyValueDBUtil.instance.getValue( + CMTables.ConfigDB.toString(), "__NodeManager__"); // manager.key is used when node manager isn' set if (null == nowManager || nowManager.isEmpty()) { - KeyValueDBUtil.instance.setValue(CMTables.ConfigDB.toString(), - "__NodeManager__", pubKey); - KeyValueDBUtil.instance.setValue(CMTables.NodeRole.toString(), pubKey, + KeyValueDBUtil.instance.setValue( + CMTables.ConfigDB.toString(), "__NodeManager__", pubKey); + KeyValueDBUtil.instance.setValue( + CMTables.NodeRole.toString(), pubKey, "NodeManager,ContractProvider,ContractUser,ContractInstanceManager"); - KeyValueDBUtil.instance.setValue(CMTables.NodeTime.toString(), pubKey, + KeyValueDBUtil.instance.setValue( + CMTables.NodeTime.toString(), + pubKey, Long.toString(new Date().getTime())); LOGGER.info("set node manager from manager.key"); } @@ -272,7 +266,7 @@ public class CMHttpServer { } } GlobalConf.initIpPort(cmdConf.ip + ":" + cmdConf.servicePort); - GlobalConf.initMasterAddress(cmdConf.ip + ":" + (cmdConf.servicePort + 1)); + //GlobalConf.initMasterAddress(cmdConf.ip + ":" + (cmdConf.servicePort + 1)); start(cmdConf.servicePort); } @@ -280,7 +274,7 @@ public class CMHttpServer { LOGGER.info("start server at:" + port); LOGGER.debug("dir:" + new File("./").getAbsolutePath()); new CMHttpServer(port).start(); - // never reach here!! + //never reach here!! } /** @@ -291,9 +285,9 @@ public class CMHttpServer { // EpollEventLoopGroup // EpollServerSocketChannel // ContractManager.reconnectPort = (port - 18000) * 30 + 1630; - // if (ContractManager.reconnectPort < 0) ContractManager.reconnectPort = 1630; - File[] pluginJar = - new File("./pluginLib/").listFiles(pathname -> pathname.getName().endsWith(".jar")); + // if (ContractManager.reconnectPort < 0) ContractManager.reconnectPort = 1630; + File[] pluginJar = new File("./pluginLib/") + .listFiles(pathname -> pathname.getName().endsWith(".jar")); URL[] urls; if (pluginJar != null && pluginJar.length > 0) { urls = new URL[pluginJar.length]; @@ -306,7 +300,7 @@ public class CMHttpServer { } } } else { - urls = new URL[] {}; + urls = new URL[]{}; } pluginLoader = new URLClassLoader(urls, CMHttpServer.class.getClassLoader()); if (port >= 18000 && port < 18100) { @@ -322,24 +316,36 @@ public class CMHttpServer { try { ServerBootstrap b1 = new ServerBootstrap(); b1.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); - b1.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) - .localAddress(port).childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel arg0) { - if (sslContext != null) { - arg0.pipeline().addLast(new OptionalSslHandler(sslContext)); - } - arg0.pipeline().addLast(trafficSharp).addLast(new HttpServerCodec()) - .addLast(new HttpObjectAggregator(10 * 1024 * 1024)) - .addLast(new WebSocketServerProtocolHandler(PATH, null, true)) - .addLast(new ChunkedWriteHandler()).addLast(serverHandler) - .addLast(new ContractManagerFrameHandler()); - } - }); + b1.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .localAddress(port) + .childHandler( + new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel arg0) { + if (sslContext != null) { + arg0.pipeline().addLast(new OptionalSslHandler(sslContext)); + } + arg0.pipeline() + .addLast(trafficSharp) + .addLast(new HttpServerCodec()) + .addLast(new HttpObjectAggregator(10 * 1024 * 1024)) + .addLast( + new WebSocketServerProtocolHandler( + PATH, null, true)) + .addLast(new ChunkedWriteHandler()) + .addLast(serverHandler) + .addLast(new ContractManagerFrameHandler()); + } + }); final Channel ch = b1.bind(port).sync().channel(); LOGGER.debug("[CMHttpServer] listen master port at:" + port); new HTTPServer(port + 3); NetworkManager.instance.initTCP(port + 1, workerGroup); + + loadStartContractConfiguration(); + + ch.closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); @@ -350,9 +356,39 @@ public class CMHttpServer { } } + private void loadStartContractConfiguration() { + if (cmdConf.startContract != null && cmdConf.startContract.size() > 0) { + ContractManager.scheduledThreadPool.schedule( + () -> { + for (JsonElement je : cmdConf.startContract) { + try { + JsonObject jo = je.getAsJsonObject(); + if (!jo.has("path")) + continue; + if (!jo.has("owner")) + jo.addProperty("owner", UserManagerAction.getNodeManager()); + if (jo.has("killBeforeStart")) { + ContractManager.instance.stopContract(jo.get("killBeforeStart").getAsString()); + } + if (jo.get("path").getAsString().startsWith("@")) { + jo.addProperty("bcoId", jo.get("path").getAsString().substring(1)); + ContractRepositoryMain.currentHandler.startUsingJsonObject(jo); + } else { + startByPath(jo); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }, + 10, TimeUnit.SECONDS); + } + } + @Sharable public static class NettyConnectServerHandler extends ChannelInboundHandlerAdapter { - public NettyConnectServerHandler(AtomicInteger connectNum) {} + public NettyConnectServerHandler(AtomicInteger connectNum) { + } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { diff --git a/src/main/java/org/bdware/server/GlobalConf.java b/src/main/java/org/bdware/server/GlobalConf.java index 7700a7e..085f0a7 100644 --- a/src/main/java/org/bdware/server/GlobalConf.java +++ b/src/main/java/org/bdware/server/GlobalConf.java @@ -17,6 +17,7 @@ import org.zz.gmhelper.SM2KeyPair; import org.zz.gmhelper.SM2Util; import java.io.File; +import java.net.URL; import java.util.logging.Level; public class GlobalConf { @@ -53,7 +54,7 @@ public class GlobalConf { public String bcoDir; public String memoryDir; - public String masterAddress; + // public String masterAddress; public String ipPort; public boolean isLAN = true; private String nodeCenterUrl; // 从ConfigDB读。 @@ -63,11 +64,14 @@ public class GlobalConf { private static GlobalConf init() { java.util.logging.Logger.getLogger(org.bdware.bdledger.api.grpc.Client.class.getName()) .setLevel(Level.OFF); - Configurator.setLevel("io.netty.handler.codec.http.websocketx.WebSocket08FrameEncoder", + Configurator.setLevel( + "io.netty.handler.codec.http.websocketx.WebSocket08FrameEncoder", org.apache.logging.log4j.Level.OFF); - Configurator.setLevel("io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder", + Configurator.setLevel( + "io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder", org.apache.logging.log4j.Level.OFF); - Configurator.setLevel("io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker", + Configurator.setLevel( + "io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker", org.apache.logging.log4j.Level.OFF); KeyValueDBUtil.setupCM(); @@ -79,17 +83,19 @@ public class GlobalConf { String dbName = CMTables.ConfigDB.toString(); if (!KeyValueDBUtil.instance.getKeys(dbName).contains("hasInited")) { KeyValueDBUtil.instance.setValue(dbName, "hasInited", "true"); - KeyValueDBUtil.instance.setValue(dbName, "projectDir", - new File("./BDWareProjectDir/").getAbsolutePath()); - KeyValueDBUtil.instance.setValue(dbName, "ADSPDir", + KeyValueDBUtil.instance.setValue( + dbName, "projectDir", new File("./BDWareProjectDir/").getAbsolutePath()); + KeyValueDBUtil.instance.setValue( + dbName, + "ADSPDir", new File("./BDWareProjectDir/ADSPDir/").getAbsolutePath()); File f = new File("./yjs.jar"); if (f.exists()) { - KeyValueDBUtil.instance.setValue(dbName, "yjsPath", - new File("./yjs.jar").getAbsolutePath()); + KeyValueDBUtil.instance.setValue( + dbName, "yjsPath", new File("./yjs.jar").getAbsolutePath()); } else { - KeyValueDBUtil.instance.setValue(dbName, "yjsPath", - new File("./cp/yjs.jar").getAbsolutePath()); + KeyValueDBUtil.instance.setValue( + dbName, "yjsPath", new File("./cp/yjs.jar").getAbsolutePath()); } conf.keyPairStr = SM2Util.generateSM2KeyPair().toJson(); @@ -105,27 +111,40 @@ public class GlobalConf { // long time = System.currentTimeMillis()+15811200000; String licence = - ByteHexUtil - .encode(SM2Util.encrypt(conf.keyPair.getPublicKey(), - (HardwareInfo.getCPUID() + "==" - + (System.currentTimeMillis() + 15811200000L)) - .getBytes())); + ByteHexUtil.encode( + SM2Util.encrypt( + conf.keyPair.getPublicKey(), + (HardwareInfo.getCPUID() + + "==" + + (System.currentTimeMillis() + + 15811200000L)) + .getBytes())); LOGGER.debug("licence:" + licence); - LOGGER.debug(String.format("deviceName %s license %s %s==%d", deviceName, licence, - HardwareInfo.getCPUID(), (System.currentTimeMillis() + 15811200000L))); + LOGGER.debug( + String.format( + "deviceName %s license %s %s==%d", + deviceName, + licence, + HardwareInfo.getCPUID(), + (System.currentTimeMillis() + 15811200000L))); KeyValueDBUtil.instance.setValue(dbName, "licence", licence); KeyValueDBUtil.instance.setValue(dbName, "nodeName", deviceName.substring(0, 10)); KeyValueDBUtil.instance.setValue(dbName, "masterAddress", "null"); KeyValueDBUtil.instance.setValue(dbName, "ipPort", "null"); KeyValueDBUtil.instance.setValue(dbName, "nodeCenter", "ws://127.0.0.1:18005"); - KeyValueDBUtil.instance.setValue(dbName, "datachainConf", - "39.104.70.160:18091\n" + "47.98.247.70:18091\n" + "47.98.248.208:18091\n" - + "39.104.77.165:18091\n" + "47.98.249.131:18091"); + KeyValueDBUtil.instance.setValue( + dbName, + "datachainConf", + "39.104.70.160:18091\n" + + "47.98.247.70:18091\n" + + "47.98.248.208:18091\n" + + "39.104.77.165:18091\n" + + "47.98.249.131:18091"); } conf.projectDir = KeyValueDBUtil.instance.getValue(dbName, "projectDir"); - conf.bcoDir = conf.projectDir + "/bco"; + conf.bcoDir = conf.projectDir+"/bco"; conf.publicDir = KeyValueDBUtil.instance.getValue(dbName, "projectDir") + "/public"; conf.ADSPDir = KeyValueDBUtil.instance.getValue(dbName, "projectDir") + "/ADSPDir"; conf.publicCompiledDir = @@ -140,7 +159,7 @@ public class GlobalConf { conf.name = KeyValueDBUtil.instance.getValue(dbName, "nodeName"); conf.ipPort = KeyValueDBUtil.instance.getValue(dbName, "ipPort"); conf.isLAN = "true".equals(KeyValueDBUtil.instance.getValue(dbName, "isLAN")); - conf.masterAddress = KeyValueDBUtil.instance.getValue(dbName, "masterAddress"); + // conf.masterAddress = KeyValueDBUtil.instance.getValue(dbName, "masterAddress"); conf.nodeCenterUrl = KeyValueDBUtil.instance.getValue(dbName, "nodeCenter"); conf.nodeCenterWSUrl = KeyValueDBUtil.instance.getValue(dbName, "nodeCenterWS"); conf.peerID = KeyValueDBUtil.instance.getValue(dbName, "peerID"); @@ -192,8 +211,9 @@ public class GlobalConf { LOGGER.debug("[GlobalConf] ProjectDir Path:" + new File(conf.projectDir).getAbsolutePath()); LOGGER.debug("[GlobalConf] publicDir Path:" + new File(conf.publicDir).getAbsolutePath()); LOGGER.debug("[GlobalConf] publicDir Path:" + new File(conf.ADSPDir).getAbsolutePath()); - LOGGER.debug("[GlobalConf] publicDirCompiled Path:" - + new File(conf.publicCompiledDir).getAbsolutePath()); + LOGGER.debug( + "[GlobalConf] publicDirCompiled Path:" + + new File(conf.publicCompiledDir).getAbsolutePath()); LOGGER.debug( "[GlobalConf] PersonalDir Path:" + new File(conf.privateDir).getAbsolutePath()); LOGGER.debug("[GlobalConf] memorytDir Path:" + new File(conf.memoryDir).getAbsolutePath()); @@ -230,17 +250,16 @@ public class GlobalConf { private static void verifyLicence(GlobalConf conf) { try { - // String pubkey = - // "OTIzNmUzMGNmOGI1ZjFkMDBjZjEyMWY4OThmM2ZmYTIwNjE2ODYxOWNiMDNhMTVlM2FiZTA0OThhNTlkZDg1MmRi" - // + - // "MjA5Njc1NmM3ZDBhOWM3YTNkOTg2NWVlYzk2YzM1MmY0MDdkMGMyOTA4M2NkNDI4YmY1YjM5M2U5OTA1" + - // "NWE0MzM0MTJhM2Y2ZDhkZWVmZDk4MmI4NmZiZTMyYjhlMGE3ZWFmZmE5ODM3M2E4ZTRmNTYyNDgxNTY0" + - // "Yjk2ZjFkMTZiODk2MGRhZDAwMTNjZDYwOGZmOTcxNjdiOWI1MDU1MjJlMzk0ODhmODczNDJjNWUwOGRj" + - // "ZjFhZjFkYzBjODUxZjRlNDg2ZWIyOTM5NDI3MDc4MjA5NDg5ODliODVhZDNlOGJlNWJiYWEzZDUyMWU2" + - // "MjdmZjE3NGY4Y2ZlZDk3NTY4OWNlNDEzOGYyMTgyOWIwMDVmMzE0YjM3MmNlZmFkZjBkNmUyOTY4ZGUz" + - // "ZmFlNGUxNTFkMWFmNWE4Mjc4ZjQ2MDI5ODBjY2JkMDM0ZDE0YWRjZDk1ZjI1MjY3NmRlODRjYzdkNzU5" + - // "NGYyYTAxMTliYWJmYjgyMGRjMWNjZWZjNThjNWUwYWRjMDQyM2MzYzA1ODNhZTU1MWZlN2Y5YTYwYjkx" + - // "Zjg2YWViNDNlMzU0NzlhYWI5YmFjOTAwN2IsMTAwMDEsMA=="; +// String pubkey = +// "OTIzNmUzMGNmOGI1ZjFkMDBjZjEyMWY4OThmM2ZmYTIwNjE2ODYxOWNiMDNhMTVlM2FiZTA0OThhNTlkZDg1MmRi" + +// "MjA5Njc1NmM3ZDBhOWM3YTNkOTg2NWVlYzk2YzM1MmY0MDdkMGMyOTA4M2NkNDI4YmY1YjM5M2U5OTA1" + +// "NWE0MzM0MTJhM2Y2ZDhkZWVmZDk4MmI4NmZiZTMyYjhlMGE3ZWFmZmE5ODM3M2E4ZTRmNTYyNDgxNTY0" + +// "Yjk2ZjFkMTZiODk2MGRhZDAwMTNjZDYwOGZmOTcxNjdiOWI1MDU1MjJlMzk0ODhmODczNDJjNWUwOGRj" + +// "ZjFhZjFkYzBjODUxZjRlNDg2ZWIyOTM5NDI3MDc4MjA5NDg5ODliODVhZDNlOGJlNWJiYWEzZDUyMWU2" + +// "MjdmZjE3NGY4Y2ZlZDk3NTY4OWNlNDEzOGYyMTgyOWIwMDVmMzE0YjM3MmNlZmFkZjBkNmUyOTY4ZGUz" + +// "ZmFlNGUxNTFkMWFmNWE4Mjc4ZjQ2MDI5ODBjY2JkMDM0ZDE0YWRjZDk1ZjI1MjY3NmRlODRjYzdkNzU5" + +// "NGYyYTAxMTliYWJmYjgyMGRjMWNjZWZjNThjNWUwYWRjMDQyM2MzYzA1ODNhZTU1MWZlN2Y5YTYwYjkx" + +// "Zjg2YWViNDNlMzU0NzlhYWI5YmFjOTAwN2IsMTAwMDEsMA=="; LOGGER.debug("beforedecode:" + conf.licence); if (conf.licence != null && conf.licence.length() > 8) { @@ -248,8 +267,11 @@ public class GlobalConf { try { // byte[] arr = key.encode(new BASE64Decoder().decodeBuffer(conf.licence)); // String actualKey = new String(arr); - String arr = new String(SM2Util.decrypt(conf.keyPair.getPrivateKeyParameter(), - ByteHexUtil.decode(conf.licence))); + String arr = + new String( + SM2Util.decrypt( + conf.keyPair.getPrivateKeyParameter(), + ByteHexUtil.decode(conf.licence))); LOGGER.debug("[GlobalConf] actualKey:" + arr); @@ -303,30 +325,29 @@ public class GlobalConf { } } - public static void initMasterAddress(String val) { - if ("null".equals(instance.masterAddress) - || instance.masterAddress.startsWith("127.0.0.1")) { - resetMasterAddress(val); - } - } +// public static void initMasterAddress(String val) { +// if ("null".equals(instance.masterAddress) || instance.masterAddress.startsWith("127.0.0.1")) { +// resetMasterAddress(val); +// } +// } public static void initDOAConfig(DOAConf doaConf) { if (instance.doaConf == null || instance.doaConf.doipAddress == null) resetDOAConfig(JsonUtil.toJson(doaConf)); } - public static boolean resetMasterAddress(String val) { - try { - instance.masterAddress = val; - KeyValueDBUtil.instance.setValue(CMTables.ConfigDB.toString(), "masterAddress", val); - NetworkManager.instance.reInitNodeCenter(); - return true; - } catch (Exception e) { - LOGGER.error(e.getMessage()); - LOGGER.debug(ExceptionUtil.exceptionToString(e)); - return false; - } - } +// public static boolean resetMasterAddress(String val) { +// try { +// instance.masterAddress = val; +// KeyValueDBUtil.instance.setValue(CMTables.ConfigDB.toString(), "masterAddress", val); +// NetworkManager.instance.reInitNodeCenter(); +// return true; +// } catch (Exception e) { +// LOGGER.error(e.getMessage()); +// LOGGER.debug(ExceptionUtil.exceptionToString(e)); +// return false; +// } +// } public static boolean resetNodeCenter(String val) { try { @@ -409,7 +430,7 @@ public class GlobalConf { } public static void initIpPort(String val) { - if ("null".equals(instance.ipPort) || instance.masterAddress.startsWith("127.0.0.1")) { + if ("null".equals(instance.ipPort) || instance.ipPort.startsWith("127.0.0.1")) { resetIpPort(val); } } diff --git a/src/main/java/org/bdware/server/action/CMActions.java b/src/main/java/org/bdware/server/action/CMActions.java index 0fc0e6b..a884f18 100644 --- a/src/main/java/org/bdware/server/action/CMActions.java +++ b/src/main/java/org/bdware/server/action/CMActions.java @@ -800,7 +800,6 @@ public class CMActions implements OnHashCallback { } else { c.setScript(args.get("script").getAsString()); } - LOGGER.info("+++++++++++++++" + args.get("script").getAsString()); if (args.has("publicKey")) { c.setOwner(args.get("publicKey").getAsString()); } else if (args.has("owner")) { diff --git a/src/main/java/org/bdware/server/action/FileActions.java b/src/main/java/org/bdware/server/action/FileActions.java index 617d7ad..97f23b1 100644 --- a/src/main/java/org/bdware/server/action/FileActions.java +++ b/src/main/java/org/bdware/server/action/FileActions.java @@ -49,7 +49,7 @@ import java.util.concurrent.TimeUnit; import static io.netty.handler.codec.http.HttpResponseStatus.OK; public class FileActions { - // private static final String PARAM_ACTION = "action"; + // private static final String PARAM_ACTION = "action"; private static final Logger LOGGER = LogManager.getLogger(FileActions.class); private static final Set TEXT_FILE_SUFFIXES = new HashSet<>(); static Set changeSet = ConcurrentHashMap.newKeySet(); @@ -59,13 +59,14 @@ public class FileActions { ContractManagerFrameHandler handler; static { - clearUploadFailed = new TimerTask() { - @Override - public void run(Timeout arg0) { - clearUploadFailed(); - SyncResult.timer.newTimeout(this, 5, TimeUnit.MINUTES); - } - }; + clearUploadFailed = + new TimerTask() { + @Override + public void run(Timeout arg0) { + clearUploadFailed(); + SyncResult.timer.newTimeout(this, 5, TimeUnit.MINUTES); + } + }; SyncResult.timer.newTimeout(clearUploadFailed, 5, TimeUnit.MINUTES); } @@ -84,8 +85,11 @@ public class FileActions { String fileName = compileInternal(parentPath, projectName, isPrivate, true); File dir; if (isPrivate) { - dir = new File(parentPath.replace(GlobalConf.instance.privateDir, - GlobalConf.instance.privateCompiledDir)); + dir = + new File( + parentPath.replace( + GlobalConf.instance.privateDir, + GlobalConf.instance.privateCompiledDir)); } else { dir = new File(GlobalConf.instance.publicCompiledDir); } @@ -103,7 +107,9 @@ public class FileActions { return ret != null && ret.equals("locked"); } - @URIPath(method = org.bdware.server.http.HttpMethod.POST, value = {"/SCIDE/Upload", "/Upload"}) + @URIPath( + method = org.bdware.server.http.HttpMethod.POST, + value = {"/SCIDE/Upload", "/Upload"}) public static void handleUploadRequest(ChannelHandlerContext ctx, FullHttpRequest request) { // logger.info("[CMHttpHandler] handleUploadRequest : "); // Upload method is POST @@ -118,16 +124,20 @@ public class FileActions { } } - if (!transformedParam.containsKey("path") || !transformedParam.containsKey("fileName") + if (!transformedParam.containsKey("path") + || !transformedParam.containsKey("fileName") || !transformedParam.containsKey("isPrivate") - || !transformedParam.containsKey("order") || !transformedParam.containsKey("count") + || !transformedParam.containsKey("order") + || !transformedParam.containsKey("count") || !transformedParam.containsKey("pubKey") || !transformedParam.containsKey("sign")) { - DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse( - request.protocolVersion(), OK, - Unpooled.wrappedBuffer( - "{\"status\":\"false\",\"data\":\"Missing argument, please check: path, fileName, isPrivate, order, count, pubKey, sign!\"}" - .getBytes())); + DefaultFullHttpResponse fullResponse = + new DefaultFullHttpResponse( + request.protocolVersion(), + OK, + Unpooled.wrappedBuffer( + "{\"status\":\"false\",\"data\":\"Missing argument, please check: path, fileName, isPrivate, order, count, pubKey, sign!\"}" + .getBytes())); ChannelFuture f = addCrossOriginHeaderAndWrite(ctx, fullResponse); @@ -136,8 +146,10 @@ public class FileActions { } // 验签 - // HttpMethod method = request.method(); - String uri = URLDecoder.decode(request.uri()).split("\\?")[1]; // http请求中规定签名必须是最后一个且公钥名必须为pubKey,否则验签失败 + // HttpMethod method = request.method(); + String uri = + URLDecoder.decode(request.uri()) + .split("\\?")[1]; // http请求中规定签名必须是最后一个且公钥名必须为pubKey,否则验签失败 int index = uri.lastIndexOf('&'); String str = uri.substring(0, index); // logger.info("uri=" + uri); @@ -171,8 +183,9 @@ public class FileActions { Method mm; Action a = null; try { - mm = FileActions.class.getDeclaredMethod("uploadFile", JsonObject.class, - ResultCallback.class); + mm = + FileActions.class.getDeclaredMethod( + "uploadFile", JsonObject.class, ResultCallback.class); a = mm.getAnnotation(Action.class); } catch (SecurityException | NoSuchMethodException e1) { // TODO Auto-generated catch block @@ -202,17 +215,28 @@ public class FileActions { status = "accept"; } - TimeDBUtil.instance.put(CMTables.LocalNodeLogDB.toString(), - "{\"action\":\"" + action + "\",\"pubKey\":\"" + transformedParam.get("pubKey") - + "\",\"status\":\"" + status + "\",\"date\":" + System.currentTimeMillis() + TimeDBUtil.instance.put( + CMTables.LocalNodeLogDB.toString(), + "{\"action\":\"" + + action + + "\",\"pubKey\":\"" + + transformedParam.get("pubKey") + + "\",\"status\":\"" + + status + + "\",\"date\":" + + System.currentTimeMillis() + "}"); // logger.info("[CMHttpHandler] flag = " + flag + " flag2 = " + flag2); if (!flag || !flag2) { - DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse( - request.protocolVersion(), OK, Unpooled.wrappedBuffer( - "{\"status\":\"false\",\"data\":\"Permission denied!\"}".getBytes())); + DefaultFullHttpResponse fullResponse = + new DefaultFullHttpResponse( + request.protocolVersion(), + OK, + Unpooled.wrappedBuffer( + "{\"status\":\"false\",\"data\":\"Permission denied!\"}" + .getBytes())); ChannelFuture f = addCrossOriginHeaderAndWrite(ctx, fullResponse); f.addListener(ChannelFutureListener.CLOSE); @@ -232,7 +256,9 @@ public class FileActions { ContractMeta meta = CMActions.manager.statusRecorder.getContractMeta(contractID); if (meta == null) { DefaultFullHttpResponse fullResponse = - new DefaultFullHttpResponse(request.protocolVersion(), OK, + new DefaultFullHttpResponse( + request.protocolVersion(), + OK, Unpooled.wrappedBuffer( "{\"status\":\"false\",\"data\":\"no such contract!\"}" .getBytes())); @@ -241,20 +267,24 @@ public class FileActions { return; } if (!meta.contract.getOwner().equals(pubkey)) { - DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse( - request.protocolVersion(), OK, Unpooled.wrappedBuffer( - "{\"status\":\"false\",\"data\":\"not owner!\"}".getBytes())); + DefaultFullHttpResponse fullResponse = + new DefaultFullHttpResponse( + request.protocolVersion(), + OK, + Unpooled.wrappedBuffer( + "{\"status\":\"false\",\"data\":\"not owner!\"}" + .getBytes())); ChannelFuture f = addCrossOriginHeaderAndWrite(ctx, fullResponse); f.addListener(ChannelFutureListener.CLOSE); return; } dir = new File(GlobalConf.instance.getDBPath(), meta.getName()); dir = new File(dir, dirName); - if (!dir.exists()) - dir.mkdirs(); + if (!dir.exists()) dir.mkdirs(); } else { - boolean isPrivate = transformedParam.containsKey("isPrivate") - && Boolean.parseBoolean(transformedParam.get("isPrivate")); + boolean isPrivate = + transformedParam.containsKey("isPrivate") + && Boolean.parseBoolean(transformedParam.get("isPrivate")); // TODO verify signature and if (isPrivate) { String pub = "/" + transformedParam.get("pubKey"); @@ -268,24 +298,27 @@ public class FileActions { } File target = new File(dir, fileName); if (fileName.contains("..")) { - DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse( - request.protocolVersion(), OK, Unpooled.wrappedBuffer( - "{\"status\":\"false\",\"data\":\"FileName illegal!\"}".getBytes())); + DefaultFullHttpResponse fullResponse = + new DefaultFullHttpResponse( + request.protocolVersion(), + OK, + Unpooled.wrappedBuffer( + "{\"status\":\"false\",\"data\":\"FileName illegal!\"}" + .getBytes())); ChannelFuture f = addCrossOriginHeaderAndWrite(ctx, fullResponse); f.addListener(ChannelFutureListener.CLOSE); return; } - // LOGGER.info(request.refCnt()); - // httpDecoder.offer(request); - // LOGGER.info(request.refCnt()); + // LOGGER.info(request.refCnt()); + // httpDecoder.offer(request); + // LOGGER.info(request.refCnt()); FileOutputStream fout; if (order == 0) { try { LOGGER.debug("Path:" + target.getAbsolutePath()); - if (!target.getParentFile().exists()) - target.getParentFile().mkdirs(); + if (!target.getParentFile().exists()) target.getParentFile().mkdirs(); fout = new FileOutputStream(target, false); fileMap.put(target.getAbsolutePath(), fout); } catch (FileNotFoundException e) { @@ -297,6 +330,7 @@ public class FileActions { httpDecoder.destroy(); String retStr = "{\"status\":\"true\",\"data\":\"success\",\"handle\":\"null\"}"; + LOGGER.info("upload file, order/count:" + order + "/" + count); if (order == count - 1) { fout = fileMap.get(target.getAbsolutePath()); try { @@ -306,24 +340,33 @@ public class FileActions { } fileMap.remove(target.getAbsolutePath()); updateTime.remove(target.getAbsolutePath()); - boolean isDebug = transformedParam.containsKey("isDebug") - && Boolean.parseBoolean(transformedParam.get("isDebug")); + boolean isDebug = + transformedParam.containsKey("isDebug") + && Boolean.parseBoolean(transformedParam.get("isDebug")); String doi = null; - if (target.getParentFile().getParentFile() - .equals(new File(GlobalConf.instance.privateDir))) + String path = target.getAbsolutePath(); + path = path.replaceAll("/\\./", "/"); + String path2 = new File(GlobalConf.instance.privateDir).getAbsolutePath(); + path2 = path2.replaceAll("/\\./", "/"); + String path3 = new File(path).getParentFile().getParentFile().getAbsolutePath(); + LOGGER.info("=======Target:" + target.getAbsolutePath() + " --> replaced:" + path); + LOGGER.info("=======Which file:" + path + "->" + path2 + " -> " + path3); + boolean isEqual = path2.equals(path3); + LOGGER.info("=======isEqual:" + isEqual); + if (isEqual) doi = unzipIfYpk(target, dir, isDebug); if (null != doi) { retStr = retStr.replaceFirst("null", doi); } } - DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse( - request.protocolVersion(), OK, Unpooled.wrappedBuffer(retStr.getBytes())); + DefaultFullHttpResponse fullResponse = + new DefaultFullHttpResponse( + request.protocolVersion(), OK, Unpooled.wrappedBuffer(retStr.getBytes())); ChannelFuture f = addCrossOriginHeaderAndWrite(ctx, fullResponse); f.addListener(ChannelFutureListener.CLOSE); } - private static ChannelFuture addCrossOriginHeaderAndWrite(ChannelHandlerContext ctx, - DefaultFullHttpResponse fullResponse) { + private static ChannelFuture addCrossOriginHeaderAndWrite(ChannelHandlerContext ctx, DefaultFullHttpResponse fullResponse) { fullResponse.headers().add("Access-Control-Allow-Origin", "*"); fullResponse.headers().add("Access-Control-Allow-Methods", "*"); return ctx.write(fullResponse); @@ -341,12 +384,15 @@ public class FileActions { } private static String unzipIfYpk(File target, File dir, boolean isDebug) { - // [FileAction] unzipIfYpk, - // target:/data/bdwaas/bdcontract/./BDWareProjectDir/private/045eeda3a001faad9d636ab1e973599ea87338a9576756eb10ceeca6083c1f76aac5cd201eab21c41342eb8aac40e9b283f0b6eae019644cdcc0a9f9aeb73de8fc/ContractUNknown.ypk - // targetDir:/data/bdwaas/bdcontract/./BDWareProjectDir/private/045eeda3a001faad9d636ab1e973599ea87338a9576756eb10ceeca6083c1f76aac5cd201eab21c41342eb8aac40e9b283f0b6eae019644cdcc0a9f9aeb73de8fc/ContractUNknown - LOGGER.info("[FileAction] unzipIfYpk, date:" - + new SimpleDateFormat("MM-dd hh:mm:ss").format(new Date()) + " -> target:" - + target.getAbsolutePath() + " dir:" + dir.getAbsolutePath()); + // [FileAction] unzipIfYpk, + // target:/data/bdwaas/bdcontract/./BDWareProjectDir/private/045eeda3a001faad9d636ab1e973599ea87338a9576756eb10ceeca6083c1f76aac5cd201eab21c41342eb8aac40e9b283f0b6eae019644cdcc0a9f9aeb73de8fc/ContractUNknown.ypk targetDir:/data/bdwaas/bdcontract/./BDWareProjectDir/private/045eeda3a001faad9d636ab1e973599ea87338a9576756eb10ceeca6083c1f76aac5cd201eab21c41342eb8aac40e9b283f0b6eae019644cdcc0a9f9aeb73de8fc/ContractUNknown + LOGGER.info( + "[FileAction] unzipIfYpk, date:" + + new SimpleDateFormat("MM-dd hh:mm:ss").format(new Date()) + + " -> target:" + + target.getAbsolutePath() + + " dir:" + + dir.getAbsolutePath()); if (target.getParentFile().equals(dir)) { if (target.getName().endsWith(".ypk")) { String dirName = target.getName().substring(0, target.getName().length() - 4); @@ -360,8 +406,11 @@ public class FileActions { } } targetDir.mkdirs(); - LOGGER.info("[FileAction] unzipIfYpk, target:" + target.getAbsolutePath() - + " targetDir:" + targetDir.getAbsolutePath()); + LOGGER.info( + "[FileAction] unzipIfYpk, target:" + + target.getAbsolutePath() + + " targetDir:" + + targetDir.getAbsolutePath()); YJSPacker.unpack(target.getAbsolutePath(), targetDir.getAbsolutePath()); final File tempDir = targetDir; ContractManager.threadPool.execute(() -> startIfManifestDetected(tempDir, isDebug)); @@ -379,13 +428,14 @@ public class FileActions { String doi = "86.5000.470/do." + geneRandomID(); jo.addProperty("doi", doi); } - ContractManager.threadPool.execute(() -> { - try { - GRPCPool.instance.reRegister(jo.get("doi").getAsString()); - } catch (Exception e) { - LOGGER.warn("unable to connect LHS: " + e.getMessage()); - } - }); + ContractManager.threadPool.execute( + () -> { + try { + GRPCPool.instance.reRegister(jo.get("doi").getAsString()); + } catch (Exception e) { + LOGGER.warn("unable to connect LHS: " + e.getMessage()); + } + }); FileWriter fw = new FileWriter(manifestFile); fw.write(JsonUtil.toJson(jo)); fw.close(); @@ -410,8 +460,9 @@ public class FileActions { LOGGER.info("startContractProcess:" + targetDir); Contract c = new Contract(); c.setType(ContractExecType.Sole); - String ypkPath = FileActions - .autoCompile(targetDir.getParentFile().getAbsolutePath(), contractName); + String ypkPath = + FileActions.autoCompile( + targetDir.getParentFile().getAbsolutePath(), contractName); c.setScript(ypkPath); c.setOwner(owner); c.setDebug(isDebug); @@ -446,8 +497,8 @@ public class FileActions { } } - private static void writeChunk(ChannelHandlerContext ctx, HttpPostRequestDecoder httpDecoder, - File file) { + private static void writeChunk( + ChannelHandlerContext ctx, HttpPostRequestDecoder httpDecoder, File file) { try { if (!file.exists()) { file.createNewFile(); @@ -480,8 +531,8 @@ public class FileActions { } } - private static String compileInternal(String parPath, String projectName, boolean isPrivate, - boolean isAuto) { + private static String compileInternal( + String parPath, String projectName, boolean isPrivate, boolean isAuto) { File project = new File(parPath, projectName); try { if (project.isDirectory()) { @@ -493,18 +544,24 @@ public class FileActions { File dir; if (isPrivate) { - dir = new File(parPath.replace(GlobalConf.instance.privateDir, - GlobalConf.instance.privateCompiledDir)); + dir = + new File( + parPath.replace( + GlobalConf.instance.privateDir, + GlobalConf.instance.privateCompiledDir)); } else { dir = new File(GlobalConf.instance.publicCompiledDir); } tempZip = new File(dir, projectName + "_" + time + isAutoStr + ".ypk"); if (isAuto) { - File[] files = dir - .listFiles(pathname -> pathname.getName().startsWith(projectName + "_") - && pathname.getName().endsWith("_Auto.ypk")); - if (files != null && files.length == 1 + File[] files = + dir.listFiles( + pathname -> + pathname.getName().startsWith(projectName + "_") + && pathname.getName().endsWith("_Auto.ypk")); + if (files != null + && files.length == 1 && !changeSet.contains(project.getAbsolutePath())) { return files[0].getName(); } else if (files != null) { @@ -529,7 +586,8 @@ public class FileActions { Map header = new HashMap<>(); header.put("accept", "*/*"); header.put("connection", "Keep-Alive"); - header.put("user-agent", + header.put( + "user-agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36)"); // header.put("Content-Type", "application/json"); return header; @@ -604,8 +662,7 @@ public class FileActions { } private static String toProjectName(String path) { - if (path.startsWith("/")) - path = path.substring(1); + if (path.startsWith("/")) path = path.substring(1); return path.replaceAll("/.*$", ""); } @@ -724,7 +781,9 @@ public class FileActions { int counter = 0; while ((s = br.readLine()) != null) { - if (s.equals("{") || s.equals("}") || s.equals("") + if (s.equals("{") + || s.equals("}") + || s.equals("") || s.trim().startsWith("\"doi\":\"") || s.trim().startsWith("\"doipFlag\":\"")) { continue; @@ -803,8 +862,8 @@ public class FileActions { returnFileListResponse(resultCallback, response, dirs, f); } - private void returnFileListResponse(ResultCallback resultCallback, Response response, - List dirs, File f) { + private void returnFileListResponse( + ResultCallback resultCallback, Response response, List dirs, File f) { if (f.exists() && f.isDirectory()) { for (File subFile : f.listFiles()) { dirs.add(subFile.getName()); @@ -846,8 +905,7 @@ public class FileActions { String fileName = subFile.getName(); dirs.add(fileName); } - } else - dirs.add(project); + } else dirs.add(project); } response.data = JsonUtil.toJson(dirs); } @@ -947,20 +1005,20 @@ public class FileActions { response.isPrivate = true; String strr = "/" + getPubkey(args); projectDir = GlobalConf.instance.privateDir + strr; - // url = - // "http://" - // + mainHost - // + "/SCIDE/CMManager?action=downloadContract&projectName=" - // + projectName - // + "&pubkey=" - // + json.get("pubkey").getAsString(); + // url = + // "http://" + // + mainHost + // + "/SCIDE/CMManager?action=downloadContract&projectName=" + // + projectName + // + "&pubkey=" + // + json.get("pubkey").getAsString(); } else { projectDir = GlobalConf.instance.publicDir; - // url = - // "http://" - // + mainHost - // + "/SCIDE/CMManager?action=downloadContract&projectName=" - // + projectName; + // url = + // "http://" + // + mainHost + // + "/SCIDE/CMManager?action=downloadContract&projectName=" + // + projectName; } url = "http://127.0.0.1:18000/Users/zhangyixuan/Grade2/temp65/TEST.txt"; @@ -1029,7 +1087,7 @@ public class FileActions { long downloaded = 0; byte[] buff = new byte[1024 * 100 * 4]; int d = 5; - for (int k; (k = input.read(buff)) > 0;) { + for (int k; (k = input.read(buff)) > 0; ) { fout.write(buff, 0, k); downloaded += k; response.data = "downloading"; @@ -1131,72 +1189,89 @@ public class FileActions { case "Data Sharing Project": // 注册一个用于授权状态持久化的DO,并设置到manifest String authInfoPersistDOI = null; - // try { + // try { // - // HandleService hs = - // new + // HandleService hs = + // new // HandleService(HandleServiceUtils.hrRegister); - // authInfoPersistDOI = + // authInfoPersistDOI = // // hs.registerContract(DOIPMainServer.repoIdentifier, ""); - // DigitalObject contractDO = - // new + // DigitalObject contractDO = + // new // DigitalObject(authInfoPersistDOI, DoType.Json); - // Element e = new + // Element e = new // Element("contract", "JsonString"); - // e.setData("{}".getBytes()); - // contractDO.addElements(e); - // // - // DOAClient.getGlobalInstance().create(DOIPMainServer.repoIdentifier, - // contractDO); - // DoipClient doipClient = + // e.setData("{}".getBytes()); + // contractDO.addElements(e); + // // + // DOAClient.getGlobalInstance().create(DOIPMainServer.repoIdentifier, contractDO); + // DoipClient doipClient = // // DoipClient.createByRepoUrlAndMsgFmt( // // DOIPMainServer.repoUrl, // // DoipMessageFormat.PACKET.getName()); - // DoMessage response = - // doipClient.create( + // DoMessage response = + // doipClient.create( // // DOIPMainServer.repoIdentifier, contractDO); - // if (authInfoPersistDOI == + // if (authInfoPersistDOI == // null) return; - // } catch (Exception ex) { - // ex.printStackTrace(); - // return; - // } + // } catch (Exception ex) { + // ex.printStackTrace(); + // return; + // } if (args.has("projectDOI")) - manifestFout.write(("{\n \"main\":\"" + fileName + ".yjs\",\n" - + " \"doipFlag\":true,\n" + " \"doi\":\"" - + args.get("projectDOI").getAsString() + "\",\n" - + " \"authInfoPersistDOI\":\"" + authInfoPersistDOI - + "\"\n}").getBytes()); + manifestFout.write( + ("{\n \"main\":\"" + + fileName + + ".yjs\",\n" + + " \"doipFlag\":true,\n" + + " \"doi\":\"" + + args.get("projectDOI").getAsString() + + "\",\n" + + " \"authInfoPersistDOI\":\"" + + authInfoPersistDOI + + "\"\n}") + .getBytes()); else - manifestFout.write(("{\n \"main\":\"" + fileName + ".yjs\",\n" - + " \"authInfoPersistDOI\":\"" + authInfoPersistDOI - + "\"\n}").getBytes()); + manifestFout.write( + ("{\n \"main\":\"" + + fileName + + ".yjs\",\n" + + " \"authInfoPersistDOI\":\"" + + authInfoPersistDOI + + "\"\n}") + .getBytes()); YJSPacker.unpack( new File("./WebContent/ProjectTemplate/naiveDAC.zip") .getAbsolutePath(), newFile.getPath() + "/naiveDAC"); - mainyjsFout - .write(("import \"naiveDAC/naiveDAC.yjs\"\n\n").getBytes()); - mainyjsFout.write(("contract " + fileName - + "{\n function onCreate(){\n initDAC(requester);\n }\n}") + mainyjsFout.write( + ("import \"naiveDAC/naiveDAC.yjs\"\n\n").getBytes()); + mainyjsFout.write( + ("contract " + + fileName + + "{\n function onCreate(){\n initDAC(requester);\n }\n}") .getBytes()); break; default: if (args.has("projectDOI")) - manifestFout.write(("{\n \"main\":\"" + fileName - + ".yjs\",\n \"doipFlag\":true,\n \"doi\":\"" - + args.get("projectDOI").getAsString() + "\"\n}") + manifestFout.write( + ("{\n \"main\":\"" + + fileName + + ".yjs\",\n \"doipFlag\":true,\n \"doi\":\"" + + args.get("projectDOI").getAsString() + + "\"\n}") .getBytes()); else - manifestFout.write(("{\n \"main\":\"" + fileName + ".yjs\"\n}") - .getBytes()); + manifestFout.write( + ("{\n \"main\":\"" + fileName + ".yjs\"\n}") + .getBytes()); mainyjsFout.write(("contract " + fileName + "{\n\n}").getBytes()); } } @@ -1258,8 +1333,11 @@ public class FileActions { File f = new File(parPath + "/" + oldFile); if (!oldFile.contains("..") && f.exists()) { - LOGGER.debug("[FileController] delete:" + f.getAbsolutePath() + " exists:" - + f.exists()); + LOGGER.debug( + "[FileController] delete:" + + f.getAbsolutePath() + + " exists:" + + f.exists()); if (f.isDirectory()) { deleteDir(f); } else { @@ -1397,8 +1475,10 @@ public class FileActions { // 文本文件 if (!path.contains("..") && isTextFile(path)) { LOGGER.debug("[FileActions] 上传文本文件类型 : "); - BufferedWriter bw = new BufferedWriter( - new FileWriter(target.getAbsolutePath() + "/" + fileName, isAppend)); + BufferedWriter bw = + new BufferedWriter( + new FileWriter( + target.getAbsolutePath() + "/" + fileName, isAppend)); bw.write(content); bw.close(); } else { // 其他类型文件 @@ -1435,8 +1515,7 @@ public class FileActions { private String getPubkey(JsonObject args) { try { - if (handler != null) - return handler.getPubKey(); + if (handler != null) return handler.getPubKey(); return args.get("pubKey").getAsString(); } catch (Exception e) { e.printStackTrace(); @@ -1489,59 +1568,59 @@ public class FileActions { resultCallback.onResult(JsonUtil.toJson(response)); } - // @Action(userPermission = 1 << 14, async = true) - // public void importContractInstanceCodeByDOI(JsonObject args, ResultCallback + // @Action(userPermission = 1 << 14, async = true) + // public void importContractInstanceCodeByDOI(JsonObject args, ResultCallback // resultCallback) { - // long s = System.currentTimeMillis(); - // String ret; - // try { - // String contractDOI = args.get("doi").getAsString(); - // DigitalObject contractDO; - // DoipClient doipClient = - // DoipClient.createByRepoUrlAndMsgFmt( - // DOIPMainServer.repoUrl, DoipMessageFormat.PACKET.getName()); - // DoMessage response = doipClient.retrieve(contractDOI, null, null); - // if (response.parameters.response == DoResponse.Success) { - // contractDO = DigitalObject.parse(response.body); - // } else { - // DoMessage resp = DOAClient.getGlobalInstance().retrieve(contractDOI, null, + // long s = System.currentTimeMillis(); + // String ret; + // try { + // String contractDOI = args.get("doi").getAsString(); + // DigitalObject contractDO; + // DoipClient doipClient = + // DoipClient.createByRepoUrlAndMsgFmt( + // DOIPMainServer.repoUrl, DoipMessageFormat.PACKET.getName()); + // DoMessage response = doipClient.retrieve(contractDOI, null, null); + // if (response.parameters.response == DoResponse.Success) { + // contractDO = DigitalObject.parse(response.body); + // } else { + // DoMessage resp = DOAClient.getGlobalInstance().retrieve(contractDOI, null, // null); - // contractDO = DigitalObject.parse(resp.body); - // } - // // Dictionary contractInfo = JsonUtil.fromJson(new - // // String(contractDO.getData()), - // // new Hashtable().getClass()); - // ContractInstanceDO contractInstanceDO = - // (ContractInstanceDO) - // ContractManager.toObject(contractDO.elements.get(0).getData()); - // String projectName = contractDOI.replace('/', '_'); - // String projectDirStr = - // GlobalConf.instance.privateDir + "/" + getPubkey(args) + "/" + + // contractDO = DigitalObject.parse(resp.body); + // } + // // Dictionary contractInfo = JsonUtil.fromJson(new + // // String(contractDO.getData()), + // // new Hashtable().getClass()); + // ContractInstanceDO contractInstanceDO = + // (ContractInstanceDO) + // ContractManager.toObject(contractDO.elements.get(0).getData()); + // String projectName = contractDOI.replace('/', '_'); + // String projectDirStr = + // GlobalConf.instance.privateDir + "/" + getPubkey(args) + "/" + // projectName; - // File projectDir = new File(projectDirStr); - // if (projectDir.isDirectory()) { - // deleteDir(projectDir); - // } - // YJSPacker.unpack(contractInstanceDO.script, projectDirStr); - // ret = - // "Import project successfully." - // + "\nProject Name: " - // + projectName - // + "\nContract ID: " - // + contractInstanceDO.id - // + "\nContract PublicKey: " - // + contractInstanceDO.publicKey; - // } catch (Exception e) { - // ByteArrayOutputStream bo = new ByteArrayOutputStream(); - // e.printStackTrace(new PrintStream(bo)); - // ret = bo.toString(); - // } - // Map r = new HashMap<>(); - // r.put("action", "onImportContractInstanceCodeByDOI"); - // r.put("data", ret); - // r.put("executeTime", System.currentTimeMillis() - s); - // resultCallback.onResult(JsonUtil.toJson(r)); - // } + // File projectDir = new File(projectDirStr); + // if (projectDir.isDirectory()) { + // deleteDir(projectDir); + // } + // YJSPacker.unpack(contractInstanceDO.script, projectDirStr); + // ret = + // "Import project successfully." + // + "\nProject Name: " + // + projectName + // + "\nContract ID: " + // + contractInstanceDO.id + // + "\nContract PublicKey: " + // + contractInstanceDO.publicKey; + // } catch (Exception e) { + // ByteArrayOutputStream bo = new ByteArrayOutputStream(); + // e.printStackTrace(new PrintStream(bo)); + // ret = bo.toString(); + // } + // Map r = new HashMap<>(); + // r.put("action", "onImportContractInstanceCodeByDOI"); + // r.put("data", ret); + // r.put("executeTime", System.currentTimeMillis() - s); + // resultCallback.onResult(JsonUtil.toJson(r)); + // } private boolean isTextFile(String path) { return TEXT_FILE_SUFFIXES.contains(path.substring(path.lastIndexOf("."))); @@ -1579,8 +1658,9 @@ public class FileActions { if (null != ypkPath) { try { ret.put("ypk", new File(ypkPath).getName()); - ret.put("permissions", JsonUtil - .parseStringAsJsonObject(CMActions.manager.parseYpkPermissions(ypkPath))); + ret.put( + "permissions", + JsonUtil.parseStringAsJsonObject(CMActions.manager.parseYpkPermissions(ypkPath))); } catch (Exception e) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(bo)); diff --git a/src/main/java/org/bdware/server/action/ManagerActions.java b/src/main/java/org/bdware/server/action/ManagerActions.java index a8f4477..5bafa2f 100644 --- a/src/main/java/org/bdware/server/action/ManagerActions.java +++ b/src/main/java/org/bdware/server/action/ManagerActions.java @@ -90,8 +90,7 @@ public class ManagerActions { data = status = GlobalConf.resetNodeName(val); break; case "masterAddress": - data = status = GlobalConf.resetMasterAddress(val); - break; + // data = status = GlobalConf.resetMasterAddress(val); default: status = false; data = "unsupported key:" + key; @@ -119,6 +118,7 @@ public class ManagerActions { data.put("expireTime", new Date(GlobalConf.instance.expireTime) + ""); data.put("nodeName", GlobalConf.instance.name); data.put("doipConfig", GlobalConf.instance.doaConf); + data.put("nodePubKey", GlobalConf.instance.keyPair.getPublicKeyStr()); ReplyUtil.replyWithStatus(resultCallback, "onLoadConfig", true, data); } @@ -153,7 +153,7 @@ public class ManagerActions { data.put("clusterConnected", String.valueOf(NetworkManager.instance.isConnectedToNodeCenter())); data.put("nodePubKey", GlobalConf.instance.keyPair.getPublicKeyStr()); - data.put("masterAddress", GlobalConf.instance.masterAddress); + // data.put("masterAddress", GlobalConf.instance.masterAddress); data.put("nodeCenterWS", GlobalConf.getNodeCenterWSUrl()); ReplyUtil.replyWithStatus(resultCallback, "onLoadNodeConfig", true, data); } diff --git a/src/main/java/org/bdware/server/doip/BCOManager.java b/src/main/java/org/bdware/server/doip/BCOManager.java index 89685e4..ac664bb 100644 --- a/src/main/java/org/bdware/server/doip/BCOManager.java +++ b/src/main/java/org/bdware/server/doip/BCOManager.java @@ -31,7 +31,7 @@ public class BCOManager { this.keyPair = keyPair; } - public String download(String bCoId) { + public String download(String bcoId) { if (client == null) { EndpointConfig config = new EndpointConfig(); config.routerURI = GlobalConf.instance.doaConf.lhsAddress; @@ -40,11 +40,11 @@ public class BCOManager { client = new CodeRepoClient(codeRepoDoid, irpClient, keyPair); } YPKInfo ypkInfo = new YPKInfo(); - client.retrieveBCO(bCoId, new DoipMessageCallback() { + client.retrieveBCO(bcoId, new DoipMessageCallback() { @Override public void onResult(DoipMessage doipMessage) { String body = doipMessage.body.getDataAsJsonString(); - LOGGER.info("Retrieve " + bCoId + " Result:" + body); + LOGGER.info("Retrieve " + bcoId + " Result:" + body); YPKInfo parsed = new Gson().fromJson(body, YPKInfo.class); if (parsed != null && parsed.md5 != null && parsed.status == UploadingStatus.Finished) { @@ -58,23 +58,21 @@ public class BCOManager { synchronized (ypkInfo) { try { if (ypkInfo.status == null) - ypkInfo.wait(1000L); + ypkInfo.wait(4000L); } catch (Exception e) { } } LOGGER.info("Download:" + new Gson().toJson(ypkInfo)); - if (ypkInfo.status == UploadingStatus.Finished) { File target = getYpkFile(ypkInfo); if (target.exists() && (client.calFileMd5(target.getAbsolutePath()) + ".ypk") .equals(target.getName())) return target.getAbsolutePath(); DownloadProgressChecker checker = new DownloadProgressChecker(); - client.downloadYPK(bCoId, checker, target); + client.downloadYPK(bcoId, checker, target); LOGGER.info("start Download:" + new Gson().toJson(ypkInfo)); checker.waitForResult(30000); LOGGER.info("checker:" + checker.isSuccess); - if (checker.isSuccess) return target.getAbsolutePath(); } diff --git a/src/main/java/org/bdware/server/doip/ContractRepositoryHandler.java b/src/main/java/org/bdware/server/doip/ContractRepositoryHandler.java index c7c92a7..50da83a 100644 --- a/src/main/java/org/bdware/server/doip/ContractRepositoryHandler.java +++ b/src/main/java/org/bdware/server/doip/ContractRepositoryHandler.java @@ -1,16 +1,12 @@ package org.bdware.server.doip; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; +import com.google.gson.*; import io.netty.channel.ChannelHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bdware.doip.audit.server.DefaultRepoHandlerInjector; import org.bdware.doip.codec.digitalObject.DigitalObject; import org.bdware.doip.codec.digitalObject.DoType; -import org.bdware.doip.codec.digitalObject.Element; import org.bdware.doip.codec.doipMessage.DoipMessage; import org.bdware.doip.codec.doipMessage.DoipMessageFactory; import org.bdware.doip.codec.doipMessage.DoipResponseCode; @@ -18,6 +14,7 @@ import org.bdware.doip.codec.operations.BasicOperations; import org.bdware.doip.endpoint.server.DoipServiceInfo; import org.bdware.doip.endpoint.server.Op; import org.bdware.doip.endpoint.server.RepositoryHandlerBase; +import org.bdware.irp.stateinfo.StateInfoBase; import org.bdware.sc.ContractClient; import org.bdware.sc.ContractMeta; import org.bdware.sc.ContractStatusEnum; @@ -32,7 +29,6 @@ import org.bdware.sc.util.JsonUtil; import org.bdware.server.GlobalConf; import org.bdware.server.action.CMActions; import org.zz.gmhelper.SM2KeyPair; -import org.zz.gmhelper.SM2Util; import java.io.ByteArrayOutputStream; import java.io.File; @@ -40,9 +36,10 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.List; +import static org.bdware.server.doip.ContractRepositoryMain.currentIrpClient; + @ChannelHandler.Sharable -public class ContractRepositoryHandler extends RepositoryHandlerBase - implements DefaultRepoHandlerInjector { +public class ContractRepositoryHandler extends RepositoryHandlerBase implements DefaultRepoHandlerInjector { BCOManager bcoManager; static Logger LOGGER = LogManager.getLogger(ContractRepositoryHandler.class); @@ -50,8 +47,7 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase super(info); GlobalConf.DOAConf doaConf = GlobalConf.instance.doaConf; String bcoDir = GlobalConf.instance.bcoDir; - bcoManager = new BCOManager(doaConf.repoDoid, new File(bcoDir), doaConf.lhsAddress, - GlobalConf.instance.keyPair); + bcoManager = new BCOManager(doaConf.repoDoid, new File(bcoDir), doaConf.lhsAddress, GlobalConf.instance.keyPair); } @Override @@ -62,9 +58,7 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase @Override public DoipMessage handleListOps(DoipMessage doipMessage) { if (!GlobalConf.instance.doaConf.repoDoid.equals(doipMessage.header.parameters.id)) { - return replyStringWithStatus(doipMessage, - "unsupported doid:" + doipMessage.header.parameters.id, - DoipResponseCode.DoNotFound); + return replyStringWithStatus(doipMessage, "unsupported doid:" + doipMessage.header.parameters.id, DoipResponseCode.DoNotFound); } JsonArray ops = new JsonArray(); ops.add(BasicOperations.Hello.getName()); @@ -75,17 +69,13 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase @Override public DoipMessage handleCreate(DoipMessage doipMessage) { if (!GlobalConf.instance.doaConf.repoDoid.equals(doipMessage.header.parameters.id)) { - return replyStringWithStatus(doipMessage, - "unsupported doid:" + doipMessage.header.parameters.id, - DoipResponseCode.DoNotFound); + return replyStringWithStatus(doipMessage, "unsupported doid:" + doipMessage.header.parameters.id, DoipResponseCode.DoNotFound); } - // TODD 验证签名。完事后进入 + //TODD 验证签名。完事后进入 if (doipMessage.credential != null && doipMessage.credential.getSigner() != null) { - String permissions = KeyValueDBUtil.instance.getValue(CMTables.NodeRole.toString(), - doipMessage.credential.getSigner()); + String permissions = KeyValueDBUtil.instance.getValue(CMTables.NodeRole.toString(), doipMessage.credential.getSigner()); if (!permissions.contains("ContractInstanceManager")) { - return replyStringWithStatus(doipMessage, "permission denied, role:" + permissions, - DoipResponseCode.Declined); + return replyStringWithStatus(doipMessage, "permission denied, role:" + permissions, DoipResponseCode.Declined); } } DigitalObject digitalObject = null; @@ -95,65 +85,98 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase } catch (Exception e) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(bo)); - return replyStringWithStatus(doipMessage, "exception:" + new String(bo.toByteArray()), - DoipResponseCode.Invalid); + return replyStringWithStatus(doipMessage, "exception:" + new String(bo.toByteArray()), DoipResponseCode.Invalid); + } + digitalObject.attributes.addProperty("owner", doipMessage.credential.getSigner()); + try { + String result = startUsingJsonObject(digitalObject.attributes); + //Please note startContractByYPK is invoked in sync mode method. + return replyStringWithStatus(doipMessage, result, DoipResponseCode.Success); + } catch (Exception e) { + return replyStringWithStatus(doipMessage, e.getMessage(), DoipResponseCode.MoreThanOneErrors); + } - - digitalObject.attributes.addProperty("verifiedPubKey", doipMessage.credential.getSigner()); - String path = null; - LOGGER.info("create BDO, bCoId:" + digitalObject.attributes.get("bCoId").getAsString()); - if (digitalObject.attributes.has("bCoId")) - path = bcoManager.download(digitalObject.attributes.get("bCoId").getAsString()); - - if (path == null) { - return replyStringWithStatus(doipMessage, - "exception, failed to locate bCoId:" - + digitalObject.attributes.get("bCoId").getAsString(), - DoipResponseCode.Invalid); - } - digitalObject.attributes.addProperty("path", path); - Contract c = new Contract(); - if (digitalObject.attributes.has("contractExecType")) - c.setType(ContractExecType - .valueOf(digitalObject.attributes.get("contractExecType").getAsString())); - else - c.setType(ContractExecType.Sole); - if (digitalObject.attributes.has("shardingId")) - c.setShardingId( - Integer.valueOf(digitalObject.attributes.get("shardingId").getAsString())); - else - c.setShardingId(-1); - c.setScript(path); - c.setOwner(doipMessage.credential.getSigner()); - if (digitalObject.attributes.has("createParam")) { - c.setCreateParam(digitalObject.attributes.get("createParam")); - - } - SM2KeyPair sm2Key; - if (digitalObject.attributes.has("sm2KeyPair")) - sm2Key = SM2KeyPair.fromJson( - digitalObject.attributes.get("sm2KeyPair").getAsJsonObject().toString()); - else - sm2Key = SM2Util.generateSM2KeyPair(); - String contractID = String.valueOf(sm2Key.getPublicKeyStr().hashCode()); - - c.setID(contractID); // contractID是根据hash算出来的 - c.setKey(sm2Key.getPrivateKeyStr()); - c.setPublicKey(sm2Key.getPublicKeyStr()); - if (c.getCreateParam() != null && c.getCreateParam().isJsonObject()) { - c.getCreateParam().getAsJsonObject().addProperty("repoId", - GlobalConf.instance.doaConf.repoDoid + "/" + c.getID()); - } - registerBDOID(contractID); - - String result = CMActions.manager.startContract(c); - // Please note startContractByYPK is invoked in sync mode method. - return replyStringWithStatus(doipMessage, result, DoipResponseCode.Success); } - private void registerBDOID(String contractID) { - // TODO + public String startUsingJsonObject(JsonObject attributes) { + LOGGER.info("create BDO, bCcoId:" + attributes.get("bcoId").getAsString()); + String path = null; + if (attributes.has("bcoId")) + path = bcoManager.download(attributes.get("bcoId").getAsString()); + if (path == null) { + throw new IllegalArgumentException("exception, failed to locate bcoId:" + attributes.get("bcoId").getAsString()); + } + attributes.addProperty("path", path); + Contract c = new Contract(); + if (attributes.has("contractExecType")) + c.setType(ContractExecType.valueOf(attributes.get("contractExecType").getAsString())); + else c.setType(ContractExecType.Sole); + if (attributes.has("shardingId")) + c.setShardingId(Integer.valueOf(attributes.get("shardingId").getAsString())); + else c.setShardingId(-1); + c.setScript(path); + c.setOwner(attributes.get("owner").getAsString()); + if (attributes.has("createParam")) { + c.setCreateParam(attributes.get("createParam")); + + } + SM2KeyPair sm2Key = null; + if (attributes.has("sm2KeyPair")) + sm2Key = SM2KeyPair.fromJson(attributes.get("sm2KeyPair").getAsJsonObject().toString()); + if (sm2Key == null) + CMActions.manager.allocateKeyIfNotExists(c); + else { + c.setKey(sm2Key.getPrivateKeyStr()); + c.setPublicKey(sm2Key.getPublicKeyStr()); + String contractID = String.valueOf(sm2Key.getPublicKeyStr().hashCode()); + c.setID(contractID); // contractID是根据hash算出来的 + } + String result = CMActions.manager.startContract(c); + registerBDOID(c.getID(), c.getPublicKey(), attributes.get("bcoId").getAsString(), result); + return result; + } + + private void registerBDOID(String contractID, String contractPubKey, String bcoId, String startResult) { + try { + + JsonObject startResultJO = JsonParser.parseString(startResult).getAsJsonObject(); + if (!startResultJO.get("status").getAsString().equals("Success")) + return; + int doipPort = 0; + if (startResultJO.has("doipStartPort")) + doipPort = startResultJO.get("doipStartPort").getAsInt(); + if (startResultJO.has("doipListenPort")) + doipPort = startResultJO.get("doipListenPort").getAsInt(); + StateInfoBase base = new StateInfoBase(); + String repoId = GlobalConf.instance.doaConf.repoDoid; + String uri = GlobalConf.instance.doaConf.doipAddress; + int lastPos = uri.lastIndexOf(":"); + base.identifier = repoId + "/" + contractID; + base.handleValues = new JsonObject(); + base.handleValues.addProperty("bdwType", "BDO"); + base.handleValues.addProperty("bcoId", bcoId); + base.handleValues.addProperty("repoId", repoId); + base.handleValues.addProperty("date", System.currentTimeMillis()); + if (doipPort > 0) { + base.handleValues.addProperty("address", uri.substring(0, lastPos + 1) + doipPort); + base.handleValues.addProperty("version", "2.1"); + base.handleValues.addProperty("protocol", "DOIP"); + } + base.handleValues.addProperty("pubKey", contractPubKey); + StateInfoBase oldBase = currentIrpClient.resolve(base.identifier, false); + String registerResult = null; + LOGGER.info("base:" + oldBase == null ? "NULL" : JsonUtil.toPrettyJson(oldBase)); + if (oldBase == null) + registerResult = currentIrpClient.register(base); + else + registerResult = currentIrpClient.reRegister(base); + // LOGGER.info("TORegister:" + new GsonBuilder().setPrettyPrinting().create().toJson(base)); + LOGGER.info(base.identifier + " register result:" + registerResult); + } catch (Exception e) { + e.printStackTrace(); + } + // irp } @Override @@ -166,15 +189,13 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase String id = doipMessage.header.parameters.attributes.get("elementId").getAsString(); id = id.replaceAll(".*/", ""); LOGGER.info("handleDelete:" + id); - // TODO judge whethere the do exists + //TODO judge whethere the do exists ContractMeta meta = CMActions.manager.statusRecorder.getContractMeta(id); if (meta == null) { - return replyStringWithStatus(doipMessage, "can't locate do", - DoipResponseCode.DoNotFound); + return replyStringWithStatus(doipMessage, "can't locate do", DoipResponseCode.DoNotFound); } if (meta.getStatus() == ContractStatusEnum.KILLED) { - return replyStringWithStatus(doipMessage, "already deleted!", - DoipResponseCode.Declined); + return replyStringWithStatus(doipMessage, "already deleted!", DoipResponseCode.Declined); } DoipMessage[] content = new DoipMessage[1]; JsonObject jo = new JsonObject(); @@ -185,31 +206,38 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase @Override public DoipMessage handleRetrieve(DoipMessage doipMessage) { + if (doipMessage.header.parameters.id.equals(GlobalConf.instance.doaConf.repoDoid)) { + if (doipMessage.header.parameters.attributes == null || !doipMessage.header.parameters.attributes.has("element")) + return retrieveList(doipMessage); + else + return retrieveBDO(doipMessage, doipMessage.header.parameters.attributes.get("element").getAsString()); + } else return replyStringWithStatus(doipMessage, "no such do", DoipResponseCode.Declined); + + } + + private DoipMessage retrieveBDO(DoipMessage doipMessage, String idOrName) { ContractClient client = null; try { - client = CMActions.manager.getContractClientByDoi(doipMessage.header.parameters.id); + client = CMActions.manager.getContractClientByDoi(idOrName); } catch (Exception e) { } if (client == null) { - String doid = doipMessage.header.parameters.id; + String doid = idOrName; int off = doid.lastIndexOf("/"); - if (off > 0) - doid = doid.substring(off + 1); + if (off > 0) doid = doid.substring(off + 1); client = CMActions.manager.getContractClientByDoi(doid); } if (client == null) { - return replyStringWithStatus(doipMessage, "Contract instance not exist!", - DoipResponseCode.DoNotFound); + return replyStringWithStatus(doipMessage, "BDO instance not exist!", DoipResponseCode.DoNotFound); } byte[] data = doipMessage.body.getEncodedData(); - if (data == null || data.length == 0) { - DigitalObject contractDO = contract2DigitalObject(client); - return replyDO(doipMessage, contractDO); + JsonObject contractDO = contract2DigitalObject(client); + return replyString(doipMessage, contractDO.toString()); } else { JsonObject jo = JsonUtil.parseStringAsJsonObject(new String(data)); List result = new ArrayList<>(); - jo.addProperty("contractID", client.contractMeta.getID()); + jo.addProperty("bdoSuffix", client.contractMeta.getID()); CMActions.executeContractInternal(jo, new ResultCallback() { @Override public void onResult(JsonObject str) { @@ -236,8 +264,7 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase result.add(new JsonPrimitive("Timeout!")); retStatus = DoipResponseCode.MoreThanOneErrors; } - DigitalObject digitalObject = - new DigitalObject(doipMessage.header.parameters.id, DoType.DO); + DigitalObject digitalObject = new DigitalObject(doipMessage.header.parameters.id, DoType.DO); digitalObject.addAttribute("status", retStatus.getName()); digitalObject.addAttribute("result", result.get(0)); @@ -245,50 +272,62 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase } } - private DigitalObject contract2DigitalObject(ContractClient contractClient) { - DigitalObject contractDO = new DigitalObject(contractClient.getContractID(), DoType.DO); - contractDO.addAttribute("contractName", contractClient.getContractName()); - // contractDO.addAttribute("script",contract.contract.getScriptStr()); - contractDO.addAttribute("owner", contractClient.contractMeta.contract.getOwner()); + private DoipMessage retrieveList(DoipMessage message) { + JsonArray listDO = new JsonArray(); + for (String key : CMActions.manager.statusRecorder.getStatus().keySet()) { + ContractClient contractClient = CMActions.manager.getContractClientByDoi(key); + if (contractClient != null) { + JsonObject ele = new JsonObject(); + ele.addProperty("suffix", contractClient.getContractID()); + ele.addProperty("bdoName", contractClient.contractMeta.getName()); + ele.addProperty("status", contractClient.contractMeta.getStatus().toString()); + listDO.add(ele); + } + } + return replyString(message, listDO.toString()); + } + + private JsonObject contract2DigitalObject(ContractClient contractClient) { + JsonObject contractDO = new JsonObject(); + contractDO.addProperty("suffix", contractClient.getContractID()); + contractDO.addProperty("bdoName", contractClient.getContractName()); + contractDO.addProperty("owner", contractClient.contractMeta.contract.getOwner()); + JsonArray operations = new JsonArray(); + contractDO.add("operations", operations); for (FunctionDesp f : contractClient.getExportedFunctions()) { - Element fe = new Element(f.functionName, "function"); - fe.setAttribute("annotation", JsonUtil.toJson(f.annotations)); - contractDO.addElements(fe); + JsonObject jo = new JsonObject(); + jo.addProperty("opeationName", f.functionName); + jo.add("annotation", JsonUtil.parseObject(f.annotations)); + operations.add(jo); } return contractDO; } @Op(op = BasicOperations.Extension, name = "call") public DoipMessage handleCall(DoipMessage doipMessage) { - ContractClient cc = - CMActions.manager.getContractClientByDoi(doipMessage.header.parameters.id); + ContractClient cc = CMActions.manager.getContractClientByDoi(doipMessage.header.parameters.id); if (cc == null) - return replyStringWithStatus(doipMessage, "Contract instance not exist!", - DoipResponseCode.DoNotFound); + return replyStringWithStatus(doipMessage, "Contract instance not exist!", DoipResponseCode.DoNotFound); // todo transform doipMessage to args JsonObject args = doipMessage.header.parameters.attributes; ContractRequest cr = new ContractRequest(); cr.setContractID(cc.getContractID()); - if (args.has("withDynamicAnalysis")) - cr.withDynamicAnalysis = args.get("withDynamicAnalysis").getAsBoolean(); + if (args.has("withDynamicAnalysis")) cr.withDynamicAnalysis = args.get("withDynamicAnalysis").getAsBoolean(); if (args.has("withEvaluatesAnalysis")) cr.withEvaluatesAnalysis = args.get("withEvaluatesAnalysis").getAsBoolean(); if (args.get("elementID") == null) - return replyStringWithStatus(doipMessage, "missing elementID", - DoipResponseCode.Invalid); + return replyStringWithStatus(doipMessage, "missing elementID", DoipResponseCode.Invalid); cr.setAction(args.get("elementID").getAsString()); - if (doipMessage.body.getEncodedData() != null) - cr.setArg(new String(doipMessage.body.getEncodedData())); + if (doipMessage.body.getEncodedData() != null) cr.setArg(new String(doipMessage.body.getEncodedData())); if (doipMessage.credential != null && doipMessage.credential.getSigner() != null) cr.setRequesterDOI(doipMessage.credential.getSigner()); String reqID; - if (args.has("requestID")) - reqID = args.get("requestID").getAsString(); + if (args.has("requestID")) reqID = args.get("requestID").getAsString(); else { reqID = System.currentTimeMillis() + "_" + (int) (Math.random() * 1000); args.addProperty("requestID", reqID); @@ -297,8 +336,8 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase String resp = CMActions.manager.execute(cr, null); - // StringContainer sc = new StringContainer(); - // SyncContainer sync = new SyncContainer(sc); + // StringContainer sc = new StringContainer(); + // SyncContainer sync = new SyncContainer(sc); return replyString(doipMessage, resp); } @@ -315,25 +354,22 @@ public class ContractRepositoryHandler extends RepositoryHandlerBase } @Override - public void injectListOps(DoipMessage doipMessage, - DoipMessageFactory.DoipMessageBuilder builder) { + public void injectListOps(DoipMessage doipMessage, DoipMessageFactory.DoipMessageBuilder builder) { builder.setDoipMessage(handleListOps(doipMessage)); } @Override public void injectUpdate(DoipMessage request, DoipMessageFactory.DoipMessageBuilder builder) { - // use default behavior + // use default behavior } @Override - public void injectRetrieve(DoipMessage doipMessage, - DoipMessageFactory.DoipMessageBuilder builder) { + public void injectRetrieve(DoipMessage doipMessage, DoipMessageFactory.DoipMessageBuilder builder) { builder.setDoipMessage(handleRetrieve(doipMessage)); } @Override - public void injectDelete(DoipMessage doipMessage, - DoipMessageFactory.DoipMessageBuilder builder) { + public void injectDelete(DoipMessage doipMessage, DoipMessageFactory.DoipMessageBuilder builder) { builder.setDoipMessage(handleDelete(doipMessage)); } } diff --git a/src/main/java/org/bdware/server/doip/ContractRepositoryMain.java b/src/main/java/org/bdware/server/doip/ContractRepositoryMain.java index 2cccdd6..fccdfc4 100644 --- a/src/main/java/org/bdware/server/doip/ContractRepositoryMain.java +++ b/src/main/java/org/bdware/server/doip/ContractRepositoryMain.java @@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandlerContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bdware.doip.audit.EndpointConfig; +import org.bdware.doip.audit.client.AuditIrpClient; import org.bdware.doip.audit.server.AuditDoipServer; import org.bdware.doip.audit.writer.AuditType; import org.bdware.doip.codec.doipMessage.DoipMessage; @@ -27,6 +28,8 @@ public class ContractRepositoryMain { static AuditDoipServer currentServer; static LocalDoipFrowarder forwarder; static final String repoType = "BDRepo"; + public static AuditIrpClient currentIrpClient; + public static ContractRepositoryHandler currentHandler; public static void start() { try { @@ -34,8 +37,7 @@ public class ContractRepositoryMain { String url = GlobalConf.instance.doaConf.doipAddress; forwarder = new LocalDoipFrowarder(); if (url == null || GlobalConf.instance.doaConf.repoDoid.isEmpty()) { - LOGGER.warn("missing args, failed to start! url:" + url + " doid:" - + GlobalConf.instance.doaConf.repoDoid); + LOGGER.warn("missing args, failed to start! url:" + url + " doid:" + GlobalConf.instance.doaConf.repoDoid); return; } if (currentServer != null) { @@ -43,32 +45,30 @@ public class ContractRepositoryMain { } List infos = new ArrayList<>(); infos.add(new DoipListenerConfig(url, "2.1")); - DoipServiceInfo info = new DoipServiceInfo(GlobalConf.instance.doaConf.repoDoid, - GlobalConf.instance.keyPair.getPublicKeyStr(), repoType, infos); + DoipServiceInfo info = new DoipServiceInfo(GlobalConf.instance.doaConf.repoDoid, GlobalConf.instance.keyPair.getPublicKeyStr(), repoType, infos); EndpointConfig config = new EndpointConfig(); config.publicKey = GlobalConf.instance.keyPair.getPublicKeyStr(); config.privateKey = GlobalConf.instance.keyPair.getPrivateKeyStr(); config.auditType = AuditType.None; config.routerURI = GlobalConf.instance.doaConf.lhsAddress; config.repoName = GlobalConf.instance.doaConf.repoName; + currentIrpClient = new AuditIrpClient(config); currentServer = new AuditDoipServer(config, info); - currentServer.setRepositoryHandler(new ContractRepositoryHandler(info)); + currentHandler = new ContractRepositoryHandler(info); + currentServer.setRepositoryHandler(currentHandler); DoipRequestHandler requestCallback = currentServer.getRequestCallback(); SM2Signer signer = new SM2Signer(SM2KeyPair.fromJson(new Gson().toJson(config))); DelegateDoipHandler delegateHandler = new DelegateDoipHandler(requestCallback) { @Override - protected DoipMessage delegateMessage(ChannelHandlerContext context, - DoipMessage message) { - DoipMessageFactory.DoipMessageBuilder builder = - new DoipMessageFactory.DoipMessageBuilder(); + protected DoipMessage delegateMessage(ChannelHandlerContext context, DoipMessage message) { + DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder(); builder.createResponse(DoipResponseCode.DelegateRequired, message); String id = message.header.parameters.id; id = id.replaceAll(".*/", ""); ContractMeta meta = CMActions.manager.statusRecorder.getContractMeta(id); if (enableDelegate(meta)) { - LOGGER.info("delegate:" + message.requestID); - - // if port is near cmhttp server port + LOGGER.info("delegate:" + message.requestID + " --> doipPort:" + meta.contract.getDoipPort()); + //if port is near cmhttp server port builder.addAttributes("port", meta.contract.getDoipPort()); DoipMessage ret; ret = builder.create(); @@ -77,7 +77,7 @@ public class ContractRepositoryMain { } return ret; } else { - LOGGER.info("forward:" + message.requestID); + LOGGER.info("forward:" + message.requestID + " --> doipPort:" + meta.contract.getDoipPort()); return forwarder.forward(meta, message); } @@ -105,6 +105,7 @@ public class ContractRepositoryMain { private static boolean enableDelegate(ContractMeta meta) { int port = meta.contract.getDoipPort(); + int delta = Integer.valueOf(GlobalConf.instance.ipPort.split(":")[1]) - port; return Math.abs(delta) < 200; } diff --git a/src/main/java/org/bdware/server/nodecenter/client/NodeCenterClientController.java b/src/main/java/org/bdware/server/nodecenter/client/NodeCenterClientController.java index bda517a..53c2c5f 100644 --- a/src/main/java/org/bdware/server/nodecenter/client/NodeCenterClientController.java +++ b/src/main/java/org/bdware/server/nodecenter/client/NodeCenterClientController.java @@ -43,7 +43,7 @@ public class NodeCenterClientController implements NodeCenterConn { private static boolean startCheck = false; private final NetNeighbors neighbors; public Map distributeReqMap = new ConcurrentHashMap<>(); - // public NodeCenterClientController cmClientController; + // public NodeCenterClientController cmClientController; String nodeID; NodeCenterClientHandler handler; // 合约contractID,master的公钥 @@ -123,8 +123,11 @@ public class NodeCenterClientController implements NodeCenterConn { setNodeID.put("id", keyPair.getPublicKeyStr()); String signature = "no signature"; try { - byte[] sig = SM2Util.sign(keyPair.getPrivateKeyParameter(), - (keyPair.getPublicKeyStr() + json.get("session").getAsString()).getBytes()); + byte[] sig = + SM2Util.sign( + keyPair.getPrivateKeyParameter(), + (keyPair.getPublicKeyStr() + json.get("session").getAsString()) + .getBytes()); signature = ByteUtils.toHexString(sig); } catch (Exception e) { e.printStackTrace(); @@ -133,7 +136,8 @@ public class NodeCenterClientController implements NodeCenterConn { setNodeID.put("nodeName", GlobalConf.instance.name); setNodeID.put("peerID", GlobalConf.instance.peerID); setNodeID.put("ipPort", GlobalConf.instance.ipPort); - setNodeID.put("masterAddress", GlobalConf.instance.masterAddress); + setNodeID.put("masterAddress", GlobalConf.instance.ipPort); + // setNodeID.put("masterAddress", GlobalConf.instance.masterAddress); sendMsg(JsonUtil.toJson(setNodeID)); } @@ -145,8 +149,8 @@ public class NodeCenterClientController implements NodeCenterConn { @Action public void syncPong(JsonObject json, ResultCallback resultCallback) { - sync.wakeUp(json.get("requestID").getAsString(), - "{\"status\":\"Success\",\"result\":\"a\"}"); + sync.wakeUp( + json.get("requestID").getAsString(), "{\"status\":\"Success\",\"result\":\"a\"}"); } public boolean syncPing() { @@ -169,9 +173,12 @@ public class NodeCenterClientController implements NodeCenterConn { } public void listCMInfo() { - sendMsg("{\"action\":\"listCMInfo\",\"pubKey\":\"" - + KeyValueDBUtil.instance.getValue(CMTables.ConfigDB.toString(), "pubKey") - + "\",\"requestID\":\"" + System.currentTimeMillis() + "\"}"); + sendMsg( + "{\"action\":\"listCMInfo\",\"pubKey\":\"" + + KeyValueDBUtil.instance.getValue(CMTables.ConfigDB.toString(), "pubKey") + + "\",\"requestID\":\"" + + System.currentTimeMillis() + + "\"}"); } @Action @@ -223,8 +230,7 @@ public class NodeCenterClientController implements NodeCenterConn { @Action(async = true) public void publishEventFromCenter(JsonObject jo, ResultCallback rcb) { if (jo.has("event")) { - CMActions.manager - .deliverEvent(JsonUtil.fromJson(jo.get("event").getAsString(), REvent.class)); + CMActions.manager.deliverEvent(JsonUtil.fromJson(jo.get("event").getAsString(), REvent.class)); } } @@ -251,7 +257,7 @@ public class NodeCenterClientController implements NodeCenterConn { InputStream in = zipFile.getInputStream(zipEntry); ByteArrayOutputStream bo = new ByteArrayOutputStream(); byte[] buff = new byte[1024]; - for (int k; (k = in.read(buff)) > 0;) { + for (int k; (k = in.read(buff)) > 0; ) { bo.write(buff, 0, k); } resp.addProperty("readmeStr", bo.toString()); @@ -272,18 +278,17 @@ public class NodeCenterClientController implements NodeCenterConn { String requestID = jo.get("requestID").getAsString(); String requesterNodeID = jo.get("requesterNodeID").getAsString(); String crStr = jo.get("contractRequest").getAsString(); - CMActions.manager.executeLocallyAsync(JsonUtil.fromJson(crStr, ContractRequest.class), - new ResultCallback() { - @Override - public void onResult(String str) { - JsonObject ret = new JsonObject(); - ret.addProperty("action", "onReceiveContractExecution"); - ret.addProperty("requestID", requestID); - ret.addProperty("requesterNodeID", requesterNodeID); - ret.addProperty("contractResult", str); - sendMsg(JsonUtil.toJson(ret)); - } - }, null); + CMActions.manager.executeLocallyAsync(JsonUtil.fromJson(crStr, ContractRequest.class), new ResultCallback() { + @Override + public void onResult(String str) { + JsonObject ret = new JsonObject(); + ret.addProperty("action", "onReceiveContractExecution"); + ret.addProperty("requestID", requestID); + ret.addProperty("requesterNodeID", requesterNodeID); + ret.addProperty("contractResult", str); + sendMsg(JsonUtil.toJson(ret)); + } + }, null); } @Action(async = true) @@ -353,15 +358,15 @@ public class NodeCenterClientController implements NodeCenterConn { String requestID = System.currentTimeMillis() + "_" + (int) (Math.random() * 100000); req.put("requestID", requestID); sendMsg(JsonUtil.toJson(req)); - // TODO use async instead? + //TODO use async instead? ContractResult cr = sync.syncSleep(requestID); LOGGER.debug("result: " + JsonUtil.toJson(cr)); LOGGER.info("node " + pubKey + " succeed!"); if (!cr.result.equals(JsonNull.INSTANCE)) { try { JsonObject jo = cr.result.getAsJsonObject(); - NetworkManager.instance.updateAgentRouter(jo.get("pubKey").getAsString(), - jo.get("masterAddress").getAsString()); + NetworkManager.instance.updateAgentRouter( + jo.get("pubKey").getAsString(), jo.get("masterAddress").getAsString()); NetworkManager.instance.connectToAgent(jo.get("pubKey").getAsString(), null); return "success"; } catch (Exception e) { @@ -385,17 +390,18 @@ public class NodeCenterClientController implements NodeCenterConn { if (!cr.result.equals(JsonNull.INSTANCE)) { try { JsonObject jo = cr.result.getAsJsonObject(); - NetworkManager.instance.updateAgentRouter(jo.get("pubKey").getAsString(), - jo.get("masterAddress").getAsString()); + NetworkManager.instance.updateAgentRouter( + jo.get("pubKey").getAsString(), jo.get("masterAddress").getAsString()); NetworkManager.instance.connectToAgent(jo.get("pubKey").getAsString(), null); - LOGGER.info(String.format("the master of contract %s: pubKey=%s address=%s", - contractID, jo.get("pubKey").getAsString(), - jo.get("masterAddress").getAsString())); + LOGGER.info( + String.format("the master of contract %s: pubKey=%s address=%s", + contractID, + jo.get("pubKey").getAsString(), + jo.get("masterAddress").getAsString())); contractID2PubKey.put(contractID, jo.get("pubKey").getAsString()); return jo.get("pubKey").getAsString(); } catch (Exception e) { - LOGGER.warn( - "the master of contract " + contractID + " is null! " + e.getMessage()); + LOGGER.warn("the master of contract " + contractID + " is null! " + e.getMessage()); } } } catch (Exception e) { @@ -414,8 +420,8 @@ public class NodeCenterClientController implements NodeCenterConn { return; } startCheck = true; - for (MultiContractMeta meta : CMActions.manager.multiContractRecorder.getStatus() - .values()) { + for (MultiContractMeta meta : + CMActions.manager.multiContractRecorder.getStatus().values()) { String contractID = meta.getContractID(); LOGGER.info("check master of contract " + contractID); ContractMeta cmeta = CMActions.manager.statusRecorder.getContractMeta(meta.getID()); @@ -429,21 +435,20 @@ public class NodeCenterClientController implements NodeCenterConn { // 该合约可能在这个节点崩溃期间已经被终止,不存在了,这个节点不用恢复这个合约了,直接从数据库中删除 LOGGER.info("该合约在集群已经不存在!"); KeyValueDBUtil.instance.delete(CMTables.UnitContracts.toString(), contractID); - if (KeyValueDBUtil.instance.containsKey(CMTables.CheckPointLastHash.toString(), - contractID)) { - KeyValueDBUtil.instance.delete(CMTables.CheckPointLastHash.toString(), - contractID); + if (KeyValueDBUtil.instance.containsKey( + CMTables.CheckPointLastHash.toString(), contractID)) { + KeyValueDBUtil.instance.delete( + CMTables.CheckPointLastHash.toString(), contractID); } - if (KeyValueDBUtil.instance.containsKey(CMTables.LastExeSeq.toString(), - contractID)) { + if (KeyValueDBUtil.instance.containsKey( + CMTables.LastExeSeq.toString(), contractID)) { KeyValueDBUtil.instance.delete(CMTables.LastExeSeq.toString(), contractID); } continue; } MasterClientRecoverMechAction.recoverSet.add(contractID); - LOGGER.info("queryUnitContractsID master为" + master.substring(0, 5) + " -> 合约id:" - + contractID); + LOGGER.info("queryUnitContractsID master为" + master.substring(0, 5) + " -> 合约id:" + contractID); RecoverMechTimeRecorder.queryMasterFinish = System.currentTimeMillis(); queryUnitContractsID2(contractID, master); } @@ -484,7 +489,9 @@ public class NodeCenterClientController implements NodeCenterConn { @Action(async = true) public void requestLog(JsonObject json, ResultCallback rc) { - if (!json.has("requestID") || !json.has("contractID") || !json.has("offset") + if (!json.has("requestID") + || !json.has("contractID") + || !json.has("offset") || !json.has("count")) { LOGGER.debug( "[CMClientController] missing arguments, requestID / contractID / offset / count"); @@ -560,7 +567,7 @@ public class NodeCenterClientController implements NodeCenterConn { long total = tempZip.length(); LOGGER.debug("temp length = " + total); long count = 0; - for (int len; (len = (fin.read(buff))) > 0;) { + for (int len; (len = (fin.read(buff))) > 0; ) { LOGGER.debug("read len = " + len); req.put("data", ByteUtil.encodeBASE64(buff, len)); count += len; @@ -624,8 +631,8 @@ public class NodeCenterClientController implements NodeCenterConn { MasterElectTimeRecorder.slaveConnectFinish = System.currentTimeMillis(); // 开启master恢复 - MasterServerRecoverMechAction.newMasterRecover(contractID, - json.get("members").getAsString(), onlineMembers); + MasterServerRecoverMechAction.newMasterRecover( + contractID, json.get("members").getAsString(), onlineMembers); } private boolean waitForConnection(List nodeNames) { @@ -645,8 +652,7 @@ public class NodeCenterClientController implements NodeCenterConn { e.printStackTrace(); } } - } else - return true; + } else return true; } return false; } @@ -662,8 +668,7 @@ public class NodeCenterClientController implements NodeCenterConn { String distributeID = null; if (json.has("distributeID")) distributeID = json.get("distributeID").getAsString(); - else - distributeID = json.get("responseID").getAsString(); + else distributeID = json.get("responseID").getAsString(); ResultCallback to = distributeReqMap.get(distributeID); distributeReqMap.remove(distributeID); to.onResult(json.get("content").getAsString()); @@ -715,11 +720,13 @@ public class NodeCenterClientController implements NodeCenterConn { public void NCStartElect(JsonObject jo, ResultCallback result) { String conID = jo.get("contractID").getAsString(); String uniNumber = null; - if (jo.has("nuiNumber")) - uniNumber = jo.get("nuiNumber").getAsString(); + if (jo.has("nuiNumber")) uniNumber = jo.get("nuiNumber").getAsString(); ContractClient cc = CMActions.manager.getClient(conID); - LOGGER.info("[CMClientController] NCStartElect : contractID=" + conID + " client==null:" - + (null == cc)); + LOGGER.info( + "[CMClientController] NCStartElect : contractID=" + + conID + + " client==null:" + + (null == cc)); // 不是自己本地的合约 if (null == cc) { @@ -766,7 +773,7 @@ public class NodeCenterClientController implements NodeCenterConn { } public void run() { - for (;;) { + for (; ; ) { if (receiveQueue.size() > 0) { try { JsonObject jo = receiveQueue.poll(); @@ -793,12 +800,11 @@ public class NodeCenterClientController implements NodeCenterConn { boolean isAppend = args.get("isAppend").getAsBoolean(); boolean isDone = args.get("isDone").getAsBoolean(); boolean isPrivate = args.get("isPrivate").getAsBoolean(); - LOGGER.debug(String.format("isAppend=%b isDone=%b isPrivate=%b", isAppend, isDone, - isPrivate)); + LOGGER.debug( + String.format("isAppend=%b isDone=%b isPrivate=%b", isAppend, isDone, isPrivate)); String path = GlobalConf.instance.publicCompiledDir; if (isPrivate && args.has("pubKey")) { - path = GlobalConf.instance.privateCompiledDir + "/" - + args.get("pubKey").getAsString(); + path = GlobalConf.instance.privateCompiledDir + "/" + args.get("pubKey").getAsString(); } File dir = new File(path); if (!dir.exists()) { diff --git a/src/main/java/org/bdware/units/NetworkManager.java b/src/main/java/org/bdware/units/NetworkManager.java index 266d48a..c483211 100644 --- a/src/main/java/org/bdware/units/NetworkManager.java +++ b/src/main/java/org/bdware/units/NetworkManager.java @@ -41,11 +41,10 @@ import java.util.concurrent.TimeUnit; * @author OliveDS (Shuang Deng) */ public class NetworkManager { - // Manage server->client connection; + //Manage server->client connection; public static final Map CONNECTORS = new ConcurrentHashMap<>(); - // Manage client->server connection; - public static final Map SERVER_CONNECTORS = - new ConcurrentHashMap<>(); + //Manage client->server connection; + public static final Map SERVER_CONNECTORS = new ConcurrentHashMap<>(); public static final String NODE_CENTER_CLIENT = "NODE_CENTER_CLIENT"; public static final String P2P_GRPC_CLIENT = "P2P_GRPC_CLIENT"; private static final Map slaverRouter = new HashMap<>(); @@ -60,13 +59,18 @@ public class NetworkManager { } public static void reconnectAgent(String master) { - LOGGER.debug(String.format("master=%s\t%s", master, JsonUtil.toJson(slaverRouter))); + LOGGER.debug( + String.format("master=%s\t%s", + master, + JsonUtil.toJson(slaverRouter))); try { NetworkManager.AgentConnector conn; synchronized (conn = NetworkManager.CONNECTORS.get(master)) { if (!conn.handler.isOpen()) { String[] ipAndPort = slaverRouter.get(master).split(":"); - conn.bootstrap.connect(ipAndPort[0], Integer.parseInt(ipAndPort[1])).sync() + conn.bootstrap + .connect(ipAndPort[0], Integer.parseInt(ipAndPort[1])) + .sync() .channel(); } } @@ -90,36 +94,46 @@ public class NetworkManager { nodeCenterClientHandler = ControllerManager.createNodeCenterClientHandler(); EventLoopGroup group = new NioEventLoopGroup(); b.group(group); - b.channel(NioSocketChannel.class).handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ChannelPipeline p = ch.pipeline(); - p.addLast(new DelimiterCodec()).addLast(nodeCenterClientHandler); - } - }); - ContractManager.scheduledThreadPool.scheduleWithFixedDelay(() -> { - try { - // manager.clearCache(); - String URL = GlobalConf.getNodeCenterUrl(); - // LOGGER.debug("GlobalConf.getNodeCenterUrl() -> URL=" + URL); - URI uri = null; - try { - uri = new URI(URL); - } catch (URISyntaxException e) { - LOGGER.error("creating uri failed! " + e.getMessage()); - } - if (!nodeCenterClientHandler.isConnected() - || !ControllerManager.getNodeCenterController().syncPing()) { - nodeCenterClientHandler.close(); - assert null != uri; - b.connect(uri.getHost(), uri.getPort()).sync().channel(); - LOGGER.info("connect to node center: " + uri.getHost() + ":" + uri.getPort()); - } - } catch (Exception e) { - // e.printStackTrace(); - LOGGER.warn("connecting to node center failed! " + e.getMessage()); - } - }, 0, 30 + (int) (20 * Math.random()), TimeUnit.SECONDS); + b.channel(NioSocketChannel.class) + .handler( + new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + p.addLast(new DelimiterCodec()).addLast(nodeCenterClientHandler); + } + }); + ContractManager.scheduledThreadPool.scheduleWithFixedDelay( + () -> { + try { + // manager.clearCache(); + String URL = GlobalConf.getNodeCenterUrl(); +// LOGGER.debug("GlobalConf.getNodeCenterUrl() -> URL=" + URL); + URI uri = null; + try { + uri = new URI(URL); + } catch (URISyntaxException e) { + LOGGER.error("creating uri failed! " + e.getMessage()); + } + if (!nodeCenterClientHandler.isConnected() + || !ControllerManager.getNodeCenterController().syncPing()) { + nodeCenterClientHandler.close(); + assert null != uri; + b.connect(uri.getHost(), uri.getPort()).sync().channel(); + LOGGER.info( + "connect to node center: " + + uri.getHost() + + ":" + + uri.getPort()); + } + } catch (Exception e) { +// e.printStackTrace(); + LOGGER.warn("connecting to node center failed! " + e.getMessage()); + } + }, + 4, + 30 + (int) (20 * Math.random()), + TimeUnit.SECONDS); } @@ -128,16 +142,20 @@ public class NetworkManager { ServerBootstrap b = new ServerBootstrap(); EventLoopGroup bossGroup = new NioEventLoopGroup(1); b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); - b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) - .option(ChannelOption.SO_BACKLOG, 100).localAddress(port) + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 100) + .localAddress(port) .childOption(ChannelOption.SO_KEEPALIVE, true) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel arg0) { - arg0.pipeline().addLast(new DelimiterCodec()) - .addLast(new TCPServerFrameHandler()); - } - }); + .childHandler( + new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel arg0) { + arg0.pipeline() + .addLast(new DelimiterCodec()) + .addLast(new TCPServerFrameHandler()); + } + }); b.bind(port).sync().channel(); } catch (InterruptedException e) { @@ -146,7 +164,7 @@ public class NetworkManager { } - // TODO Remove in future + //TODO Remove in future public void sendToNodeCenter(String msg) { nodeCenterClientHandler.sendMsg(msg); } @@ -156,8 +174,9 @@ public class NetworkManager { } public void waitForNodeCenterConnected() { - for (int i = 0; i < 10 && null != nodeCenterClientHandler - && !nodeCenterClientHandler.isConnected(); i++) { + for (int i = 0; + i < 10 && null != nodeCenterClientHandler && !nodeCenterClientHandler.isConnected(); + i++) { try { Thread.sleep(200); } catch (InterruptedException e) { @@ -172,7 +191,7 @@ public class NetworkManager { } } - // ----------AgentNetworkManagement + //----------AgentNetworkManagement public void updateAgentRouter(String nodeID, String address) { @@ -214,13 +233,15 @@ public class NetworkManager { connector.handler = handler; b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); b.group(CMHttpServer.workerGroup); - b.channel(NioSocketChannel.class).handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ChannelPipeline p = ch.pipeline(); - p.addLast(new DelimiterCodec()).addLast(handler); - } - }); + b.channel(NioSocketChannel.class) + .handler( + new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + p.addLast(new DelimiterCodec()).addLast(handler); + } + }); } reconnectAgent(master); } @@ -271,8 +292,8 @@ public class NetworkManager { return CONNECTORS.containsKey(pubKey); } - // -------UNUSED TOMerge------------ - // UNUSED + //-------UNUSED TOMerge------------ + //UNUSED public TCPClientFrameHandler createTCPClient(String peer, String ipPort) throws InterruptedException { if (peer.equals(GlobalConf.instance.peerID)) { @@ -285,28 +306,30 @@ public class NetworkManager { NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap b = new Bootstrap(); final TCPClientFrameHandler handler = new TCPClientFrameHandler(peer); - // tcpClientMap.put(peer, handler); - b.group(group).channel(NioSocketChannel.class) + //tcpClientMap.put(peer, handler); + b.group(group) + .channel(NioSocketChannel.class) .remoteAddress(new InetSocketAddress(host, port)) .option(ChannelOption.TCP_NODELAY, true) - .handler(new ChannelInitializer() { - @Override - public void initChannel(SocketChannel ch) throws Exception { - ch.pipeline() - // .addLast(new - // IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)) - .addLast(new DelimiterCodec()) - .addLast(new IdleStateHandler(0, 5, 0)) - // .addLast(new - // HeartBeatEncode()) - .addLast(handler); - } - }); + .handler( + new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline() + // .addLast(new + // IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)) + .addLast(new DelimiterCodec()) + .addLast(new IdleStateHandler(0, 5, 0)) + // .addLast(new + // HeartBeatEncode()) + .addLast(handler); + } + }); ChannelFuture f = b.connect().sync(); if (f.isSuccess()) { LOGGER.info("TCP Client " + peer + " started"); } - // channel = (SocketChannel) future.channel(); + // channel = (SocketChannel) future.channel(); return handler; } @@ -329,14 +352,14 @@ public class NetworkManager { } /** - * UNUSED send to TCP nodes, if fail send by p2p + * UNUSED send to TCP nodes, if fail send by p2p * * @param msg unit message */ public void send(UnitMessage msg) { Iterator iterator = msg.getReceiverList().iterator(); String peer; - // boolean sendByP2P = false; + // boolean sendByP2P = false; TCPClientFrameHandler tcpClientFrameHandler; while (iterator.hasNext()) { peer = iterator.next(); @@ -345,16 +368,17 @@ public class NetworkManager { LOGGER.info("send msg to itself " + msg); continue; } - // tcpClientFrameHandler = NetworkManager.instance.tcpClientMap.getOrDefault(peer, - // null); + // tcpClientFrameHandler = NetworkManager.instance.tcpClientMap.getOrDefault(peer, null); if (peerID2TCPAddress.containsKey(peer)) { - // recreateTCPClient(peer); - // instance.tcpClientMap.put(peer, tcpClientFrameHandler); - UnitMessage unitMessage = msg.toBuilder().clearReceiver().addReceiver(peer).build(); + //recreateTCPClient(peer); + // instance.tcpClientMap.put(peer, tcpClientFrameHandler); + UnitMessage unitMessage = + msg.toBuilder().clearReceiver().addReceiver(peer).build(); LOGGER.info("send msg by p2p to " + peer); JavaContractServiceGrpcServer.sendMsg(unitMessage); } else { - UnitMessage unitMessage = msg.toBuilder().clearReceiver().addReceiver(peer).build(); + UnitMessage unitMessage = + msg.toBuilder().clearReceiver().addReceiver(peer).build(); LOGGER.info("send msg by p2p to " + peer); JavaContractServiceGrpcServer.sendMsg(unitMessage); } diff --git a/src/test/java/org/bdware/server/ByteTest.java b/src/test/java/org/bdware/server/ByteTest.java index 5bd5e2c..db4bd3d 100644 --- a/src/test/java/org/bdware/server/ByteTest.java +++ b/src/test/java/org/bdware/server/ByteTest.java @@ -14,4 +14,11 @@ public class ByteTest { String b64 = ByteUtil.encodeBASE64(ByteUtils.fromHexString(hexStr)); System.out.println(URLEncoder.encode(b64)); } + + @Test + public void strReplace() { + String path = "/aba/dad/./adfa.zip"; + path = path.replaceAll("/\\./", "/"); + System.out.println(path); + } }