diff --git a/agents/monarch/commands/filesystem.nim b/agents/monarch/commands/filesystem.nim index 185d917..baaa1eb 100644 --- a/agents/monarch/commands/filesystem.nim +++ b/agents/monarch/commands/filesystem.nim @@ -224,7 +224,6 @@ proc taskRm*(task: Task): TaskResult = echo fmt"Deleting file {target}." try: - # Get current working directory using GetCurrentDirectory if DeleteFile(target) == FALSE: raise newException(OSError, fmt"Failed to delete file ({GetLastError()}).") @@ -252,7 +251,6 @@ proc taskRmdir*(task: Task): TaskResult = echo fmt"Deleting directory {target}." try: - # Get current working directory using GetCurrentDirectory if RemoveDirectoryA(target) == FALSE: raise newException(OSError, fmt"Failed to delete directory ({GetLastError()}).") @@ -263,6 +261,68 @@ proc taskRmdir*(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 + ) + +# Move file or directory +proc taskMove*(task: Task): TaskResult = + + # Parse arguments + echo task.args + let + params = parseJson(task.args) + lpExistingFileName = params["from"].getStr() + lpNewFileName = params["to"].getStr() + + echo fmt"Moving {lpExistingFileName} to {lpNewFileName}." + + try: + if MoveFile(lpExistingFileName, lpNewFileName) == FALSE: + raise newException(OSError, fmt"Failed to move file or directory ({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 + ) + +# Copy file or directory +proc taskCopy*(task: Task): TaskResult = + + # Parse arguments + let + params = parseJson(task.args) + lpExistingFileName = params["from"].getStr() + lpNewFileName = params["to"].getStr() + + echo fmt"Copying {lpExistingFileName} to {lpNewFileName}." + + try: + # Copy file to new location, overwrite if a file with the same name already exists + if CopyFile(lpExistingFileName, lpNewFileName, FALSE) == FALSE: + raise newException(OSError, fmt"Failed to copy file or 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/taskHandler.nim b/agents/monarch/taskHandler.nim index 2c49cae..a9c3dc2 100644 --- a/agents/monarch/taskHandler.nim +++ b/agents/monarch/taskHandler.nim @@ -13,7 +13,9 @@ proc handleTask*(task: Task, config: AgentConfig): TaskResult = SetWorkingDirectory: taskCd, ListDirectory: taskDir, RemoveFile: taskRm, - RemoveDirectory: taskRmdir + RemoveDirectory: taskRmdir, + Move: taskMove, + Copy: taskCopy }.toTable # Handle task command diff --git a/server/agent/interact.nim b/server/agent/interact.nim index 1d97e05..b3c75a8 100644 --- a/server/agent/interact.nim +++ b/server/agent/interact.nim @@ -39,6 +39,16 @@ var parser = newParser: help("Remove directory.") arg("directory", help="Relative or absolute path to the directory to delete.", nargs = -1) + command("move"): + help("Move a file or directory.") + option("-f", "--from", help="Original file name.", required=true) + option("-t", "--to", help="New file name.", required=true) + + command("copy"): + help("Copy a file or directory.") + option("-f", "--from", help="Original file name.", required=true) + option("-t", "--to", help="New file name.", required=true) + command("bof"): help("Execute COFF or BOF file (.o) in memory.") arg("file", help="Local path to object file.", nargs = 1) @@ -93,6 +103,12 @@ proc handleAgentCommand*(cq: Conquest, args: varargs[string]) = of "rmdir": cq.taskRemoveDirectory(opts.rmdir.get.directory) + of "move": + cq.taskMove(opts.move.get.from, opts.move.get.to) + + of "copy": + cq.taskCopy(opts.copy.get.from, opts.copy.get.to) + of "bof": cq.taskExecuteBof(opts.bof.get.file, opts.bof.get.arguments) diff --git a/server/agent/taskDispatcher.nim b/server/agent/taskDispatcher.nim index 6110aaf..0488994 100644 --- a/server/agent/taskDispatcher.nim +++ b/server/agent/taskDispatcher.nim @@ -55,6 +55,14 @@ proc taskRemoveDirectory*(cq: Conquest, arguments: seq[string]) = let payload = %*{ "directory": arguments.join(" ").replace("\"").replace("'")} cq.createTask(RemoveDirectory, $payload, "Tasked agent to remove directory.") +proc taskMove*(cq: Conquest, oldPath, newPath: string) = + let payload = %*{ "from": oldPath, "to": newPath} + cq.createTask(Move, $payload, "Tasked agent to move a file or directory.") + +proc taskCopy*(cq: Conquest, oldPath, newPath: string) = + let payload = %*{ "from": oldPath, "to": newPath} + cq.createTask(Copy, $payload, "Tasked agent to copy a file or directory.") + proc taskExecuteBof*(cq: Conquest, file: string, arguments: seq[string]) = # Verify that the object file exists diff --git a/server/types.nim b/server/types.nim index 11279f4..25eec0a 100644 --- a/server/types.nim +++ b/server/types.nim @@ -20,6 +20,8 @@ type ListDirectory = "ls" RemoveFile = "rm" RemoveDirectory = "rmdir" + Move = "move" + Copy = "copy" TaskStatus* = enum Completed = "completed"