200 lines
6.9 KiB
Go
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
|
|
}
|