Skip to content

Commit dc8e35e

Browse files
author
AlbertZhan
committed
New openwrt/lede platform
优化目录结构 优化openwrt/lede下内存的消耗 优化命令行的使用体验
1 parent c32cda5 commit dc8e35e

File tree

17 files changed

+949
-608
lines changed

17 files changed

+949
-608
lines changed

client/command.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
type command interface {
4+
addFlags()
5+
printHelp(string)
6+
run(args []string)
7+
}

client/main.go

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"net"
7+
"os"
8+
"runtime"
9+
"strings"
10+
"time"
11+
)
12+
13+
var commands map[string]command
14+
var provider command
15+
16+
//与浏览器相关的连接
17+
type browser struct {
18+
conn net.Conn
19+
er chan bool
20+
writ chan bool
21+
recv chan []byte
22+
send chan []byte
23+
}
24+
25+
//读取浏览器发送过来的数据
26+
func (self browser) read() {
27+
for {
28+
var recv=make([]byte,10240)
29+
n, err := self.conn.Read(recv)
30+
if err != nil {
31+
self.writ <- true
32+
self.er <- true
33+
break
34+
}
35+
self.recv <- recv[:n]
36+
}
37+
}
38+
39+
//把数据发送给浏览器
40+
func (self browser) write() {
41+
for {
42+
var send=make([]byte, 10240)
43+
select {
44+
case send = <-self.send:
45+
_, _ = self.conn.Write(send)
46+
case <-self.writ:
47+
break
48+
}
49+
}
50+
}
51+
52+
//与服务端相关的连接
53+
type server struct {
54+
conn net.Conn
55+
er chan bool
56+
writ chan bool
57+
recv chan []byte
58+
send chan []byte
59+
}
60+
61+
//读取服务端发送过来的数据
62+
func (self *server) read() {
63+
//isheart与timeout共同判断是不是自己设定的SetReadDeadline
64+
var isheart=false
65+
//20秒发一次心跳包
66+
_ = self.conn.SetReadDeadline(time.Now().Add(20*time.Second))
67+
for {
68+
var recv=make([]byte,10240)
69+
n, err := self.conn.Read(recv)
70+
if err != nil {
71+
if strings.Contains(err.Error(), "timeout") && !isheart {
72+
_, _ = self.conn.Write([]byte("hh"))
73+
//4秒时间收心跳包
74+
_ = self.conn.SetReadDeadline(time.Now().Add(4*time.Second))
75+
isheart = true
76+
continue
77+
}
78+
//浏览器有可能连接上不发消息就断开,此时就发一个0,为了与服务器一直有一条tcp通道
79+
self.recv <- []byte("0")
80+
self.er <- true
81+
self.writ <- true
82+
break
83+
}
84+
//收到心跳包
85+
if recv[0] == 'h' && recv[1] == 'h' {
86+
_ = self.conn.SetReadDeadline(time.Now().Add(time.Second * 20))
87+
isheart = false
88+
continue
89+
}
90+
self.recv <- recv[:n]
91+
}
92+
}
93+
94+
//把数据发送给服务端
95+
func (self server) write() {
96+
for {
97+
var send=make([]byte, 10240)
98+
select {
99+
case send = <-self.send:
100+
_, _ = self.conn.Write(send)
101+
case <-self.writ:
102+
break
103+
}
104+
}
105+
}
106+
107+
func printUsage() {
108+
fmt.Println("Usage: proxy [command] [parameters], where command is one of:")
109+
fmt.Print(" ")
110+
111+
i := 0
112+
for id := range commands {
113+
fmt.Print(id)
114+
115+
if i < len(commands)-1 {
116+
fmt.Print(", ")
117+
}
118+
i++
119+
}
120+
121+
fmt.Println(" or help")
122+
fmt.Println()
123+
124+
if provider != nil {
125+
provider.printHelp(" ")
126+
} else {
127+
for id, provider := range commands {
128+
fmt.Printf(" %s\n", id)
129+
provider.printHelp(" ")
130+
fmt.Printf(" For more information run \"proxy help %s\"\n", id)
131+
fmt.Println("")
132+
}
133+
}
134+
flag.PrintDefaults()
135+
}
136+
137+
func help() {
138+
printUsage()
139+
os.Exit(2)
140+
}
141+
142+
func loadCommands() {
143+
commands = make(map[string]command)
144+
commands["start"]=&start{}
145+
commands["stop"] = &stop{}
146+
}
147+
148+
func main() {
149+
runtime.GOMAXPROCS(runtime.NumCPU())
150+
loadCommands()
151+
flag.Usage = printUsage
152+
153+
args := os.Args[1:]
154+
if len(args) < 1 {
155+
help()
156+
}
157+
158+
command := args[0]
159+
if command[0] == '-' {
160+
help()
161+
}
162+
163+
if command == "help" {
164+
if len(args) >= 2 {
165+
provider = commands[args[1]]
166+
provider.addFlags()
167+
}
168+
help()
169+
} else if command == "version" {
170+
fmt.Printf("proxy version %s","0.3.3")
171+
}else {
172+
provider = commands[command]
173+
if provider == nil {
174+
fmt.Println("Unsupported command", command)
175+
return
176+
}
177+
178+
provider.addFlags()
179+
if command=="start" {
180+
_ = flag.CommandLine.Parse(args[1:])
181+
}
182+
provider.run(os.Args[2:])
183+
}
184+
}

