mirror of
https://github.com/lwch/natpass.git
synced 2024-04-21 12:41:54 +00:00
91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package app
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net"
|
|
rt "runtime"
|
|
|
|
"github.com/common-nighthawk/go-figure"
|
|
"github.com/kardianos/service"
|
|
"github.com/lwch/logging"
|
|
"github.com/lwch/natpass/code/server/global"
|
|
"github.com/lwch/natpass/code/server/handler"
|
|
"github.com/lwch/runtime"
|
|
)
|
|
|
|
type program struct {
|
|
cfg *global.Configure
|
|
}
|
|
|
|
func newProgram() *program {
|
|
return &program{}
|
|
}
|
|
|
|
func (p *program) setConfigure(cfg *global.Configure) *program {
|
|
p.cfg = cfg
|
|
return p
|
|
}
|
|
|
|
func (p *program) Start(s service.Service) error {
|
|
go p.run()
|
|
return nil
|
|
}
|
|
|
|
func (p *program) run() {
|
|
// initialize logging
|
|
stdout := true
|
|
if rt.GOOS == "windows" {
|
|
stdout = false
|
|
}
|
|
logging.SetSizeRotate(logging.SizeRotateConfig{
|
|
Dir: p.cfg.LogDir,
|
|
Name: "np-svr",
|
|
Size: int64(p.cfg.LogSize.Bytes()),
|
|
Rotate: p.cfg.LogRotate,
|
|
WriteStdout: stdout,
|
|
WriteFile: true,
|
|
})
|
|
defer logging.Flush()
|
|
|
|
fg := figure.NewFigure("NatPass", "alligator2", false)
|
|
figure.Write(&logging.DefaultLogger, fg)
|
|
logging.DefaultLogger.Write(nil)
|
|
|
|
// go func() {
|
|
// http.ListenAndServe(":7878", nil)
|
|
// }()
|
|
|
|
var l net.Listener
|
|
if len(p.cfg.TLSCrt) > 0 && len(p.cfg.TLSKey) > 0 {
|
|
cert, err := tls.LoadX509KeyPair(p.cfg.TLSCrt, p.cfg.TLSKey)
|
|
runtime.Assert(err)
|
|
l, err = tls.Listen("tcp", fmt.Sprintf(":%d", p.cfg.Listen), &tls.Config{
|
|
Certificates: []tls.Certificate{cert},
|
|
})
|
|
runtime.Assert(err)
|
|
logging.Info("listen on %d", p.cfg.Listen)
|
|
} else {
|
|
var err error
|
|
l, err = net.Listen("tcp", fmt.Sprintf(":%d", p.cfg.Listen))
|
|
runtime.Assert(err)
|
|
}
|
|
|
|
p.serve(l)
|
|
}
|
|
|
|
func (p *program) Stop(s service.Service) error {
|
|
return nil
|
|
}
|
|
|
|
func (p *program) serve(l net.Listener) {
|
|
h := handler.New(p.cfg)
|
|
for {
|
|
conn, err := l.Accept()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
go h.Handle(conn)
|
|
}
|
|
}
|