Skip to content

Commit

Permalink
备份及还原系统代理
Browse files Browse the repository at this point in the history
  • Loading branch information
yanue committed Feb 1, 2019
1 parent f09bf17 commit 910ed07
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 40 deletions.
Expand Up @@ -70,7 +70,7 @@
<key>V2rayUTool.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>15</integer>
<integer>14</integer>
</dict>
<key>V2rayuHelper.xcscheme</key>
<dict>
Expand Down
Expand Up @@ -16,7 +16,7 @@
<key>isShown</key>
<false />
<key>orderHint</key>
<integer>14</integer>
<integer>15</integer>
</dict>
</dict>
</dict>
Expand Down
3 changes: 2 additions & 1 deletion V2rayU/AppDelegate.swift
Expand Up @@ -18,7 +18,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {


func applicationDidFinishLaunching(_ aNotification: Notification) {
V2rayLaunch.chmodCmdPermission()

// Insert code here to initialize your application
let startedAtLogin = NSWorkspace.shared.runningApplications.contains {
Expand Down Expand Up @@ -101,5 +100,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
V2rayLaunch.Stop()
// restore system proxy
V2rayLaunch.setSystemProxy(mode: .restore)
}
}
4 changes: 2 additions & 2 deletions V2rayU/Info.plist
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.1.1</string>
<string>1.2</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
Expand All @@ -34,7 +34,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.1.1</string>
<string>1.2</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
Expand Down
17 changes: 17 additions & 0 deletions V2rayU/MainMenu.swift
Expand Up @@ -26,6 +26,7 @@ class MenuController: NSObject, NSMenuDelegate {
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
var statusItemClicked: (() -> Void)?
var configWindow: ConfigWindowController!
var lastRunMode: String = ""; // for backup system proxy

@IBOutlet weak var pacMode: NSMenuItem!
@IBOutlet weak var manualMode: NSMenuItem!
Expand All @@ -37,6 +38,11 @@ class MenuController: NSObject, NSMenuDelegate {

// when menu.xib loaded
override func awakeFromNib() {
V2rayLaunch.chmodCmdPermission()

// backup system proxy when init
V2rayLaunch.setSystemProxy(mode: .backup)

// Do any additional setup after loading the view.
// initial auth ref
let runMode = UserDefaults.get(forKey: .runMode) ?? "pac"
Expand Down Expand Up @@ -118,6 +124,8 @@ class MenuController: NSObject, NSMenuDelegate {
self.setStatusOff()
// stop launch
V2rayLaunch.Stop()
// restore system proxy
V2rayLaunch.setSystemProxy(mode: .restore)
}

// start v2ray core
Expand Down Expand Up @@ -280,17 +288,20 @@ class MenuController: NSObject, NSMenuDelegate {
@IBAction func switchManualMode(_ sender: NSMenuItem) {
// disable
switchRunMode(runMode: .manual)
lastRunMode = RunMode.manual.rawValue
}

@IBAction func switchPacMode(_ sender: NSMenuItem) {
// switch mode
switchRunMode(runMode: .pac)
lastRunMode = RunMode.pac.rawValue
}

// MARK: - actions
@IBAction func switchGlobalMode(_ sender: NSMenuItem) {
// switch mode
switchRunMode(runMode: .global)
lastRunMode = RunMode.global.rawValue
}

func switchRunMode(runMode: RunMode) {
Expand All @@ -313,6 +324,12 @@ class MenuController: NSObject, NSMenuDelegate {
httpPort = cfg.httpPort
}

// manual mode
if lastRunMode == RunMode.manual.rawValue {
// backup first
V2rayLaunch.setSystemProxy(mode: .backup)
}

// global
if runMode == .global {
V2rayLaunch.setSystemProxy(mode: .global, httpPort: httpPort, sockPort: sockPort)
Expand Down
14 changes: 4 additions & 10 deletions V2rayU/V2rayLaunch.swift
Expand Up @@ -30,6 +30,8 @@ enum RunMode: String {
case off
case manual
case pac
case backup
case restore
}

class V2rayLaunch: NSObject {
Expand Down Expand Up @@ -106,14 +108,6 @@ class V2rayLaunch: NSObject {
} else {
NSLog("Stop v2ray-core failed.")
}

// if enable system proxy
let runMode = RunMode(rawValue: UserDefaults.get(forKey: .runMode) ?? "manual") ?? .manual

if runMode == .global || runMode == .pac {
// close system proxy
V2rayLaunch.setSystemProxy(mode: .off)
}
}

static func OpenLogs() {
Expand Down Expand Up @@ -160,9 +154,9 @@ class V2rayLaunch: NSObject {
let task = Process.launchedProcess(launchPath: AppResourcesPath + "/V2rayUTool", arguments: ["-mode", mode.rawValue, "-pac-url", PACUrl, "-http-port", httpPort, "-sock-port", sockPort])
task.waitUntilExit()
if task.terminationStatus == 0 {
NSLog("setSystemProxy succeeded.")
NSLog("setSystemProxy " + mode.rawValue + " succeeded.")
} else {
NSLog("setSystemProxy failed.")
NSLog("setSystemProxy " + mode.rawValue + " failed.")
}
}
}
66 changes: 41 additions & 25 deletions V2rayUTool/main.swift
Expand Up @@ -10,34 +10,36 @@ import Foundation
import SystemConfiguration

var authRef: AuthorizationRef?
let SysProxyBackupPlist = NSHomeDirectory() + "/Library/Preferences/net.yanue.V2rayU.system_proxy_backup.plist"

class V2rayUTool: NSObject {
static let usage = "Usage: V2rayUTool -mode <global|manual|pac|off> -pac <url> -http-port <port> -sock-port <port>"
static let usage = "Usage: V2rayUTool -mode <global|manual|pac|off|restore|backup> -pac <url> -http-port <port> -sock-port <port>"

enum RunMode: String {
case global
case manual
case pac
case off
case backup
case restore
}



static func run() {
let arguments = CommandLine.arguments
if arguments.count < 9 {
print(self.usage)
return
}

let modeArg = arguments[2]
let pac = arguments[4]
let httpPort = arguments[6]
let sockPort = arguments[8]
let mode = self.RunMode(rawValue: modeArg) ?? .manual

self.setProxy(mode: mode, pacUrl: pac, httpPort: httpPort, sockPort: sockPort)
}

static func setProxy(mode: RunMode, pacUrl: String, httpPort: String, sockPort: String) {
let authErr = AuthorizationCreate(nil, nil, [.interactionAllowed, .extendRights, .preAuthorize], &authRef)
if (authErr != noErr) {
Expand All @@ -49,13 +51,23 @@ class V2rayUTool: NSObject {
NSLog("No authorization has been granted to modify network configuration");
return;
}

// set system proxy
let prefRef = SCPreferencesCreateWithAuthorization(kCFAllocatorDefault, "V2rayU" as CFString, nil, authRef)!
let sets = SCPreferencesGetValue(prefRef, kSCPrefNetworkServices)!


// backup system proxy
if mode == .backup {
do {
_ = (sets as! NSDictionary).write(toFile: SysProxyBackupPlist, atomically: true)
} catch {
print(error)
}
return
}

var proxies = [NSObject: AnyObject]()

// global proxy
if mode == .global {
// socks
Expand All @@ -65,47 +77,51 @@ class V2rayUTool: NSObject {
proxies[kCFNetworkProxiesSOCKSPort] = Int(sockPort)! as NSNumber
proxies[kCFNetworkProxiesExcludeSimpleHostnames] = 1 as NSNumber
}

// check http port
if httpPort != "" && Int(httpPort) ?? 0 > 1024 {
// http
proxies[kCFNetworkProxiesHTTPEnable] = 1 as NSNumber
proxies[kCFNetworkProxiesHTTPProxy] = "127.0.0.1" as AnyObject?
proxies[kCFNetworkProxiesHTTPPort] = Int(httpPort)! as NSNumber
proxies[kCFNetworkProxiesExcludeSimpleHostnames] = 1 as NSNumber

// https
proxies[kCFNetworkProxiesHTTPSEnable] = 1 as NSNumber
proxies[kCFNetworkProxiesHTTPSProxy] = "127.0.0.1" as AnyObject?
proxies[kCFNetworkProxiesHTTPSPort] = Int(httpPort)! as NSNumber
proxies[kCFNetworkProxiesExcludeSimpleHostnames] = 1 as NSNumber
}
}


// pac mode
if mode == .pac {
proxies[kCFNetworkProxiesProxyAutoConfigURLString] = pacUrl as AnyObject
proxies[kCFNetworkProxiesProxyAutoConfigEnable] = 1 as NSNumber
}

// restore system proxy setting in off or manual
if mode == .off || mode == .manual {
proxies[kCFNetworkProxiesProxyAutoConfigURLString] = "" as AnyObject?
proxies[kCFNetworkProxiesProxyAutoConfigEnable] = 0 as NSNumber
// set enable 0
proxies[kCFNetworkProxiesSOCKSEnable] = 0 as NSNumber
proxies[kCFNetworkProxiesHTTPEnable] = 0 as NSNumber
proxies[kCFNetworkProxiesHTTPSEnable] = 0 as NSNumber

// restore system proxy setting in off or manual or restore
var originalSets: Dictionary<String, Dictionary<String, Any>>?
if mode == .off || mode == .manual || mode == .restore {
originalSets = (NSDictionary(contentsOfFile: SysProxyBackupPlist) as? Dictionary<String, Dictionary<String, Any>>)
}

sets.allKeys!.forEach { (key) in
let dict = sets.object(forKey: key)!
let hardware = (dict as AnyObject).value(forKeyPath: "Interface.Hardware")

if hardware != nil && ["AirPort", "Wi-Fi", "Ethernet"].contains(hardware as! String) {
// restore system proxy setting in off or manual or restore
if (mode == .off || mode == .manual || mode == .restore) && originalSets != nil && originalSets!.keys.contains(key as! String) {
if let nowSet = originalSets![key as! String] {
proxies = nowSet["Proxies"] as! [NSObject: AnyObject];
}
}

SCPreferencesPathSetValue(prefRef, "/\(kSCPrefNetworkServices)/\(key)/\(kSCEntNetProxies)" as CFString, proxies as CFDictionary)
}
}

// commit to system preferences.
let commitRet = SCPreferencesCommitChanges(prefRef)
let applyRet = SCPreferencesApplyChanges(prefRef)
Expand Down

0 comments on commit 910ed07

Please sign in to comment.