fix crash on restart due to change #1030

This commit is contained in:
Alireza Ahmadi
2026-02-28 01:52:34 +01:00
parent 5812d6a827
commit 13d475da20
5 changed files with 39 additions and 23 deletions
+2 -8
View File
@@ -386,13 +386,7 @@ func (a *ApiService) DeleteToken(c *gin.Context) {
} }
func (a *ApiService) GetSingboxConfig(c *gin.Context) { func (a *ApiService) GetSingboxConfig(c *gin.Context) {
config, err := a.ConfigService.GetConfig("") rawConfig, err := a.ConfigService.GetConfig("")
if err != nil {
c.Status(400)
c.Writer.WriteString(err.Error())
return
}
rawConfig, err := json.MarshalIndent(config, "", " ")
if err != nil { if err != nil {
c.Status(400) c.Status(400)
c.Writer.WriteString(err.Error()) 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-Type", "application/json")
c.Header("Content-Disposition", "attachment; filename=config_"+time.Now().Format("20060102-150405")+".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) { func (a *ApiService) GetCheckOutbound(c *gin.Context) {
+1 -1
View File
@@ -79,7 +79,7 @@ func (a *APP) Start() error {
return err return err
} }
err = a.configService.StartCore("") err = a.configService.StartCore()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
} }
+3
View File
@@ -83,6 +83,9 @@ func (c *Core) Start(sbConfig []byte) error {
func (c *Core) Stop() error { func (c *Core) Stop() error {
c.isRunning = false c.isRunning = false
if c.instance != nil {
return nil
}
return c.instance.Close() return c.instance.Close()
} }
+1 -1
View File
@@ -13,5 +13,5 @@ func NewCheckCoreJob() *CheckCoreJob {
} }
func (s *CheckCoreJob) Run() { func (s *CheckCoreJob) Run() {
s.ConfigService.StartCore("") s.ConfigService.StartCore()
} }
+32 -13
View File
@@ -44,7 +44,7 @@ func NewConfigService(core *core.Core) *ConfigService {
return &ConfigService{} return &ConfigService{}
} }
func (s *ConfigService) GetConfig(data string) (*SingBoxConfig, error) { func (s *ConfigService) GetConfig(data string) (*[]byte, error) {
var err error var err error
if len(data) == 0 { if len(data) == 0 {
data, err = s.SettingService.GetConfig() data, err = s.SettingService.GetConfig()
@@ -74,22 +74,22 @@ func (s *ConfigService) GetConfig(data string) (*SingBoxConfig, error) {
if err != nil { if err != nil {
return nil, err 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() { if corePtr.IsRunning() {
return nil return nil
} }
singboxConfig, err := s.GetConfig(defaultConfig) rawConfig, err := s.GetConfig("")
if err != nil { if err != nil {
return err return err
} }
rawConfig, err := json.MarshalIndent(singboxConfig, "", " ") err = corePtr.Start(*rawConfig)
if err != nil {
return err
}
err = corePtr.Start(rawConfig)
if err != nil { if err != nil {
logger.Error("start sing-box err:", err.Error()) logger.Error("start sing-box err:", err.Error())
return err return err
@@ -103,15 +103,34 @@ func (s *ConfigService) RestartCore() error {
if err != nil { if err != nil {
return err return err
} }
return s.StartCore("") return s.StartCore()
} }
func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error { 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 { if err != nil {
return err return err
} }
return s.StartCore(string(config)) }
rawConfig, err := s.GetConfig(string(config))
if err != nil {
return err
}
err = corePtr.Start(*rawConfig)
if err != nil {
return err
}
return nil
} }
func (s *ConfigService) StopCore() error { func (s *ConfigService) StopCore() error {
@@ -144,7 +163,7 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initU
tx.Commit() tx.Commit()
// Try to start core if it is not running // Try to start core if it is not running
if !corePtr.IsRunning() { if !corePtr.IsRunning() {
s.StartCore("") s.StartCore()
} }
} else { } else {
tx.Rollback() tx.Rollback()