proxystream/main.go

154 lines
3.0 KiB
Go

package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"time"
"github.com/gosuri/uilive"
"github.com/mattn/go-tty"
"git.tcp.direct/kayos/Prox5"
)
var quit chan bool
var ui *uilive.Writer
var t *tty.TTY
var listen = "127.0.0.1:9988"
var socksFile = "socks.txt"
var Swamp *Prox5.Swamp
func init() {
for i, arg := range os.Args {
if arg == "-l" || arg == "-listen" || arg == "--listen" {
listen = os.Args[i+1]
}
if arg == "-f" || arg == "-file" || arg == "--file" {
socksFile = os.Args[i+1]
}
}
Swamp = PrepSwamp()
Swamp.SetDialerBailout(15)
go StartLocalUpstreamProxy(listen)
ui = uilive.New()
}
func PrepSwamp() *Prox5.Swamp {
s := Prox5.NewDefaultSwamp()
s.SetMaxWorkers(20)
s.EnableRecycling()
s.AddCheckEndpoints([]string{"https://icanhazip.com"})
s.Start()
var count = 0
for _, prox := range loadAndShuffle(socksFile) {
if s.LoadSingleProxy(prox) {
count++
}
}
fmt.Println("Loaded and shuffled socks proxies for validation: ", count)
return s
}
func loadAndShuffle(file string) (proxies []string) {
f, err := os.Open(file)
defer f.Close()
if err != nil {
println("Failed to open file: " + err.Error())
os.Exit(1)
return []string{}
}
var ogProxies []string
xerox := bufio.NewScanner(f)
for xerox.Scan() {
ogProxies = append(ogProxies, xerox.Text())
}
proxies = make([]string, len(ogProxies))
rand.Seed(time.Now().UnixNano())
perm := rand.Perm(len(ogProxies))
for i, v := range perm {
proxies[v] = ogProxies[i]
}
return proxies
}
func watchKeyPresses() {
var err error
t, err = tty.Open()
if err != nil {
panic(err)
}
var done = false
for {
r, err := t.ReadRune()
if err != nil {
panic(err)
}
switch string(r) {
case "d":
if Swamp.DebugEnabled() {
println("Disabling debug")
Swamp.DisableDebug()
} else {
println("Enabling debug")
Swamp.EnableDebug()
}
case "+":
Swamp.SetMaxWorkers(Swamp.GetMaxWorkers() + 1)
case "-":
Swamp.SetMaxWorkers(Swamp.GetMaxWorkers() - 1)
case "p":
if Swamp.IsRunning() {
err := Swamp.Pause()
if err != nil {
println(err.Error())
}
} else {
if err := Swamp.Resume(); err != nil {
println(err.Error())
}
}
case "q":
done = true
break
default:
}
if done {
break
}
}
quit <- true
return
}
func ticker() {
println("controls:; (p) pause/resume | (d) debug on/off | (+/-) change worker count | (q) quit")
go watchKeyPresses()
ui.Start()
for {
mw, rw, iw := Swamp.GetWorkers()
stats := Swamp.GetStatistics()
total := stats.Valid4 + stats.Valid5 + stats.Valid4a
_, _ = fmt.Fprintf(ui, "Working: %d | Idle: %d | Max: %d\n\nChecked: %d\nValidated: %d\nDispensed: %d\n", rw, iw, mw, stats.Checked, total, stats.Dispensed)
time.Sleep(25 * time.Millisecond)
ui.Flush()
}
}
func main() {
go ticker()
<-quit
}