go-pkg/cmd/mercury/app.mercury.go
2024-02-15 11:58:37 -07:00

108 lines
2.0 KiB
Go

package main
import (
"context"
"fmt"
"os"
"strings"
_ "github.com/lib/pq"
_ "modernc.org/sqlite"
"github.com/oklog/ulid/v2"
"go.sour.is/passwd"
"go.sour.is/passwd/pkg/argon2"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/mercury/app"
"go.sour.is/pkg/mercury/http"
"go.sour.is/pkg/ident"
"go.sour.is/pkg/ident/source"
"go.sour.is/pkg/mercury/mqtt"
"go.sour.is/pkg/mercury/sql"
"go.sour.is/pkg/service"
"go.sour.is/pkg/xdg"
"go.sour.is/pkg/mercury"
)
var baseConfig = `
# mercury.source [handler] [name]
#@mercury.source.http-notify.default
@mercury.source.http-notify.default
match :1 d42.*
endpoint :http://example.com/webhook
@mercury.source.mqtt-notify.default
#match :0 *
#endpoint :mqtt://example.com/topic
disabled :
@mercury.source.mercury-default.default
match :1 mercury.*
@mercury.source.mercury-environ.environ
match :1 mercury.*
`
var _ = apps.Register(50, func(ctx context.Context, svc *service.Harness) error {
ctx, span := lg.Span(ctx)
defer span.End()
conf, err := readConfig(ctx)
if err != nil {
return err
}
app.Register("local", conf)
http.Register()
mqtt.Register()
sql.Register()
err = mercury.Registry.Configure(conf)
if err != nil {
return err
}
span.AddEvent("Enable Mercury")
idm := ident.NewIDM(passwd.New(argon2.Argon2id), ulid.DefaultEntropy())
idm.Add(1, source.NewMercury(mercury.Registry, idm))
svc.Add(mercury.NewHTTP(), ident.NewHTTP(idm))
return nil
})
func readConfig(ctx context.Context) (mercury.SpaceMap, error) {
_, span := lg.Span(ctx)
defer span.End()
conf, err := mercury.ParseText(strings.NewReader(baseConfig))
if err != nil {
return nil, err
}
wd, err := os.Getwd()
if err != err {
return nil, err
}
for _, fn := range xdg.Find(wd+":"+xdg.EnvConfigDirs, "config.mercury") {
span.AddEvent(fmt.Sprint("config:", fn))
fd, err := os.Open(fn)
if err != nil {
return nil, err
}
defer fd.Close()
c, err := mercury.ParseText(fd)
if err != nil {
return nil, err
}
conf.MergeMap(c)
}
return conf, nil
}