prox5/debug.go

184 lines
4.1 KiB
Go
Raw Normal View History

2022-05-23 01:05:50 +00:00
package prox5
import (
2022-06-26 02:11:01 +00:00
"fmt"
2022-07-25 06:23:12 +00:00
"strings"
"sync"
"sync/atomic"
"git.tcp.direct/kayos/prox5/internal/pools"
)
var (
debugStatus *uint32
debugHardLock = &sync.RWMutex{}
)
2022-06-26 02:11:01 +00:00
func init() {
dd := debugDisabled
debugStatus = &dd
2022-06-26 02:11:01 +00:00
}
const (
debugEnabled uint32 = iota
debugDisabled
)
type SocksLogger struct {
2022-09-22 23:28:28 +00:00
parent *Swamp
}
// Printf is used to handle socks server logging.
func (s SocksLogger) Printf(format string, a ...interface{}) {
buf := pools.CopABuffer.Get().(*strings.Builder)
buf.WriteString(fmt.Sprintf(format, a...))
s.parent.dbgPrint(buf)
}
2022-06-26 02:11:01 +00:00
type basicPrinter struct{}
2022-08-31 18:38:44 +00:00
func (b *basicPrinter) Print(str string) {
2022-06-28 02:27:52 +00:00
println("[prox5] " + str)
2022-06-26 02:11:01 +00:00
}
2022-08-31 18:38:44 +00:00
func (b *basicPrinter) Printf(format string, items ...any) {
2022-06-26 02:11:01 +00:00
println(fmt.Sprintf("prox5: "+format, items))
}
2022-06-26 02:11:01 +00:00
// DebugEnabled returns the current state of our debug switch.
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) DebugEnabled() bool {
debugHardLock.RLock()
defer debugHardLock.RUnlock()
return atomic.CompareAndSwapUint32(debugStatus, debugEnabled, debugEnabled)
}
// EnableDebug enables printing of verbose messages during operation
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) EnableDebug() {
atomic.StoreUint32(debugStatus, debugEnabled)
}
// DisableDebug enables printing of verbose messages during operation.
// WARNING: if you are using a DebugChannel, you must read all of the messages in the channel's cache or this will block.
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) DisableDebug() {
atomic.StoreUint32(debugStatus, debugDisabled)
}
2022-07-25 06:23:12 +00:00
func simpleString(s string) *strings.Builder {
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 06:23:12 +00:00
buf.WriteString(s)
return buf
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) dbgPrint(builder *strings.Builder) {
defer pools.DiscardBuffer(builder)
2022-09-22 23:48:08 +00:00
if !p5.DebugEnabled() {
return
}
2022-09-22 23:48:08 +00:00
p5.DebugLogger.Print(builder.String())
return
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgUnableToReach(socksString, target string, err error) {
if !p5.DebugEnabled() {
2022-06-26 02:51:42 +00:00
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
buf.WriteString("unable to reach ")
2022-09-22 23:48:08 +00:00
if p5.swampopt.redact {
buf.WriteString("[redacted]")
} else {
buf.WriteString(target)
}
buf.WriteString(" with ")
2022-07-25 07:14:26 +00:00
buf.WriteString(socksString)
2022-09-22 23:48:08 +00:00
if !p5.swampopt.redact {
buf.WriteString(": ")
buf.WriteString(err.Error())
}
2022-07-25 07:14:26 +00:00
buf.WriteString(", cycling...")
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgUsingProxy(socksString string) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("MysteryDialer using socks: ")
buf.WriteString(socksString)
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgFailedMiddleware(socksString string) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("failed middleware check, ")
buf.WriteString(socksString)
buf.WriteString(", cycling...")
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgTry(socksString string) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("try dial with: ")
buf.WriteString(socksString)
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgCantGetLock(socksString string, putback bool) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("can't get lock for ")
buf.WriteString(socksString)
if putback {
buf.WriteString(", putting back in queue")
}
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgGotLock(socksString string) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("got lock for ")
buf.WriteString(socksString)
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgChecked(sock *Proxy, success bool) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
if success {
buf.WriteString("verified ")
buf.WriteString(sock.Endpoint)
2022-09-22 23:24:35 +00:00
buf.WriteString(" as ")
buf.WriteString(sock.protocol.Get().String())
buf.WriteString(" proxy")
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
return
}
buf.WriteString("failed to verify: ")
buf.WriteString(sock.Endpoint)
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}
2022-09-22 23:48:08 +00:00
func (p5 *Swamp) msgBadProxRate(sock *Proxy) {
if !p5.DebugEnabled() {
return
}
buf := pools.CopABuffer.Get().(*strings.Builder)
2022-07-25 07:14:26 +00:00
buf.WriteString("badProx ratelimited: ")
buf.WriteString(sock.Endpoint)
2022-09-22 23:48:08 +00:00
p5.dbgPrint(buf)
2022-07-25 07:14:26 +00:00
}