Add signed, notarized releases with the server inside the app
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"g.fc.run/misc/byre/internal/tailscale"
|
||||
)
|
||||
|
||||
const serviceLabel = "run.fc.byre"
|
||||
|
||||
const plistTemplate = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>%s</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>%s</string>
|
||||
<string>serve</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>%s</string>
|
||||
</dict>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>StandardOutPath</key>
|
||||
<string>%s</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>%s</string>
|
||||
</dict>
|
||||
</plist>
|
||||
`
|
||||
|
||||
func installCmd() {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
fatal("find executable", "err", err)
|
||||
}
|
||||
exe, err = filepath.EvalSymlinks(exe)
|
||||
if err != nil {
|
||||
fatal("resolve executable", "err", err)
|
||||
}
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
fatal("home dir", "err", err)
|
||||
}
|
||||
|
||||
plistPath := filepath.Join(home, "Library", "LaunchAgents", serviceLabel+".plist")
|
||||
logPath := filepath.Join(home, "Library", "Logs", "byre.log")
|
||||
plist := fmt.Sprintf(plistTemplate, xmlText(serviceLabel), xmlText(exe), xmlText(filepath.Dir(exe)+":"+os.Getenv("PATH")), xmlText(logPath), xmlText(logPath))
|
||||
err = os.MkdirAll(filepath.Dir(plistPath), 0o755)
|
||||
if err != nil {
|
||||
fatal("create launch agents dir", "err", err)
|
||||
}
|
||||
err = os.WriteFile(plistPath, []byte(plist), 0o644)
|
||||
if err != nil {
|
||||
fatal("write launch agent", "err", err)
|
||||
}
|
||||
fmt.Println("wrote", plistPath)
|
||||
|
||||
domain := fmt.Sprintf("gui/%d", os.Getuid())
|
||||
service := domain + "/" + serviceLabel
|
||||
if exec.Command("launchctl", "print", service).Run() == nil {
|
||||
run("launchctl", "bootout", service)
|
||||
}
|
||||
run("launchctl", "bootstrap", domain, plistPath)
|
||||
fmt.Println("started", service, "running", exe)
|
||||
|
||||
url, err := tailscale.ServeRoot(context.Background(), "http://"+defaultListen)
|
||||
if err != nil {
|
||||
fatal("tailscale serve", "err", err)
|
||||
}
|
||||
fmt.Println("byre is at", url)
|
||||
}
|
||||
|
||||
func run(name string, args ...string) {
|
||||
cmd := exec.Command(name, args...)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
fatal("run "+name, "args", args, "err", err)
|
||||
}
|
||||
}
|
||||
|
||||
func xmlText(s string) string {
|
||||
var b strings.Builder
|
||||
xml.EscapeText(&b, []byte(s))
|
||||
return b.String()
|
||||
}
|
||||
+3
-1
@@ -14,6 +14,8 @@ func main() {
|
||||
switch os.Args[1] {
|
||||
case "serve":
|
||||
serveCmd(os.Args[2:])
|
||||
case "install":
|
||||
installCmd()
|
||||
case "run":
|
||||
runCmd(os.Args[2:])
|
||||
default:
|
||||
@@ -22,7 +24,7 @@ func main() {
|
||||
}
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintln(os.Stderr, "usage: byre serve | byre run [--resume ID]")
|
||||
fmt.Fprintln(os.Stderr, "usage: byre serve | byre install | byre run [--resume ID]")
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -17,6 +17,8 @@ import (
|
||||
"g.fc.run/misc/byre/internal/store"
|
||||
)
|
||||
|
||||
const defaultListen = "127.0.0.1:8270"
|
||||
|
||||
func serveCmd(args []string) {
|
||||
configDir, err := os.UserConfigDir()
|
||||
if err != nil {
|
||||
@@ -25,7 +27,7 @@ func serveCmd(args []string) {
|
||||
|
||||
flags := flag.NewFlagSet("serve", flag.ExitOnError)
|
||||
dataDir := flags.String("data", filepath.Join(configDir, "byre"), "directory holding byre's database, worktrees, leads and blobs")
|
||||
listenAddr := flags.String("listen", "127.0.0.1:8270", "address to listen on")
|
||||
listenAddr := flags.String("listen", defaultListen, "address to listen on")
|
||||
ports := flags.Int("ports", store.DefaultPortFirst, "first port of the tasks' port blocks")
|
||||
flags.Parse(args)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user