aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolay Govorov <me@govorov.online>2026-03-30 05:39:20 +0100
committerNikolay Govorov <me@govorov.online>2026-03-30 05:50:55 +0100
commit35e4a967c54551caed5507b44dfb9469d2fb960b (patch)
treef2807dcad98c9c1207b16ac2845a9603186cfc71
parent0beaa9733caa4c68057e12c70ff5003eb4fac33c (diff)
downloadtar
tar.gz
tar.bz2
tar.lz
tar.xz
tar.zst
zip
Use config instead of flags
Diffstat
-rw-r--r--cmd/mirumd/main.go55+37 −18
-rw-r--r--go.mod1+1 −0
-rw-r--r--go.sum4+4 −0
-rw-r--r--pkg/index.html3+2 −1
-rw-r--r--pkg/mirumd.service2+1 −1
-rw-r--r--pkg/mirumd.yaml3+3 −0
6 files changed, 48 insertions, 20 deletions
diff --git a/cmd/mirumd/main.go b/cmd/mirumd/main.go
index c3c05a9..1960fc4 100644
--- a/cmd/mirumd/main.go
+++ b/cmd/mirumd/main.go
@@ -29,14 +29,22 @@ import (
"github.com/coreos/go-systemd/v22/activation"
"github.com/coreos/go-systemd/v22/daemon"
"go.starlark.net/starlark"
+ "gopkg.in/yaml.v3"
)
-var (
- addr = flag.String("addr", ":3000", "listen address")
- secret = flag.String("secret", "", "GitHub webhook secret")
- token = flag.String("token", "", "GitHub personal access token (required)")
- script = flag.String("script", ".mirum/main.star", "starlark script to run from repo root")
-)
+type config struct {
+ Address string `yaml:"address"`
+ Secret string `yaml:"secret"`
+ Token string `yaml:"token"`
+ Script string `yaml:"script"`
+}
+
+var cfg = config{
+ Address: ":3000",
+ Script: ".mirum/main.star",
+}
+
+var configFile = flag.String("config", "", "path to config file")
type pushEvent struct {
Ref string `json:"ref"`
@@ -96,7 +104,7 @@ func setStatus(owner, repo, sha, state, description string) error {
if err != nil {
return err
}
- req.Header.Set("Authorization", "Bearer "+*token)
+ req.Header.Set("Authorization", "Bearer "+cfg.Token)
req.Header.Set("Accept", "application/vnd.github+json")
resp, err := http.DefaultClient.Do(req)
@@ -121,20 +129,20 @@ func verifySignature(payload []byte, signature string) bool {
if err != nil {
return false
}
- mac := hmac.New(sha256.New, []byte(*secret))
+ mac := hmac.New(sha256.New, []byte(cfg.Secret))
mac.Write(payload)
return hmac.Equal(mac.Sum(nil), decoded)
}
func authURL(cloneURL string) string {
- if *token == "" {
+ if cfg.Token == "" {
return cloneURL
}
u, err := url.Parse(cloneURL)
if err != nil {
return cloneURL
}
- u.User = url.UserPassword("x-access-token", *token)
+ u.User = url.UserPassword("x-access-token", cfg.Token)
return u.String()
}
@@ -184,18 +192,18 @@ func (c *taskCtx) shell(thread *starlark.Thread, fn *starlark.Builtin, args star
func runStarlark(dir string) error {
thread := &starlark.Thread{Name: "mirum"}
- globals, err := starlark.ExecFile(thread, filepath.Join(dir, *script), nil, nil)
+ globals, err := starlark.ExecFile(thread, filepath.Join(dir, cfg.Script), nil, nil)
if err != nil {
return err
}
projectFn, ok := globals["project"]
if !ok {
- return fmt.Errorf("%s: project() not defined", *script)
+ return fmt.Errorf("%s: project() not defined", cfg.Script)
}
fn, ok := projectFn.(starlark.Callable)
if !ok {
- return fmt.Errorf("%s: project is not a function", *script)
+ return fmt.Errorf("%s: project is not a function", cfg.Script)
}
ctx := &taskCtx{dir: dir}
@@ -216,9 +224,20 @@ func runCmd(dir, name string, args ...string) (string, error) {
func main() {
flag.Parse()
- if *token == "" {
- fmt.Fprintln(os.Stderr, "error: --token is required")
- flag.Usage()
+ if *configFile != "" {
+ data, err := os.ReadFile(*configFile)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ if err := yaml.Unmarshal(data, &cfg); err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ }
+
+ if cfg.Token == "" {
+ fmt.Fprintln(os.Stderr, "error: token is required")
os.Exit(1)
}
@@ -230,7 +249,7 @@ func main() {
return
}
- if len(*secret) > 0 && !verifySignature(body, r.Header.Get("X-Hub-Signature-256")) {
+ if len(cfg.Secret) > 0 && !verifySignature(body, r.Header.Get("X-Hub-Signature-256")) {
http.Error(w, "invalid signature", http.StatusUnauthorized)
return
}
@@ -305,7 +324,7 @@ func socketActivationListener() (net.Listener, error) {
if len(listeners) > 0 {
return listeners[0], nil
}
- return net.Listen("tcp", *addr)
+ return net.Listen("tcp", cfg.Address)
}
func watchdog() {
diff --git a/go.mod b/go.mod
index 5e5f10b..0f62d22 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.26.1
require (
github.com/coreos/go-systemd/v22 v22.7.0
go.starlark.net v0.0.0-20260326113308-fadfc96def35
+ gopkg.in/yaml.v3 v3.0.1
)
require golang.org/x/sys v0.42.0 // indirect
diff --git a/go.sum b/go.sum
index 305c53c..b67d3d2 100644
--- a/go.sum
+++ b/go.sum
@@ -8,3 +8,7 @@ golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/pkg/index.html b/pkg/index.html
index 9b0a399..23290c9 100644
--- a/pkg/index.html
+++ b/pkg/index.html
@@ -20,7 +20,8 @@
</head>
<body>
- <h1>Mirum Download</h1>
+ <h1>Install Mirum</h1>
+
<p>An experimental CI built around virtual machines and Starlark</p>
<div class="warn">This project is in its infancy and is <strong>not</strong> intended for production use.</div>
diff --git a/pkg/mirumd.service b/pkg/mirumd.service
index dedf83a..7a424d0 100644
--- a/pkg/mirumd.service
+++ b/pkg/mirumd.service
@@ -16,7 +16,7 @@ RestartSec=30
WatchdogSec=30
NotifyAccess=main
ExecPaths=/usr/local/bin/mirumd /usr/lib
-ExecStart=/usr/local/bin/mirumd --config=/etc/mirumd.yaml
+ExecStart=/usr/local/bin/mirumd -config=/etc/mirumd.yaml
LimitCORE=infinity
LimitNOFILE=500000
AmbientCapabilities=CAP_NET_BIND_SERVICE
diff --git a/pkg/mirumd.yaml b/pkg/mirumd.yaml
index 1ced7ab..7116877 100644
--- a/pkg/mirumd.yaml
+++ b/pkg/mirumd.yaml
@@ -2,3 +2,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
address: :2026
+secret: ""
+token: ""
+script: .mirum/main.star