mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
feat(runner): implement BubbleWrap policy provider and related test
This commit is contained in:
@@ -11,6 +11,8 @@ import work.slhaf.partner.core.action.runner.execution.CommandExecutionService;
|
||||
import work.slhaf.partner.core.action.runner.execution.McpActionExecutor;
|
||||
import work.slhaf.partner.core.action.runner.execution.OriginExecutionService;
|
||||
import work.slhaf.partner.core.action.runner.mcp.*;
|
||||
import work.slhaf.partner.core.action.runner.policy.BwrapPolicyProvider;
|
||||
import work.slhaf.partner.core.action.runner.policy.ExecutionPolicyRegistry;
|
||||
import work.slhaf.partner.core.action.runner.support.ActionSerializer;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -69,6 +71,8 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable {
|
||||
McpConfigWatcher configWatcher = null;
|
||||
|
||||
try {
|
||||
ExecutionPolicyRegistry.INSTANCE.registerPolicyProvider(BwrapPolicyProvider.INSTANCE);
|
||||
|
||||
metaRegistry = new McpMetaRegistry(existedMetaActions);
|
||||
registerMcpClient(clientRegistry, transportFactory, MCP_NAME_DESC, metaRegistry.clientConfig(MCP_NAME_DESC, 10));
|
||||
log.info("DescMcp 注册完毕");
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package work.slhaf.partner.core.action.runner.policy
|
||||
|
||||
import work.slhaf.partner.core.action.exception.ActionInitFailedException
|
||||
|
||||
private const val BWRAP_COMMAND = "bwrap"
|
||||
|
||||
object BwrapPolicyProvider : PolicyProvider(
|
||||
policyName = "bwrap"
|
||||
) {
|
||||
|
||||
init {
|
||||
requireBwrapAvailable()
|
||||
}
|
||||
|
||||
override fun prepare(
|
||||
policy: ExecutionPolicy,
|
||||
commands: List<String>
|
||||
): WrappedLaunchSpec {
|
||||
val (command, args) = splitCommands(commands)
|
||||
val wrappedArgs = buildList {
|
||||
add("--ro-bind")
|
||||
add("/")
|
||||
add("/")
|
||||
add("--proc")
|
||||
add("/proc")
|
||||
add("--dev")
|
||||
add("/dev")
|
||||
if (policy.net == ExecutionPolicy.Network.DISABLE) {
|
||||
add("--unshare-net")
|
||||
}
|
||||
if (!policy.workingDirectory.isNullOrBlank()) {
|
||||
add("--chdir")
|
||||
add(policy.workingDirectory)
|
||||
}
|
||||
policy.readOnlyPaths.forEach { path ->
|
||||
add("--ro-bind")
|
||||
add(path)
|
||||
add(path)
|
||||
}
|
||||
policy.writablePaths.forEach { path ->
|
||||
add("--bind")
|
||||
add(path)
|
||||
add(path)
|
||||
}
|
||||
add("--")
|
||||
add(command)
|
||||
addAll(args)
|
||||
}
|
||||
return WrappedLaunchSpec(
|
||||
command = BWRAP_COMMAND,
|
||||
args = wrappedArgs,
|
||||
workingDirectory = policy.workingDirectory,
|
||||
environment = resolveEnvironment(policy)
|
||||
)
|
||||
}
|
||||
|
||||
private fun requireBwrapAvailable() {
|
||||
val available = try {
|
||||
val process = ProcessBuilder(BWRAP_COMMAND, "--version")
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
val exitCode = process.waitFor()
|
||||
exitCode == 0
|
||||
} catch (e: Exception) {
|
||||
throw ActionInitFailedException("bwrap provider 初始化失败: 无法检测 $BWRAP_COMMAND 可执行文件", e)
|
||||
}
|
||||
if (!available) {
|
||||
throw ActionInitFailedException("bwrap provider 初始化失败: 未检测到可执行命令 '$BWRAP_COMMAND'")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user