feat: use mixed port for proxies
This commit is contained in:
parent
143583c7b9
commit
5fed9d57da
@ -128,9 +128,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
Logger.log("ClashX quit need clean proxy setting")
|
||||
shouldWait = true
|
||||
group.enter()
|
||||
let port = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
SystemProxyManager.shared.disableProxy(port: port, socksPort: socketPort) {
|
||||
SystemProxyManager.shared.disableProxy {
|
||||
group.leave()
|
||||
}
|
||||
}
|
||||
@ -232,15 +230,15 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
|
||||
self.proxyModeMenuItem.title = "\(NSLocalizedString("Proxy Mode", comment: "")) (\(config.mode.name))"
|
||||
|
||||
if old?.port != config.port || old?.socketPort != config.socketPort {
|
||||
Logger.log("port config updated,new: \(config.port),\(config.socketPort)")
|
||||
if old?.usedHttpPort != config.usedHttpPort || old?.usedSocksPort != config.usedSocksPort {
|
||||
Logger.log("port config updated,new: \(config.usedHttpPort),\(config.usedSocksPort)")
|
||||
if ConfigManager.shared.proxyPortAutoSet {
|
||||
SystemProxyManager.shared.enableProxy(port: config.port, socksPort: config.socketPort)
|
||||
SystemProxyManager.shared.enableProxy(port: config.usedHttpPort, socksPort: config.usedSocksPort)
|
||||
}
|
||||
}
|
||||
|
||||
self.httpPortMenuItem.title = "Http Port: \(config.port)"
|
||||
self.socksPortMenuItem.title = "Socks Port: \(config.socketPort)"
|
||||
self.httpPortMenuItem.title = "Http Port: \(config.usedHttpPort)"
|
||||
self.socksPortMenuItem.title = "Socks Port: \(config.usedSocksPort)"
|
||||
self.apiPortMenuItem.title = "Api Port: \(ConfigManager.shared.apiPort)"
|
||||
self.ipMenuItem.title = "IP: \(NetworkChangeNotifier.getPrimaryIPAddress() ?? "")"
|
||||
|
||||
@ -535,24 +533,22 @@ extension AppDelegate {
|
||||
} else {
|
||||
ConfigManager.shared.proxyPortAutoSet = !ConfigManager.shared.proxyPortAutoSet
|
||||
}
|
||||
let port = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
|
||||
if ConfigManager.shared.proxyPortAutoSet {
|
||||
if canSaveProxy {
|
||||
SystemProxyManager.shared.saveProxy()
|
||||
}
|
||||
SystemProxyManager.shared.enableProxy(port: port, socksPort: socketPort)
|
||||
SystemProxyManager.shared.enableProxy()
|
||||
} else {
|
||||
SystemProxyManager.shared.disableProxy(port: port, socksPort: socketPort)
|
||||
SystemProxyManager.shared.disableProxy()
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func actionCopyExportCommand(_ sender: NSMenuItem) {
|
||||
let pasteboard = NSPasteboard.general
|
||||
pasteboard.clearContents()
|
||||
let port = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let socksport = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0
|
||||
let socksport = ConfigManager.shared.currentConfig?.usedSocksPort ?? 0
|
||||
let localhost = "127.0.0.1"
|
||||
let isLocalhostCopy = sender == copyExportCommandMenuItem
|
||||
let ip = isLocalhostCopy ? localhost :
|
||||
|
@ -46,8 +46,8 @@ class SystemProxyManager: NSObject {
|
||||
}
|
||||
|
||||
func enableProxy() {
|
||||
let port = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.usedSocksPort ?? 0
|
||||
SystemProxyManager.shared.enableProxy(port: port, socksPort: socketPort)
|
||||
}
|
||||
|
||||
@ -64,10 +64,10 @@ class SystemProxyManager: NSObject {
|
||||
})
|
||||
}
|
||||
|
||||
func disableProxy() {
|
||||
let port = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
SystemProxyManager.shared.disableProxy(port: port, socksPort: socketPort)
|
||||
func disableProxy(complete: (() -> Void)? = nil) {
|
||||
let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0
|
||||
let socketPort = ConfigManager.shared.currentConfig?.usedSocksPort ?? 0
|
||||
SystemProxyManager.shared.disableProxy(port: port, socksPort: socketPort, complete: complete)
|
||||
}
|
||||
|
||||
func disableProxy(port: Int, socksPort: Int, forceDisable: Bool = false, complete: (() -> Void)? = nil) {
|
||||
|
@ -11,8 +11,8 @@ import Cocoa
|
||||
class ClashStatusTool {
|
||||
static func checkPortConfig(cfg: ClashConfig?) {
|
||||
guard let cfg = cfg else { return }
|
||||
if cfg.port == 0 || cfg.socketPort == 0 {
|
||||
Logger.log("checkPortConfig: \(cfg.port) \(cfg.socketPort)", level: .error)
|
||||
if cfg.mixedPort == 0 {
|
||||
Logger.log("checkPortConfig: \(cfg.mixedPort) ", level: .error)
|
||||
let alert = NSAlert()
|
||||
alert.messageText = NSLocalizedString("ClashX Start Error!", comment: "")
|
||||
alert.informativeText = NSLocalizedString("Ports Open Fail, Please try to restart ClashX", comment: "")
|
||||
|
@ -80,8 +80,8 @@ class NetworkChangeNotifier {
|
||||
|
||||
static func isCurrentSystemSetToClash() -> Bool {
|
||||
let (http, https, socks) = NetworkChangeNotifier.currentSystemProxySetting()
|
||||
let currentPort = ConfigManager.shared.currentConfig?.port ?? 0
|
||||
let currentSocks = ConfigManager.shared.currentConfig?.socketPort ?? 0
|
||||
let currentPort = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0
|
||||
let currentSocks = ConfigManager.shared.currentConfig?.usedSocksPort ?? 0
|
||||
|
||||
let proxySetted = http == currentPort && https == currentPort && socks == currentSocks
|
||||
return proxySetted
|
||||
|
@ -33,14 +33,29 @@ enum ClashLogLevel: String, Codable {
|
||||
}
|
||||
|
||||
class ClashConfig: Codable {
|
||||
var port: Int
|
||||
var socketPort: Int
|
||||
private var port: Int
|
||||
private var socksPort: Int
|
||||
var allowLan: Bool
|
||||
var mixedPort: Int
|
||||
var mode: ClashProxyMode
|
||||
var logLevel: ClashLogLevel
|
||||
|
||||
var usedHttpPort: Int {
|
||||
if mixedPort > 0 {
|
||||
return mixedPort
|
||||
}
|
||||
return port
|
||||
}
|
||||
|
||||
var usedSocksPort: Int {
|
||||
if mixedPort > 0 {
|
||||
return mixedPort
|
||||
}
|
||||
return socksPort
|
||||
}
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case port, socketPort = "socks-port", allowLan = "allow-lan", mode, logLevel = "log-level"
|
||||
case port, socksPort = "socks-port", mixedPort = "mixed-port", allowLan = "allow-lan", mode, logLevel = "log-level"
|
||||
}
|
||||
|
||||
static func fromData(_ data: Data) -> ClashConfig? {
|
||||
|
@ -4,25 +4,25 @@
|
||||
## 这份文件是clashX的基础配置文件,请尽量新建配置文件进行修改。
|
||||
## !!!只有这份文件的端口设置会随ClashX启动生效
|
||||
|
||||
## 如果您不知道如何操作,请参阅 SS-Rule-Snippet:https://github.com/Hackl0us/SS-Rule-Snippet/blob/master/LAZY_RULES/clash.yaml
|
||||
## 或者官方Github文档 https://github.com/Dreamacro/clash/blob/master/README.md
|
||||
## 如果您不知道如何操作,请参阅 官方Github文档 https://github.com/Dreamacro/clash/blob/dev/README.md
|
||||
#---------------------------------------------------#
|
||||
|
||||
port: 7890
|
||||
socks-port: 7891
|
||||
allow-lan: false
|
||||
mode: Rule
|
||||
log-level: info
|
||||
# (HTTP and SOCKS5 in one port)
|
||||
mixed-port: 7890
|
||||
# RESTful API for clash
|
||||
external-controller: 127.0.0.1:9090
|
||||
allow-lan: false
|
||||
mode: rule
|
||||
log-level: warning
|
||||
|
||||
Proxy:
|
||||
proxies:
|
||||
|
||||
Proxy Group:
|
||||
proxy-groups:
|
||||
|
||||
Rule:
|
||||
- DOMAIN-SUFFIX,google.com,DIRECT
|
||||
- DOMAIN-KEYWORD,google,DIRECT
|
||||
- DOMAIN,google.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ad.com,REJECT
|
||||
- GEOIP,CN,DIRECT
|
||||
- MATCH,DIRECT
|
||||
rules:
|
||||
- DOMAIN-SUFFIX,google.com,DIRECT
|
||||
- DOMAIN-KEYWORD,google,DIRECT
|
||||
- DOMAIN,google.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ad.com,REJECT
|
||||
- GEOIP,CN,DIRECT
|
||||
- MATCH,DIRECT
|
||||
|
@ -23,7 +23,7 @@ func isAddrValid(addr string) bool {
|
||||
v := comps[len(comps)-1]
|
||||
if port, err := strconv.Atoi(v); err == nil {
|
||||
if port > 0 && port < 65535 {
|
||||
return true
|
||||
return checkPortAvailable(port)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -54,6 +54,18 @@ func parseDefaultConfigThenStart(checkPort, allowLan bool) (*config.Config, erro
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if cfg.General.MixedPort == 0 {
|
||||
if cfg.General.Port > 0 {
|
||||
cfg.General.MixedPort = cfg.General.Port
|
||||
} else if cfg.General.SocksPort > 0 {
|
||||
cfg.General.MixedPort = cfg.General.SocksPort
|
||||
} else {
|
||||
cfg.General.MixedPort = 7890
|
||||
}
|
||||
cfg.General.SocksPort = 0
|
||||
cfg.General.Port = 0
|
||||
}
|
||||
|
||||
if checkPort {
|
||||
if !isAddrValid(cfg.General.ExternalController) {
|
||||
port, err := freeport.GetFreePort()
|
||||
@ -64,17 +76,11 @@ func parseDefaultConfigThenStart(checkPort, allowLan bool) (*config.Config, erro
|
||||
cfg.General.Secret = ""
|
||||
}
|
||||
cfg.General.AllowLan = allowLan
|
||||
}
|
||||
|
||||
if !checkPortAvailable(cfg.General.Port) {
|
||||
if port, err := freeport.GetFreePort(); err == nil {
|
||||
cfg.General.Port = port
|
||||
}
|
||||
}
|
||||
|
||||
if !checkPortAvailable(cfg.General.SocksPort) {
|
||||
if port, err := freeport.GetFreePort(); err == nil {
|
||||
cfg.General.SocksPort = port
|
||||
if !checkPortAvailable(cfg.General.MixedPort) {
|
||||
if port, err := freeport.GetFreePort(); err == nil {
|
||||
cfg.General.MixedPort = port
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user