package main import ( // External werr "git.gibonuddevalla.se/go/wrappederror" "github.com/jmoiron/sqlx" // Standard "encoding/json" "strings" "time" ) type Script struct { ID int Group string Name string Source string Updated time.Time } type Hook struct { ID int Node Node Script Script SSH string } func GetScripts() (scripts []Script, err error) { // {{{ scripts = []Script{} var rows *sqlx.Rows rows, err = db.Queryx(` SELECT * FROM script ORDER BY "group" ASC, name ASC `) if err != nil { err = werr.Wrap(err) return } defer rows.Close() for rows.Next() { var script Script err = rows.StructScan(&script) if err != nil { err = werr.Wrap(err) return } scripts = append(scripts, script) } return } // }}} func UpdateScript(scriptID int, data []byte) (script Script, err error) { // {{{ err = json.Unmarshal(data, &script) if err != nil { err = werr.Wrap(err) return } script.ID = scriptID script.Group = strings.TrimSpace(script.Group) script.Name = strings.TrimSpace(script.Name) if script.Group == "" || script.Name == "" { err = werr.New("Group and name must be provided.") return } if script.ID < 1 { row := db.QueryRowx(` INSERT INTO script("group", "name", "source") VALUES($1, $2, $3) RETURNING id `, strings.TrimSpace(script.Group), strings.TrimSpace(script.Name), script.Source, ) err = row.Scan(&script.ID) } else { _, err = db.Exec(` UPDATE script SET "group" = $2, "name" = $3, "source" = $4 WHERE id = $1 `, scriptID, strings.TrimSpace(script.Group), strings.TrimSpace(script.Name), script.Source, ) } if err != nil { err = werr.Wrap(err) return } return } // }}} func DeleteScript(scriptID int) (err error) { // {{{ _, err = db.Exec(`DELETE FROM script WHERE id = $1`, scriptID) if err != nil { err = werr.Wrap(err) return } return } // }}} func SearchScripts(search string) (scripts []Script, err error) { // {{{ scripts = []Script{} row := db.QueryRow(` SELECT json_agg(script) AS scripts FROM public.script WHERE name ILIKE $1 ORDER BY "group" ASC, name ASC `, search, ) var jsonBody []byte err = row.Scan(&jsonBody) if err != nil { err = werr.Wrap(err) return } err = json.Unmarshal(jsonBody, &scripts) if err != nil { err = werr.Wrap(err) return } return } // }}} func HookScript(nodeID, scriptID int) (err error) {// {{{ _, err = db.Exec(`INSERT INTO hook(node_id, script_id, ssh) VALUES($1, $2, '')`, nodeID, scriptID) return }// }}} func UpdateHook(hook Hook) (err error) { // {{{ _, err = db.Exec(`UPDATE hook SET ssh=$2 WHERE id=$1`, hook.ID, strings.TrimSpace(hook.SSH)) if err != nil { err = werr.Wrap(err) return } return } // }}} func DeleteHook(hookID int) (err error) { // {{{ _, err = db.Exec(`DELETE FROM hook WHERE id=$1`, hookID) if err != nil { err = werr.Wrap(err) return } return } // }}}