Script execution list

This commit is contained in:
Magnus Åhall 2025-08-08 18:15:13 +02:00
parent 13a5b9a973
commit 55724b36b5
8 changed files with 517 additions and 14 deletions

View file

@ -3,6 +3,7 @@ package main
import (
// External
werr "git.gibonuddevalla.se/go/wrappederror"
"github.com/jmoiron/sqlx"
// Standard
"bytes"
@ -25,15 +26,30 @@ type ScriptExecution struct {
ID int
TimeStart sql.NullTime `db:"time_start"`
TimeEnd sql.NullTime `db:"time_end"`
Source []byte
Data []byte
ScriptName string `db:"script_name"`
Source string
Data string
SSH string
Env []byte
Env string
OutputStdout sql.NullString `db:"output_stdout"`
OutputStderr sql.NullString `db:"output_stderr"`
ExitCode sql.NullInt16
}
type ScriptExecutionBrief struct {
ID int
TimeStart sql.NullTime `db:"time_start"`
TimeEnd sql.NullTime `db:"time_end"`
ScriptName string `db:"script_name"`
SSH string
ExitCode sql.NullInt16
HasSource bool `db:"has_source"`
HasData bool `db:"has_data"`
HasEnv bool `db:"has_env"`
HasOutputStdout bool `db:"has_output_stdout"`
HasOutputStderr bool `db:"has_output_stderr"`
}
func NewScriptScheduler() (sched ScriptScheduler) {
sched.EventQueue = make(chan string, 64)
return
@ -200,7 +216,7 @@ func (se *ScriptExecution) SSHCommand(stdin []byte, log bool, args ...string) (s
func (se *ScriptExecution) UploadScript() (fnames []string, err error) { // {{{
var filenames string
filenames, err = se.SSHCommand(
se.Source,
[]byte(se.Source),
true,
`sh -c 'RUNENV=$(mktemp -t datagraph.XXXXXX) && SCRIPT=$(mktemp -t datagraph.XXXXXX) && touch $RUNENV $SCRIPT && chmod 700 $RUNENV $SCRIPT && cat >$SCRIPT && echo $RUNENV $SCRIPT'`,
)
@ -219,7 +235,7 @@ func (se *ScriptExecution) UploadScript() (fnames []string, err error) { // {{{
} // }}}
func (se *ScriptExecution) UploadEnv(envFname, scriptFname string) (err error) { // {{{
env := make(map[string]string)
err = json.Unmarshal(se.Env, &env)
err = json.Unmarshal([]byte(se.Env), &env)
if err != nil {
err = werr.Wrap(err)
return
@ -243,9 +259,79 @@ func (se *ScriptExecution) UploadEnv(envFname, scriptFname string) (err error) {
return
} // }}}
func (se *ScriptExecution) RunScript(fname string) (err error) { // {{{
_, err = se.SSHCommand(se.Data, true, fname)
_, err = se.SSHCommand([]byte(se.Data), true, fname)
if err != nil {
err = werr.Wrap(err)
}
return
} // }}}
func GetScriptExecutions() (executions []ScriptExecutionBrief, err error) { // {{{
executions = []ScriptExecutionBrief{}
var rows *sqlx.Rows
rows, err = db.Queryx(`
SELECT
e.id,
time_start,
time_end,
ssh,
sl.name AS script_name,
exitcode,
LENGTH(source) > 0 AS has_source,
LENGTH(data::varchar) > 0 AS has_data,
LENGTH(env::varchar) > 0 AS has_env,
LENGTH(output_stdout) > 0 AS has_output_stdout,
LENGTH(output_stderr) > 0 AS has_output_stderr
FROM execution e
INNER JOIN script_log sl ON e.script_log_id = sl.id
ORDER BY
id DESC
LIMIT 100
`)
if err != nil {
err = werr.Wrap(err)
return
}
defer rows.Close()
for rows.Next() {
var execution ScriptExecutionBrief
err = rows.StructScan(&execution)
if err != nil {
err = werr.Wrap(err)
return
}
executions = append(executions, execution)
}
return
} // }}}
func GetScriptExecution(id int) (e ScriptExecution, err error) {
row := db.QueryRowx(`
SELECT
e.id,
time_start,
time_end,
ssh,
sl.name AS script_name,
sl.source,
exitcode,
data,
env,
output_stdout,
output_stderr
FROM execution e
INNER JOIN script_log sl ON e.script_log_id = sl.id
WHERE
e.id = $1`,
id,
)
err = row.StructScan(&e)
if err != nil {
err = werr.Wrap(err)
return
}
return
}