From f50fded8e65e4d93bafa844d3bc2fe72a601ef2b Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Tue, 29 Jul 2025 13:17:05 +0100 Subject: [PATCH] spindle: move MOTD to embedded file Change-Id: nwnoumtnuulvwvryvqprvmrtqyqksvtn Signed-off-by: oppiliappan --- spindle/config/config.go | 23 +++++++--- spindle/motd | 25 +++++++++++ spindle/server.go | 90 ++++++++++++++++++++++------------------ 3 files changed, 91 insertions(+), 47 deletions(-) create mode 100644 spindle/motd diff --git a/spindle/config/config.go b/spindle/config/config.go index 44f1596..23d1f9f 100644 --- a/spindle/config/config.go +++ b/spindle/config/config.go @@ -2,17 +2,28 @@ package config import ( "context" + "fmt" + "github.com/bluesky-social/indigo/atproto/syntax" "github.com/sethvargo/go-envconfig" ) type Server struct { - ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:6555"` - DBPath string `env:"DB_PATH, default=spindle.db"` - Hostname string `env:"HOSTNAME, required"` - JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"` - Dev bool `env:"DEV, default=false"` - Owner string `env:"OWNER, required"` + ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:6555"` + DBPath string `env:"DB_PATH, default=spindle.db"` + Hostname string `env:"HOSTNAME, required"` + JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"` + Dev bool `env:"DEV, default=false"` + Owner string `env:"OWNER, required"` + Secrets Secrets `env:",prefix=SECRETS_"` +} + +func (s Server) Did() syntax.DID { + return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname)) +} + +type Secrets struct { + Provider string `env:"PROVIDER, default=sqlite"` } type Pipelines struct { diff --git a/spindle/motd b/spindle/motd new file mode 100644 index 0000000..9dbcc9f --- /dev/null +++ b/spindle/motd @@ -0,0 +1,25 @@ + **** + *** *** + *** ** ****** ** + ** * ***** + * ** ** + * * * *************** + ** ** *# ** + * ** ** *** ** + * * ** ** * ****** + * ** ** * ** * * + ** ** *** ** ** * + ** ** * ** * * + ** **** ** * * + ** *** ** ** ** + *** ** ***** + ******************** + ** + * + #************** + ** + ******** + +This is a spindle server. More info at https://tangled.sh/@tangled.sh/core/tree/master/docs/spindle + +Most API routes are under /xrpc/ diff --git a/spindle/server.go b/spindle/server.go index ef933fd..221bc2a 100644 --- a/spindle/server.go +++ b/spindle/server.go @@ -2,6 +2,7 @@ package spindle import ( "context" + _ "embed" "encoding/json" "fmt" "log/slog" @@ -11,6 +12,7 @@ import ( "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/eventconsumer" "tangled.sh/tangled.sh/core/eventconsumer/cursor" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/jetstream" "tangled.sh/tangled.sh/core/log" "tangled.sh/tangled.sh/core/notifier" @@ -20,22 +22,29 @@ import ( "tangled.sh/tangled.sh/core/spindle/engine" "tangled.sh/tangled.sh/core/spindle/models" "tangled.sh/tangled.sh/core/spindle/queue" + "tangled.sh/tangled.sh/core/spindle/secrets" + "tangled.sh/tangled.sh/core/spindle/xrpc" ) +//go:embed motd +var motd []byte + const ( rbacDomain = "thisserver" ) type Spindle struct { - jc *jetstream.JetstreamClient - db *db.DB - e *rbac.Enforcer - l *slog.Logger - n *notifier.Notifier - eng *engine.Engine - jq *queue.Queue - cfg *config.Config - ks *eventconsumer.Consumer + jc *jetstream.JetstreamClient + db *db.DB + e *rbac.Enforcer + l *slog.Logger + n *notifier.Notifier + eng *engine.Engine + jq *queue.Queue + cfg *config.Config + ks *eventconsumer.Consumer + res *idresolver.Resolver + vault secrets.Manager } func Run(ctx context.Context) error { @@ -76,15 +85,19 @@ func Run(ctx context.Context) error { } jc.AddDid(cfg.Server.Owner) + resolver := idresolver.DefaultResolver() + spindle := Spindle{ - jc: jc, - e: e, - db: d, - l: logger, - n: &n, - eng: eng, - jq: jq, - cfg: cfg, + jc: jc, + e: e, + db: d, + l: logger, + n: &n, + eng: eng, + jq: jq, + cfg: cfg, + res: resolver, + vault: vault, } err = e.AddSpindle(rbacDomain) @@ -144,39 +157,34 @@ func (s *Spindle) Router() http.Handler { mux := chi.NewRouter() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte( - ` **** - *** *** - *** ** ****** ** - ** * ***** - * ** ** - * * * *************** - ** ** *# ** - * ** ** *** ** - * * ** ** * ****** - * ** ** * ** * * - ** ** *** ** ** * - ** ** * ** * * - ** **** ** * * - ** *** ** ** ** - *** ** ***** - ******************** - ** - * - #************** - ** - ******** - -This is a spindle server. More info at https://tangled.sh/@tangled.sh/core/tree/master/docs/spindle`)) + w.Write(motd) }) mux.HandleFunc("/events", s.Events) mux.HandleFunc("/owner", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(s.cfg.Server.Owner)) }) mux.HandleFunc("/logs/{knot}/{rkey}/{name}", s.Logs) + + mux.Mount("/xrpc", s.XrpcRouter()) return mux } +func (s *Spindle) XrpcRouter() http.Handler { + logger := s.l.With("route", "xrpc") + + x := xrpc.Xrpc{ + Logger: logger, + Db: s.db, + Enforcer: s.e, + Engine: s.eng, + Config: s.cfg, + Resolver: s.res, + Vault: s.vault, + } + + return x.Router() +} + func (s *Spindle) processPipeline(ctx context.Context, src eventconsumer.Source, msg eventconsumer.Message) error { if msg.Nsid == tangled.PipelineNSID { tpl := tangled.Pipeline{} -- 2.43.0