update new features service-dns
This commit is contained in:
+16
-1
@@ -22,6 +22,7 @@ type ConfigService struct {
|
||||
SettingService
|
||||
InboundService
|
||||
OutboundService
|
||||
ServicesService
|
||||
EndpointService
|
||||
}
|
||||
|
||||
@@ -31,6 +32,7 @@ type SingBoxConfig struct {
|
||||
Ntp json.RawMessage `json:"ntp"`
|
||||
Inbounds []json.RawMessage `json:"inbounds"`
|
||||
Outbounds []json.RawMessage `json:"outbounds"`
|
||||
Services []json.RawMessage `json:"services"`
|
||||
Endpoints []json.RawMessage `json:"endpoints"`
|
||||
Route json.RawMessage `json:"route"`
|
||||
Experimental json.RawMessage `json:"experimental"`
|
||||
@@ -63,6 +65,10 @@ func (s *ConfigService) GetConfig(data string) (*SingBoxConfig, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
singboxConfig.Services, err = s.ServicesService.GetAllConfig(database.GetDB())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
singboxConfig.Endpoints, err = s.EndpointService.GetAllConfig(database.GetDB())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -119,6 +125,7 @@ func (s *ConfigService) StopCore() error {
|
||||
func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initUsers string, loginUser string, hostname string) ([]string, error) {
|
||||
var err error
|
||||
var inboundIds []uint
|
||||
var serviceIds []uint
|
||||
var inboundId uint
|
||||
var objs []string = []string{obj}
|
||||
|
||||
@@ -133,6 +140,12 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initU
|
||||
logger.Error("unable to restart inbounds: ", err1)
|
||||
}
|
||||
}
|
||||
if len(serviceIds) > 0 && corePtr.IsRunning() {
|
||||
err1 := s.ServicesService.RestartServices(db, serviceIds)
|
||||
if err1 != nil {
|
||||
logger.Error("unable to restart services: ", err1)
|
||||
}
|
||||
}
|
||||
// Try to start core if it is not running
|
||||
if !corePtr.IsRunning() {
|
||||
s.StartCore("")
|
||||
@@ -147,11 +160,13 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initU
|
||||
inboundIds, err = s.ClientService.Save(tx, act, data, hostname)
|
||||
objs = append(objs, "inbounds")
|
||||
case "tls":
|
||||
inboundIds, err = s.TlsService.Save(tx, act, data)
|
||||
serviceIds, inboundIds, err = s.TlsService.Save(tx, act, data)
|
||||
case "inbounds":
|
||||
inboundId, err = s.InboundService.Save(tx, act, data, initUsers, hostname)
|
||||
case "outbounds":
|
||||
err = s.OutboundService.Save(tx, act, data)
|
||||
case "services":
|
||||
err = s.ServicesService.Save(tx, act, data)
|
||||
case "endpoints":
|
||||
err = s.EndpointService.Save(tx, act, data)
|
||||
case "config":
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"s-ui/database"
|
||||
"s-ui/database/model"
|
||||
"s-ui/util/common"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type ServicesService struct{}
|
||||
|
||||
func (s *ServicesService) GetAll() (*[]map[string]interface{}, error) {
|
||||
db := database.GetDB()
|
||||
services := []model.Service{}
|
||||
err := db.Model(model.Service{}).Scan(&services).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var data []map[string]interface{}
|
||||
for _, srv := range services {
|
||||
srvData := map[string]interface{}{
|
||||
"id": srv.Id,
|
||||
"type": srv.Type,
|
||||
"tag": srv.Tag,
|
||||
"tls_id": srv.TlsId,
|
||||
}
|
||||
if srv.Options != nil {
|
||||
var restFields map[string]json.RawMessage
|
||||
if err := json.Unmarshal(srv.Options, &restFields); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for k, v := range restFields {
|
||||
srvData[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
data = append(data, srvData)
|
||||
}
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func (s *ServicesService) GetAllConfig(db *gorm.DB) ([]json.RawMessage, error) {
|
||||
var servicesJson []json.RawMessage
|
||||
var services []*model.Service
|
||||
err := db.Model(model.Service{}).Preload("Tls").Find(&services).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, srv := range services {
|
||||
srvJson, err := srv.MarshalJSON()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
servicesJson = append(servicesJson, srvJson)
|
||||
}
|
||||
return servicesJson, nil
|
||||
}
|
||||
|
||||
func (s *ServicesService) Save(tx *gorm.DB, act string, data json.RawMessage) error {
|
||||
var err error
|
||||
|
||||
switch act {
|
||||
case "new", "edit":
|
||||
var srv model.Service
|
||||
err = srv.UnmarshalJSON(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if srv.TlsId > 0 {
|
||||
err = tx.Model(model.Tls{}).Where("id = ?", srv.TlsId).Find(&srv.Tls).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if corePtr.IsRunning() {
|
||||
configData, err := srv.MarshalJSON()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if act == "edit" {
|
||||
var oldTag string
|
||||
err = tx.Model(model.Service{}).Select("tag").Where("id = ?", srv.Id).Find(&oldTag).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = corePtr.RemoveService(oldTag)
|
||||
if err != nil && err != os.ErrInvalid {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err = corePtr.AddService(configData)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = tx.Save(&srv).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "del":
|
||||
var tag string
|
||||
err = json.Unmarshal(data, &tag)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if corePtr.IsRunning() {
|
||||
err = corePtr.RemoveService(tag)
|
||||
if err != nil && err != os.ErrInvalid {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err = tx.Where("tag = ?", tag).Delete(model.Service{}).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
default:
|
||||
return common.NewErrorf("unknown action: %s", act)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ServicesService) RestartServices(tx *gorm.DB, ids []uint) error {
|
||||
var services []*model.Service
|
||||
err := tx.Model(model.Service{}).Preload("Tls").Where("id in ?", ids).Find(&services).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, srv := range services {
|
||||
err = corePtr.RemoveService(srv.Tag)
|
||||
if err != nil && err != os.ErrInvalid {
|
||||
return err
|
||||
}
|
||||
srvConfig, err := srv.MarshalJSON()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = corePtr.AddService(srvConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
+18
-11
@@ -24,45 +24,52 @@ func (s *TlsService) GetAll() ([]model.Tls, error) {
|
||||
return tlsConfig, nil
|
||||
}
|
||||
|
||||
func (s *TlsService) Save(tx *gorm.DB, action string, data json.RawMessage) ([]uint, error) {
|
||||
func (s *TlsService) Save(tx *gorm.DB, action string, data json.RawMessage) ([]uint, []uint, error) {
|
||||
var err error
|
||||
var inboundIds []uint
|
||||
var serviceIds []uint
|
||||
|
||||
switch action {
|
||||
case "new", "edit":
|
||||
var tls model.Tls
|
||||
err = json.Unmarshal(data, &tls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
err = tx.Save(&tls).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
err = tx.Model(model.Inbound{}).Select("id").Where("tls_id = ?", tls.Id).Scan(&inboundIds).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
return inboundIds, nil
|
||||
err = tx.Model(model.Service{}).Where("tls_id = ?", tls.Id).Scan(&serviceIds).Error
|
||||
return serviceIds, inboundIds, nil
|
||||
case "del":
|
||||
var id uint
|
||||
err = json.Unmarshal(data, &id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
var inboundCount int64
|
||||
err = tx.Model(model.Inbound{}).Where("tls_id = ?", id).Count(&inboundCount).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
if inboundCount > 0 {
|
||||
return nil, common.NewError("tls in use")
|
||||
var serviceCount int64
|
||||
err = tx.Model(model.Service{}).Where("tls_id = ?", id).Count(&serviceCount).Error
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
if inboundCount > 0 || serviceCount > 0 {
|
||||
return nil, nil, common.NewError("tls in use")
|
||||
}
|
||||
err = tx.Where("id = ?", id).Delete(model.Tls{}).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user