2026-04-06 00:20:51 -05:00

200 lines
6.9 KiB
Go

package database
import (
"AdaptixServer/core/utils/logs"
"database/sql"
"errors"
"fmt"
"github.com/Adaptix-Framework/axc2"
)
func (dbms *DBMS) DbTaskExist(taskId string) bool {
var id string
err := dbms.database.QueryRow("SELECT TaskId FROM Tasks WHERE TaskId = ? LIMIT 1;", taskId).Scan(&id)
return err == nil
}
func (dbms *DBMS) DbTaskInsert(taskData adaptix.TaskData) error {
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
var (
result sql.Result
err error
)
if dbms.stmtTaskInsert != nil {
result, err = dbms.stmtTaskInsert.Exec(taskData.TaskId, taskData.AgentId, taskData.Type, taskData.Client, taskData.User, taskData.Computer, taskData.StartDate, taskData.FinishDate, taskData.CommandLine, taskData.MessageType, taskData.Message, taskData.ClearText, taskData.Completed)
} else {
result, err = dbms.database.Exec(`INSERT OR IGNORE INTO Tasks (TaskId, AgentId, TaskType, Client, User, Computer, StartDate, FinishDate, CommandLine, MessageType, Message, ClearText, Completed) values(?,?,?,?,?,?,?,?,?,?,?,?,?);`, taskData.TaskId, taskData.AgentId, taskData.Type, taskData.Client, taskData.User, taskData.Computer, taskData.StartDate, taskData.FinishDate, taskData.CommandLine, taskData.MessageType, taskData.Message, taskData.ClearText, taskData.Completed)
}
if err != nil {
return err
}
rows, _ := result.RowsAffected()
if rows == 0 {
return fmt.Errorf("task %s already exists", taskData.TaskId)
}
return nil
}
func (dbms *DBMS) DbTaskUpdate(taskData adaptix.TaskData) error {
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
var (
result sql.Result
err error
)
if dbms.stmtTaskUpdate != nil {
result, err = dbms.stmtTaskUpdate.Exec(taskData.FinishDate, taskData.MessageType, taskData.Message, taskData.ClearText, taskData.Completed, taskData.TaskId)
} else {
result, err = dbms.database.Exec(`UPDATE Tasks SET FinishDate = ?, MessageType = ?, Message = ?, ClearText = ?, Completed = ? WHERE TaskId = ?;`, taskData.FinishDate, taskData.MessageType, taskData.Message, taskData.ClearText, taskData.Completed, taskData.TaskId)
}
if err != nil {
return err
}
rows, _ := result.RowsAffected()
if rows == 0 {
return fmt.Errorf("task %s does not exist", taskData.TaskId)
}
return nil
}
func (dbms *DBMS) DbTaskDelete(taskId string, agentId string) error {
var err error
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
if taskId != "" {
deleteQuery := `DELETE FROM Tasks WHERE TaskId = ?;`
_, err = dbms.database.Exec(deleteQuery, taskId)
} else if agentId != "" {
deleteQuery := `DELETE FROM Tasks WHERE AgentId = ?;`
_, err = dbms.database.Exec(deleteQuery, agentId)
}
return err
}
func (dbms *DBMS) DbTaskGet(taskId string) (adaptix.TaskData, error) {
var taskData adaptix.TaskData
if !dbms.DatabaseExists() {
return taskData, errors.New("database does not exist")
}
selectQuery := `SELECT TaskId, AgentId, TaskType, Client, User, Computer, StartDate, FinishDate, CommandLine, MessageType, Message, ClearText, Completed FROM Tasks WHERE TaskId = ?;`
err := dbms.database.QueryRow(selectQuery, taskId).Scan(&taskData.TaskId, &taskData.AgentId, &taskData.Type, &taskData.Client, &taskData.User, &taskData.Computer, &taskData.StartDate, &taskData.FinishDate, &taskData.CommandLine, &taskData.MessageType, &taskData.Message, &taskData.ClearText, &taskData.Completed)
if err != nil {
return taskData, fmt.Errorf("task %s not found", taskId)
}
return taskData, nil
}
func (dbms *DBMS) DbTasksAll(agentId string) []adaptix.TaskData {
var tasks []adaptix.TaskData
ok := dbms.DatabaseExists()
if ok {
selectQuery := `SELECT TaskId, AgentId, TaskType, Client, User, Computer, StartDate, FinishDate, CommandLine, MessageType, Message, ClearText, Completed FROM Tasks WHERE AgentId = ? ORDER BY StartDate;`
query, err := dbms.database.Query(selectQuery, agentId)
if err != nil {
logs.Debug("", "Failed to query tasks: "+err.Error())
return tasks
}
defer func(query *sql.Rows) {
_ = query.Close()
}(query)
for query.Next() {
taskData := adaptix.TaskData{}
err = query.Scan(&taskData.TaskId, &taskData.AgentId, &taskData.Type, &taskData.Client, &taskData.User, &taskData.Computer, &taskData.StartDate, &taskData.FinishDate, &taskData.CommandLine, &taskData.MessageType, &taskData.Message, &taskData.ClearText, &taskData.Completed)
if err != nil {
continue
}
tasks = append(tasks, taskData)
}
}
return tasks
}
func (dbms *DBMS) DbTasksListCompleted(agentId string, limit int, offset int) ([]adaptix.TaskData, error) {
if !dbms.DatabaseExists() {
return nil, errors.New("database does not exist")
}
selectQuery := `SELECT TaskId, AgentId, TaskType, Client, User, Computer, StartDate, FinishDate, CommandLine, MessageType, Message, ClearText, Completed FROM Tasks WHERE AgentId = ? AND Completed = 1 ORDER BY StartDate DESC LIMIT ? OFFSET ?;`
rows, err := dbms.database.Query(selectQuery, agentId, limit, offset)
if err != nil {
return nil, err
}
defer func(rows *sql.Rows) {
_ = rows.Close()
}(rows)
tasks := make([]adaptix.TaskData, 0, limit)
for rows.Next() {
var taskData adaptix.TaskData
err = rows.Scan(&taskData.TaskId, &taskData.AgentId, &taskData.Type, &taskData.Client, &taskData.User, &taskData.Computer, &taskData.StartDate, &taskData.FinishDate, &taskData.CommandLine, &taskData.MessageType, &taskData.Message, &taskData.ClearText, &taskData.Completed)
if err != nil {
continue
}
tasks = append(tasks, taskData)
}
return tasks, nil
}
func (dbms *DBMS) DbTasksLimited(agentId string, limit int) []adaptix.TaskData {
var tasks []adaptix.TaskData
ok := dbms.DatabaseExists()
if ok {
selectQuery := `SELECT TaskId, AgentId, TaskType, Client, User, Computer, StartDate, FinishDate, CommandLine, MessageType, Message, ClearText, Completed FROM Tasks WHERE AgentId = ? ORDER BY StartDate DESC LIMIT ?;`
query, err := dbms.database.Query(selectQuery, agentId, limit)
if err != nil {
logs.Debug("", "Failed to query tasks: "+err.Error())
return tasks
}
defer func(query *sql.Rows) {
_ = query.Close()
}(query)
for query.Next() {
taskData := adaptix.TaskData{}
err = query.Scan(&taskData.TaskId, &taskData.AgentId, &taskData.Type, &taskData.Client, &taskData.User, &taskData.Computer, &taskData.StartDate, &taskData.FinishDate, &taskData.CommandLine, &taskData.MessageType, &taskData.Message, &taskData.ClearText, &taskData.Completed)
if err != nil {
continue
}
tasks = append(tasks, taskData)
}
}
for i, j := 0, len(tasks)-1; i < j; i, j = i+1, j-1 {
tasks[i], tasks[j] = tasks[j], tasks[i]
}
return tasks
}
func (dbms *DBMS) DbTasksCount(agentId string) int {
ok := dbms.DatabaseExists()
if !ok {
return 0
}
var count int
selectQuery := `SELECT COUNT(*) FROM Tasks WHERE AgentId = ?;`
err := dbms.database.QueryRow(selectQuery, agentId).Scan(&count)
if err != nil {
return 0
}
return count
}