From 3010435c4c80b587cfd882faba41801fc5f90613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98niuerzhuang=E2=80=99?= <‘niuerzhuang@huoxian.cn’> Date: Mon, 20 Jun 2022 18:17:24 +0800 Subject: [PATCH] fix: 1. support arm attach 2. log upload port --- .../java/io/dongtai/iast/agent/Agent.java | 9 +++-- .../io/dongtai/iast/agent/util/FileUtils.java | 31 +++++++++--------- .../src/main/resources/bin/jattach-arm | Bin 0 -> 74368 bytes 3 files changed, 21 insertions(+), 19 deletions(-) create mode 100755 dongtai-agent/src/main/resources/bin/jattach-arm diff --git a/dongtai-agent/src/main/java/io/dongtai/iast/agent/Agent.java b/dongtai-agent/src/main/java/io/dongtai/iast/agent/Agent.java index f882e8cfa..4903644c6 100644 --- a/dongtai-agent/src/main/java/io/dongtai/iast/agent/Agent.java +++ b/dongtai-agent/src/main/java/io/dongtai/iast/agent/Agent.java @@ -114,8 +114,8 @@ private static void doAttach(String pid, String agentArgs) { } } - private static boolean isLinux() { - return OS_NAME.indexOf("linux") >= 0; + private static boolean isArm() { + return System.getProperty("os.arch").contains("arm") || System.getProperty("os.arch").contains("aarch"); } public static boolean isWindows() { @@ -133,7 +133,10 @@ private static void extractJattach() throws IOException { } else if (isMacOs()) { JATTACH_FILE = System.getProperty("java.io.tmpdir")+ File.separator + "iast"+System.currentTimeMillis() + File.separator + "jattach-mac"; FileUtils.getResourceToFile("bin/jattach-mac", JATTACH_FILE); - } else { + } else if (isArm()){ + JATTACH_FILE = System.getProperty("java.io.tmpdir")+ File.separator + "iast"+System.currentTimeMillis() + File.separator + "jattach-linux"; + FileUtils.getResourceToFile("bin/jattach-arm", JATTACH_FILE); + }else { JATTACH_FILE = System.getProperty("java.io.tmpdir")+ File.separator + "iast"+System.currentTimeMillis() + File.separator + "jattach-linux"; FileUtils.getResourceToFile("bin/jattach-linux", JATTACH_FILE); } diff --git a/dongtai-agent/src/main/java/io/dongtai/iast/agent/util/FileUtils.java b/dongtai-agent/src/main/java/io/dongtai/iast/agent/util/FileUtils.java index 24975c634..5fd608fcf 100644 --- a/dongtai-agent/src/main/java/io/dongtai/iast/agent/util/FileUtils.java +++ b/dongtai-agent/src/main/java/io/dongtai/iast/agent/util/FileUtils.java @@ -50,15 +50,15 @@ public static void confReplace(String path) { StringBuffer buf = new StringBuffer(); // 保存该行前面的内容 while ((temp = br.readLine()) != null) { - if (temp.contains("${HOSTNAME_AGENT_ID}")){ - temp = temp.replace("${HOSTNAME_AGENT_ID}", AgentRegisterReport.getInternalHostName()+"-"+AgentRegisterReport.getAgentFlag().toString()); - }else if (temp.contains("${HOSTNAME}")){ - temp = temp.replace("${HOSTNAME}",AgentRegisterReport.getInternalHostName()); - }else if (temp.contains("${AGENT_ID}")){ - temp = temp.replace("${AGENT_ID}",AgentRegisterReport.getAgentFlag().toString()); - }else if (temp.contains("${OPENAPI}")){ + if (temp.contains("${HOSTNAME_AGENT_ID}")) { + temp = temp.replace("${HOSTNAME_AGENT_ID}", AgentRegisterReport.getInternalHostName() + "-" + AgentRegisterReport.getAgentFlag().toString()); + } else if (temp.contains("${HOSTNAME}")) { + temp = temp.replace("${HOSTNAME}", AgentRegisterReport.getInternalHostName()); + } else if (temp.contains("${AGENT_ID}")) { + temp = temp.replace("${AGENT_ID}", AgentRegisterReport.getAgentFlag().toString()); + } else if (temp.contains("${OPENAPI}")) { String logAddress = IastProperties.getInstance().getLogAddress(); - if (null == logAddress){ + if (null == logAddress) { String s = IastProperties.getInstance().getBaseUrl(); try { String openApiDomain = new URI(s).getHost(); @@ -70,17 +70,16 @@ public static void confReplace(String path) { } temp = temp.replace("${OPENAPI}", s); } - }else { + } else { temp = temp.replace("${OPENAPI}", logAddress); } - }else if (temp.contains("${LOG_PORT}")){ + } else if (temp.contains("${LOG_PORT}")) { String logPort = IastProperties.getInstance().getLogPort(); - if (null == logPort){ + if (null == logPort) { String s = IastProperties.getInstance().getBaseUrl(); try { int openApiPort = new URI(s).getPort(); - temp = temp.replace("${LOG_PORT}", openApiPort > 0 ? Integer.toString(openApiPort) : - ("https".equalsIgnoreCase(new URI(s).getScheme()) ? "443" : "80")); + temp = temp.replace("${LOG_PORT}", openApiPort > 0 ? Integer.toString(openApiPort) : "80"); } catch (Exception e) { s = s.substring(s.indexOf("://") + 3, s.indexOf("/openapi")); if (s.contains(":")) { @@ -90,11 +89,11 @@ public static void confReplace(String path) { temp = temp.replace("${LOG_PORT}", "80"); } } - }else { + } else { temp = temp.replace("${LOG_PORT}", logPort); } - }else if (temp.contains("${LOG_PATH}")){ - temp = temp.replace("${LOG_PATH}", System.getProperty("java.io.tmpdir.dongtai")+File.separator+"dongtaiJavaAgentLogs"+File.separator+"dongtai_javaagent.log"); + } else if (temp.contains("${LOG_PATH}")) { + temp = temp.replace("${LOG_PATH}", System.getProperty("java.io.tmpdir.dongtai") + File.separator + "dongtaiJavaAgentLogs" + File.separator + "dongtai_javaagent.log"); } buf = buf.append(temp); buf = buf.append(System.getProperty("line.separator")); diff --git a/dongtai-agent/src/main/resources/bin/jattach-arm b/dongtai-agent/src/main/resources/bin/jattach-arm new file mode 100755 index 0000000000000000000000000000000000000000..3d957495b9ab13d731eb3a9acf55748832bab858 GIT binary patch literal 74368 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