update README.md
89
README.md
@@ -1,2 +1,89 @@
|
||||
# shadowsocks-over-websocket
|
||||
A fast tunnel proxy that helps you bypass firewalls.
|
||||
基于 [shadowsocks](https://zh.wikipedia.org/zh-cn/Shadowsocks) 协议的翻墙工具 , 可部署在 [Heroku](https://www.heroku.com/) 平台上 , 实现免费科学上网
|
||||
|
||||
|
||||
## 如何部署在 Heroku 平台上
|
||||
|
||||
### 1.准备工作
|
||||
* [Heroku](https://signup.heroku.com/) 注册
|
||||
* [GitHub](https://github.com/join?source=header-home) 注册
|
||||
|
||||
### 2.Fork[本项目](https://github.com/VincentChanX/shadowsocks-over-websocket)到个人账号下
|
||||

|
||||
进入 <https://github.com/VincentChanX/shadowsocks-over-websocket> 页面 ==> Fork
|
||||
|
||||
---
|
||||
|
||||
### 3.创建 [Heroku](https://dashboard.heroku.com/new?org=personal-apps) 应用
|
||||

|
||||
登陆 Heroku 帐号,进入 [Dashboard](https://dashboard.heroku.com/apps) 页面 ==> Create New App ==> 输入 App Name ==> Create App
|
||||
|
||||
---
|
||||
|
||||
### 4.Heroku 帐号与 Github 帐号关联
|
||||

|
||||
进入 Deploy 页面 ==> 选择 Deployment Method 为 Github ==> Connect to GitHub
|
||||
|
||||
---
|
||||
|
||||
### 5.选择要关联的Github项目
|
||||

|
||||
选择GitHub帐号 ==> 查找shadowsocks-over-websocket ==> Connect
|
||||
|
||||
---
|
||||
|
||||
### 6.部署 master 分支
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### 7.配置环境变量
|
||||

|
||||
Setting 页面 ==> Reveal Config Vars
|
||||
|
||||
需要配置 METHOD(加密方法),PASSWORD(密码,推荐使用`aes-256-cfb`),SERVER_ADDRESS(`0.0.0.0`) 三个环境变量,支持以下加密方法:
|
||||
|
||||
* rc4
|
||||
* rc4-md5
|
||||
* table
|
||||
* bf-cfb
|
||||
* des-cfb
|
||||
* rc2-cfb
|
||||
* idea-cfb
|
||||
* seed-cfb
|
||||
* cast5-cfb
|
||||
* aes-128-cfb
|
||||
* aes-192-cfb
|
||||
* aes-256-cfb
|
||||
* camellia-256-cfb
|
||||
* camellia-192-cfb
|
||||
* camellia-128-cfb
|
||||
|
||||
---
|
||||
|
||||
## 启动客户端:
|
||||
|
||||
### 命令行启动:
|
||||
1. 安装 [nodejs](https://nodejs.org/en/download/) 和 [git](https://git-scm.com/downloads)
|
||||
2. 执行 `git clone https://github.com/VincentChanX/shadowsocks-over-websocket.git` 命令
|
||||
1. **进到本项目目录**,执行`npm install` 命令
|
||||
2. 执行 `node local.js -s app名称.herokuapp.com -l 1080 -m 设置的加密算法 -k 设置的密码 -p 80` 命令,启动成功
|
||||
|
||||
|
||||
## Chrome 浏览器配置
|
||||
1. 下载 [Chrome](http://www.google.cn/chrome/browser/desktop/index.html) 浏览器插件 [SwitchyOmega](https://github.com/VincentChanX/shadowsocks-over-websocket/tree/master/extensions/SwitchyOmega.crx)
|
||||
|
||||
2. 安装 SwitchyOmega 插件:打开浏览器的扩展程序页面 [chrome://extensions](chrome://extensions),把SwitchyOmega.crx文件拖放到浏览器扩展程序页面安装
|
||||
|
||||
3. 新建情景模式 `local-proxy`,配置 SwitchyOmega :`代理协议:SOCKS5 代理服务器:127.0.0.1 代理端口:1080`,如下图:
|
||||

|
||||
|
||||
4. 配置 `auto switch` 情景模式,添加规则列表网址: <https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt> 并更新情景模式,规则列表规则处的情景模式选中为上一步创建的 `local-proxy` ,配置如下图:
|
||||

|
||||
|
||||
|
||||
5. 选中 `auto switch` 情景模式:
|
||||

|
||||
|
||||
6. 现在你就可以科学上网了
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"localAddress":"127.0.0.1",
|
||||
"localPort": 1080,
|
||||
"serverAddress": "127.0.0.1",
|
||||
"serverPort": 1081,
|
||||
"serverPort": 8388,
|
||||
"password": "shadowsocks-over-websocket",
|
||||
"method": "aes-256-cfb"
|
||||
}
|
||||
BIN
extensions/SwitchyOmega.crx
Normal file
BIN
imgs/1.jpg
Executable file
|
After Width: | Height: | Size: 47 KiB |
BIN
imgs/2.png
Executable file
|
After Width: | Height: | Size: 23 KiB |
BIN
imgs/3.jpg
Executable file
|
After Width: | Height: | Size: 58 KiB |
BIN
imgs/4.jpg
Executable file
|
After Width: | Height: | Size: 31 KiB |
BIN
imgs/5.jpg
Executable file
|
After Width: | Height: | Size: 96 KiB |
BIN
imgs/6.jpg
Executable file
|
After Width: | Height: | Size: 39 KiB |
BIN
imgs/6.png
Executable file
|
After Width: | Height: | Size: 36 KiB |
BIN
imgs/7.png
Executable file
|
After Width: | Height: | Size: 19 KiB |
BIN
imgs/8.png
Executable file
|
After Width: | Height: | Size: 48 KiB |
BIN
imgs/9.png
Executable file
|
After Width: | Height: | Size: 20 KiB |
33
local.js
@@ -1,11 +1,22 @@
|
||||
const {
|
||||
TCPRelay
|
||||
} = require('./tcprelay');
|
||||
new TCPRelay({
|
||||
localAddress: '127.0.0.1',
|
||||
localPort: 1080,
|
||||
serverAddress: '127.0.0.1',
|
||||
serverPort: 1081,
|
||||
password: 'shadowsocks-over-websocket',
|
||||
method: 'aes-256-cfb'
|
||||
}, true, 'info').bootstrap();
|
||||
const TCPRelay = require('./tcprelay').TCPRelay;
|
||||
const local = require('commander');
|
||||
|
||||
local
|
||||
.version('0.1.0')
|
||||
.option('-m --method [method]', 'encryption method, default: aes-256-cfb')
|
||||
.option('-k --password [password]', 'password')
|
||||
.option('-s --server-address [address]', 'server address')
|
||||
.option('-p --server-port [port]', 'server port, default: 8388')
|
||||
.option('-b --local-address [address]', 'local binding address, default: 127.0.0.1')
|
||||
.option('-l --local-port [port]', 'local port, default: 1080')
|
||||
.parse(process.argv);
|
||||
|
||||
var relay = new TCPRelay({
|
||||
localAddress: local.localAddress || '127.0.0.1',
|
||||
localPort: local.localPort || 1080,
|
||||
serverAddress: local.serverAddress || '127.0.0.1',
|
||||
serverPort: local.serverPort || 8388,
|
||||
password: local.password || 'shadowsocks-over-websocket',
|
||||
method: local.method || 'aes-256-cfb'
|
||||
}, true, 'info');
|
||||
relay.bootstrap();
|
||||
261
node_modules/commander/History.md
generated
vendored
Normal file
@@ -0,0 +1,261 @@
|
||||
|
||||
2.9.0 / 2015-10-13
|
||||
==================
|
||||
|
||||
* Add option `isDefault` to set default subcommand #415 @Qix-
|
||||
* Add callback to allow filtering or post-processing of help text #434 @djulien
|
||||
* Fix `undefined` text in help information close #414 #416 @zhiyelee
|
||||
|
||||
2.8.1 / 2015-04-22
|
||||
==================
|
||||
|
||||
* Back out `support multiline description` Close #396 #397
|
||||
|
||||
2.8.0 / 2015-04-07
|
||||
==================
|
||||
|
||||
* Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
|
||||
* Fix bug in Git-style sub-commands #372 @zhiyelee
|
||||
* Allow commands to be hidden from help #383 @tonylukasavage
|
||||
* When git-style sub-commands are in use, yet none are called, display help #382 @claylo
|
||||
* Add ability to specify arguments syntax for top-level command #258 @rrthomas
|
||||
* Support multiline descriptions #208 @zxqfox
|
||||
|
||||
2.7.1 / 2015-03-11
|
||||
==================
|
||||
|
||||
* Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
|
||||
|
||||
2.7.0 / 2015-03-09
|
||||
==================
|
||||
|
||||
* Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
|
||||
* Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
|
||||
* Add support for camelCase on `opts()`. Close #353 @nkzawa
|
||||
* Add node.js 0.12 and io.js to travis.yml
|
||||
* Allow RegEx options. #337 @palanik
|
||||
* Fixes exit code when sub-command failing. Close #260 #332 @pirelenito
|
||||
* git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee
|
||||
|
||||
2.6.0 / 2014-12-30
|
||||
==================
|
||||
|
||||
* added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
|
||||
* Add application description to the help msg. Close #112 @dalssoft
|
||||
|
||||
2.5.1 / 2014-12-15
|
||||
==================
|
||||
|
||||
* fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
|
||||
|
||||
2.5.0 / 2014-10-24
|
||||
==================
|
||||
|
||||
* add support for variadic arguments. Closes #277 @whitlockjc
|
||||
|
||||
2.4.0 / 2014-10-17
|
||||
==================
|
||||
|
||||
* fixed a bug on executing the coercion function of subcommands option. Closes #270
|
||||
* added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
|
||||
* added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
|
||||
* fixed a bug on subcommand name. Closes #248 @jonathandelgado
|
||||
* fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
|
||||
|
||||
2.3.0 / 2014-07-16
|
||||
==================
|
||||
|
||||
* add command alias'. Closes PR #210
|
||||
* fix: Typos. Closes #99
|
||||
* fix: Unused fs module. Closes #217
|
||||
|
||||
2.2.0 / 2014-03-29
|
||||
==================
|
||||
|
||||
* add passing of previous option value
|
||||
* fix: support subcommands on windows. Closes #142
|
||||
* Now the defaultValue passed as the second argument of the coercion function.
|
||||
|
||||
2.1.0 / 2013-11-21
|
||||
==================
|
||||
|
||||
* add: allow cflag style option params, unit test, fixes #174
|
||||
|
||||
2.0.0 / 2013-07-18
|
||||
==================
|
||||
|
||||
* remove input methods (.prompt, .confirm, etc)
|
||||
|
||||
1.3.2 / 2013-07-18
|
||||
==================
|
||||
|
||||
* add support for sub-commands to co-exist with the original command
|
||||
|
||||
1.3.1 / 2013-07-18
|
||||
==================
|
||||
|
||||
* add quick .runningCommand hack so you can opt-out of other logic when running a sub command
|
||||
|
||||
1.3.0 / 2013-07-09
|
||||
==================
|
||||
|
||||
* add EACCES error handling
|
||||
* fix sub-command --help
|
||||
|
||||
1.2.0 / 2013-06-13
|
||||
==================
|
||||
|
||||
* allow "-" hyphen as an option argument
|
||||
* support for RegExp coercion
|
||||
|
||||
1.1.1 / 2012-11-20
|
||||
==================
|
||||
|
||||
* add more sub-command padding
|
||||
* fix .usage() when args are present. Closes #106
|
||||
|
||||
1.1.0 / 2012-11-16
|
||||
==================
|
||||
|
||||
* add git-style executable subcommand support. Closes #94
|
||||
|
||||
1.0.5 / 2012-10-09
|
||||
==================
|
||||
|
||||
* fix `--name` clobbering. Closes #92
|
||||
* fix examples/help. Closes #89
|
||||
|
||||
1.0.4 / 2012-09-03
|
||||
==================
|
||||
|
||||
* add `outputHelp()` method.
|
||||
|
||||
1.0.3 / 2012-08-30
|
||||
==================
|
||||
|
||||
* remove invalid .version() defaulting
|
||||
|
||||
1.0.2 / 2012-08-24
|
||||
==================
|
||||
|
||||
* add `--foo=bar` support [arv]
|
||||
* fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
|
||||
|
||||
1.0.1 / 2012-08-03
|
||||
==================
|
||||
|
||||
* fix issue #56
|
||||
* fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
|
||||
|
||||
1.0.0 / 2012-07-05
|
||||
==================
|
||||
|
||||
* add support for optional option descriptions
|
||||
* add defaulting of `.version()` to package.json's version
|
||||
|
||||
0.6.1 / 2012-06-01
|
||||
==================
|
||||
|
||||
* Added: append (yes or no) on confirmation
|
||||
* Added: allow node.js v0.7.x
|
||||
|
||||
0.6.0 / 2012-04-10
|
||||
==================
|
||||
|
||||
* Added `.prompt(obj, callback)` support. Closes #49
|
||||
* Added default support to .choose(). Closes #41
|
||||
* Fixed the choice example
|
||||
|
||||
0.5.1 / 2011-12-20
|
||||
==================
|
||||
|
||||
* Fixed `password()` for recent nodes. Closes #36
|
||||
|
||||
0.5.0 / 2011-12-04
|
||||
==================
|
||||
|
||||
* Added sub-command option support [itay]
|
||||
|
||||
0.4.3 / 2011-12-04
|
||||
==================
|
||||
|
||||
* Fixed custom help ordering. Closes #32
|
||||
|
||||
0.4.2 / 2011-11-24
|
||||
==================
|
||||
|
||||
* Added travis support
|
||||
* Fixed: line-buffered input automatically trimmed. Closes #31
|
||||
|
||||
0.4.1 / 2011-11-18
|
||||
==================
|
||||
|
||||
* Removed listening for "close" on --help
|
||||
|
||||
0.4.0 / 2011-11-15
|
||||
==================
|
||||
|
||||
* Added support for `--`. Closes #24
|
||||
|
||||
0.3.3 / 2011-11-14
|
||||
==================
|
||||
|
||||
* Fixed: wait for close event when writing help info [Jerry Hamlet]
|
||||
|
||||
0.3.2 / 2011-11-01
|
||||
==================
|
||||
|
||||
* Fixed long flag definitions with values [felixge]
|
||||
|
||||
0.3.1 / 2011-10-31
|
||||
==================
|
||||
|
||||
* Changed `--version` short flag to `-V` from `-v`
|
||||
* Changed `.version()` so it's configurable [felixge]
|
||||
|
||||
0.3.0 / 2011-10-31
|
||||
==================
|
||||
|
||||
* Added support for long flags only. Closes #18
|
||||
|
||||
0.2.1 / 2011-10-24
|
||||
==================
|
||||
|
||||
* "node": ">= 0.4.x < 0.7.0". Closes #20
|
||||
|
||||
0.2.0 / 2011-09-26
|
||||
==================
|
||||
|
||||
* Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
|
||||
|
||||
0.1.0 / 2011-08-24
|
||||
==================
|
||||
|
||||
* Added support for custom `--help` output
|
||||
|
||||
0.0.5 / 2011-08-18
|
||||
==================
|
||||
|
||||
* Changed: when the user enters nothing prompt for password again
|
||||
* Fixed issue with passwords beginning with numbers [NuckChorris]
|
||||
|
||||
0.0.4 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Fixed `Commander#args`
|
||||
|
||||
0.0.3 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Added default option value support
|
||||
|
||||
0.0.2 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Added mask support to `Command#password(str[, mask], fn)`
|
||||
* Added `Command#password(str, fn)`
|
||||
|
||||
0.0.1 / 2010-01-03
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
22
node_modules/commander/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
351
node_modules/commander/Readme.md
generated
vendored
Normal file
@@ -0,0 +1,351 @@
|
||||
# Commander.js
|
||||
|
||||
|
||||
[](http://travis-ci.org/tj/commander.js)
|
||||
[](https://www.npmjs.org/package/commander)
|
||||
[](https://www.npmjs.org/package/commander)
|
||||
[](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/tj/commander).
|
||||
[API documentation](http://tj.github.com/commander.js/)
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
$ npm install commander
|
||||
|
||||
## Option parsing
|
||||
|
||||
Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('commander');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --peppers', 'Add peppers')
|
||||
.option('-P, --pineapple', 'Add pineapple')
|
||||
.option('-b, --bbq-sauce', 'Add bbq sauce')
|
||||
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
|
||||
.parse(process.argv);
|
||||
|
||||
console.log('you ordered a pizza with:');
|
||||
if (program.peppers) console.log(' - peppers');
|
||||
if (program.pineapple) console.log(' - pineapple');
|
||||
if (program.bbqSauce) console.log(' - bbq');
|
||||
console.log(' - %s cheese', program.cheese);
|
||||
```
|
||||
|
||||
Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
|
||||
|
||||
|
||||
## Coercion
|
||||
|
||||
```js
|
||||
function range(val) {
|
||||
return val.split('..').map(Number);
|
||||
}
|
||||
|
||||
function list(val) {
|
||||
return val.split(',');
|
||||
}
|
||||
|
||||
function collect(val, memo) {
|
||||
memo.push(val);
|
||||
return memo;
|
||||
}
|
||||
|
||||
function increaseVerbosity(v, total) {
|
||||
return total + 1;
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.usage('[options] <file ...>')
|
||||
.option('-i, --integer <n>', 'An integer argument', parseInt)
|
||||
.option('-f, --float <n>', 'A float argument', parseFloat)
|
||||
.option('-r, --range <a>..<b>', 'A range', range)
|
||||
.option('-l, --list <items>', 'A list', list)
|
||||
.option('-o, --optional [value]', 'An optional value')
|
||||
.option('-c, --collect [value]', 'A repeatable value', collect, [])
|
||||
.option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' int: %j', program.integer);
|
||||
console.log(' float: %j', program.float);
|
||||
console.log(' optional: %j', program.optional);
|
||||
program.range = program.range || [];
|
||||
console.log(' range: %j..%j', program.range[0], program.range[1]);
|
||||
console.log(' list: %j', program.list);
|
||||
console.log(' collect: %j', program.collect);
|
||||
console.log(' verbosity: %j', program.verbose);
|
||||
console.log(' args: %j', program.args);
|
||||
```
|
||||
|
||||
## Regular Expression
|
||||
```js
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
|
||||
.option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' size: %j', program.size);
|
||||
console.log(' drink: %j', program.drink);
|
||||
```
|
||||
|
||||
## Variadic arguments
|
||||
|
||||
The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to
|
||||
append `...` to the argument name. Here is an example:
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('commander');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.command('rmdir <dir> [otherDirs...]')
|
||||
.action(function (dir, otherDirs) {
|
||||
console.log('rmdir %s', dir);
|
||||
if (otherDirs) {
|
||||
otherDirs.forEach(function (oDir) {
|
||||
console.log('rmdir %s', oDir);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
```
|
||||
|
||||
An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
|
||||
to your action as demonstrated above.
|
||||
|
||||
## Specify the argument syntax
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
var program = require('../');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.arguments('<cmd> [env]')
|
||||
.action(function (cmd, env) {
|
||||
cmdValue = cmd;
|
||||
envValue = env;
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
if (typeof cmdValue === 'undefined') {
|
||||
console.error('no command given!');
|
||||
process.exit(1);
|
||||
}
|
||||
console.log('command:', cmdValue);
|
||||
console.log('environment:', envValue || "no environment given");
|
||||
```
|
||||
|
||||
## Git-style sub-commands
|
||||
|
||||
```js
|
||||
// file: ./examples/pm
|
||||
var program = require('..');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.command('install [name]', 'install one or more packages')
|
||||
.command('search [query]', 'search with optional query')
|
||||
.command('list', 'list packages installed', {isDefault: true})
|
||||
.parse(process.argv);
|
||||
```
|
||||
|
||||
When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
|
||||
The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
|
||||
|
||||
Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the option from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
|
||||
|
||||
If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
|
||||
|
||||
### `--harmony`
|
||||
|
||||
You can enable `--harmony` option in two ways:
|
||||
* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
|
||||
* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
|
||||
|
||||
## Automated --help
|
||||
|
||||
The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
|
||||
|
||||
```
|
||||
$ ./examples/pizza --help
|
||||
|
||||
Usage: pizza [options]
|
||||
|
||||
An application for pizzas ordering
|
||||
|
||||
Options:
|
||||
|
||||
-h, --help output usage information
|
||||
-V, --version output the version number
|
||||
-p, --peppers Add peppers
|
||||
-P, --pineapple Add pineapple
|
||||
-b, --bbq Add bbq sauce
|
||||
-c, --cheese <type> Add the specified type of cheese [marble]
|
||||
-C, --no-cheese You do not want any cheese
|
||||
|
||||
```
|
||||
|
||||
## Custom help
|
||||
|
||||
You can display arbitrary `-h, --help` information
|
||||
by listening for "--help". Commander will automatically
|
||||
exit once you are done so that the remainder of your program
|
||||
does not execute causing undesired behaviours, for example
|
||||
in the following executable "stuff" will not output when
|
||||
`--help` is used.
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('commander');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-f, --foo', 'enable some foo')
|
||||
.option('-b, --bar', 'enable some bar')
|
||||
.option('-B, --baz', 'enable some baz');
|
||||
|
||||
// must be before .parse() since
|
||||
// node's emit() is immediate
|
||||
|
||||
program.on('--help', function(){
|
||||
console.log(' Examples:');
|
||||
console.log('');
|
||||
console.log(' $ custom-help --help');
|
||||
console.log(' $ custom-help -h');
|
||||
console.log('');
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
console.log('stuff');
|
||||
```
|
||||
|
||||
Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
|
||||
|
||||
```
|
||||
|
||||
Usage: custom-help [options]
|
||||
|
||||
Options:
|
||||
|
||||
-h, --help output usage information
|
||||
-V, --version output the version number
|
||||
-f, --foo enable some foo
|
||||
-b, --bar enable some bar
|
||||
-B, --baz enable some baz
|
||||
|
||||
Examples:
|
||||
|
||||
$ custom-help --help
|
||||
$ custom-help -h
|
||||
|
||||
```
|
||||
|
||||
## .outputHelp(cb)
|
||||
|
||||
Output help information without exiting.
|
||||
Optional callback cb allows post-processing of help text before it is displayed.
|
||||
|
||||
If you want to display help by default (e.g. if no command was provided), you can use something like:
|
||||
|
||||
```js
|
||||
var program = require('commander');
|
||||
var colors = require('colors');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.command('getstream [url]', 'get stream URL')
|
||||
.parse(process.argv);
|
||||
|
||||
if (!process.argv.slice(2).length) {
|
||||
program.outputHelp(make_red);
|
||||
}
|
||||
|
||||
function make_red(txt) {
|
||||
return colors.red(txt); //display the help text in red on the console
|
||||
}
|
||||
```
|
||||
|
||||
## .help(cb)
|
||||
|
||||
Output help information and exit immediately.
|
||||
Optional callback cb allows post-processing of help text before it is displayed.
|
||||
|
||||
## Examples
|
||||
|
||||
```js
|
||||
var program = require('commander');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-C, --chdir <path>', 'change the working directory')
|
||||
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||
.option('-T, --no-tests', 'ignore test hook')
|
||||
|
||||
program
|
||||
.command('setup [env]')
|
||||
.description('run setup commands for all envs')
|
||||
.option("-s, --setup_mode [mode]", "Which setup mode to use")
|
||||
.action(function(env, options){
|
||||
var mode = options.setup_mode || "normal";
|
||||
env = env || 'all';
|
||||
console.log('setup for %s env(s) with %s mode', env, mode);
|
||||
});
|
||||
|
||||
program
|
||||
.command('exec <cmd>')
|
||||
.alias('ex')
|
||||
.description('execute the given remote cmd')
|
||||
.option("-e, --exec_mode <mode>", "Which exec mode to use")
|
||||
.action(function(cmd, options){
|
||||
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
|
||||
}).on('--help', function() {
|
||||
console.log(' Examples:');
|
||||
console.log();
|
||||
console.log(' $ deploy exec sequential');
|
||||
console.log(' $ deploy exec async');
|
||||
console.log();
|
||||
});
|
||||
|
||||
program
|
||||
.command('*')
|
||||
.action(function(env){
|
||||
console.log('deploying "%s"', env);
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
```
|
||||
|
||||
More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
1110
node_modules/commander/index.js
generated
vendored
Normal file
106
node_modules/commander/package.json
generated
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "commander",
|
||||
"scope": null,
|
||||
"escapedName": "commander",
|
||||
"name": "commander",
|
||||
"rawSpec": "",
|
||||
"spec": "latest",
|
||||
"type": "tag"
|
||||
},
|
||||
"/home/vincent/Projects/SublimeTextProjects/shadowsocks-over-websocket"
|
||||
]
|
||||
],
|
||||
"_from": "commander@latest",
|
||||
"_id": "commander@2.9.0",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/commander",
|
||||
"_nodeVersion": "0.12.7",
|
||||
"_npmUser": {
|
||||
"name": "zhiyelee",
|
||||
"email": "zhiyelee@gmail.com"
|
||||
},
|
||||
"_npmVersion": "2.11.3",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "commander",
|
||||
"scope": null,
|
||||
"escapedName": "commander",
|
||||
"name": "commander",
|
||||
"rawSpec": "",
|
||||
"spec": "latest",
|
||||
"type": "tag"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
|
||||
"_shasum": "9c99094176e12240cb22d6c5146098400fe0f7d4",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "commander",
|
||||
"_where": "/home/vincent/Projects/SublimeTextProjects/shadowsocks-over-websocket",
|
||||
"author": {
|
||||
"name": "TJ Holowaychuk",
|
||||
"email": "tj@vision-media.ca"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/tj/commander.js/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"graceful-readlink": ">= 1.0.0"
|
||||
},
|
||||
"description": "the complete solution for node.js command-line programs",
|
||||
"devDependencies": {
|
||||
"should": ">= 0.0.1",
|
||||
"sinon": ">=1.17.1"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "9c99094176e12240cb22d6c5146098400fe0f7d4",
|
||||
"tarball": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6.x"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"gitHead": "b2aad7a8471d434593a85306aa73777a526e9f75",
|
||||
"homepage": "https://github.com/tj/commander.js#readme",
|
||||
"keywords": [
|
||||
"command",
|
||||
"option",
|
||||
"parser"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "tjholowaychuk",
|
||||
"email": "tj@vision-media.ca"
|
||||
},
|
||||
{
|
||||
"name": "somekittens",
|
||||
"email": "rkoutnik@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "zhiyelee",
|
||||
"email": "zhiyelee@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "commander",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/tj/commander.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "make test"
|
||||
},
|
||||
"version": "2.9.0"
|
||||
}
|
||||
3
node_modules/graceful-readlink/.npmignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.idea/
|
||||
.DS_Store
|
||||
node_modules/
|
||||
5
node_modules/graceful-readlink/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
- "0.12"
|
||||
- "io.js"
|
||||
22
node_modules/graceful-readlink/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Zhiye Li
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
17
node_modules/graceful-readlink/README.md
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# graceful-readlink
|
||||
[](https://www.npmjs.org/package/graceful-readlink)
|
||||
[](https://www.npmjs.org/package/graceful-readlink)
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
var readlinkSync = require('graceful-readlink').readlinkSync;
|
||||
console.log(readlinkSync(f));
|
||||
// output
|
||||
// the file pointed to when `f` is a symbolic link
|
||||
// the `f` itself when `f` is not a symbolic link
|
||||
```
|
||||
## Licence
|
||||
|
||||
MIT License
|
||||
12
node_modules/graceful-readlink/index.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
var fs = require('fs')
|
||||
, lstat = fs.lstatSync;
|
||||
|
||||
exports.readlinkSync = function (p) {
|
||||
if (lstat(p).isSymbolicLink()) {
|
||||
return fs.readlinkSync(p);
|
||||
} else {
|
||||
return p;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
84
node_modules/graceful-readlink/package.json
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "graceful-readlink@>= 1.0.0",
|
||||
"scope": null,
|
||||
"escapedName": "graceful-readlink",
|
||||
"name": "graceful-readlink",
|
||||
"rawSpec": ">= 1.0.0",
|
||||
"spec": ">=1.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"/home/vincent/Projects/SublimeTextProjects/shadowsocks-over-websocket/node_modules/commander"
|
||||
]
|
||||
],
|
||||
"_from": "graceful-readlink@>=1.0.0",
|
||||
"_id": "graceful-readlink@1.0.1",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/graceful-readlink",
|
||||
"_nodeVersion": "0.11.14",
|
||||
"_npmUser": {
|
||||
"name": "zhiyelee",
|
||||
"email": "zhiyelee@gmail.com"
|
||||
},
|
||||
"_npmVersion": "2.1.17",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "graceful-readlink@>= 1.0.0",
|
||||
"scope": null,
|
||||
"escapedName": "graceful-readlink",
|
||||
"name": "graceful-readlink",
|
||||
"rawSpec": ">= 1.0.0",
|
||||
"spec": ">=1.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/commander"
|
||||
],
|
||||
"_resolved": "http://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
|
||||
"_shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "graceful-readlink@>= 1.0.0",
|
||||
"_where": "/home/vincent/Projects/SublimeTextProjects/shadowsocks-over-websocket/node_modules/commander",
|
||||
"author": {
|
||||
"name": "zhiyelee"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/zhiyelee/graceful-readlink/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "graceful fs.readlink",
|
||||
"devDependencies": {},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
|
||||
"tarball": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
|
||||
},
|
||||
"gitHead": "f6655275bebef706fb63fd01b5f062a7052419a5",
|
||||
"homepage": "https://github.com/zhiyelee/graceful-readlink",
|
||||
"keywords": [
|
||||
"fs.readlink",
|
||||
"readlink"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "zhiyelee",
|
||||
"email": "zhiyelee@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "graceful-readlink",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/zhiyelee/graceful-readlink.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"version": "1.0.1"
|
||||
}
|
||||
@@ -24,6 +24,7 @@
|
||||
"homepage": "https://github.com/VincentChanX/shadowsocks-over-websocket#readme",
|
||||
"dependencies": {
|
||||
"bufferutil": "^3.0.0",
|
||||
"commander": "^2.9.0",
|
||||
"log4js": "^1.1.1",
|
||||
"shadowsocks": "^1.5.3",
|
||||
"ws": "^2.2.3"
|
||||
|
||||
27
server.js
@@ -1,9 +1,18 @@
|
||||
const {
|
||||
TCPRelay
|
||||
} = require('./tcprelay');
|
||||
new TCPRelay({
|
||||
serverAddress: process.env['SERVER_ADDRESS'] || '127.0.0.1',
|
||||
serverPort: process.env['PORT'] || 1081,
|
||||
password: process.env['PASSWORD'] || 'shadowsocks-over-websocket',
|
||||
method: process.env['METHOD'] || 'aes-256-cfb'
|
||||
}, false, 'info').bootstrap();
|
||||
const TCPRelay = require('./tcprelay').TCPRelay;
|
||||
const server = require('commander');
|
||||
|
||||
server
|
||||
.version('0.1.0')
|
||||
.option('-m --method [method]', 'encryption method, default: aes-256-cfb')
|
||||
.option('-k --password [password]', 'password')
|
||||
.option('-s --server-address [address]', 'server address')
|
||||
.option('-p --server-port [port]', 'server port, default: 8388')
|
||||
.parse(process.argv);
|
||||
|
||||
var relay = new TCPRelay({
|
||||
serverAddress: process.env['SERVER_ADDRESS'] || server.serverAddress || '127.0.0.1',
|
||||
serverPort: process.env['PORT'] || server.serverPort || 8388,
|
||||
password: process.env['PASSWORD'] || server.password || 'shadowsocks-over-websocket',
|
||||
method: process.env['METHOD'] || server.method || 'aes-256-cfb'
|
||||
}, false, 'info');
|
||||
relay.bootstrap();
|
||||