Files
trihuy-russian/sub/sub.go
T

209 lines
3.8 KiB
Go
Raw Normal View History

2023-05-22 18:06:34 +03:30
package sub
import (
"context"
"crypto/tls"
"io"
"net"
"net/http"
"strconv"
2024-03-11 01:01:24 +03:30
2023-05-22 18:06:34 +03:30
"x-ui/config"
"x-ui/logger"
"x-ui/util/common"
2023-05-31 01:24:18 +04:30
"x-ui/web/middleware"
2023-05-22 18:06:34 +03:30
"x-ui/web/network"
"x-ui/web/service"
"github.com/gin-gonic/gin"
)
type Server struct {
httpServer *http.Server
listener net.Listener
sub *SUBController
settingService service.SettingService
ctx context.Context
cancel context.CancelFunc
}
func NewServer() *Server {
ctx, cancel := context.WithCancel(context.Background())
return &Server{
ctx: ctx,
cancel: cancel,
}
}
func (s *Server) initRouter() (*gin.Engine, error) {
if config.IsDebug() {
gin.SetMode(gin.DebugMode)
} else {
gin.DefaultWriter = io.Discard
gin.DefaultErrorWriter = io.Discard
gin.SetMode(gin.ReleaseMode)
}
engine := gin.Default()
2024-02-21 14:17:52 +03:30
subDomain, err := s.settingService.GetSubDomain()
2023-05-22 18:06:34 +03:30
if err != nil {
return nil, err
}
2024-02-21 14:17:52 +03:30
if subDomain != "" {
engine.Use(middleware.DomainValidatorMiddleware(subDomain))
}
LinksPath, err := s.settingService.GetSubPath()
2023-05-22 18:06:34 +03:30
if err != nil {
return nil, err
}
2024-02-21 14:17:52 +03:30
JsonPath, err := s.settingService.GetSubJsonPath()
if err != nil {
return nil, err
}
Encrypt, err := s.settingService.GetSubEncrypt()
if err != nil {
return nil, err
}
ShowInfo, err := s.settingService.GetSubShowInfo()
if err != nil {
return nil, err
}
RemarkModel, err := s.settingService.GetRemarkModel()
if err != nil {
RemarkModel = "-ieo"
}
SubUpdates, err := s.settingService.GetSubUpdates()
if err != nil {
SubUpdates = "10"
}
SubJsonFragment, err := s.settingService.GetSubJsonFragment()
if err != nil {
SubJsonFragment = ""
2023-05-22 18:06:34 +03:30
}
2024-09-17 09:33:44 +02:00
SubJsonNoises, err := s.settingService.GetSubJsonNoises()
2024-08-29 11:27:43 +02:00
if err != nil {
2024-09-17 09:33:44 +02:00
SubJsonNoises = ""
2024-08-29 11:27:43 +02:00
}
2024-03-12 19:44:51 +03:30
SubJsonMux, err := s.settingService.GetSubJsonMux()
if err != nil {
SubJsonMux = ""
}
SubJsonRules, err := s.settingService.GetSubJsonRules()
if err != nil {
SubJsonRules = ""
}
2024-02-21 14:17:52 +03:30
g := engine.Group("/")
2023-05-22 18:06:34 +03:30
2024-03-12 19:44:51 +03:30
s.sub = NewSUBController(
g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates,
2024-09-17 09:33:44 +02:00
SubJsonFragment, SubJsonNoises, SubJsonMux, SubJsonRules)
2023-05-22 18:06:34 +03:30
return engine, nil
}
func (s *Server) Start() (err error) {
2024-03-11 01:01:24 +03:30
// This is an anonymous function, no function name
2023-05-22 18:06:34 +03:30
defer func() {
if err != nil {
s.Stop()
}
}()
subEnable, err := s.settingService.GetSubEnable()
if err != nil {
return err
}
if !subEnable {
return nil
}
engine, err := s.initRouter()
if err != nil {
return err
}
certFile, err := s.settingService.GetSubCertFile()
if err != nil {
return err
}
keyFile, err := s.settingService.GetSubKeyFile()
if err != nil {
return err
}
listen, err := s.settingService.GetSubListen()
if err != nil {
return err
}
port, err := s.settingService.GetSubPort()
if err != nil {
return err
}
2023-05-31 01:24:18 +04:30
2023-05-22 18:06:34 +03:30
listenAddr := net.JoinHostPort(listen, strconv.Itoa(port))
listener, err := net.Listen("tcp", listenAddr)
if err != nil {
return err
}
2023-05-31 01:24:18 +04:30
2023-05-22 18:06:34 +03:30
if certFile != "" || keyFile != "" {
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
2024-03-11 11:37:16 +03:30
if err == nil {
c := &tls.Config{
Certificates: []tls.Certificate{cert},
}
listener = network.NewAutoHttpsListener(listener)
listener = tls.NewListener(listener, c)
2024-07-08 23:08:00 +02:00
logger.Info("Sub server running HTTPS on", listener.Addr())
2024-03-11 11:37:16 +03:30
} else {
2024-07-08 23:08:00 +02:00
logger.Error("Error loading certificates:", err)
logger.Info("Sub server running HTTP on", listener.Addr())
2023-05-22 18:06:34 +03:30
}
} else {
2024-07-08 23:08:00 +02:00
logger.Info("Sub server running HTTP on", listener.Addr())
2023-05-22 18:06:34 +03:30
}
s.listener = listener
s.httpServer = &http.Server{
Handler: engine,
}
go func() {
s.httpServer.Serve(listener)
}()
return nil
}
func (s *Server) Stop() error {
s.cancel()
var err1 error
var err2 error
if s.httpServer != nil {
err1 = s.httpServer.Shutdown(s.ctx)
}
if s.listener != nil {
err2 = s.listener.Close()
}
return common.Combine(err1, err2)
}
func (s *Server) GetCtx() context.Context {
return s.ctx
2023-05-31 01:24:18 +04:30
}