From a69f6eb45311d21014db2acdd43eb013d9358460 Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Tue, 14 Apr 2026 11:17:11 +0000 Subject: [PATCH] knotserver: add motd Signed-off-by: Anirudh Oppiliappan --- knotserver/motd | 13 +++++++++++++ knotserver/router.go | 24 +++++++++++++++++++++++- 2 file(s) changed, 36 insertion(s)(+), 1 deletion(s)(-) diff --git a/knotserver/motd b/knotserver/motd new file mode 100644 --- /dev/null +++ b/knotserver/motd @@ -0,0 +1,13 @@ + + ____ _.-' + _.---..__ .-'____i-+'_.-' + .__ .-'_.---.._i'.-'____.--' + .__""--: .'__..--"_.' "" '.'. __ + ""-: :.___..--" .---._____i.i--""__ + ...___: :________.-"""-.______..--"" + ...____: '.______.-"""-.__.-' + '-.___.' + +This is a knot server. More info at https://docs.tangled.org/knot-self-hosting-guide.html + +Most API routes are under /xrpc/ diff --git a/knotserver/router.go b/knotserver/router.go --- a/knotserver/router.go +++ b/knotserver/router.go @@ -2,10 +2,12 @@ package knotserver import ( "context" + _ "embed" "fmt" "log/slog" "net/http" "strings" + "sync" "github.com/go-chi/chi/v5" "tangled.org/core/idresolver" @@ -19,6 +21,9 @@ "tangled.org/core/rbac" "tangled.org/core/xrpc/serviceauth" ) +//go:embed motd +var defaultMotd []byte + type Knot struct { c *config.Config db *db.DB @@ -27,6 +32,8 @@ e *rbac.Enforcer l *slog.Logger n *notifier.Notifier resolver *idresolver.Resolver + motd []byte + motdMu sync.RWMutex } func Setup(ctx context.Context, c *config.Config, db *db.DB, e *rbac.Enforcer, jc *jetstream.JetstreamClient, n *notifier.Notifier) (http.Handler, error) { @@ -38,6 +45,7 @@ l: log.FromContext(ctx), jc: jc, n: n, resolver: idresolver.DefaultResolver(c.Server.PlcUrl), + motd: defaultMotd, } err := e.AddKnot(rbac.ThisServer) @@ -76,7 +84,7 @@ r.Use(h.CORS) r.Use(h.RequestLogger) r.Get("/", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("This is a knot server. More info at https://tangled.sh")) + w.Write(h.GetMotdContent()) }) r.Route("/{did}", func(r chi.Router) { @@ -102,6 +110,20 @@ // Socket that streams git oplogs r.Get("/events", h.Events) return r +} + +// SetMotdContent sets custom MOTD content, replacing the embedded default. +func (h *Knot) SetMotdContent(content []byte) { + h.motdMu.Lock() + defer h.motdMu.Unlock() + h.motd = content +} + +// GetMotdContent returns the current MOTD content. +func (h *Knot) GetMotdContent() []byte { + h.motdMu.RLock() + defer h.motdMu.RUnlock() + return h.motd } func (h *Knot) XrpcRouter() http.Handler { -- tangled.sh