diff --git a/Makefile b/Makefile index aeb1c09..ad7bdab 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,14 @@ .POSIX: .SUFFIXES: -all: sh-api sh-index sh-search sh-web +all: sh-admin sh-api sh-index sh-search sh-web generate: go generate ./... +sh-admin: generate + go build -o sh-admin cmd/sh-admin/main.go + sh-api: generate go build -o sh-api cmd/sh-api/main.go @@ -18,4 +21,4 @@ sh-search: generate sh-web: generate go build -o sh-web cmd/sh-web/main.go -.PHONY: all sh-api sh-index sh-search sh-web generate +.PHONY: all sh-admin sh-api sh-index sh-search sh-web generate diff --git a/cmd/sh-admin/main.go b/cmd/sh-admin/main.go new file mode 100644 index 0000000..774ff77 --- /dev/null +++ b/cmd/sh-admin/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "database/sql" + "log" + "os" + + "git.sr.ht/~sircmpwn/getopt" + "github.com/lib/pq" + + "git.sr.ht/~sircmpwn/searchhut/config" +) + +func main() { + var ( + authoritative bool + tags []string + ) + opts, optind, err := getopt.Getopts(os.Args, "at:") + if err != nil { + panic(err) + } + for _, opt := range opts { + switch opt.Option { + case 'a': + authoritative = true + case 't': + tags = append(tags, opt.Value) + } + } + args := os.Args[optind:] + domain := args[0] + + conf := config.Load() + connstr, ok := conf.Get("searchhut", "connection-string") + if !ok { + log.Fatal("Configuration missing connection string") + } + + db, err := sql.Open("postgres", connstr) + if err != nil { + log.Fatal(err) + } + + var id int + row := db.QueryRow(` + INSERT INTO domain ( + hostname, + authoritative, + tags + ) VALUES ($1, $2, coalesce($3, '{}'::text[])) RETURNING id; + `, domain, authoritative, pq.Array(tags)) + if err := row.Scan(&id); err != nil { + log.Fatal(err) + } + log.Printf("Added domain %s with ID %d", domain, id) +}