[server][status]- 优化command executor的代码
This commit is contained in:
36
.run/Agent-dev-1.run.xml
Normal file
36
.run/Agent-dev-1.run.xml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Agent-dev-1" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" activateToolWindowBeforeRun="false">
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH" value="11" />
|
||||||
|
<envs>
|
||||||
|
<env name="agentVersion" value="2023-02-13" />
|
||||||
|
<env name="archInfo" value=""x86_64 (64 Bit)"" />
|
||||||
|
<env name="cpuBrand" value=""Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz"" />
|
||||||
|
<env name="cpuCore" value=""12 @ 4299.998 MHz"" />
|
||||||
|
<env name="diskTotal" value=""914.9 GB"" />
|
||||||
|
<env name="diskUsage" value=""12.3 GB"" />
|
||||||
|
<env name="ioSpeed" value=""259 MB/s"" />
|
||||||
|
<env name="location" value=""Chengdu Sichuan CN"" />
|
||||||
|
<env name="machineId" value=""remote-dev-19"" />
|
||||||
|
<env name="managePort" value=""22"" />
|
||||||
|
<env name="memoryTotal" value=""7.6 GB"" />
|
||||||
|
<env name="osInfo" value=""Ubuntu 20.04.5 LTS"" />
|
||||||
|
<env name="osKernelInfo" value=""5.4.0-135-generic"" />
|
||||||
|
<env name="provider" value=""AS139080 The Internet Data Center of Sichuan Mobile Communication Company Limited"" />
|
||||||
|
<env name="serverIpInV4" value="""" />
|
||||||
|
<env name="serverIpInV6" value="""" />
|
||||||
|
<env name="serverIpPbV4" value=""183.220.149.17"" />
|
||||||
|
<env name="serverIpPbV6" value="""" />
|
||||||
|
<env name="serverName" value=""Chengdu-amd64-77"" />
|
||||||
|
<env name="tcpControl" value=""cubic"" />
|
||||||
|
<env name="virtualization" value=""Dedicated"" />
|
||||||
|
<env name="server.port" value="8001" />
|
||||||
|
</envs>
|
||||||
|
<module name="agent" />
|
||||||
|
<target name="root@10.250.0.18:22" />
|
||||||
|
<option name="SPRING_BOOT_MAIN_CLASS" value="io.wdd.agent.AgentApplication" />
|
||||||
|
<option name="VM_PARAMETERS" value="-Dserver.port=8001 -Dfile.encoding=utf-8 -Ddebug=true -Dlogging.level.io.wdd.agent=debug -Dspring.profiles.active=dev -Dspring.cloud.nacos.config.group=dev -Dspring.cloud.nacos.config.extension-configs[0].dataId=common-dev.yaml -Dspring.cloud.nacos.config.extension-configs[0].group=dev" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -11,7 +11,6 @@ import org.apache.commons.lang3.ObjectUtils;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -76,15 +75,23 @@ public class CommandExecutor {
|
|||||||
|
|
||||||
|
|
||||||
private int processExecute(String streamKey, ProcessBuilder processBuilder) {
|
private int processExecute(String streamKey, ProcessBuilder processBuilder) {
|
||||||
|
// 重定向,错误日志到标准输出中
|
||||||
processBuilder.redirectErrorStream(true);
|
processBuilder.redirectErrorStream(true);
|
||||||
// processBuilder.inheritIO();
|
//processBuilder.inheritIO();
|
||||||
processBuilder.directory(new File(System.getProperty("user.home")));
|
//processBuilder.directory(new File(System.getProperty("user.home")));
|
||||||
int processResult = 233;
|
int processResult = 233;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
// 开始执行命令之前,需要进行打印
|
||||||
|
log.debug(
|
||||||
|
"current shell command {}",
|
||||||
|
processBuilder.command()
|
||||||
|
);
|
||||||
|
|
||||||
|
// 开始执行命令操作
|
||||||
Process process = processBuilder.start();
|
Process process = processBuilder.start();
|
||||||
|
|
||||||
// start a backend thread to daemon the process
|
// start a backend thread to daemon the process
|
||||||
// wait for processMaxWaitSeconds and kill the process if it's still alived
|
// wait for processMaxWaitSeconds and kill the process if it's still alived
|
||||||
DaemonCommandProcess.submit(
|
DaemonCommandProcess.submit(
|
||||||
@@ -93,14 +100,15 @@ public class CommandExecutor {
|
|||||||
processMaxWaitSeconds
|
processMaxWaitSeconds
|
||||||
));
|
));
|
||||||
|
|
||||||
// cache log lines
|
|
||||||
|
// 缓存让命令处理日志,并且打印
|
||||||
logToArrayListCache.cacheLog(
|
logToArrayListCache.cacheLog(
|
||||||
streamKey,
|
streamKey,
|
||||||
process
|
process
|
||||||
);
|
);
|
||||||
|
|
||||||
// start to send the result log
|
// start to send the result log
|
||||||
streamSender.startToWaitLog(streamKey);
|
//streamSender.startToWaitLog(streamKey);
|
||||||
|
|
||||||
// todo this will stuck the process and rabbitmq message will reentry the queue
|
// todo this will stuck the process and rabbitmq message will reentry the queue
|
||||||
// get the command result must also be a timeout smaller than the process
|
// get the command result must also be a timeout smaller than the process
|
||||||
@@ -109,8 +117,10 @@ public class CommandExecutor {
|
|||||||
TimeUnit.SECONDS
|
TimeUnit.SECONDS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// end send logs
|
// end send logs
|
||||||
streamSender.endWaitLog(streamKey);
|
//streamSender.endWaitLog(streamKey);
|
||||||
|
|
||||||
// get the process result
|
// get the process result
|
||||||
if (ObjectUtils.isNotEmpty(waitFor) && ObjectUtils.isNotEmpty(process)) {
|
if (ObjectUtils.isNotEmpty(waitFor) && ObjectUtils.isNotEmpty(process)) {
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* utils to cache store the command execution logs
|
* utils to cache store the command execution logs
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -35,7 +34,13 @@ public class LogToArrayListCache {
|
|||||||
|
|
||||||
ArrayList<String> commandCachedLog = this.getExecutionCmdCachedLogArrayList(streamKey);
|
ArrayList<String> commandCachedLog = this.getExecutionCmdCachedLogArrayList(streamKey);
|
||||||
|
|
||||||
String format = String.format("execution command are => [ %s ]", process.info().commandLine().get());
|
String format = String.format(
|
||||||
|
"execution command are => [ %s ]",
|
||||||
|
process
|
||||||
|
.info()
|
||||||
|
.commandLine()
|
||||||
|
.get()
|
||||||
|
);
|
||||||
|
|
||||||
// add the command
|
// add the command
|
||||||
commandCachedLog.add("");
|
commandCachedLog.add("");
|
||||||
@@ -44,16 +49,17 @@ public class LogToArrayListCache {
|
|||||||
commandCachedLog.add("");
|
commandCachedLog.add("");
|
||||||
|
|
||||||
// cache the real command logs
|
// cache the real command logs
|
||||||
cacheLog(streamKey, process.getInputStream());
|
doCacheLog(
|
||||||
|
streamKey,
|
||||||
|
process.getInputStream()
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cacheLog(String streamKey, InputStream commandLogStream) {
|
private void doCacheLog(String streamKey, InputStream commandLogStream) {
|
||||||
|
|
||||||
ArrayList<String> commandCachedLog = this.getExecutionCmdCachedLogArrayList(streamKey);
|
ArrayList<String> commandCachedLog = this.getExecutionCmdCachedLogArrayList(streamKey);
|
||||||
|
|
||||||
// log.info(String.valueOf(commandCachedLog));
|
|
||||||
|
|
||||||
// read from input stream and store to the cacheArrayList
|
// read from input stream and store to the cacheArrayList
|
||||||
new BufferedReader(new InputStreamReader(commandLogStream))
|
new BufferedReader(new InputStreamReader(commandLogStream))
|
||||||
.lines()
|
.lines()
|
||||||
@@ -61,7 +67,11 @@ public class LogToArrayListCache {
|
|||||||
commandCachedLog::add
|
commandCachedLog::add
|
||||||
);
|
);
|
||||||
|
|
||||||
log.debug("current streamKey is {} and CacheLog is {}", streamKey, commandCachedLog);
|
log.debug(
|
||||||
|
"current streamKey is {} and CacheLog is {}",
|
||||||
|
streamKey,
|
||||||
|
commandCachedLog
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getExecutionCmdCachedLogArrayList(String streamKey) {
|
public ArrayList<String> getExecutionCmdCachedLogArrayList(String streamKey) {
|
||||||
@@ -85,9 +95,9 @@ public class LogToArrayListCache {
|
|||||||
boolean hasRehashed = false;
|
boolean hasRehashed = false;
|
||||||
|
|
||||||
if (CollectionUtils.isNotEmpty(CachedCommandLog.get(result))) {
|
if (CollectionUtils.isNotEmpty(CachedCommandLog.get(result))) {
|
||||||
for (int index = result+1; index < CachedCommandLog.size(); index++) {
|
for (int index = result + 1; index < CachedCommandLog.size(); index++) {
|
||||||
// from the index to the end
|
// from the index to the end
|
||||||
if (CollectionUtils.isEmpty(CachedCommandLog.get(index))){
|
if (CollectionUtils.isEmpty(CachedCommandLog.get(index))) {
|
||||||
hasRehashed = true;
|
hasRehashed = true;
|
||||||
result = index;
|
result = index;
|
||||||
break;
|
break;
|
||||||
@@ -96,7 +106,7 @@ public class LogToArrayListCache {
|
|||||||
if (!hasRehashed) {
|
if (!hasRehashed) {
|
||||||
for (int index = 0; index < result; index++) {
|
for (int index = 0; index < result; index++) {
|
||||||
// from begin to the index
|
// from begin to the index
|
||||||
if (CollectionUtils.isEmpty(CachedCommandLog.get(index))){
|
if (CollectionUtils.isEmpty(CachedCommandLog.get(index))) {
|
||||||
hasRehashed = true;
|
hasRehashed = true;
|
||||||
result = index;
|
result = index;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ public class ProxyNodeSet {
|
|||||||
public static ProxyNode phoenix2;
|
public static ProxyNode phoenix2;
|
||||||
public static ProxyNode london2;
|
public static ProxyNode london2;
|
||||||
|
|
||||||
|
// 开发使用
|
||||||
public static ProxyNode chengduAgent;
|
public static ProxyNode chengduAgent;
|
||||||
|
public static ProxyNode tokyoDev;
|
||||||
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -92,7 +94,7 @@ public class ProxyNodeSet {
|
|||||||
.agentName("London-amd64-02")
|
.agentName("London-amd64-02")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
chengduAgent = ProxyNode
|
tokyoDev = ProxyNode
|
||||||
.builder()
|
.builder()
|
||||||
.location("Tokyo")
|
.location("Tokyo")
|
||||||
.num(99)
|
.num(99)
|
||||||
@@ -103,6 +105,18 @@ public class ProxyNodeSet {
|
|||||||
.agentTopicName("Tokyo-amd64-07-f66a41")
|
.agentTopicName("Tokyo-amd64-07-f66a41")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
chengduAgent = ProxyNode
|
||||||
|
.builder()
|
||||||
|
.location("Chengdu")
|
||||||
|
.num(90)
|
||||||
|
.publicIPv4("183.220.9.13")
|
||||||
|
.proxyNodeType(ProxyNodeType.EXTERNAL)
|
||||||
|
.name("chengdu-agent")
|
||||||
|
.agentName("Chengdu-amd64-77")
|
||||||
|
.agentTopicName("Chengdu-amd64-77-remote")
|
||||||
|
.build();
|
||||||
|
|
||||||
ProxyNodeMap.put(chengdu.getNum(), chengdu);
|
ProxyNodeMap.put(chengdu.getNum(), chengdu);
|
||||||
ProxyNodeMap.put(hongkong.getNum(), hongkong);
|
ProxyNodeMap.put(hongkong.getNum(), hongkong);
|
||||||
ProxyNodeMap.put(shanghai.getNum(), shanghai);
|
ProxyNodeMap.put(shanghai.getNum(), shanghai);
|
||||||
@@ -111,6 +125,7 @@ public class ProxyNodeSet {
|
|||||||
ProxyNodeMap.put(phoenix2.getNum(), phoenix2);
|
ProxyNodeMap.put(phoenix2.getNum(), phoenix2);
|
||||||
ProxyNodeMap.put(london2.getNum(), london2);
|
ProxyNodeMap.put(london2.getNum(), london2);
|
||||||
ProxyNodeMap.put(chengduAgent.getNum(), chengduAgent);
|
ProxyNodeMap.put(chengduAgent.getNum(), chengduAgent);
|
||||||
|
ProxyNodeMap.put(tokyoDev.getNum(), tokyoDev);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class XrayConfigDistribute {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
||||||
ArrayList<String> zero = new ArrayList<>(
|
/*ArrayList<String> zero = new ArrayList<>(
|
||||||
List.of(
|
List.of(
|
||||||
"if",
|
"if",
|
||||||
"[",
|
"[",
|
||||||
@@ -56,7 +56,7 @@ public class XrayConfigDistribute {
|
|||||||
";",
|
";",
|
||||||
"fi"
|
"fi"
|
||||||
)
|
)
|
||||||
);
|
);*/
|
||||||
|
|
||||||
|
|
||||||
ArrayList<String> first = new ArrayList<>(
|
ArrayList<String> first = new ArrayList<>(
|
||||||
@@ -92,13 +92,12 @@ public class XrayConfigDistribute {
|
|||||||
"|",
|
"|",
|
||||||
"grep",
|
"grep",
|
||||||
"-c",
|
"-c",
|
||||||
"active,(running)"
|
"active (running)"
|
||||||
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
updateXrayCommandList.add(zero);
|
|
||||||
updateXrayCommandList.add(first);
|
updateXrayCommandList.add(first);
|
||||||
updateXrayCommandList.add(second);
|
updateXrayCommandList.add(second);
|
||||||
updateXrayCommandList.add(third);
|
updateXrayCommandList.add(third);
|
||||||
@@ -166,10 +165,10 @@ public class XrayConfigDistribute {
|
|||||||
}
|
}
|
||||||
// 修改命令中的时间
|
// 修改命令中的时间
|
||||||
String s = updateXrayCommandList
|
String s = updateXrayCommandList
|
||||||
.get(1)
|
.get(0)
|
||||||
.get(2);
|
.get(2);
|
||||||
updateXrayCommandList
|
updateXrayCommandList
|
||||||
.get(1)
|
.get(0)
|
||||||
.set(
|
.set(
|
||||||
2,
|
2,
|
||||||
s.replace(
|
s.replace(
|
||||||
@@ -180,7 +179,7 @@ public class XrayConfigDistribute {
|
|||||||
|
|
||||||
// 修改命令中的下载url
|
// 修改命令中的下载url
|
||||||
updateXrayCommandList
|
updateXrayCommandList
|
||||||
.get(2)
|
.get(1)
|
||||||
.set(
|
.set(
|
||||||
1,
|
1,
|
||||||
realUrl
|
realUrl
|
||||||
|
|||||||
Reference in New Issue
Block a user