summaryrefslogtreecommitdiff
path: root/pkg/server/module
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/module')
-rw-r--r--pkg/server/module/auth.go9
-rw-r--r--pkg/server/module/hex.go2
-rw-r--r--pkg/server/module/tee.go112
3 files changed, 115 insertions, 8 deletions
diff --git a/pkg/server/module/auth.go b/pkg/server/module/auth.go
index de58e82..5e5caeb 100644
--- a/pkg/server/module/auth.go
+++ b/pkg/server/module/auth.go
@@ -4,7 +4,6 @@ import (
"crypto/md5"
"crypto/rand"
"errors"
- "fmt"
"io"
"tunnel/pkg/netstring"
"tunnel/pkg/server/env"
@@ -124,12 +123,8 @@ func (a *auth) Recv(rq, wq queue.Q) (err error) {
}
func getAuthSecret(env env.Env) string {
- if id, ok := env.Find("tunnel"); ok {
- k := fmt.Sprintf("tunnel.%s.secret", id)
-
- if v, ok := env.Find(k); ok {
- return v
- }
+ if v := env.Eval("@{tunnel.@{tunnel}.secret}"); v != "" {
+ return v
}
return env.Get("secret")
diff --git a/pkg/server/module/hex.go b/pkg/server/module/hex.go
index e71688c..ef4ff37 100644
--- a/pkg/server/module/hex.go
+++ b/pkg/server/module/hex.go
@@ -24,7 +24,7 @@ func (m hexModule) Recv(rq, wq queue.Q) error {
return queue.IoCopy(r, wq.Writer())
}
-func (m hexModule) Open(env env.Env) (interface{}, error) {
+func (m hexModule) Open(env.Env) (interface{}, error) {
return m, nil
}
diff --git a/pkg/server/module/tee.go b/pkg/server/module/tee.go
new file mode 100644
index 0000000..7953247
--- /dev/null
+++ b/pkg/server/module/tee.go
@@ -0,0 +1,112 @@
+package module
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "encoding/hex"
+ "sync"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+const teeDefaultPath = "/tmp/tunnel.dump"
+
+type tee struct {
+ f *os.File
+ mu sync.Mutex
+ wg sync.WaitGroup
+}
+
+type teeModule struct {
+ path string
+}
+
+func (t *tee) dump(s string, p []byte) error {
+ var out bytes.Buffer
+
+ fmt.Fprintln(&out, s, len(p))
+
+ w := hex.Dumper(&out)
+ w.Write(p)
+ w.Close()
+
+ if _, err := t.f.Write(out.Bytes()); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (t *tee) Send(rq, wq queue.Q) error {
+ defer t.wg.Done()
+
+ for b := range rq {
+ t.dump(">", b)
+ wq <- b
+ }
+
+ return nil
+}
+
+func (t *tee) Recv(rq, wq queue.Q) error {
+ defer t.wg.Done()
+
+ for b := range rq {
+ t.dump("<", b)
+ wq <- b
+ }
+
+ return nil
+}
+
+func (m *teeModule) where(env env.Env) string {
+ if m.path != "" {
+ return m.path
+ }
+
+ if v := env.Eval("@{tunnel.@{tunnel}.tee.path}"); v != "" {
+ return v
+ }
+
+ if v, ok := env.Find("module.tee.path"); ok {
+ return v
+ }
+
+ return teeDefaultPath
+}
+
+func (m *teeModule) Open(env env.Env) (interface{}, error) {
+ tid, sid := env.Get("tunnel"), env.Get("stream")
+ name := fmt.Sprintf("%s.%s.%s", m.where(env), tid, sid)
+
+ var t tee
+
+ if f, err := os.Create(name); err != nil {
+ return nil, err
+ } else {
+ t.f = f
+ }
+
+ t.wg.Add(2)
+
+ go func() {
+ t.wg.Wait()
+ t.f.Close()
+ }()
+
+ return &t, nil
+}
+
+func newTeeModule(opts opts.Opts, env env.Env) (module, error) {
+ m := &teeModule{}
+ if path, ok := opts["path"]; ok {
+ m.path = path
+ }
+ return m, nil
+}
+
+func init() {
+ register("tee", newTeeModule)
+}