diff --git a/CHANGELOG.md b/CHANGELOG.md index e485bc7..ced6737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -224,4 +224,5 @@ ## TODO -1. go版本升级到1.20.11 \ No newline at end of file +1. 支持自动生成local_port +2. go版本升级到1.20.11 \ No newline at end of file diff --git a/code/client/app/handler.go b/code/client/app/handler.go index 31804f1..47ab275 100644 --- a/code/client/app/handler.go +++ b/code/client/app/handler.go @@ -30,7 +30,7 @@ func (p *program) shellCreate(mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) create := msg.GetCreq() tn := mgr.GetLinked(create.GetName(), msg.GetFrom()) if tn == nil { - tn = shell.New(global.Rule{ + tn = shell.New(&global.Rule{ Name: create.GetName(), Target: msg.GetFrom(), Type: "shell", @@ -57,7 +57,7 @@ func (p *program) vncCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg create := msg.GetCreq() tn := mgr.GetLinked(create.GetName(), msg.GetFrom()) if tn == nil { - tn = vnc.New(global.Rule{ + tn = vnc.New(&global.Rule{ Name: create.GetName(), Target: msg.GetFrom(), Type: "vnc", @@ -92,7 +92,7 @@ func (p *program) codeCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg create := msg.GetCreq() tn := mgr.GetLinked(create.GetName(), msg.GetFrom()) if tn == nil { - tn = code.New(global.Rule{ + tn = code.New(&global.Rule{ Name: create.GetName(), Target: msg.GetFrom(), Type: "code-server", diff --git a/code/client/conn/send_conn.go b/code/client/conn/send_conn.go index eee6681..9bf3f0c 100644 --- a/code/client/conn/send_conn.go +++ b/code/client/conn/send_conn.go @@ -9,7 +9,7 @@ import ( ) // SendConnectReq send connect request message -func (conn *Conn) SendConnectReq(id string, cfg global.Rule) { +func (conn *Conn) SendConnectReq(id string, cfg *global.Rule) { var msg network.Msg msg.To = cfg.Target msg.XType = network.Msg_connect_req @@ -68,7 +68,7 @@ func (conn *Conn) SendConnectReq(id string, cfg global.Rule) { } // SendConnectVnc send connect vnc request message -func (conn *Conn) SendConnectVnc(id string, cfg global.Rule, quality uint64, showCursor bool) { +func (conn *Conn) SendConnectVnc(id string, cfg *global.Rule, quality uint64, showCursor bool) { var msg network.Msg msg.To = cfg.Target msg.XType = network.Msg_connect_req diff --git a/code/client/global/conf.go b/code/client/global/conf.go index a1f9e66..88f1b0f 100644 --- a/code/client/global/conf.go +++ b/code/client/global/conf.go @@ -42,7 +42,7 @@ type Configure struct { DashboardEnabled bool DashboardListen string DashboardPort uint16 - Rules []Rule + Rules []*Rule CodeDir string } @@ -70,8 +70,8 @@ func LoadConf(dir string) *Configure { Listen string `yaml:"listen"` Port uint16 `yaml:"port"` } `yaml:"dashboard"` - Rules []Rule `yaml:"rules"` - CodeDir string `yaml:"codedir"` + Rules []*Rule `yaml:"rules"` + CodeDir string `yaml:"codedir"` } cfg.ID = "unset" cfg.Server = "127.0.0.1:6154" diff --git a/code/client/global/port.go b/code/client/global/port.go new file mode 100644 index 0000000..b6fb8a3 --- /dev/null +++ b/code/client/global/port.go @@ -0,0 +1,14 @@ +package global + +import ( + "net" + + "github.com/lwch/runtime" +) + +func GeneratePort() uint16 { + l, err := net.ListenTCP("tcp", &net.TCPAddr{}) + runtime.Assert(err) + defer l.Close() + return uint16(l.Addr().(*net.TCPAddr).Port) +} diff --git a/code/client/rule/bench/bench.go b/code/client/rule/bench/bench.go index e1d3973..faf890a 100644 --- a/code/client/rule/bench/bench.go +++ b/code/client/rule/bench/bench.go @@ -15,7 +15,7 @@ import ( // Bench benchmark handler type Bench struct { Name string - cfg global.Rule + cfg *global.Rule } // Link bench link @@ -39,7 +39,7 @@ func (link *Link) GetPackets() (uint64, uint64) { } // New new benchmark handler -func New(cfg global.Rule) *Bench { +func New(cfg *global.Rule) *Bench { return &Bench{ Name: cfg.Name, cfg: cfg, @@ -92,6 +92,10 @@ func (bench *Bench) Handle(conn *conn.Conn) { mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { bench.http(conn, w, r) }) + if bench.cfg.LocalPort == 0 { + bench.cfg.LocalPort = global.GeneratePort() + logging.Info("generate port for %s: %d", bench.Name, bench.cfg.LocalPort) + } svr := &http.Server{ Addr: fmt.Sprintf("%s:%d", bench.cfg.LocalAddr, bench.cfg.LocalPort), Handler: mux, diff --git a/code/client/rule/code/code.go b/code/client/rule/code/code.go index fc62eab..92ae4f6 100644 --- a/code/client/rule/code/code.go +++ b/code/client/rule/code/code.go @@ -20,14 +20,14 @@ import ( type Code struct { sync.RWMutex Name string - cfg global.Rule + cfg *global.Rule workspace map[string]*Workspace readTimeout time.Duration writeTimeout time.Duration } // New new code-server handler -func New(cfg global.Rule, readTimeout, writeTimeout time.Duration) *Code { +func New(cfg *global.Rule, readTimeout, writeTimeout time.Duration) *Code { return &Code{ Name: cfg.Name, cfg: cfg, @@ -110,6 +110,10 @@ func (code *Code) Handle(c *conn.Conn) { mux.HandleFunc("/info", code.Info) mux.HandleFunc("/forward/", pf(code.Forward)) mux.HandleFunc("/", pf(code.Render)) + if code.cfg.LocalPort == 0 { + code.cfg.LocalPort = global.GeneratePort() + logging.Info("generate port for %s: %d", code.Name, code.cfg.LocalPort) + } svr := &http.Server{ Addr: fmt.Sprintf("%s:%d", code.cfg.LocalAddr, code.cfg.LocalPort), Handler: mux, diff --git a/code/client/rule/shell/shell.go b/code/client/rule/shell/shell.go index 89596d6..e1e84ef 100644 --- a/code/client/rule/shell/shell.go +++ b/code/client/rule/shell/shell.go @@ -18,14 +18,14 @@ import ( type Shell struct { sync.RWMutex Name string - cfg global.Rule + cfg *global.Rule links map[string]*Link readTimeout time.Duration writeTimeout time.Duration } // New new shell -func New(cfg global.Rule, readTimeout, writeTimeout time.Duration) *Shell { +func New(cfg *global.Rule, readTimeout, writeTimeout time.Duration) *Shell { return &Shell{ Name: cfg.Name, cfg: cfg, @@ -113,6 +113,10 @@ func (shell *Shell) Handle(c *conn.Conn) { mux.HandleFunc("/ws/", pf(shell.WS)) mux.HandleFunc("/resize", pf(shell.Resize)) mux.HandleFunc("/", shell.Render) + if shell.cfg.LocalPort == 0 { + shell.cfg.LocalPort = global.GeneratePort() + logging.Info("generate port for %s: %d", shell.Name, shell.cfg.LocalPort) + } svr := &http.Server{ Addr: fmt.Sprintf("%s:%d", shell.cfg.LocalAddr, shell.cfg.LocalPort), Handler: mux, diff --git a/code/client/rule/vnc/vnc.go b/code/client/rule/vnc/vnc.go index b453077..b14f1ea 100644 --- a/code/client/rule/vnc/vnc.go +++ b/code/client/rule/vnc/vnc.go @@ -19,7 +19,7 @@ import ( type VNC struct { sync.RWMutex Name string - cfg global.Rule + cfg *global.Rule link *Link readTimeout time.Duration writeTimeout time.Duration @@ -27,7 +27,7 @@ type VNC struct { } // New new vnc -func New(cfg global.Rule, readTimeout, writeTimeout time.Duration) *VNC { +func New(cfg *global.Rule, readTimeout, writeTimeout time.Duration) *VNC { return &VNC{ Name: cfg.Name, cfg: cfg, @@ -109,6 +109,10 @@ func (v *VNC) Handle(c *conn.Conn) { mux.HandleFunc("/clipboard", pf(v.Clipboard)) mux.HandleFunc("/ws/", pf(v.WS)) mux.HandleFunc("/", v.Render) + if v.cfg.LocalPort == 0 { + v.cfg.LocalPort = global.GeneratePort() + logging.Info("generate port for %s: %d", v.Name, v.cfg.LocalPort) + } svr := &http.Server{ Addr: fmt.Sprintf("%s:%d", v.cfg.LocalAddr, v.cfg.LocalPort), Handler: mux, diff --git a/conf/rule.d/code-server.yaml b/conf/rule.d/code-server.yaml index 4afd38d..2a36e51 100644 --- a/conf/rule.d/code-server.yaml +++ b/conf/rule.d/code-server.yaml @@ -7,4 +7,4 @@ target: remote # 目标客户端ID type: code-server # code-server local_addr: 0.0.0.0 # 本地监听地址 - local_port: 8000 # 本地监听端口号 \ No newline at end of file + # local_port: 8000 # 本地监听端口号 \ No newline at end of file diff --git a/conf/rule.d/shell.yaml b/conf/rule.d/shell.yaml index 7f224ec..aa264f2 100644 --- a/conf/rule.d/shell.yaml +++ b/conf/rule.d/shell.yaml @@ -2,7 +2,7 @@ target: remote # 目标客户端ID type: shell # web shell local_addr: 0.0.0.0 # 本地监听地址 - local_port: 2222 # 本地监听端口号 + # local_port: 2222 # 本地监听端口号 #exec: /bin/bash # 运行命令 # windows默认powershell或cmd # 其他系统bash或sh diff --git a/conf/rule.d/vnc.yaml b/conf/rule.d/vnc.yaml index e7ff30f..7e66c36 100644 --- a/conf/rule.d/vnc.yaml +++ b/conf/rule.d/vnc.yaml @@ -3,5 +3,5 @@ target: remote # 目标客户端ID type: vnc # web vnc local_addr: 0.0.0.0 # 本地监听地址 - local_port: 5900 # 本地监听端口号 + # local_port: 5900 # 本地监听端口号 fps: 10 # 刷新频率 \ No newline at end of file diff --git a/docs/rules.md b/docs/rules.md index 35b8674..d1d0275 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -10,7 +10,7 @@ shell规则用于创建一个网页端的命令行操作页面 target: that # 目标客户端ID type: shell # web shell local_addr: 0.0.0.0 # 本地监听地址 - local_port: 8080 # 本地监听端口号 + #local_port: 8080 # 本地监听端口号 #exec: /bin/bash # 运行命令 # windows默认powershell或cmd # 其他系统bash或sh @@ -21,15 +21,13 @@ shell规则用于创建一个网页端的命令行操作页面 2. `target`: 对端客户端ID 3. `type`: shell 4. `local_addr`: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上 -5. `local_port`: 本地监听端口号 +5. `local_port`: 本地监听端口号,可选 6. `exec`: 连接建立成功后的启动命令 - 指定该参数:直接使用设定的命令运行 - linux系统:优先查找bash命令,若没有则查找sh命令,否则报错 - windows系统:优先查找powershell命令,若没有则查找cmd命令,否则报错 7. `env`: 进程启动时的环境变量设置 -连接成功后即可使用浏览器访问`local_port`所对应的端口来创建shell,如http://127.0.0.1:8080 - ## vnc规则 vnc规则用于创建一个网页端的远程桌面操作页面 @@ -38,18 +36,16 @@ vnc规则用于创建一个网页端的远程桌面操作页面 target: that # 目标客户端ID type: vnc # web vnc local_addr: 0.0.0.0 # 本地监听地址 - local_port: 5900 # 本地监听端口号 + #local_port: 5900 # 本地监听端口号 fps: 10 # 刷新频率 1. `name`: 该规则名称,必须全局唯一 2. `target`: 对端客户端ID 3. `type`: shell 4. `local_addr`: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上 -5. `local_port`: 本地监听端口号 +5. `local_port`: 本地监听端口号,可选 6. `fps`: 每秒钟截屏多少次,最高50 -连接成功后即可使用浏览器访问`local_port`所对应的端口来创建vnc,如http://127.0.0.1:5900 - 注意: 1. 创建vnc连接后远端服务会创建一个子进程进行截屏和键鼠操作, @@ -70,12 +66,10 @@ vnc规则用于创建一个网页端的code-server页面,主要用于远程开 target: remote # 目标客户端ID type: code-server # code-server local_addr: 0.0.0.0 # 本地监听地址 - local_port: 8000 # 本地监听端口号 + #local_port: 8000 # 本地监听端口号 1. `name`: 该规则名称,必须全局唯一 2. `target`: 对端客户端ID 3. `type`: code-server 4. `local_addr`: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上 -5. `local_port`: 本地监听端口号 - -连接成功后即可使用浏览器访问`local_port`所对应的端口来创建code-server,如http://127.0.0.1:8000 \ No newline at end of file +5. `local_port`: 本地监听端口号,可选 \ No newline at end of file