fix: ASW-65 停止捕包时等待 tcpdump 资源释放,防止 pcap 不全
This commit is contained in:
@@ -142,7 +142,7 @@ public class APIController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/pcap")
|
@DeleteMapping("/pcap")
|
||||||
public void stopTcpdump(@RequestParam String id,
|
public synchronized void stopTcpdump(@RequestParam String id,
|
||||||
@RequestParam(required = false, defaultValue = "false") Boolean returnFile,
|
@RequestParam(required = false, defaultValue = "false") Boolean returnFile,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
AdbUtil.CommandResult result = adbUtil.stopTcpdump(id);
|
AdbUtil.CommandResult result = adbUtil.stopTcpdump(id);
|
||||||
|
|||||||
@@ -641,6 +641,21 @@ public class AdbUtil {
|
|||||||
.serial(this.getSerial())
|
.serial(this.getSerial())
|
||||||
.buildShellCommand(String.format("shell \"ps -ef | grep tcpdump | grep -v grep | grep %s | awk '{print $2}' | xargs kill -INT \"", id))
|
.buildShellCommand(String.format("shell \"ps -ef | grep tcpdump | grep -v grep | grep %s | awk '{print $2}' | xargs kill -INT \"", id))
|
||||||
.build());
|
.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);
|
log.info("[stopTcpdump] [id: {}] [pcapFilePath: {}] [result: {}]", id, pcapFilePath, result);
|
||||||
if (T.StrUtil.isEmpty(result)) {
|
if (T.StrUtil.isEmpty(result)) {
|
||||||
return new CommandResult(0, pcapFilePath);
|
return new CommandResult(0, pcapFilePath);
|
||||||
|
|||||||
@@ -204,10 +204,12 @@ public class T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class ResponseUtil {
|
public static class ResponseUtil {
|
||||||
|
static Log log = Log.get();
|
||||||
/**
|
/**
|
||||||
* reponse 下载 byte数据
|
* reponse 下载 byte数据
|
||||||
*/
|
*/
|
||||||
public static void downloadFile(HttpServletResponse response, String filename, byte[] data) throws IORuntimeException, IOException {
|
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);
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
String fileName = T.URLUtil.encode(filename, T.CharsetUtil.CHARSET_UTF_8);
|
String fileName = T.URLUtil.encode(filename, T.CharsetUtil.CHARSET_UTF_8);
|
||||||
cn.hutool.core.util.ReflectUtil.invoke(response, "addHeader", "Content-Disposition", "attachment; filename=" + fileName);
|
cn.hutool.core.util.ReflectUtil.invoke(response, "addHeader", "Content-Disposition", "attachment; filename=" + fileName);
|
||||||
|
|||||||
Reference in New Issue
Block a user