diff --git a/api/apiService.go b/api/apiService.go index 75911eb..9ab0212 100644 --- a/api/apiService.go +++ b/api/apiService.go @@ -386,13 +386,7 @@ func (a *ApiService) DeleteToken(c *gin.Context) { } func (a *ApiService) GetSingboxConfig(c *gin.Context) { - config, err := a.ConfigService.GetConfig("") - if err != nil { - c.Status(400) - c.Writer.WriteString(err.Error()) - return - } - rawConfig, err := json.MarshalIndent(config, "", " ") + rawConfig, err := a.ConfigService.GetConfig("") if err != nil { c.Status(400) c.Writer.WriteString(err.Error()) @@ -400,7 +394,7 @@ func (a *ApiService) GetSingboxConfig(c *gin.Context) { } c.Header("Content-Type", "application/json") c.Header("Content-Disposition", "attachment; filename=config_"+time.Now().Format("20060102-150405")+".json") - c.Writer.Write(rawConfig) + c.Writer.Write(*rawConfig) } func (a *ApiService) GetCheckOutbound(c *gin.Context) { diff --git a/app/app.go b/app/app.go index 640b29f..f61a654 100644 --- a/app/app.go +++ b/app/app.go @@ -79,7 +79,7 @@ func (a *APP) Start() error { return err } - err = a.configService.StartCore("") + err = a.configService.StartCore() if err != nil { logger.Error(err) } diff --git a/core/main.go b/core/main.go index 7aa20ac..fcbf665 100644 --- a/core/main.go +++ b/core/main.go @@ -83,6 +83,9 @@ func (c *Core) Start(sbConfig []byte) error { func (c *Core) Stop() error { c.isRunning = false + if c.instance != nil { + return nil + } return c.instance.Close() } diff --git a/cronjob/checkCoreJob.go b/cronjob/checkCoreJob.go index 84f34da..85ce98f 100644 --- a/cronjob/checkCoreJob.go +++ b/cronjob/checkCoreJob.go @@ -13,5 +13,5 @@ func NewCheckCoreJob() *CheckCoreJob { } func (s *CheckCoreJob) Run() { - s.ConfigService.StartCore("") + s.ConfigService.StartCore() } diff --git a/service/config.go b/service/config.go index eb1f76b..85a41b9 100644 --- a/service/config.go +++ b/service/config.go @@ -44,7 +44,7 @@ func NewConfigService(core *core.Core) *ConfigService { return &ConfigService{} } -func (s *ConfigService) GetConfig(data string) (*SingBoxConfig, error) { +func (s *ConfigService) GetConfig(data string) (*[]byte, error) { var err error if len(data) == 0 { data, err = s.SettingService.GetConfig() @@ -74,22 +74,22 @@ func (s *ConfigService) GetConfig(data string) (*SingBoxConfig, error) { if err != nil { return nil, err } - return &singboxConfig, nil + rawConfig, err := json.MarshalIndent(singboxConfig, "", " ") + if err != nil { + return nil, err + } + return &rawConfig, nil } -func (s *ConfigService) StartCore(defaultConfig string) error { +func (s *ConfigService) StartCore() error { if corePtr.IsRunning() { return nil } - singboxConfig, err := s.GetConfig(defaultConfig) + rawConfig, err := s.GetConfig("") if err != nil { return err } - rawConfig, err := json.MarshalIndent(singboxConfig, "", " ") - if err != nil { - return err - } - err = corePtr.Start(rawConfig) + err = corePtr.Start(*rawConfig) if err != nil { logger.Error("start sing-box err:", err.Error()) return err @@ -103,15 +103,34 @@ func (s *ConfigService) RestartCore() error { if err != nil { return err } - return s.StartCore("") + return s.StartCore() } func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error { - err := s.StopCore() + var err error + defer func() { + if err != nil { + corePtr.Stop() + logger.Error("restart sing-box err:", err.Error()) + } else { + logger.Info("sing-box restarted with new config") + } + }() + if corePtr.IsRunning() { + err = corePtr.GetInstance().Close() + if err != nil { + return err + } + } + rawConfig, err := s.GetConfig(string(config)) if err != nil { return err } - return s.StartCore(string(config)) + err = corePtr.Start(*rawConfig) + if err != nil { + return err + } + return nil } func (s *ConfigService) StopCore() error { @@ -144,7 +163,7 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initU tx.Commit() // Try to start core if it is not running if !corePtr.IsRunning() { - s.StartCore("") + s.StartCore() } } else { tx.Rollback()