// Supress output of function to keep logs clean func supressOutput(f func()) { old := os.Stdout oldErr := os.Stderr r, w, _ := os.Pipe() os.Stdout = w os.Stderr = w l.SetOutput(w) f() outC := make(chan string) // copy the output in a separate goroutine so printing can't block indefinitely go func() { var buf bytes.Buffer io.Copy(&buf, r) o := buf.String() log.Trace(o) outC <- o }() // log to TRACE // back to normal state w.Close() os.Stdout = old os.Stderr = oldErr l.SetOutput(old) }
func (p *proxy) start() { log.Trace("Starting TCP Proxy") defer p.lconn.Close() //connect to remote rconn, err := net.DialTCP("tcp", nil, p.raddr) if err != nil { p.err("Remote connection failed: %s", err) return } p.rconn = rconn defer p.rconn.Close() //nagles? if p.nagles { p.lconn.SetNoDelay(true) p.rconn.SetNoDelay(true) } //display both ends log.Info("Opened %s >>> %s", p.lconn.RemoteAddr().String(), p.rconn.RemoteAddr().String()) //bidirectional copy go p.pipe(p.lconn, p.rconn) go p.pipe(p.rconn, p.lconn) //wait for close... <-p.errsig log.Info("Closed (%d bytes sent, %d bytes received)", p.sentBytes, p.receivedBytes) }
func (p *TcpProxy) Proxy() { log.Trace("Checking connection: %s:%d", p.Host, p.Port) laddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", p.Host, p.Port)) check(err) log.Trace("Checking connection: %s:%d", p.ProxyHost, p.ProxyPort) raddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", p.ProxyHost, p.ProxyPort)) check(err) listener, err := net.ListenTCP("tcp", laddr) check(err) for { log.Info("TCP proxy listening on %s", log.Colorize(log.BLUE, fmt.Sprintf("tcp://%s:%d", p.Host, p.Port))) conn, err := listener.AcceptTCP() if err != nil { fmt.Printf("Failed to accept connection '%s'\n", err) continue } p.connId++ p := &proxy{ lconn: conn, laddr: laddr, raddr: raddr, packetsize: p.PacketSize, erred: false, errsig: make(chan bool), prefix: fmt.Sprintf("Connection #%03d ", p.connId), hex: p.HexOutput, nagles: p.NaglesAlgorithm, middleware: p.middleware, // matcher: matcher, // replacer: replacer, } go p.start() } }