Added automatical hook scheduling

This commit is contained in:
Magnus Åhall 2025-08-11 20:54:36 +02:00
parent e0628bc480
commit 463d2805b3
6 changed files with 124 additions and 28 deletions

110
script.go
View file

@ -23,11 +23,12 @@ type Script struct {
}
type Hook struct {
ID int
Node Node
Script Script
SSH string
Env map[string]string
ID int
Node Node
Script Script
SSH string
Env map[string]string
ScheduleOnChildUpdate bool `db:"schedule_on_child_update"`
}
func GetScript(scriptID int) (script Script, err error) { // {{{
@ -135,13 +136,20 @@ func SearchScripts(search string) (scripts []Script, err error) { // {{{
row := db.QueryRow(`
SELECT
json_agg(script) AS scripts
FROM public.script
WHERE
name ILIKE $1
ORDER BY
"group" ASC,
name ASC
COALESCE(
json_agg(scripts),
'[]'::json
) AS scripts
FROM (
SELECT
to_json(script) AS scripts
FROM public.script
WHERE
name ILIKE $1
ORDER BY
"group" ASC,
name ASC
) scripts
`,
search,
)
@ -172,11 +180,12 @@ func GetHook(hookID int) (hook Hook, err error) { // {{{
to_json(res)
FROM (
SELECT
h.id,
h.ssh,
h.env,
(SELECT to_json(node) FROM node WHERE id = h.node_id) AS node,
(SELECT to_json(script) FROM script WHERE id = h.script_id) AS script
h.id,
h.ssh,
h.env,
h.schedule_on_child_update,
(SELECT to_json(node) FROM node WHERE id = h.node_id) AS node,
(SELECT to_json(script) FROM script WHERE id = h.script_id) AS script
FROM hook h
WHERE
h.id = $1
@ -198,7 +207,20 @@ func GetHook(hookID int) (hook Hook, err error) { // {{{
} // }}}
func UpdateHook(hook Hook) (err error) { // {{{
j, _ := json.Marshal(hook.Env)
_, err = db.Exec(`UPDATE hook SET ssh=$2, env=$3 WHERE id=$1`, hook.ID, strings.TrimSpace(hook.SSH), j)
_, err = db.Exec(`
UPDATE hook
SET
ssh=$2,
env=$3,
schedule_on_child_update=$4
WHERE
id=$1
`,
hook.ID,
strings.TrimSpace(hook.SSH),
j,
hook.ScheduleOnChildUpdate,
)
if err != nil {
err = werr.Wrap(err)
return
@ -259,6 +281,58 @@ func ScheduleHook(hookID int) (err error) { // {{{
return
} // }}}
func ScheduleHookRecursivelyUpwards(nodeID int) (err error) { // {{{
var rows *sql.Rows
rows, err = db.Query(`
WITH RECURSIVE rec AS (
SELECT
id,
parent_id
FROM public.node
WHERE
id = $1
UNION ALL
SELECT
n.id,
n.parent_id
FROM node n
INNER JOIN rec ON n.id = rec.parent_id
)
SELECT
hook.id
FROM rec
INNER JOIN hook ON
hook.node_id = rec.id AND
hook.schedule_on_child_update
`,
nodeID,
)
if err != nil {
err = werr.Wrap(err)
return
}
defer rows.Close()
for rows.Next() {
var hookID int
err = rows.Scan(&hookID)
if err != nil {
err = werr.Wrap(err)
return
}
err = ScheduleHook(hookID)
if err != nil {
err = werr.Wrap(err)
return
}
}
return
} // }}}
func ScriptPreservedID(name, source string) (id int, err error) { // {{{
sum := md5.Sum([]byte(source))