Chore: merge branch 'with-tun' into plus-pro
This commit is contained in:
@ -1,15 +1,17 @@
|
||||
package route
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/Dreamacro/clash/component/dialer"
|
||||
"github.com/Dreamacro/clash/component/resolver"
|
||||
"github.com/Dreamacro/clash/config"
|
||||
"github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/hub/executor"
|
||||
P "github.com/Dreamacro/clash/listener"
|
||||
"github.com/Dreamacro/clash/listener/tun/ipstack/commons"
|
||||
"github.com/Dreamacro/clash/log"
|
||||
"github.com/Dreamacro/clash/tunnel"
|
||||
|
||||
@ -26,26 +28,28 @@ func configRouter() http.Handler {
|
||||
}
|
||||
|
||||
type configSchema struct {
|
||||
Port *int `json:"port"`
|
||||
SocksPort *int `json:"socks-port"`
|
||||
RedirPort *int `json:"redir-port"`
|
||||
TProxyPort *int `json:"tproxy-port"`
|
||||
MixedPort *int `json:"mixed-port"`
|
||||
MitmPort *int `json:"mitm-port"`
|
||||
AllowLan *bool `json:"allow-lan"`
|
||||
BindAddress *string `json:"bind-address"`
|
||||
Mode *tunnel.TunnelMode `json:"mode"`
|
||||
LogLevel *log.LogLevel `json:"log-level"`
|
||||
IPv6 *bool `json:"ipv6"`
|
||||
Tun *tunConfigSchema `json:"tun"`
|
||||
Port *int `json:"port,omitempty"`
|
||||
SocksPort *int `json:"socks-port,omitempty"`
|
||||
RedirPort *int `json:"redir-port,omitempty"`
|
||||
TProxyPort *int `json:"tproxy-port,omitempty"`
|
||||
MixedPort *int `json:"mixed-port,omitempty"`
|
||||
MitmPort *int `json:"mitm-port,omitempty"`
|
||||
AllowLan *bool `json:"allow-lan,omitempty"`
|
||||
BindAddress *string `json:"bind-address,omitempty"`
|
||||
Mode *tunnel.TunnelMode `json:"mode,omitempty"`
|
||||
LogLevel *log.LogLevel `json:"log-level,omitempty"`
|
||||
IPv6 *bool `json:"ipv6,omitempty"`
|
||||
Sniffing *bool `json:"sniffing,omitempty"`
|
||||
Tun *tunConfigSchema `json:"tun,omitempty"`
|
||||
}
|
||||
|
||||
type tunConfigSchema struct {
|
||||
Enable *bool `json:"enable"`
|
||||
Device *string `json:"device"`
|
||||
Stack *constant.TUNStack `json:"stack"`
|
||||
DNSHijack *[]netip.AddrPort `json:"dns-hijack"`
|
||||
AutoRoute *bool `json:"auto-route"`
|
||||
Enable *bool `json:"enable,omitempty"`
|
||||
Device *string `json:"device,omitempty"`
|
||||
Stack *constant.TUNStack `json:"stack,omitempty"`
|
||||
DNSHijack *[]constant.DNSUrl `json:"dns-hijack,omitempty"`
|
||||
AutoRoute *bool `json:"auto-route,omitempty"`
|
||||
AutoDetectInterface *bool `json:"auto-detect-interface,omitempty"`
|
||||
}
|
||||
|
||||
func getConfigs(w http.ResponseWriter, r *http.Request) {
|
||||
@ -101,6 +105,10 @@ func patchConfigs(w http.ResponseWriter, r *http.Request) {
|
||||
resolver.DisableIPv6 = !*general.IPv6
|
||||
}
|
||||
|
||||
if general.Sniffing != nil {
|
||||
tunnel.SetSniffing(*general.Sniffing)
|
||||
}
|
||||
|
||||
if general.Tun != nil {
|
||||
tunSchema := general.Tun
|
||||
tunConf := P.GetTunConf()
|
||||
@ -120,10 +128,26 @@ func patchConfigs(w http.ResponseWriter, r *http.Request) {
|
||||
if tunSchema.AutoRoute != nil {
|
||||
tunConf.AutoRoute = *tunSchema.AutoRoute
|
||||
}
|
||||
if tunSchema.AutoDetectInterface != nil {
|
||||
tunConf.AutoDetectInterface = *tunSchema.AutoDetectInterface
|
||||
}
|
||||
|
||||
P.ReCreateTun(&tunConf, nil, tcpIn, udpIn)
|
||||
if dialer.DefaultInterface.Load() == "" && tunConf.Enable {
|
||||
outboundInterface, err := commons.GetAutoDetectInterface()
|
||||
if err != nil {
|
||||
render.Status(r, http.StatusBadRequest)
|
||||
render.JSON(w, r, newError("Get auto detect interface fail: "+err.Error()))
|
||||
return
|
||||
}
|
||||
dialer.DefaultInterface.Store(outboundInterface)
|
||||
}
|
||||
|
||||
P.ReCreateTun(&tunConf, tcpIn, udpIn)
|
||||
}
|
||||
|
||||
msg, _ := json.Marshal(general)
|
||||
log.Warnln("[REST-API] patch config by: %s", string(msg))
|
||||
|
||||
render.NoContent(w, r)
|
||||
}
|
||||
|
||||
@ -151,6 +175,7 @@ func updateConfigs(w http.ResponseWriter, r *http.Request) {
|
||||
render.JSON(w, r, newError(err.Error()))
|
||||
return
|
||||
}
|
||||
log.Warnln("[REST-API] update config by payload")
|
||||
} else {
|
||||
if req.Path == "" {
|
||||
req.Path = constant.Path.Config()
|
||||
@ -167,6 +192,7 @@ func updateConfigs(w http.ResponseWriter, r *http.Request) {
|
||||
render.JSON(w, r, newError(err.Error()))
|
||||
return
|
||||
}
|
||||
log.Warnln("[REST-API] reload config from path: %s", req.Path)
|
||||
}
|
||||
|
||||
executor.ApplyConfig(cfg, force)
|
||||
|
64
hub/route/configsGeo.go
Normal file
64
hub/route/configsGeo.go
Normal file
@ -0,0 +1,64 @@
|
||||
package route
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"github.com/Dreamacro/clash/config"
|
||||
"github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/hub/executor"
|
||||
"github.com/Dreamacro/clash/log"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-chi/render"
|
||||
)
|
||||
|
||||
var (
|
||||
updatingGeo bool
|
||||
updateGeoMux sync.Mutex
|
||||
)
|
||||
|
||||
func configGeoRouter() http.Handler {
|
||||
r := chi.NewRouter()
|
||||
r.Post("/", updateGeoDatabases)
|
||||
return r
|
||||
}
|
||||
|
||||
func updateGeoDatabases(w http.ResponseWriter, r *http.Request) {
|
||||
updateGeoMux.Lock()
|
||||
|
||||
if updatingGeo {
|
||||
updateGeoMux.Unlock()
|
||||
render.Status(r, http.StatusBadRequest)
|
||||
render.JSON(w, r, newError("updating..."))
|
||||
return
|
||||
}
|
||||
|
||||
updatingGeo = true
|
||||
updateGeoMux.Unlock()
|
||||
|
||||
go func() {
|
||||
defer func() {
|
||||
updatingGeo = false
|
||||
}()
|
||||
|
||||
log.Warnln("[REST-API] updating GEO databases...")
|
||||
|
||||
if err := config.UpdateGeoDatabases(); err != nil {
|
||||
log.Errorln("[REST-API] update GEO databases failed: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
cfg, err := executor.ParseWithPath(constant.Path.Config())
|
||||
if err != nil {
|
||||
log.Errorln("[REST-API] update GEO databases failed: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Warnln("[REST-API] update GEO databases successful, apply config...")
|
||||
|
||||
executor.ApplyConfig(cfg, false)
|
||||
}()
|
||||
|
||||
render.NoContent(w, r)
|
||||
}
|
@ -67,6 +67,7 @@ func Start(addr string, secret string) {
|
||||
r.Get("/traffic", traffic)
|
||||
r.Get("/version", version)
|
||||
r.Mount("/configs", configRouter())
|
||||
r.Mount("/configs/geo", configGeoRouter())
|
||||
r.Mount("/proxies", proxyRouter())
|
||||
r.Mount("/rules", ruleRouter())
|
||||
r.Mount("/connections", connectionRouter())
|
||||
|
Reference in New Issue
Block a user