diff options
| author | Nikolay Govorov <me@govorov.online> | 2026-03-30 05:39:20 +0100 |
|---|---|---|
| committer | Nikolay Govorov <me@govorov.online> | 2026-03-30 05:50:55 +0100 |
| commit | 35e4a967c54551caed5507b44dfb9469d2fb960b (patch) | |
| tree | f2807dcad98c9c1207b16ac2845a9603186cfc71 | |
| parent | 0beaa9733caa4c68057e12c70ff5003eb4fac33c (diff) | |
| download | tar tar.gz tar.bz2 tar.lz tar.xz tar.zst zip | |
Use config instead of flags
Diffstat
| -rw-r--r-- | cmd/mirumd/main.go | 55 | +37 −18 |
| -rw-r--r-- | go.mod | 1 | +1 −0 |
| -rw-r--r-- | go.sum | 4 | +4 −0 |
| -rw-r--r-- | pkg/index.html | 3 | +2 −1 |
| -rw-r--r-- | pkg/mirumd.service | 2 | +1 −1 |
| -rw-r--r-- | pkg/mirumd.yaml | 3 | +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 |
