chore: store status

This commit is contained in:
xuu
2024-03-24 15:19:26 -06:00
parent 49bb6cbaea
commit bf54728f21
20 changed files with 760 additions and 147 deletions

29
cmd/mercury/app.info.go Normal file
View File

@@ -0,0 +1,29 @@
package main
import (
"context"
"fmt"
"net/http"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/service"
)
var _ = apps.Register(50, func(ctx context.Context, svc *service.Harness) error {
_, span := lg.Span(ctx)
defer span.End()
svc.Add(&info{})
return nil
})
type info struct{}
func (info) RegisterHTTP(mux *http.ServeMux) {}
func (info) RegisterAPIv1(mux *http.ServeMux) {
mux.HandleFunc("/app-info", func(w http.ResponseWriter, r *http.Request) {
_, version := service.AppName()
fmt.Fprint(w, "mercury", " :: ", version)
})
}

107
cmd/mercury/app.mercury.go Normal file
View File

@@ -0,0 +1,107 @@
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.mercury-default.default
match :1 mercury.*
@mercury.source.mercury-environ.environ
match :1 mercury.*
@mercury.output.http-notify.default
match :1 mercury.*
endpoint :http://sour.is/webhook
#endpoint :mqtt://example.com/topic
#match :1 mercury.*
@mercury.output.mqtt-notify.default
`
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")
fmt.Println(os.Getwd())
idm := ident.NewIDM(passwd.New(argon2.Argon2id), ulid.DefaultEntropy())
idm.Add(1, source.NewMercury(mercury.Registry, idm))
svc.Add(
mercury.NewHTTP(),
ident.NewHTTP(idm, source.NewSession(source.CookieName)),
)
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
}

53
cmd/mercury/main.go Normal file
View File

@@ -0,0 +1,53 @@
package main
import (
"context"
"errors"
"log"
"log/slog"
"net/http"
"os"
"os/signal"
"strconv"
"go.sour.is/pkg/env"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/service"
)
var apps service.Apps
var appName, version = service.AppName()
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
go func() {
<-ctx.Done()
defer cancel() // restore interrupt function
}()
if err := run(ctx); err != nil {
log.Fatal(err)
os.Exit(1)
}
}
func run(ctx context.Context) error {
level := slog.LevelError
if ok, _ := strconv.ParseBool(env.Default("LOG_DEBUG", "TRUE")); ok {
level = slog.LevelDebug
}
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level})))
svc := &service.Harness{}
os.Setenv("TRACE_ENDPOINT", "atombox:4318")
os.Setenv("EV_TRACE_SAMPLE", "always")
ctx, stop := lg.Init(ctx, appName+"-mercury")
svc.OnStop(stop)
svc.Add(lg.NewHTTP(ctx))
svc.Setup(ctx, apps.Apps()...)
// Run application
if err := svc.Run(ctx, appName+"-mercury", version); err != nil && !errors.Is(err, http.ErrServerClosed) {
return err
}
return nil
}

48
cmd/mercury/svc.http.go Normal file
View File

@@ -0,0 +1,48 @@
package main
import (
"context"
"log"
"net/http"
"strings"
"github.com/rs/cors"
"go.sour.is/pkg/env"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/mux"
"go.sour.is/pkg/service"
"go.sour.is/pkg/slice"
)
var _ = apps.Register(20, func(ctx context.Context, svc *service.Harness) error {
s := &http.Server{}
svc.Add(s)
mux := mux.New()
s.Handler = cors.AllowAll().Handler(mux)
// s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// log.Println(r.URL.Path)
// mux.ServeHTTP(w, r)
// })
s.Addr = env.Default("EV_HTTP", ":4088")
if strings.HasPrefix(s.Addr, ":") {
s.Addr = "[::]" + s.Addr
}
svc.OnStart(func(ctx context.Context) error {
_, span := lg.Span(ctx)
defer span.End()
log.Print("Listen on ", s.Addr)
span.AddEvent("begin listen and serve on " + s.Addr)
mux.Add(slice.FilterType[interface{ RegisterHTTP(*http.ServeMux) }](svc.Services...)...)
return s.ListenAndServe()
})
svc.OnStop(s.Shutdown)
return nil
})