add api checkOutbound #761
This commit is contained in:
@@ -97,6 +97,8 @@ func (a *APIHandler) getHandler(c *gin.Context) {
|
||||
a.ApiService.GetTokens(c)
|
||||
case "singbox-config":
|
||||
a.ApiService.GetSingboxConfig(c)
|
||||
case "checkOutbound":
|
||||
a.ApiService.GetCheckOutbound(c)
|
||||
default:
|
||||
jsonMsg(c, "failed", common.NewError("unknown action: ", action))
|
||||
}
|
||||
|
||||
@@ -396,3 +396,10 @@ func (a *ApiService) GetSingboxConfig(c *gin.Context) {
|
||||
c.Header("Content-Disposition", "attachment; filename=config_"+time.Now().Format("20060102-150405")+".json")
|
||||
c.Writer.Write(rawConfig)
|
||||
}
|
||||
|
||||
func (a *ApiService) GetCheckOutbound(c *gin.Context) {
|
||||
tag := c.Query("tag")
|
||||
link := c.Query("link")
|
||||
result := a.ConfigService.CheckOutbound(tag, link)
|
||||
jsonObj(c, result, nil)
|
||||
}
|
||||
|
||||
@@ -86,6 +86,8 @@ func (a *APIv2Handler) getHandler(c *gin.Context) {
|
||||
a.ApiService.GetKeypairs(c)
|
||||
case "getdb":
|
||||
a.ApiService.GetDb(c)
|
||||
case "checkOutbound":
|
||||
a.ApiService.GetCheckOutbound(c)
|
||||
default:
|
||||
jsonMsg(c, "failed", common.NewError("unknown action: ", action))
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
urltest "github.com/sagernet/sing-box/common/urltest"
|
||||
)
|
||||
|
||||
const checkTimeout = 15 * time.Second
|
||||
|
||||
type CheckOutboundResult struct {
|
||||
OK bool
|
||||
Delay uint16
|
||||
Error string
|
||||
}
|
||||
|
||||
func CheckOutbound(ctx context.Context, tag string, link string) (result CheckOutboundResult) {
|
||||
if outbound_manager == nil {
|
||||
result.Error = "core not running"
|
||||
return result
|
||||
}
|
||||
ob, ok := outbound_manager.Outbound(tag)
|
||||
if !ok {
|
||||
result.Error = "outbound not found"
|
||||
return result
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(ctx, checkTimeout)
|
||||
defer cancel()
|
||||
|
||||
delay, err := urltest.URLTest(ctx, link, ob)
|
||||
if err != nil {
|
||||
result.Error = err.Error()
|
||||
return result
|
||||
}
|
||||
result.OK = true
|
||||
result.Delay = delay
|
||||
return result
|
||||
}
|
||||
@@ -123,6 +123,16 @@ func (s *ConfigService) StopCore() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ConfigService) CheckOutbound(tag string, link string) core.CheckOutboundResult {
|
||||
if tag == "" {
|
||||
return core.CheckOutboundResult{Error: "missing query parameter: tag"}
|
||||
}
|
||||
if corePtr == nil || !corePtr.IsRunning() {
|
||||
return core.CheckOutboundResult{Error: "core not running"}
|
||||
}
|
||||
return core.CheckOutbound(corePtr.GetCtx(), tag, link)
|
||||
}
|
||||
|
||||
func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initUsers string, loginUser string, hostname string) ([]string, error) {
|
||||
var err error
|
||||
var objs []string = []string{obj}
|
||||
|
||||
Reference in New Issue
Block a user