client/start.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"io/ioutil"
7+
"net"
8+
"os"
9+
"os/exec"
10+
"runtime"
11+
)
12+
13+
type start struct {
14+
ip string
15+
port string
16+
local string
17+
d bool
18+
}
19+
20+
func (this *start) addFlags() {
21+
flag.StringVar(&this.ip, "h", "", "Server IP.")
22+
flag.StringVar(&this.port, "r", "2001", "Server Port.")
23+
flag.StringVar(&this.local, "l", "127.0.0.1:80", "Local IP and Port.")
24+
flag.BoolVar(&this.d, "d", false, "Open daemon.")
25+
}
26+
27+
func (this *start) printHelp(indent string) {
28+
fmt.Println(indent, "This command is used to open intranet penetration connecting the server.")
29+
fmt.Println(indent, "Command usage: proxy start [parameters]")
30+
}
31+
32+
func (this *start) run(args []string) {
33+
if len(args)==0 || this.ip=="" {
34+
help()
35+
}
36+
37+
if this.d==true {
38+
cmd:=exec.Command(os.Args[0],"-start","-h",this.ip,"-r",this.port,"-l",this.local)
39+
err:=cmd.Start()
40+
if err!=nil {
41+
fmt.Println(err.Error())
42+
os.Exit(2)
43+
}
44+
45+
_ = ioutil.WriteFile("./proxy.pid", []byte(fmt.Sprintf("%d", cmd.Process.Pid)), 0666)
46+
fmt.Println("Start success.")
47+
os.Exit(2)
48+
}else{
49+
this.startServer()
50+
}
51+
}
52+
53+
//开启内网穿透
54+
func (this *start) startServer() {
55+
target := net.JoinHostPort(this.ip,this.port)
56+
for {
57+
//链接端口
58+
serverconn := dail(target)
59+
recv := make(chan []byte)
60+
send := make(chan []byte)
61+
//1个位置是为了防止两个读取线程一个退出后另一个永远卡住
62+
er := make(chan bool, 1)
63+
writ := make(chan bool)
64+
next := make(chan bool)
65+
server := &server{serverconn, er, writ, recv, send}
66+
go server.read()
67+
go server.write()
68+
go handle(this.local,server,next)
69+
<-next
70+
}
71+
}
72+
73+
//链接端口
74+
func dail(hostport string) net.Conn {
75+
conn, err := net.Dial("tcp", hostport)
76+
if err!=nil {
77+
fmt.Printf("出现错误,退出线程: %v\n", err)
78+
runtime.Goexit()
79+
}
80+
return conn
81+
}
82+
83+
//两个socket衔接相关处理
84+
func handle(localPort string,server *server, next chan bool) {
85+
var serverrecv=make([]byte,10240)
86+
//阻塞这里等待服务端传来数据再链接浏览器
87+
fmt.Println("等待server发来消息")
88+
serverrecv = <-server.recv
89+
next <- true
90+
var browse *browser
91+
//服务端发来数据,链接本地80端口
92+
serverconn := dail(localPort)
93+
recv := make(chan []byte)
94+
send := make(chan []byte)
95+
er := make(chan bool, 1)
96+
writ := make(chan bool)
97+
browse = &browser{serverconn, er, writ, recv, send}
98+
go browse.read()
99+
go browse.write()
100+
browse.send <- serverrecv
101+
for {
102+
var serverrecv = make([]byte, 10240)
103+
var browserrecv = make([]byte, 10240)
104+
select {
105+
case serverrecv = <-server.recv:
106+
if serverrecv[0] != '0' {
107+
browse.send <- serverrecv
108+
}
109+
case browserrecv = <-browse.recv:
110+
server.send <- browserrecv
111+
case <-server.er:
112+
_ = server.conn.Close()
113+
_ = browse.conn.Close()
114+
runtime.Goexit()
115+
case <-browse.er:
116+
_ = server.conn.Close()
117+
_ = browse.conn.Close()
118+
runtime.Goexit()
119+
}
120+
}
121+
}

client/stop.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"os"
7+
"os/exec"
8+
"runtime"
9+
)
10+
11+
type stop struct {}
12+
13+
func (this *stop) addFlags() {
14+
15+
}
16+
17+
func (this *stop) printHelp(indent string) {
18+
fmt.Println(indent, "This command is used to shut down client intranet penetration.")
19+
fmt.Println(indent, "Command usage: proxy stop")
20+
}
21+
22+
func (this *stop) run(args []string) {
23+
b,_:=ioutil.ReadFile("./proxy.pid")
24+
var command *exec.Cmd
25+
//结束守护进程
26+
if runtime.GOOS=="windows"{
27+
command=exec.Command("taskkill","/F","/PID",string(b))
28+
}else{
29+
command=exec.Command("kill","-9",string(b))
30+
}
31+
err:=command.Start()
32+
if err!=nil {
33+
fmt.Println(err.Error())
34+
os.Exit(2)
35+
}
36+
37+
_ = os.Remove("./proxy.pid")
38+
fmt.Println("Stop success.")
39+
os.Exit(2)
40+
}

hosts/conf/conf.go renamed to conf/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,4 @@ func (c Config) Read(node, key string) string {
9696
return ""
9797
}
9898
return v
99-
}
99+
}

hosts/command.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
type command interface {
4+
addFlags()
5+
printHelp(string)
6+
run(args []string)
7+
}

hosts/hosts.conf

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)