Files
2023-02-01 18:03:30 +08:00

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)
}
}