fix crash on restart due to change #1030
This commit is contained in:
+2
-8
@@ -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
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,5 +13,5 @@ func NewCheckCoreJob() *CheckCoreJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *CheckCoreJob) Run() {
|
func (s *CheckCoreJob) Run() {
|
||||||
s.ConfigService.StartCore("")
|
s.ConfigService.StartCore()
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-13
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user