feat: use mixed port for proxies

This commit is contained in:
yicheng 2020-06-16 14:30:32 +08:00
parent 143583c7b9
commit 5fed9d57da
7 changed files with 71 additions and 54 deletions

View File

@ -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 :

View File

@ -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) {

View File

@ -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: "")

View File

@ -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

View File

@ -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? {

View File

@ -4,25 +4,25 @@
## 这份文件是clashX的基础配置文件请尽量新建配置文件进行修改。
## 只有这份文件的端口设置会随ClashX启动生效
## 如果您不知道如何操作,请参阅 SS-Rule-Snippethttps://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

View File

@ -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
}
}
}