From cb779de61c4b1f1404e8bb6991491353f5d9b7aa Mon Sep 17 00:00:00 2001 From: lwch Date: Tue, 31 Jan 2023 15:39:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=BA=93=E4=B8=BAcobra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 +- code/client/app/app.go | 94 +++--- code/client/app/callback.go | 24 +- code/client/app/cmd.go | 179 ++++++++++++ code/client/main.go | 268 +++++++++++------- .../rule/vnc/process/process_windows.go | 4 +- code/client/rule/vnc/process/process_xx.go | 7 +- go.mod | 3 + go.sum | 9 + 9 files changed, 436 insertions(+), 156 deletions(-) create mode 100644 code/client/app/cmd.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 1600df9..3d6d23c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -196,4 +196,6 @@ ## TODO -1. 升级第三方库 \ No newline at end of file +1. 升级第三方库 +2. 命令行交互切换到cobra库 +3. 新增start、stop、restart、status命令行交互命令 \ No newline at end of file diff --git a/code/client/app/app.go b/code/client/app/app.go index d827254..e5d57dd 100644 --- a/code/client/app/app.go +++ b/code/client/app/app.go @@ -18,94 +18,112 @@ import ( "github.com/lwch/runtime" ) -// App application -type App struct { +type program struct { confDir string cfg *global.Configure - version string conn *conn.Conn } -// New create application -func New(ver, dir string, cfg *global.Configure) *App { - return &App{version: ver, confDir: dir, cfg: cfg} +func newProgram() *program { + return &program{} } -// Start start application -func (a *App) Start(s service.Service) error { - go a.run() +func (p *program) setConfDir(dir string) *program { + p.confDir = dir + return p +} + +func (p *program) setConfigure(cfg *global.Configure) *program { + p.cfg = cfg + return p +} + +// Start main entry for service +func (p *program) Start(s service.Service) error { + go p.run() return nil } -// Stop stop application -func (a *App) Stop(s service.Service) error { +// Stop stop service callback +func (*program) Stop(s service.Service) error { return nil } -func (a *App) run() { +func (p *program) run() { // go func() { // http.ListenAndServe(":9000", nil) // }() + // initialize logging stdout := true if rt.GOOS == "windows" { stdout = false } logging.SetSizeRotate(logging.SizeRotateConfig{ - Dir: a.cfg.LogDir, + Dir: p.cfg.LogDir, Name: "np-cli", - Size: int64(a.cfg.LogSize.Bytes()), - Rotate: a.cfg.LogRotate, + Size: int64(p.cfg.LogSize.Bytes()), + Rotate: p.cfg.LogRotate, WriteStdout: stdout, WriteFile: true, }) defer logging.Flush() - a.conn = conn.New(a.cfg) + // create connection and handshake + p.conn = conn.New(p.cfg) + + // build rule manager mgr := rule.New() - for _, t := range a.cfg.Rules { + // add rules from configure file, wait http request from web browser + for _, t := range p.cfg.Rules { switch t.Type { case "shell": - sh := shell.New(t, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + sh := shell.New(t, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(sh) - go sh.Handle(a.conn) + go sh.Handle(p.conn) case "vnc": - v := vnc.New(t, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + v := vnc.New(t, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(v) - go v.Handle(a.conn) + go v.Handle(p.conn) case "bench": b := bench.New(t) mgr.Add(b) - go b.Handle(a.conn) + go b.Handle(p.conn) case "code-server": - cs := code.New(t, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + cs := code.New(t, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(cs) - go cs.Handle(a.conn) + go cs.Handle(p.conn) } } + // handle request from remote node go func() { for { - msg := <-a.conn.ChanUnknown() + msg := <-p.conn.ChanUnknown() var linkID string switch msg.GetXType() { case network.Msg_connect_req: switch msg.GetCreq().GetXType() { case network.ConnectRequest_shell: - a.shellCreate(mgr, a.conn, msg) + // fork /bin/bash command and ack + p.shellCreate(mgr, p.conn, msg) case network.ConnectRequest_vnc: - a.vncCreate(a.confDir, mgr, a.conn, msg) + // fork np-cli vnc child process and ack + p.vncCreate(p.confDir, mgr, p.conn, msg) case network.ConnectRequest_bench: - a.benchCreate(a.confDir, mgr, a.conn, msg) + // bench handler response ok directly + p.benchCreate(p.confDir, mgr, p.conn, msg) case network.ConnectRequest_code: - a.codeCreate(a.confDir, mgr, a.conn, msg) + // fork code-server child process and ack + p.codeCreate(p.confDir, mgr, p.conn, msg) } default: linkID = msg.GetLinkId() } + // invalid message type, close channel directly if len(linkID) > 0 { - a.conn.ChanClose(linkID) + p.conn.ChanClose(linkID) logging.Error("link of %s not found, type=%s", linkID, msg.GetXType().String()) continue @@ -113,22 +131,26 @@ func (a *App) run() { } }() + // on disconnect message dispatcher, also to close the forked process go func() { for { - id := <-a.conn.ChanDisconnect() + id := <-p.conn.ChanDisconnect() mgr.OnDisconnect(id) } }() - if a.cfg.DashboardEnabled { + if p.cfg.DashboardEnabled { + // if the dashboard is enabled, wait the connection close async go func() { - a.conn.Wait() + p.conn.Wait() logging.Flush() os.Exit(1) }() - db := dashboard.New(a.cfg, a.conn, mgr, a.version) - runtime.Assert(db.ListenAndServe(a.cfg.DashboardListen, a.cfg.DashboardPort)) + // handle dashboard + db := dashboard.New(p.cfg, p.conn, mgr, Version) + runtime.Assert(db.ListenAndServe(p.cfg.DashboardListen, p.cfg.DashboardPort)) } else { - a.conn.Wait() + // wait the connection close + p.conn.Wait() } } diff --git a/code/client/app/callback.go b/code/client/app/callback.go index 8fc2f18..2de8177 100644 --- a/code/client/app/callback.go +++ b/code/client/app/callback.go @@ -11,7 +11,7 @@ import ( "github.com/lwch/natpass/code/network" ) -func (a *App) shellCreate(mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { +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 { @@ -21,13 +21,13 @@ func (a *App) shellCreate(mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { Type: "shell", Exec: create.GetCshell().GetExec(), Env: create.GetCshell().GetEnv(), - }, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + }, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(tn.(rule.Rule)) } lk := tn.NewLink(msg.GetLinkId(), msg.GetFrom(), nil, conn).(*shell.Link) logging.Info("create link %s for shell rule [%s] from %s to %s", msg.GetLinkId(), create.GetName(), - msg.GetFrom(), a.cfg.ID) + msg.GetFrom(), p.cfg.ID) err := lk.Exec() if err != nil { logging.Error("create shell failed: %v", err) @@ -38,7 +38,7 @@ func (a *App) shellCreate(mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { lk.Forward() } -func (a *App) vncCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { +func (p *program) vncCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { create := msg.GetCreq() tn := mgr.GetLinked(create.GetName(), msg.GetFrom()) if tn == nil { @@ -47,13 +47,13 @@ func (a *App) vncCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *net Target: msg.GetFrom(), Type: "vnc", Fps: create.GetCvnc().GetFps(), - }, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + }, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(tn.(rule.Rule)) } lk := tn.NewLink(msg.GetLinkId(), msg.GetFrom(), nil, conn).(*vnc.Link) logging.Info("create link %s for vnc rule [%s] from %s to %s", msg.GetLinkId(), create.GetName(), - msg.GetFrom(), a.cfg.ID) + msg.GetFrom(), p.cfg.ID) lk.SetQuality(create.GetCvnc().GetQuality()) err := lk.Fork(confDir) if err != nil { @@ -65,15 +65,15 @@ func (a *App) vncCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *net lk.Forward() } -func (a *App) benchCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { +func (p *program) benchCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { create := msg.GetCreq() logging.Info("create link %s for bench rule [%s] from %s to %s", msg.GetLinkId(), create.GetName(), - msg.GetFrom(), a.cfg.ID) + msg.GetFrom(), p.cfg.ID) conn.SendConnectOK(msg.GetFrom(), msg.GetLinkId()) } -func (a *App) codeCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { +func (p *program) codeCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *network.Msg) { create := msg.GetCreq() tn := mgr.GetLinked(create.GetName(), msg.GetFrom()) if tn == nil { @@ -81,14 +81,14 @@ func (a *App) codeCreate(confDir string, mgr *rule.Mgr, conn *conn.Conn, msg *ne Name: create.GetName(), Target: msg.GetFrom(), Type: "code-server", - }, a.cfg.ReadTimeout, a.cfg.WriteTimeout) + }, p.cfg.ReadTimeout, p.cfg.WriteTimeout) mgr.Add(tn.(rule.Rule)) } workspace := tn.NewLink(msg.GetLinkId(), msg.GetFrom(), nil, conn).(*code.Workspace) logging.Info("create link %s for code-server rule [%s] from %s to %s", msg.GetLinkId(), create.GetName(), - msg.GetFrom(), a.cfg.ID) - err := workspace.Exec(a.cfg.CodeDir) + msg.GetFrom(), p.cfg.ID) + err := workspace.Exec(p.cfg.CodeDir) if err != nil { logging.Error("create vnc failed: %v", err) conn.SendConnectError(msg.GetFrom(), msg.GetLinkId(), err.Error()) diff --git a/code/client/app/cmd.go b/code/client/app/cmd.go new file mode 100644 index 0000000..e8cc281 --- /dev/null +++ b/code/client/app/cmd.go @@ -0,0 +1,179 @@ +package app + +import ( + "fmt" + "os" + "path/filepath" + rt "runtime" + + "github.com/kardianos/service" + "github.com/lwch/logging" + "github.com/lwch/natpass/code/client/global" + "github.com/lwch/natpass/code/client/rule/vnc" + "github.com/lwch/natpass/code/utils" + "github.com/lwch/runtime" + "github.com/spf13/cobra" +) + +var User string +var ConfDir string +var Version string + +// vnc child process params +var ( + VncName string + VncPort uint16 + VncCursor bool +) + +type App struct { + p *program +} + +// NewApp create application +func NewApp() *App { + return &App{ + p: newProgram(), + } +} + +func buildService(p *program) service.Service { + dir, err := filepath.Abs(ConfDir) + runtime.Assert(err) + + var depends []string + if rt.GOOS != "windows" { + depends = append(depends, "After=network.target") + } + var opt service.KeyValue + switch rt.GOOS { + case "windows": + opt = service.KeyValue{ + "StartType": "automatic", + "OnFailure": "restart", + "OnFailureDelayDuration": "5s", + "OnFailureResetPeriod": 10, + } + case "linux": + opt = service.KeyValue{ + "LimitNOFILE": 65000, + } + case "darwin": + opt = service.KeyValue{ + "SessionCreate": true, + } + } + + svc, err := service.New(p, &service.Config{ + Name: "np-cli", + DisplayName: "np-cli", + Description: "natpass client", + UserName: User, + Arguments: []string{"--conf", dir}, + Dependencies: depends, + Option: opt, + }) + runtime.Assert(err) + return svc +} + +// Run run application +func (a *App) Run(*cobra.Command, []string) { + a.p. + setConfDir(ConfDir). + setConfigure(global.LoadConf(ConfDir)) + + runtime.Assert(buildService(a.p).Run()) +} + +// Install register service +func (a *App) Install(*cobra.Command, []string) { + err := buildService(a.p).Install() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + fmt.Println("register service np-cli success") +} + +// Uninstall unregister service +func (a *App) Uninstall(*cobra.Command, []string) { + err := buildService(a.p).Uninstall() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + fmt.Println("unregister service np-cli success") +} + +// Start start service +func (a *App) Start(*cobra.Command, []string) { + err := buildService(a.p).Start() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + fmt.Println("start service np-cli success") +} + +// Stop stop service +func (a *App) Stop(*cobra.Command, []string) { + err := buildService(a.p).Stop() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + fmt.Println("stop service np-cli success") +} + +// Restart restart service +func (a *App) Restart(*cobra.Command, []string) { + err := buildService(a.p).Restart() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + fmt.Println("restart service np-cli success") +} + +// Status show service status +func (a *App) Status(*cobra.Command, []string) { + status, err := buildService(a.p).Status() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } + switch status { + case service.StatusRunning: + fmt.Println("service is running") + case service.StatusStopped: + fmt.Println("service is stopped") + case service.StatusUnknown: + fmt.Println("service status is unknown") + } +} + +// Vnc handle vnc child process +func (a *App) Vnc(*cobra.Command, []string) { + defer utils.Recover("vnc.worker") + + cfg := global.LoadConf(ConfDir) + + stdout := true + if rt.GOOS == "windows" { + stdout = false + } + // go func() { + // http.ListenAndServe(":9001", nil) + // }() + logging.SetSizeRotate(logging.SizeRotateConfig{ + Dir: cfg.LogDir, + Name: "np-cli.vnc." + VncName, + Size: int64(cfg.LogSize.Bytes()), + Rotate: cfg.LogRotate, + WriteStdout: stdout, + WriteFile: true, + }) + defer logging.Flush() + vnc.RunWorker(VncPort, VncCursor) +} diff --git a/code/client/main.go b/code/client/main.go index 29a489d..c2e88ec 100644 --- a/code/client/main.go +++ b/code/client/main.go @@ -1,19 +1,11 @@ package main import ( - "flag" "fmt" "os" - "path/filepath" - rt "runtime" - "github.com/kardianos/service" - "github.com/lwch/logging" "github.com/lwch/natpass/code/client/app" - "github.com/lwch/natpass/code/client/global" - "github.com/lwch/natpass/code/client/rule/vnc" - "github.com/lwch/natpass/code/utils" - "github.com/lwch/runtime" + "github.com/spf13/cobra" ) var ( @@ -23,111 +15,185 @@ var ( buildTime string ) -func showVersion() { - fmt.Printf("version: v%s\ntime: %s\ncommit: %s.%s\n", - version, - buildTime, - gitHash, gitReversion) - os.Exit(0) +var a = app.NewApp() + +var rootCmd = &cobra.Command{ + Use: "np-cli", + Short: "natpass client", + Run: a.Run, +} + +var installCmd = &cobra.Command{ + Use: "install", + Short: "register service", + Run: a.Install, +} + +var uninstallCmd = &cobra.Command{ + Use: "uninstall", + Short: "unregister service", + Run: a.Uninstall, +} + +var startCmd = &cobra.Command{ + Use: "start", + Short: "start service", + Run: a.Start, +} + +var stopCmd = &cobra.Command{ + Use: "stop", + Short: "stop service", + Run: a.Stop, +} + +var restartCmd = &cobra.Command{ + Use: "restart", + Short: "restart service", + Run: a.Restart, +} + +var statusCmd = &cobra.Command{ + Use: "status", + Short: "show service status", + Run: a.Status, +} + +var vncCmd = &cobra.Command{ + Use: "vnc", + Short: "vnc child process", + Run: a.Vnc, +} + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "show version info", + Run: func(*cobra.Command, []string) { + fmt.Printf("version: v%s\ntime: %s\ncommit: %s.%s\n", + version, + buildTime, + gitHash, gitReversion) + os.Exit(0) + }, } func main() { - user := flag.String("user", "", "service user") - conf := flag.String("conf", "", "configure file path") - ver := flag.Bool("version", false, "show version info") - act := flag.String("action", "", "install or uninstall") - name := flag.String("name", "", "rule name") - vport := flag.Uint("vport", 6155, "vnc worker listen port") - vcursor := flag.Bool("vcursor", false, "vnc show cursor") - flag.Parse() + app.Version = version + installCmd.Flags().StringVarP(&app.ConfDir, "conf", "c", "", "configure file path") + installCmd.Flags().StringVarP(&app.User, "user", "u", "", "service user") + installCmd.MarkFlagRequired("conf") + rootCmd.AddCommand(installCmd, uninstallCmd) + rootCmd.AddCommand(startCmd, stopCmd, restartCmd, statusCmd) + rootCmd.AddCommand(versionCmd) - if *ver { - showVersion() - os.Exit(0) - } + vncCmd.Flags().StringVarP(&app.ConfDir, "conf", "c", "", "configure file path") + vncCmd.Flags().StringVar(&app.VncName, "name", "", "name for log file") + vncCmd.Flags().Uint16Var(&app.VncPort, "port", 6155, "listen port") + vncCmd.Flags().BoolVar(&app.VncCursor, "cursor", false, "show cursor") + vncCmd.MarkFlagRequired("conf") + vncCmd.MarkFlagRequired("name") + vncCmd.Hidden = true + rootCmd.AddCommand(vncCmd) - if len(*conf) == 0 { - fmt.Println("missing -conf param") + rootCmd.CompletionOptions.DisableDefaultCmd = true + rootCmd.Flags().StringVarP(&app.ConfDir, "conf", "c", "", "configure file path") + rootCmd.MarkFlagRequired("conf") + err := rootCmd.Execute() + if err != nil { + fmt.Println(err.Error()) os.Exit(1) } - // for test - // work := worker.NewWorker() - // work.TestCapture() - // return + // user := flag.String("user", "", "service user") + // conf := flag.String("conf", "", "configure file path") + // act := flag.String("action", "", "install or uninstall") + // name := flag.String("name", "", "rule name") + // vport := flag.Uint("vport", 6155, "vnc worker listen port") + // vcursor := flag.Bool("vcursor", false, "vnc show cursor") + // flag.Parse() - dir, err := filepath.Abs(*conf) - runtime.Assert(err) + // if len(*conf) == 0 { + // fmt.Println("missing -conf param") + // os.Exit(1) + // } - var depends []string - if rt.GOOS != "windows" { - depends = append(depends, "After=network.target") - } - var opt service.KeyValue - switch rt.GOOS { - case "windows": - opt = service.KeyValue{ - "StartType": "automatic", - "OnFailure": "restart", - "OnFailureDelayDuration": "5s", - "OnFailureResetPeriod": 10, - } - case "linux": - opt = service.KeyValue{ - "LimitNOFILE": 65000, - } - case "darwin": - opt = service.KeyValue{ - "SessionCreate": true, - } - } + // // for test + // // work := worker.NewWorker() + // // work.TestCapture() + // // return - appCfg := &service.Config{ - Name: "np-cli", - DisplayName: "np-cli", - Description: "nat forward service", - UserName: *user, - Arguments: []string{"-conf", dir}, - Dependencies: depends, - Option: opt, - } + // dir, err := filepath.Abs(*conf) + // runtime.Assert(err) - cfg := global.LoadConf(*conf) + // var depends []string + // if rt.GOOS != "windows" { + // depends = append(depends, "After=network.target") + // } + // var opt service.KeyValue + // switch rt.GOOS { + // case "windows": + // opt = service.KeyValue{ + // "StartType": "automatic", + // "OnFailure": "restart", + // "OnFailureDelayDuration": "5s", + // "OnFailureResetPeriod": 10, + // } + // case "linux": + // opt = service.KeyValue{ + // "LimitNOFILE": 65000, + // } + // case "darwin": + // opt = service.KeyValue{ + // "SessionCreate": true, + // } + // } - if *act == "vnc.worker" { - defer utils.Recover("vnc.worker") - stdout := true - if rt.GOOS == "windows" { - stdout = false - } - // go func() { - // http.ListenAndServe(":9001", nil) - // }() - logging.SetSizeRotate(logging.SizeRotateConfig{ - Dir: cfg.LogDir, - Name: "np-cli.vnc." + *name, - Size: int64(cfg.LogSize.Bytes()), - Rotate: cfg.LogRotate, - WriteStdout: stdout, - WriteFile: true, - }) - defer logging.Flush() - vnc.RunWorker(uint16(*vport), *vcursor) - return - } + // appCfg := &service.Config{ + // Name: "np-cli", + // DisplayName: "np-cli", + // Description: "nat forward service", + // UserName: *user, + // Arguments: []string{"-conf", dir}, + // Dependencies: depends, + // Option: opt, + // } - app := app.New(version, *conf, cfg) - sv, err := service.New(app, appCfg) - runtime.Assert(err) + // cfg := global.LoadConf(*conf) - switch *act { - case "install": - runtime.Assert(sv.Install()) - utils.BuildDir(cfg.LogDir, *user) - utils.BuildDir(cfg.CodeDir, *user) - case "uninstall": - runtime.Assert(sv.Uninstall()) - default: - runtime.Assert(sv.Run()) - } + // if *act == "vnc.worker" { + // defer utils.Recover("vnc.worker") + // stdout := true + // if rt.GOOS == "windows" { + // stdout = false + // } + // // go func() { + // // http.ListenAndServe(":9001", nil) + // // }() + // logging.SetSizeRotate(logging.SizeRotateConfig{ + // Dir: cfg.LogDir, + // Name: "np-cli.vnc." + *name, + // Size: int64(cfg.LogSize.Bytes()), + // Rotate: cfg.LogRotate, + // WriteStdout: stdout, + // WriteFile: true, + // }) + // defer logging.Flush() + // vnc.RunWorker(uint16(*vport), *vcursor) + // return + // } + + // app := app.New(version, *conf, cfg) + // sv, err := service.New(app, appCfg) + // runtime.Assert(err) + + // switch *act { + // case "install": + // runtime.Assert(sv.Install()) + // utils.BuildDir(cfg.LogDir, *user) + // utils.BuildDir(cfg.CodeDir, *user) + // case "uninstall": + // runtime.Assert(sv.Uninstall()) + // default: + // runtime.Assert(sv.Run()) + // } } diff --git a/code/client/rule/vnc/process/process_windows.go b/code/client/rule/vnc/process/process_windows.go index 39d24d7..d46faf7 100644 --- a/code/client/rule/vnc/process/process_windows.go +++ b/code/client/rule/vnc/process/process_windows.go @@ -100,9 +100,9 @@ func createWorker(name, confDir string, tk windows.Token, showCursor bool) (*Pro startup.Cb = uint32(unsafe.Sizeof(startup)) startup.Desktop = windows.StringToUTF16Ptr("WinSta0\\default") startup.Flags = windows.STARTF_USESHOWWINDOW - str := dir + fmt.Sprintf(" -conf %s -action vnc.worker -name %s -vport %d", confDir, name, port) + str := dir + fmt.Sprintf(" vnc --conf %s --name %s --port %d", confDir, name, port) if showCursor { - str += "-vcursor" + str += "--cursor" } cmd := windows.StringToUTF16Ptr(str) if tk == 0 { diff --git a/code/client/rule/vnc/process/process_xx.go b/code/client/rule/vnc/process/process_xx.go index 7f1ca36..39054ed 100644 --- a/code/client/rule/vnc/process/process_xx.go +++ b/code/client/rule/vnc/process/process_xx.go @@ -25,10 +25,9 @@ func CreateWorker(name, confDir string, showCursor bool) (*Process, error) { if err != nil { return nil, err } - cmd := exec.Command(dir, "-conf", confDir, - "-action", "vnc.worker", - "-name", name, - "-vport", fmt.Sprintf("%d", port)) + cmd := exec.Command(dir, "vnc", "--conf", confDir, + "--name", name, + "--port", fmt.Sprintf("%d", port)) err = cmd.Start() if err != nil { p.Close() diff --git a/go.mod b/go.mod index 147509b..091c6a8 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,16 @@ require ( github.com/lwch/rdesktop v1.1.1 github.com/lwch/runtime v1.0.0 github.com/lwch/yaml v0.0.0-20220711084242-14c4f5845abe + github.com/spf13/cobra v1.6.1 golang.org/x/sys v0.4.0 golang.org/x/text v0.6.0 google.golang.org/protobuf v1.28.1 ) require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kisielk/errcheck v1.6.3 // indirect + github.com/spf13/pflag v1.0.5 // indirect golang.org/x/image v0.3.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.7.0 // indirect diff --git a/go.sum b/go.sum index 2583893..a49de56 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -10,6 +11,9 @@ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60= github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -25,6 +29,11 @@ github.com/lwch/runtime v1.0.0 h1:siMQ16oBQ7Kx+M0KnUrAhRe0j8I493zfIqmII0r2wRc= github.com/lwch/runtime v1.0.0/go.mod h1:D9d6Uzg9Nea3M+bkNyLHNk6Nhlz/j1c4mze1gG0tReI= github.com/lwch/yaml v0.0.0-20220711084242-14c4f5845abe h1:PJ1zNqqiHW2q480seGnr9G8/Oke/JxF4HscxEuV+a6Y= github.com/lwch/yaml v0.0.0-20220711084242-14c4f5845abe/go.mod h1:n4iNSR61Lth9WtFYMYdw/eo92v/AZpz/ml9FuYJ0vd0= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=