diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-05-27 17:29:59 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-05-27 17:29:59 +0300 |
| commit | e00995cf2a5968ae94d4dc0abfe21a66dae5cd54 (patch) | |
| tree | efc7c389818b9713d92dde5f231a71fde0185699 /pkg/server/hook/dump.go | |
| parent | a29c4614431c0f7b705ee793f0a98348cdd29595 (diff) | |
rename hook tee to dump
Diffstat (limited to 'pkg/server/hook/dump.go')
| -rw-r--r-- | pkg/server/hook/dump.go | 115 |
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) +} |
