add global proxy

This commit is contained in:
沈辰 2016-04-03 02:04:27 +08:00
parent 225edd2317
commit 5b52859900
3 changed files with 159 additions and 1 deletions

4
bin.js Normal file → Executable file
View File

@ -22,6 +22,7 @@ program
.option('-i, --intercept', 'intercept(decrypt) https requests when root CA exists') .option('-i, --intercept', 'intercept(decrypt) https requests when root CA exists')
.option('-s, --silent', 'do not print anything into terminal') .option('-s, --silent', 'do not print anything into terminal')
.option('-c, --clear', 'clear all the tmp certificates') .option('-c, --clear', 'clear all the tmp certificates')
.option('-o, --global', 'set as global proxy')
.option('install', '[alpha] install node modules') .option('install', '[alpha] install node modules')
.parse(process.argv); .parse(process.argv);
@ -67,7 +68,7 @@ if(program.clear){
logUtil.printLog("failed to load rule file :" + e.toString(), logUtil.T_ERR); logUtil.printLog("failed to load rule file :" + e.toString(), logUtil.T_ERR);
} }
}else{ }else{
//a feature for donghua.yan //a feature for donghua.yan
//read rule file from a specific position //read rule file from a specific position
(function(){ (function(){
try{ try{
@ -91,6 +92,7 @@ if(program.clear){
webPort : program.web, webPort : program.web,
rule : ruleModule, rule : ruleModule,
disableWebInterface : false, disableWebInterface : false,
globalProxy : program.global,
interceptHttps : program.intercept, interceptHttps : program.intercept,
silent : program.silent silent : program.silent
}); });

137
lib/proxyManager.js Normal file
View File

@ -0,0 +1,137 @@
var child_process = require('child_process');
var networkTypes = ['Ethernet', 'Thunderbolt Ethernet', 'Wi-Fi'];
function execSync(cmd) {
var stdout, status = 0;
try {
stdout = child_process.execSync(cmd);
} catch (err) {
stdout = err.stdout;
status = err.status;
}
return {
stdout: stdout.toString(),
status: status
};
}
/**
* ------------------------------------------------------------------------
* linux like system proxy manager
* ------------------------------------------------------------------------
*/
var unixLikeSysProxyManager = {};
unixLikeSysProxyManager.getNetworkType = function() {
for (var i = 0; i < networkTypes.length; i++) {
var
type = networkTypes[i],
result = execSync('networksetup -getwebproxy ' + type);
if (result.status === 0) {
unixLikeSysProxyManager.networkType = type;
return type;
}
}
throw new Error('Unknown network type');
};
unixLikeSysProxyManager.enableGlobalProxy = function(ip, port) {
if (!ip && !port) {
console.log('proxy server\'s ip and port is required');
return;
};
var networkType = unixLikeSysProxyManager.networkType || unixLikeSysProxyManager.getNetworkType();
var result = execSync(
// set http proxy
'sudo networksetup -setwebproxy ${networkType} ${ip} ${port}; '
.replace("${networkType}", networkType)
.replace("${ip}", ip)
.replace("${port}", port) +
// set https proxy
'sudo networksetup -setsecurewebproxy ${networkType} ${ip} ${port}'
.replace("${networkType}", networkType)
.replace("${ip}", ip)
.replace("${port}", port));
return result;
};
unixLikeSysProxyManager.disableGlobalProxy = function() {
var networkType = unixLikeSysProxyManager.networkType || unixLikeSysProxyManager.getNetworkType();
var result = execSync(
// disable http proxy
'networksetup -setwebproxystate ${networkType} off; '
.replace(/\$\{networkType\}/g, networkType) +
// disable https proxy
'networksetup -setsecurewebproxystate ${networkType} off'
.replace(/\$\{networkType\}/g, networkType));
return result;
};
unixLikeSysProxyManager.getProxyState = function() {
var networkType = unixLikeSysProxyManager.networkType || unixLikeSysProxyManager.getNetworkType();
var result = execSync('networksetup -getwebproxy ${networkType}'.replace('${networkType}', networkType));
return result;
};
/**
* ------------------------------------------------------------------------
* windows proxy manager
* ------------------------------------------------------------------------
*/
var winSysProxyManager = {};
winSysProxyManager.enableGlobalProxy = function(ip, port) {
if (!ip && !port) {
console.log('proxy server\'s ip and port is required');
return;
};
return execSync(
// set proxy
'reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyServer /t REG_SZ /d ${ip}:${port} /f & '
.replace("${ip}", ip)
.replace("${port}", port) +
// enable proxy
'reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f');
};
winSysProxyManager.disableGlobalProxy = function() {
return execSync('reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f');
};
winSysProxyManager.getProxyState = function() {
return '';
};
winSysProxyManager.getNetworkType = function() {
return '';
};
module.exports = /^win/.test(process.platform) ? winSysProxyManager : unixLikeSysProxyManager;

View File

@ -158,11 +158,30 @@ function proxyServer(option){
callback(null); callback(null);
}, },
function(callback) {
if (option.globalProxy) {
var result = require('./lib/proxyManager').enableGlobalProxy(ip.address(), proxyPort);
if (result.status) {
console.log(color.red(result.stdout));
}
}
},
//server status manager //server status manager
function(callback){ function(callback){
process.on("exit",function(code){ process.on("exit",function(code){
logUtil.printLog('AnyProxy is about to exit with code: ' + code, logUtil.T_ERR); logUtil.printLog('AnyProxy is about to exit with code: ' + code, logUtil.T_ERR);
var result = require('./lib/proxyManager').disableGlobalProxy();
if (result.status) {
console.log(color.red(result.stdout));
}
process.exit(); process.exit();
}); });