mirror of
https://github.com/lwch/natpass.git
synced 2024-04-21 12:41:54 +00:00
修改命令行交互库为cobra
This commit is contained in:
+3
-1
@@ -196,4 +196,6 @@
|
||||
|
||||
## TODO
|
||||
|
||||
1. 升级第三方库
|
||||
1. 升级第三方库
|
||||
2. 命令行交互切换到cobra库
|
||||
3. 新增start、stop、restart、status命令行交互命令
|
||||
+58
-36
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
+12
-12
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
+167
-101
@@ -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())
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=
|
||||
|
||||
Reference in New Issue
Block a user