158 lines
3.1 KiB
Go
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
|
|
}
|