summaryrefslogtreecommitdiff
path: root/pkg/server/hook/dump.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-05-27 17:29:59 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-05-27 17:29:59 +0300
commite00995cf2a5968ae94d4dc0abfe21a66dae5cd54 (patch)
treeefc7c389818b9713d92dde5f231a71fde0185699 /pkg/server/hook/dump.go
parenta29c4614431c0f7b705ee793f0a98348cdd29595 (diff)
rename hook tee to dump
Diffstat (limited to 'pkg/server/hook/dump.go')
-rw-r--r--pkg/server/hook/dump.go115
1 files changed, 115 insertions, 0 deletions
diff --git a/pkg/server/hook/dump.go b/pkg/server/hook/dump.go
new file mode 100644
index 0000000..d6bcd90
--- /dev/null
+++ b/pkg/server/hook/dump.go
@@ -0,0 +1,115 @@
+package hook
+
+import (
+ "bytes"
+ "encoding/hex"
+ "fmt"
+ "os"
+ "path"
+ "time"
+ "tunnel/pkg/config"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+const dumpDefaultFile = "/tmp/tunnel/dump"
+
+type dump struct {
+ f *os.File
+ h *dumpHook
+}
+
+type dumpHook struct {
+ file string
+ time bool
+}
+
+func (t *dump) write(s string, p []byte) error {
+ var out bytes.Buffer
+
+ if t.h.time {
+ now := time.Now().Format(config.TimeMsFormat)
+ fmt.Fprintln(&out, now, s, len(p))
+ } else {
+ 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 *dump) Send(rq, wq queue.Q) error {
+ for b := range rq {
+ t.write(">", b)
+ wq <- b
+ }
+
+ return nil
+}
+
+func (t *dump) Recv(rq, wq queue.Q) error {
+ for b := range rq {
+ t.write("<", b)
+ wq <- b
+ }
+
+ return nil
+}
+
+func (t *dump) Close() {
+ t.f.Close()
+}
+
+func (h *dumpHook) where(env env.Env) string {
+ if h.file != "" {
+ return h.file
+ }
+
+ if v := env.GetLocal("dump.file"); v != "" {
+ return v
+ }
+
+ return dumpDefaultFile
+}
+
+func (h *dumpHook) Open(env env.Env) (interface{}, error) {
+ file := h.where(env)
+ dir := path.Dir(file)
+
+ if err := os.MkdirAll(dir, 0755); err != nil {
+ return nil, err
+ }
+
+ tid, sid := env.Get("tunnel"), env.Get("stream")
+ name := fmt.Sprintf("%s.%s.%s", file, tid, sid)
+
+ t := &dump{h: h}
+
+ if f, err := os.Create(name); err != nil {
+ return nil, err
+ } else {
+ t.f = f
+ }
+
+ return t, nil
+}
+
+func newDumpHook(opts opts.Opts) (hook, error) {
+ h := &dumpHook{
+ file: opts["file"],
+ time: opts.Bool("time"),
+ }
+ return h, nil
+}
+
+func init() {
+ register("dump", newDumpHook)
+}