sshpiper/cmd/sshpiperd/snap/launcher/main.go
Boshi Lian 502249d275
add config for snap (#191)
* add config for snap

* place holder

* fix build

* fit 7.2

* fix lint

* no empty
2023-08-13 07:07:28 -07:00

158 lines
3.1 KiB
Go

package main
import (
"embed"
"encoding/json"
"log"
"os"
"os/exec"
"path"
"strings"
)
//go:embed all:*.txt
var configentry embed.FS
func main() {
bindir := os.Getenv("SNAP")
datadir := os.Getenv("SNAP_DATA")
flags := map[string][][]string{}
configfile := path.Join(datadir, "flags.json")
if len(os.Args) > 1 && os.Args[1] == "generate" {
flags = loadFromSnapctl()
cache, _ := json.Marshal(flags)
if err := os.WriteFile(configfile, cache, 0600); err != nil {
log.Fatal(err)
}
return
}
cache, _ := os.ReadFile(configfile)
_ = json.Unmarshal(cache, &flags)
cmd := exec.Command(path.Join(bindir, "sshpiperd"))
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
for _, flag := range flags["sshpiperd"] {
cmd.Args = append(cmd.Args, "--"+flag[0], flag[1])
}
for _, plugin := range flags["sshpiperd.plugins"][0] {
cmd.Args = append(cmd.Args, path.Join(bindir, plugin))
for _, flag := range flags[plugin] {
cmd.Args = append(cmd.Args, "--"+flag[0], flag[1])
}
cmd.Args = append(cmd.Args, "--")
}
log.Println("starting sshpiperd with args:", cmd)
_ = cmd.Run()
}
func loadFromSnapctl() map[string][][]string {
commondir := os.Getenv("SNAP_COMMON")
flags := map[string][][]string{}
data, err := configentry.ReadFile("configentry.txt")
if err != nil {
log.Fatal(err)
}
for _, line := range strings.Split(string(data), "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
v, err := get(line)
if err != nil {
log.Fatal(err)
}
if v == "" {
continue
}
parts := strings.Split(line, ".")
ns := parts[0]
flag := parts[1]
flags[ns] = append(flags[ns], []string{flag, v})
}
// known defaults
{
v, _ := get("sshpiperd.plugins")
if v == "" {
v = "workingdir"
}
var plugins []string
for _, str := range strings.Split(v, " ") {
str = strings.TrimSpace(str)
if str != "" {
plugins = append(plugins, str)
}
}
flags["sshpiperd.plugins"] = [][]string{plugins}
}
// {
// v, _ := get("sshpiperd.typescript-log-dir")
// if v == "" {
// v = "screenrecord"
// dir := path.Join(commondir, v)
// _ = os.MkdirAll(dir, 0700)
// flags["sshpiperd"] = append(flags["sshpiperd"], []string{"typescript-log-dir", dir})
// }
// }
{
v, _ := get("sshpiperd.server-key-generate-mode")
if v == "" {
v = "notexist"
flags["sshpiperd"] = append(flags["sshpiperd"], []string{"server-key-generate-mode", v})
}
}
{
v, _ := get("sshpiperd.server-key")
if v == "" {
v = "ssh_host_ed25519_key"
file := path.Join(commondir, v)
flags["sshpiperd"] = append(flags["sshpiperd"], []string{"server-key", file})
}
}
{
v, _ := get("workingdir.root")
if v == "" {
v = "workingdir"
dir := path.Join(commondir, v)
_ = os.MkdirAll(dir, 0700)
flags["workingdir"] = append(flags["workingdir"], []string{"root", dir})
}
}
return flags
}
func get(key string) (string, error) {
cmd := exec.Command("snapctl", "get", key)
output, err := cmd.Output()
if err != nil {
return "", err
}
value := string(output)
return strings.TrimSpace(value), nil
}