All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bdware.ypkdeploy.HTTPTool Maven / Gradle / Ivy

The newest version!
package org.bdware.ypkdeploy;

import com.google.gson.*;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.bdware.client.ResultCallback;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.zz.gmhelper.SM2KeyPair;
import org.zz.gmhelper.SM2Util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class HTTPTool {
    final static String TAG = "[HTTPTool] ";

    static class DeployConfig {
        public boolean asDebug;
        String agentAddress;
        // common config
        JsonElement createParam;
        String killBeforeStart;
        String privateKey;
        String publicKey;
        String ypkPath;
        int remoteDebugPort;
        int chunkSize;
    }

    public static void deployWithYpk(String deployConfigPath, String ypkPath) {
        DeployConfig config = null;
        try {
            config = new Gson().fromJson(new FileReader(deployConfigPath), DeployConfig.class);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(TAG + " parse config failed!");
        }
        config.ypkPath = ypkPath;
        deployUseHttp(config);
        restart(config);
    }

    public static void deploy(String path) {
        DeployConfig config = null;
        File f = new File(path);
        try {
            if (f.isDirectory()) {
                File[] files = f.listFiles((f2) -> f2.getName().endsWith(".json"));
                if (files != null) for (File file : files)
                    deploy(file.getAbsolutePath());
                return;
            } else {
                config = new Gson().fromJson(new FileReader(path), DeployConfig.class);
                deployUseHttp(config);
                restart(config);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(TAG + " parse config failed!");
        }

    }

    private static void restart(DeployConfig config) {
        SM2KeyPair keyPair = SM2KeyPair.fromJson(new Gson().toJson(config));
        SmartContractClientExt ext = new SmartContractClientExt(String.format("ws://%s/SCIDE/SCExecutor", config.agentAddress), keyPair);
        ext.waitForConnect();
        ext.login();
        for (; !ext.isLoggedIn; )
            Thread.yield();
        AtomicInteger counter = new AtomicInteger(0);
        try {
            if (config.killBeforeStart != null) ext.kill(config.killBeforeStart, new ResultCallback() {
                @Override
                public void onResult(JsonObject r) {
                    System.out.println(TAG + r);
                    counter.incrementAndGet();
                }
            });
            for (; counter.get() == 0; )
                Thread.yield();
            ;
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
        File f = new File(config.ypkPath);
        List fileNames = new ArrayList<>();
        String contractName = f.getName().replaceAll(".zip", "").replaceAll(".ypk", "");
        ext.listProjects(true, new ResultCallback() {
            @Override
            public void onResult(JsonObject r) {
                JsonArray array = JsonParser.parseString(r.get("data").getAsString()).getAsJsonArray();
                for (JsonElement je : array) {
                    String fileName = je.getAsString();
                    if (fileName.startsWith(contractName)) fileNames.add(fileName);
                }
                counter.incrementAndGet();
            }
        });
        for (; counter.get() == 1; )
            Thread.yield();
        Collections.sort(fileNames, new Comparator() {
            @Override
            public int compare(String o1, String o2) {
                return getCount(o2, contractName) - getCount(o1, contractName);
            }
        });

        System.out.println(TAG + "startContract:" + fileNames.get(0));
        if (config.asDebug) {
            ext.startContractAsDebug(fileNames.get(0), config.createParam, config.remoteDebugPort, new ResultCallback() {
                @Override
                public void onResult(JsonObject r) {
                    System.out.println(TAG + r);
                    counter.incrementAndGet();
                }
            });
        } else {
            ext.startContract(fileNames.get(0), config.createParam, config.remoteDebugPort, new ResultCallback() {
                @Override
                public void onResult(JsonObject r) {
                    System.out.println(TAG + r);
                    System.out.println(TAG + "access: " + config.agentAddress);
                    counter.incrementAndGet();
                }
            });
        }

        for (; counter.get() == 2; )
            Thread.yield();
    }

    public static int getCount(String dirName, String contractName) {
        String sub = dirName.substring(contractName.length());
        if (sub.startsWith("_")) {
            return Integer.valueOf(sub.substring(1));
        } else return -1;
    }

    public static void deployUseHttp(DeployConfig config) {
        String url = "http://%s/Upload?%s&sign=%s";
        File file = new File(config.ypkPath);
        String argWithoutSig = "path=%s&fileName=%s&isPrivate=true&order=%d&count=%d&pubKey=%s";
        SM2KeyPair keyPair;
        try {
            keyPair = SM2KeyPair.fromJson(String.format("{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}", config.publicKey, config.privateKey));
        } catch (Exception e) {
            System.out.println("[HttpTool] parse key error:\n" + String.format("{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}", config.publicKey, config.privateKey));
            e.printStackTrace();
            return;
        }
        String pubKey = keyPair.getPublicKeyStr();
        int trunc = 1000 * 1024;
        if (config.chunkSize > 10)
            trunc = config.chunkSize;
        byte[] buff = new byte[trunc];
        int order = 0;
        int count = (int) ((file.length() - 1) / (trunc)) + 1;
        CloseableHttpClient client = HttpClients.createDefault();
        try {
            FileInputStream fin = new FileInputStream(file);
            for (int len = 0; (len = fin.read(buff)) > 0; order++) {
                String arg = String.format(argWithoutSig, "./", file.getName(), order, count, pubKey);
                String sign = ByteUtils.toHexString(SM2Util.sign(keyPair.getPrivateKeyParameter(), arg.getBytes(StandardCharsets.UTF_8)));
                String urlStr = String.format(url, config.agentAddress, arg, sign);
                HttpPost httpPost = new HttpPost(urlStr);
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();
                if (len == trunc)
                    builder.addBinaryBody("file", buff, ContentType.APPLICATION_OCTET_STREAM, file.getName());
                else {
                    byte[] bu = new byte[len];
                    System.arraycopy(buff, 0, bu, 0, len);
                    builder.addBinaryBody("file", bu, ContentType.APPLICATION_OCTET_STREAM, file.getName());
                }
                HttpEntity multipart = builder.build();
                httpPost.setEntity(multipart);
                CloseableHttpResponse response = client.execute(httpPost);
                ByteArrayOutputStream bo = new ByteArrayOutputStream();
                response.getEntity().writeTo(bo);
                System.out.println(TAG + +order + "/" + count + " " + bo);
            }
        } catch (IOException | CryptoException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy