go mod
parent
00591f5dde
commit
32891c518c
|
|
@ -1,115 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"local/rproxy3/storage/packable"
|
|
||||||
"log"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetPort() string {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagPort, v)
|
|
||||||
return ":" + strings.TrimPrefix(v.String(), ":")
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoutes() map[string]string {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagRoutes, v)
|
|
||||||
m := make(map[string]string)
|
|
||||||
for _, v := range strings.Split(v.String(), ",") {
|
|
||||||
if len(v) == 0 {
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
from := v[:strings.Index(v, ":")]
|
|
||||||
to := v[strings.Index(v, ":")+1:]
|
|
||||||
m[from] = to
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTCP() (string, bool) {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagTCP, v)
|
|
||||||
tcpAddr := v.String()
|
|
||||||
return tcpAddr, notEmpty(tcpAddr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSSL() (string, string, bool) {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagCert, v)
|
|
||||||
certPath := v.String()
|
|
||||||
conf.Get(nsConf, flagKey, v)
|
|
||||||
keyPath := v.String()
|
|
||||||
return certPath, keyPath, notEmpty(certPath, keyPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAuth() (string, string, bool) {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagUser, v)
|
|
||||||
user := v.String()
|
|
||||||
conf.Get(nsConf, flagPass, v)
|
|
||||||
pass := v.String()
|
|
||||||
return user, pass, notEmpty(user, pass)
|
|
||||||
}
|
|
||||||
|
|
||||||
func notEmpty(s ...string) bool {
|
|
||||||
for i := range s {
|
|
||||||
if s[i] == "" || s[i] == "/dev/null" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRate() (int, int) {
|
|
||||||
r := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagRate, r)
|
|
||||||
b := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagBurst, b)
|
|
||||||
|
|
||||||
rate, err := strconv.Atoi(r.String())
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("illegal rate: %v", err)
|
|
||||||
rate = 5
|
|
||||||
}
|
|
||||||
burst, _ := strconv.Atoi(b.String())
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("illegal burst: %v", err)
|
|
||||||
burst = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
return rate, burst
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTimeout() int {
|
|
||||||
t := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagTimeout, t)
|
|
||||||
|
|
||||||
timeout, err := strconv.Atoi(t.String())
|
|
||||||
if err != nil || timeout == 5 {
|
|
||||||
return 5
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeout
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRewrites(hostMatch string) map[string]string {
|
|
||||||
v := packable.NewString()
|
|
||||||
conf.Get(nsConf, flagRewrites, v)
|
|
||||||
m := make(map[string]string)
|
|
||||||
for _, v := range strings.Split(v.String(), ",") {
|
|
||||||
vs := strings.Split(v, ":")
|
|
||||||
if len(v) < 3 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
host := vs[0]
|
|
||||||
if host != hostMatch {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
from := vs[1]
|
|
||||||
to := strings.Join(vs[2:], ":")
|
|
||||||
m[from] = to
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
161
.config/new.go
161
.config/new.go
|
|
@ -1,161 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"io/ioutil"
|
|
||||||
"local/rproxy3/storage"
|
|
||||||
"local/rproxy3/storage/packable"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
yaml "gopkg.in/yaml.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
const nsConf = "configuration"
|
|
||||||
const flagPort = "p"
|
|
||||||
const flagRoutes = "r"
|
|
||||||
const flagConf = "c"
|
|
||||||
const flagCert = "crt"
|
|
||||||
const flagTCP = "tcp"
|
|
||||||
const flagKey = "key"
|
|
||||||
const flagUser = "user"
|
|
||||||
const flagPass = "pass"
|
|
||||||
const flagRate = "rate"
|
|
||||||
const flagBurst = "burst"
|
|
||||||
const flagTimeout = "timeout"
|
|
||||||
const flagRewrites = "rw"
|
|
||||||
|
|
||||||
var conf = storage.NewMap()
|
|
||||||
|
|
||||||
type toBind struct {
|
|
||||||
flag string
|
|
||||||
value *string
|
|
||||||
}
|
|
||||||
|
|
||||||
type fileConf struct {
|
|
||||||
Port string `yaml:"p"`
|
|
||||||
Routes []string `yaml:"r"`
|
|
||||||
CertPath string `yaml:"crt"`
|
|
||||||
TCPPath string `yaml:"tcp"`
|
|
||||||
KeyPath string `yaml:"key"`
|
|
||||||
Username string `yaml:"user"`
|
|
||||||
Password string `yaml:"pass"`
|
|
||||||
Rate string `yaml:"rate"`
|
|
||||||
Burst string `yaml:"burst"`
|
|
||||||
Timeout string `yaml:"timeout"`
|
|
||||||
Rewrites []string `yaml:"rw"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func Init() error {
|
|
||||||
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
|
|
||||||
log.SetFlags(log.Ltime | log.Lshortfile)
|
|
||||||
if err := fromFile(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := fromFlags(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromFile() error {
|
|
||||||
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
|
|
||||||
defer func() {
|
|
||||||
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
|
|
||||||
}()
|
|
||||||
flag.String(flagConf, "/dev/null", "yaml config file path")
|
|
||||||
flag.Parse()
|
|
||||||
confFlag := flag.Lookup(flagConf)
|
|
||||||
if confFlag == nil || confFlag.Value.String() == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
confBytes, err := ioutil.ReadFile(confFlag.Value.String())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var c fileConf
|
|
||||||
if err := yaml.Unmarshal(confBytes, &c); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagPort, packable.NewString(c.Port)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagRoutes, packable.NewString(strings.Join(c.Routes, ","))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagCert, packable.NewString(c.CertPath)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagTCP, packable.NewString(c.TCPPath)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagKey, packable.NewString(c.KeyPath)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagUser, packable.NewString(c.Username)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagPass, packable.NewString(c.Password)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagRate, packable.NewString(c.Rate)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagBurst, packable.NewString(c.Burst)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagTimeout, packable.NewString(c.Timeout)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, flagRewrites, packable.NewString(strings.Join(c.Rewrites, ","))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromFlags() error {
|
|
||||||
binds := make([]toBind, 0)
|
|
||||||
binds = append(binds, addFlag(flagPort, "51555", "port to bind to"))
|
|
||||||
binds = append(binds, addFlag(flagConf, "", "configuration file path"))
|
|
||||||
binds = append(binds, addFlag(flagRoutes, "", "comma-separated routes to map, each as from:scheme://to.tld:port"))
|
|
||||||
binds = append(binds, addFlag(flagCert, "", "path to .crt"))
|
|
||||||
binds = append(binds, addFlag(flagTCP, "", "tcp addr"))
|
|
||||||
binds = append(binds, addFlag(flagKey, "", "path to .key"))
|
|
||||||
binds = append(binds, addFlag(flagUser, "", "basic auth username"))
|
|
||||||
binds = append(binds, addFlag(flagPass, "", "basic auth password"))
|
|
||||||
binds = append(binds, addFlag(flagRate, "100", "rate limit per second"))
|
|
||||||
binds = append(binds, addFlag(flagBurst, "100", "rate limit burst"))
|
|
||||||
binds = append(binds, addFlag(flagTimeout, "30", "seconds to wait for limiter"))
|
|
||||||
binds = append(binds, addFlag(flagRewrites, "", "comma-separated from:replace:replacement:oauth to rewrite in response bodies"))
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
for _, bind := range binds {
|
|
||||||
confFlag := flag.Lookup(bind.flag)
|
|
||||||
if confFlag == nil || confFlag.Value.String() == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err := conf.Set(nsConf, bind.flag, packable.NewString(*bind.value)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func addFlag(key, def, help string) toBind {
|
|
||||||
def = getFlagOrDefault(key, def)
|
|
||||||
v := flag.String(key, def, help)
|
|
||||||
return toBind{
|
|
||||||
flag: key,
|
|
||||||
value: v,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getFlagOrDefault(key, def string) string {
|
|
||||||
v := packable.NewString()
|
|
||||||
if err := conf.Get(nsConf, key, v); err != nil {
|
|
||||||
return def
|
|
||||||
}
|
|
||||||
return v.String()
|
|
||||||
}
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestInit(t *testing.T) {
|
|
||||||
was := os.Args[:]
|
|
||||||
os.Args = []string{"program"}
|
|
||||||
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
|
|
||||||
defer func() {
|
|
||||||
os.Args = was[:]
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err := Init(); err != nil {
|
|
||||||
t.Errorf("failed to init: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFromFile(t *testing.T) {
|
|
||||||
was := os.Args[:]
|
|
||||||
os.Args = []string{"program"}
|
|
||||||
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
|
|
||||||
defer func() {
|
|
||||||
os.Args = was[:]
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err := fromFile(); err != nil {
|
|
||||||
t.Errorf("failed from file: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFromFlags(t *testing.T) {
|
|
||||||
was := os.Args[:]
|
|
||||||
os.Args = []string{"program"}
|
|
||||||
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
|
|
||||||
defer func() {
|
|
||||||
os.Args = was[:]
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err := fromFlags(); err != nil {
|
|
||||||
t.Errorf("failed from flags: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
module local/rproxy3
|
||||||
|
|
||||||
|
go 1.18
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/google/uuid v1.3.0
|
||||||
|
golang.org/x/time v0.1.0
|
||||||
|
local/args v0.0.0-00010101000000-000000000000
|
||||||
|
local/logb v0.0.0-00010101000000-000000000000
|
||||||
|
)
|
||||||
|
|
||||||
|
require gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|
||||||
|
replace local/args => ../args
|
||||||
|
|
||||||
|
replace local/logb => ../logb
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
||||||
|
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
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.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
Loading…
Reference in New Issue