Implemented move and copy command. Needs to be reworked to work without `-f' and '-t' flags but with spaces.
This commit is contained in:
@@ -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()}).")
|
||||
|
||||
@@ -270,3 +268,65 @@ proc taskRmdir*(task: Task): TaskResult =
|
||||
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,
|
||||
agent: task.agent,
|
||||
data: encode(fmt"An error occured: {err.msg}" & "\n"),
|
||||
status: Failed
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -20,6 +20,8 @@ type
|
||||
ListDirectory = "ls"
|
||||
RemoveFile = "rm"
|
||||
RemoveDirectory = "rmdir"
|
||||
Move = "move"
|
||||
Copy = "copy"
|
||||
|
||||
TaskStatus* = enum
|
||||
Completed = "completed"
|
||||
|
||||
Reference in New Issue
Block a user