feat: add compatible Trojan manager image
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// Package managerconfig owns settings which are not part of Trojan's native JSON.
|
||||
package managerconfig
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
const DefaultPath = "/etc/trojan-manager/manager.yaml"
|
||||
|
||||
type Config struct {
|
||||
SchemaVersion int `yaml:"schema_version" json:"schemaVersion"`
|
||||
Public struct {
|
||||
Domain string `yaml:"domain" json:"domain"`
|
||||
Port int `yaml:"port" json:"port"`
|
||||
} `yaml:"public" json:"public"`
|
||||
Runtime struct {
|
||||
ListenAddress string `yaml:"listen_address" json:"listenAddress"`
|
||||
ListenPort int `yaml:"listen_port" json:"listenPort"`
|
||||
FallbackAddress string `yaml:"fallback_address" json:"fallbackAddress"`
|
||||
FallbackPort int `yaml:"fallback_port" json:"fallbackPort"`
|
||||
} `yaml:"runtime" json:"runtime"`
|
||||
Web struct { ListenAddress string `yaml:"listen_address" json:"listenAddress"`; ListenPort int `yaml:"listen_port" json:"listenPort"` } `yaml:"web" json:"web"`
|
||||
ACME struct { Enabled bool `yaml:"enabled" json:"enabled"`; Domain string `yaml:"domain" json:"domain"`; HTTPPort int `yaml:"http_port" json:"httpPort"` } `yaml:"acme" json:"acme"`
|
||||
Firewall struct { Manage bool `yaml:"manage" json:"manage"` } `yaml:"firewall" json:"firewall"`
|
||||
}
|
||||
|
||||
func Defaults() Config {
|
||||
var c Config
|
||||
c.SchemaVersion = 1; c.Public.Port = 443; c.Runtime.ListenAddress = "0.0.0.0"; c.Runtime.ListenPort = 8443
|
||||
c.Runtime.FallbackAddress = "127.0.0.1"; c.Runtime.FallbackPort = 8081; c.Web.ListenAddress = "127.0.0.1"; c.Web.ListenPort = 8081; c.ACME.HTTPPort = 8082
|
||||
return c
|
||||
}
|
||||
func Path() string { if p := os.Getenv("TROJAN_MANAGER_CONFIG"); p != "" { return p }; return DefaultPath }
|
||||
func Load() (Config, error) { c := Defaults(); b, err := os.ReadFile(Path()); if os.IsNotExist(err) { return c, nil }; if err != nil { return c, err }; err = yaml.Unmarshal(b, &c); return c, err }
|
||||
func Validate(c Config) error {
|
||||
if c.SchemaVersion != 1 { return errors.New("unsupported manager config schema") }
|
||||
ports := []int{c.Public.Port, c.Runtime.ListenPort, c.Runtime.FallbackPort, c.Web.ListenPort, c.ACME.HTTPPort}
|
||||
for _, p := range ports { if p < 1 || p > 65535 { return fmt.Errorf("invalid port %d", p) } }
|
||||
if c.Runtime.ListenPort == c.Web.ListenPort || c.Runtime.ListenPort == c.ACME.HTTPPort || c.Web.ListenPort == c.ACME.HTTPPort { return errors.New("listen, web and ACME ports must be distinct") }
|
||||
return nil
|
||||
}
|
||||
func Save(c Config) error { if err := Validate(c); err != nil { return err }; b, err := yaml.Marshal(c); if err != nil { return err }; p := Path(); if err := os.MkdirAll(filepath.Dir(p), 0750); err != nil { return err }; tmp := p + ".tmp"; if err := os.WriteFile(tmp, b, 0640); err != nil { return err }; return os.Rename(tmp, p) }
|
||||
Reference in New Issue
Block a user