mirror of
https://github.com/lwch/natpass
synced 2025-10-05 05:16:50 +08:00
120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
package app
|
|
|
|
import (
|
|
"os"
|
|
rt "runtime"
|
|
|
|
"github.com/kardianos/service"
|
|
"github.com/lwch/logging"
|
|
"github.com/lwch/natpass/code/client/conn"
|
|
"github.com/lwch/natpass/code/client/dashboard"
|
|
"github.com/lwch/natpass/code/client/global"
|
|
"github.com/lwch/natpass/code/client/rule"
|
|
"github.com/lwch/natpass/code/client/rule/bench"
|
|
"github.com/lwch/natpass/code/client/rule/shell"
|
|
"github.com/lwch/natpass/code/client/rule/vnc"
|
|
"github.com/lwch/natpass/code/network"
|
|
"github.com/lwch/runtime"
|
|
)
|
|
|
|
// App application
|
|
type App 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}
|
|
}
|
|
|
|
// Start start application
|
|
func (a *App) Start(s service.Service) error {
|
|
go a.run()
|
|
return nil
|
|
}
|
|
|
|
// Stop stop application
|
|
func (a *App) Stop(s service.Service) error {
|
|
return nil
|
|
}
|
|
|
|
func (a *App) run() {
|
|
// go func() {
|
|
// http.ListenAndServe(":9000", nil)
|
|
// }()
|
|
|
|
stdout := true
|
|
if rt.GOOS == "windows" {
|
|
stdout = false
|
|
}
|
|
logging.SetSizeRotate(logging.SizeRotateConfig{
|
|
Dir: a.cfg.LogDir,
|
|
Name: "np-cli",
|
|
Size: int64(a.cfg.LogSize.Bytes()),
|
|
Rotate: a.cfg.LogRotate,
|
|
WriteStdout: stdout,
|
|
WriteFile: true,
|
|
})
|
|
defer logging.Flush()
|
|
|
|
a.conn = conn.New(a.cfg)
|
|
mgr := rule.New()
|
|
|
|
for _, t := range a.cfg.Rules {
|
|
switch t.Type {
|
|
case "shell":
|
|
sh := shell.New(t, a.cfg.ReadTimeout, a.cfg.WriteTimeout)
|
|
mgr.Add(sh)
|
|
go sh.Handle(a.conn)
|
|
case "vnc":
|
|
v := vnc.New(t, a.cfg.ReadTimeout, a.cfg.WriteTimeout)
|
|
mgr.Add(v)
|
|
go v.Handle(a.conn)
|
|
case "bench":
|
|
b := bench.New(t)
|
|
mgr.Add(b)
|
|
go b.Handle(a.conn)
|
|
}
|
|
}
|
|
|
|
go func() {
|
|
for {
|
|
msg := <-a.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)
|
|
case network.ConnectRequest_vnc:
|
|
a.vncCreate(a.confDir, mgr, a.conn, msg)
|
|
case network.ConnectRequest_bench:
|
|
a.benchCreate(a.confDir, mgr, a.conn, msg)
|
|
}
|
|
default:
|
|
linkID = msg.GetLinkId()
|
|
}
|
|
if len(linkID) > 0 {
|
|
logging.Error("link of %s not found, type=%s",
|
|
linkID, msg.GetXType().String())
|
|
continue
|
|
}
|
|
}
|
|
}()
|
|
|
|
if a.cfg.DashboardEnabled {
|
|
go func() {
|
|
a.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))
|
|
} else {
|
|
a.conn.Wait()
|
|
}
|
|
}
|