summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorshizhendong <[email protected]>2024-09-10 16:54:16 +0800
committershizhendong <[email protected]>2024-09-10 16:54:16 +0800
commit7eb678813fcfe88daacd8345d89bd9db37511ded (patch)
treeef79bd65250c2a21d5d56642cf383a6728aa6a09 /src
parent87e211987b5a899fd4dc831c3616e9dacd0def46 (diff)
fix: ASW-65 停止捕包时等待 tcpdump 资源释放,防止 pcap 不全
Diffstat (limited to 'src')
-rw-r--r--src/main/java/net/geedge/api/controller/APIController.java2
-rw-r--r--src/main/java/net/geedge/api/util/AdbUtil.java15
-rw-r--r--src/main/java/net/geedge/common/T.java2
3 files changed, 18 insertions, 1 deletions
diff --git a/src/main/java/net/geedge/api/controller/APIController.java b/src/main/java/net/geedge/api/controller/APIController.java
index 182f9d6..db2eee3 100644
--- a/src/main/java/net/geedge/api/controller/APIController.java
+++ b/src/main/java/net/geedge/api/controller/APIController.java
@@ -142,7 +142,7 @@ public class APIController {
}
@DeleteMapping("/pcap")
- public void stopTcpdump(@RequestParam String id,
+ public synchronized void stopTcpdump(@RequestParam String id,
@RequestParam(required = false, defaultValue = "false") Boolean returnFile,
HttpServletResponse response) throws IOException {
AdbUtil.CommandResult result = adbUtil.stopTcpdump(id);
diff --git a/src/main/java/net/geedge/api/util/AdbUtil.java b/src/main/java/net/geedge/api/util/AdbUtil.java
index a17230b..61a66d3 100644
--- a/src/main/java/net/geedge/api/util/AdbUtil.java
+++ b/src/main/java/net/geedge/api/util/AdbUtil.java
@@ -641,6 +641,21 @@ public class AdbUtil {
.serial(this.getSerial())
.buildShellCommand(String.format("shell \"ps -ef | grep tcpdump | grep -v grep | grep %s | awk '{print $2}' | xargs kill -INT \"", id))
.build());
+
+ // 等待 tcpdump 资源释放,避免出现错误:The capture file appears to have been cut short in the middle of a packet.
+ for (int i = 0; i < 10; i++) {
+ T.ThreadUtil.sleep(500);
+
+ String str = CommandExec.exec(AdbCommandBuilder.builder()
+ .serial(this.getSerial())
+ .buildShellCommand(String.format("shell \"ps -ef | grep tcpdump | grep -v grep | grep %s \"", id))
+ .build());
+ log.info("[stopTcpdump] [id: {}] [is running: {}]", id, str);
+ if (T.StrUtil.isEmpty(str)) {
+ break;
+ }
+ }
+
log.info("[stopTcpdump] [id: {}] [pcapFilePath: {}] [result: {}]", id, pcapFilePath, result);
if (T.StrUtil.isEmpty(result)) {
return new CommandResult(0, pcapFilePath);
diff --git a/src/main/java/net/geedge/common/T.java b/src/main/java/net/geedge/common/T.java
index 8bb3b1a..c098b77 100644
--- a/src/main/java/net/geedge/common/T.java
+++ b/src/main/java/net/geedge/common/T.java
@@ -204,10 +204,12 @@ public class T {
}
public static class ResponseUtil {
+ static Log log = Log.get();
/**
* reponse 下载 byte数据
*/
public static void downloadFile(HttpServletResponse response, String filename, byte[] data) throws IORuntimeException, IOException {
+ log.info("[downloadFile] [fileName: {}] [size: {}]", filename, data.length);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
String fileName = T.URLUtil.encode(filename, T.CharsetUtil.CHARSET_UTF_8);
cn.hutool.core.util.ReflectUtil.invoke(response, "addHeader", "Content-Disposition", "attachment; filename=" + fileName);