summaryrefslogtreecommitdiff
path: root/pkg/server
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server')
-rw-r--r--pkg/server/echo.go14
-rw-r--r--pkg/server/env/env.go54
-rw-r--r--pkg/server/hook/aes.go2
-rw-r--r--pkg/server/hook/auth.go2
-rw-r--r--pkg/server/hook/dump.go2
-rw-r--r--pkg/server/hook/proxy.go4
-rw-r--r--pkg/server/server.go27
-rw-r--r--pkg/server/socket/dial.go2
-rw-r--r--pkg/server/socket/proxy.go2
9 files changed, 61 insertions, 48 deletions
diff --git a/pkg/server/echo.go b/pkg/server/echo.go
index 0387a3e..2ac54b9 100644
--- a/pkg/server/echo.go
+++ b/pkg/server/echo.go
@@ -5,7 +5,19 @@ import (
)
func echo(r *request) {
- r.Print(strings.Join(r.args, " "))
+ expand := false
+ args := r.args
+
+ if r.argc > 0 && r.args[0] == "-e" {
+ expand = true
+ args = args[1:]
+ }
+
+ s := strings.Join(args, " ")
+ if expand {
+ s = r.c.s.env.Expand(s)
+ }
+ r.Print(s)
}
func init() {
diff --git a/pkg/server/env/env.go b/pkg/server/env/env.go
index 8594e10..98ee231 100644
--- a/pkg/server/env/env.go
+++ b/pkg/server/env/env.go
@@ -20,7 +20,8 @@ type Env struct {
const namePattern = "[a-zA-Z][a-zA-Z0-9.]*"
var isGoodName = regexp.MustCompile("^" + namePattern + "$").MatchString
-var varRe = regexp.MustCompile("@(" + namePattern + "|{" + namePattern + "})")
+var varexpRe = regexp.MustCompile("@(" + namePattern + "|{" + namePattern + "})")
+var expandRe = regexp.MustCompile("@[" + namePattern + "]")
var errBadVariable = errors.New("bad variable name")
var errEmptyVariable = errors.New("empty variable")
@@ -67,6 +68,11 @@ func (e Env) Get(key string) string {
return v
}
+func (e Env) Has(key string) bool {
+ _, ok := e.Find(key)
+ return ok
+}
+
func (e Env) Set(key string, value string) error {
if !isGoodName(key) {
return errBadVariable
@@ -129,17 +135,9 @@ func (e *env) Clear() {
e.m = nil
}
-func (e Env) Eval(s string) string {
- repl := func(v string) string {
- key := v[1:]
- if key[0] == '{' {
- key = key[1 : len(key)-1]
- }
- return e.Get(key)
- }
-
+func (e Env) replaceWith(r *regexp.Regexp, s string, f func(string) string) string {
for {
- t := varRe.ReplaceAllStringFunc(s, repl)
+ t := r.ReplaceAllStringFunc(s, f)
if t == s {
break
@@ -151,10 +149,36 @@ func (e Env) Eval(s string) string {
return s
}
-func (e Env) GetLocal(key string) string {
- if v := e.Eval("@{tunnel.@{tunnel}." + key + "}"); v != "" {
- return v
+func (e Env) Eval(s string) string {
+ return e.replaceWith(varexpRe, s, func(v string) string {
+ key := v[1:]
+ if key[0] == '{' {
+ key = key[1 : len(key)-1]
+ }
+ return e.Get(key)
+ })
+}
+
+func (e Env) EvalStrings(s []string) []string {
+ t := make([]string, len(s))
+ for n, v := range s {
+ t[n] = e.Eval(v)
+ }
+ return t
+}
+
+func (e Env) Expand(s string) string {
+ return e.replaceWith(expandRe, s, func(v string) string {
+ return e.Get(v[2 : len(v)-1])
+ })
+}
+
+func (e Env) Value(key string) string {
+ if e.Has("tunnel") {
+ if v := e.Expand("@[tunnel.@[tunnel]." + key + "]"); v != "" {
+ return v
+ }
}
- return e.Get(key)
+ return e.Expand(e.Get(key))
}
diff --git a/pkg/server/hook/aes.go b/pkg/server/hook/aes.go
index ef0ef1a..e437651 100644
--- a/pkg/server/hook/aes.go
+++ b/pkg/server/hook/aes.go
@@ -65,7 +65,7 @@ func (a *aesPipe) Recv(rq, wq queue.Q) error {
}
func newAes(env env.Env) *aesPipe {
- s := env.GetLocal("secret")
+ s := env.Value("secret")
h := md5.Sum([]byte(s))
a := &aesPipe{key: make([]byte, 16)}
diff --git a/pkg/server/hook/auth.go b/pkg/server/hook/auth.go
index 86acd91..a30e257 100644
--- a/pkg/server/hook/auth.go
+++ b/pkg/server/hook/auth.go
@@ -151,7 +151,7 @@ func (a *auth) Recv(rq, wq queue.Q) error {
func (h *authHook) Open(env env.Env) (interface{}, error) {
a := &auth{
h: h,
- secret: env.GetLocal("secret"),
+ secret: env.Value("secret"),
recvChallenge: make(chan struct{}),
recvHash: make(chan struct{}),
fail: make(chan struct{}),
diff --git a/pkg/server/hook/dump.go b/pkg/server/hook/dump.go
index d6bcd90..864443b 100644
--- a/pkg/server/hook/dump.go
+++ b/pkg/server/hook/dump.go
@@ -73,7 +73,7 @@ func (h *dumpHook) where(env env.Env) string {
return h.file
}
- if v := env.GetLocal("dump.file"); v != "" {
+ if v := env.Value("dump.file"); v != "" {
return v
}
diff --git a/pkg/server/hook/proxy.go b/pkg/server/hook/proxy.go
index a488f58..7da4c4a 100644
--- a/pkg/server/hook/proxy.go
+++ b/pkg/server/hook/proxy.go
@@ -65,7 +65,7 @@ func (p *proxy) Recv(rq, wq queue.Q) error {
}
func (h *proxyHook) Open(env env.Env) (interface{}, error) {
- addr := env.Eval(h.addr)
+ addr := env.Expand(h.addr)
if !isGoodAddr(addr) {
return nil, fmt.Errorf("invalid addr '%s'", addr)
}
@@ -77,7 +77,7 @@ func (h *proxyHook) Open(env env.Env) (interface{}, error) {
}
if p.auth == "" {
- p.auth = env.GetLocal("proxy.auth")
+ p.auth = env.Value("proxy.auth")
}
return p, nil
diff --git a/pkg/server/server.go b/pkg/server/server.go
index c389d50..5ca81d1 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -7,7 +7,6 @@ import (
"io"
"log"
"net"
- "regexp"
"strings"
"sync"
"time"
@@ -60,8 +59,6 @@ type request struct {
type requestError string
-var wordsRe = regexp.MustCompile("[[:^space:]]+")
-
var errNotImplemented = errors.New("not implemented")
func (c *client) String() string {
@@ -208,9 +205,7 @@ func (s *Server) newClient(conn net.Conn) *client {
return c
}
-func (s *Server) Command(query string) error {
- args := wordsRe.FindAllString(query, -1)
-
+func (s *Server) Command(args []string) error {
r := &request{c: &client{s: s}}
r.run(args)
@@ -290,26 +285,8 @@ func (c *client) decode(b []byte) ([]string, error) {
return t, nil
}
-func (r *request) eval(args []string) []string {
- var out []string
-
- for _, s := range args {
- var t string
-
- if strings.HasPrefix(s, ":") {
- t = s[1:]
- } else {
- t = r.c.s.env.Eval(s)
- }
-
- out = append(out, t)
- }
-
- return out
-}
-
func (r *request) parse(args []string) {
- if c, args := getCmd(r.eval(args)); c == nil {
+ if c, args := getCmd(r.c.s.env.EvalStrings(args)); c == nil {
r.Fatal("command not found")
} else {
r.args = args
diff --git a/pkg/server/socket/dial.go b/pkg/server/socket/dial.go
index 728269e..18dee8f 100644
--- a/pkg/server/socket/dial.go
+++ b/pkg/server/socket/dial.go
@@ -21,7 +21,7 @@ func (s *dialSocket) String() string {
}
func (s *dialSocket) Open(e env.Env) (Conn, error) {
- addr := e.Eval(s.addr)
+ addr := e.Expand(s.addr)
switch s.proto {
case "tcp", "udp":
diff --git a/pkg/server/socket/proxy.go b/pkg/server/socket/proxy.go
index 47f86c9..67c5769 100644
--- a/pkg/server/socket/proxy.go
+++ b/pkg/server/socket/proxy.go
@@ -35,7 +35,7 @@ func newProxySocket(proto string) (S, error) {
func (sock *proxySocket) Open(env env.Env) (Conn, error) {
s := &proxyServer{
sock: sock,
- auth: env.GetLocal("proxy.auth"),
+ auth: env.Value("proxy.auth"),
wait: make(chan status),
env: env,
}