helper shell function to manage sslocal session and osx system proxy setting
This commit is contained in:
parent
f81d735b5b
commit
28c5c96ffd
2 changed files with 183 additions and 0 deletions
40
shell_helper/README.md
Normal file
40
shell_helper/README.md
Normal file
|
@ -0,0 +1,40 @@
|
|||
INTRO
|
||||
-----
|
||||
|
||||
bash function to manage sslocal session and mac osx system proxy settings.
|
||||
|
||||
- single bash function, minimum footprint
|
||||
- enable/disable system proxy easily
|
||||
- tab completion support
|
||||
|
||||
INSTALL
|
||||
-----
|
||||
|
||||
copy `shadowsocks_helper.sh` to anywhere you like.
|
||||
|
||||
edit the shell variables to reflect you configuration.
|
||||
|
||||
NAME="shadowsocks"
|
||||
VENVPATH="$HOME/.virtualenvs/sandbox/bin"
|
||||
CONFFILE="$HOME/bin/lib/$NAME.config.json"
|
||||
LOGFILE="/tmp/$NAME.log"
|
||||
PIDFILE="/tmp/$NAME.pid"
|
||||
|
||||
NETWORK_INTERFACE="Wi-Fi"
|
||||
PROXY_HOST="127.0.0.1"
|
||||
PROXY_PORT="3131"
|
||||
|
||||
COMMAND=($VENVPATH/python $VENVPATH/sslocal -c $CONFFILE)
|
||||
|
||||
if you don't use virtualenv, leave `VENVPATH` blank and change `COMMAND` to call sslocal directly.
|
||||
|
||||
then add the following lines to .bashrc or .zshrc
|
||||
|
||||
if [ -x ~/bin/lib/shadowsocks_helper.sh ]; then
|
||||
eval "$(~/bin/lib/shadowsocks_helper.sh)"
|
||||
fi
|
||||
|
||||
USAGE
|
||||
-----
|
||||
|
||||
$ shadowsocks [status|start|stop|restart|system_proxy_(status|enable|disable)]
|
143
shell_helper/shadowsocks_helper.sh
Executable file
143
shell_helper/shadowsocks_helper.sh
Executable file
|
@ -0,0 +1,143 @@
|
|||
#!/bin/sh
|
||||
|
||||
## TODO: completion
|
||||
|
||||
## add following lines to .bashrc or .zshrc
|
||||
## =-=
|
||||
## shadowsocks proxy helper functions
|
||||
#if [ -x ~/bin/lib/shadowsocks_helper.sh ]; then
|
||||
# eval "$(~/bin/lib/shadowsocks_helper.sh)"
|
||||
#fi
|
||||
## =-=
|
||||
|
||||
## CONFIG START ##
|
||||
NAME="shadowsocks"
|
||||
VENVPATH="$HOME/.virtualenvs/sandbox/bin"
|
||||
CONFFILE="$HOME/bin/lib/$NAME.config.json"
|
||||
LOGFILE="/tmp/$NAME.log"
|
||||
PIDFILE="/tmp/$NAME.pid"
|
||||
|
||||
NETWORK_INTERFACE="Wi-Fi"
|
||||
PROXY_HOST="127.0.0.1"
|
||||
PROXY_PORT="3131"
|
||||
|
||||
COMMAND=($VENVPATH/python $VENVPATH/sslocal -c $CONFFILE)
|
||||
## CONFIG END ##
|
||||
|
||||
cat <<EOF
|
||||
shadowsocks(){
|
||||
case \$1 in
|
||||
status)
|
||||
shadowsocks system_proxy_status
|
||||
|
||||
local PID=\$(shadowsocks _pid)
|
||||
local ARG="-f"
|
||||
[ \$2 ] && [ "-s" = \$2 ] && ARG=""
|
||||
if [ \$PID -eq 0 ]; then
|
||||
echo "[INFO] $NAME is not running."
|
||||
else
|
||||
echo "[INFO] $NAME is running with pid \$PID."
|
||||
[ \$ARG ] && echo "(press Ctrl-C to exit)"
|
||||
tail -n 5 \$ARG $LOGFILE
|
||||
fi
|
||||
;;
|
||||
start)
|
||||
[ -r $CONFFILE ] || {
|
||||
echo "[ERR] conf file not found ($CONFFILE)."
|
||||
return 1
|
||||
}
|
||||
local PID=\$(shadowsocks _pid)
|
||||
[ \$PID -ne 0 ] && {
|
||||
echo "[WARN] $NAME is already running with pid \$PID." >&2
|
||||
return
|
||||
}
|
||||
nohup ${COMMAND[@]} > $LOGFILE &
|
||||
PID=\$!
|
||||
echo \$PID > $PIDFILE
|
||||
if [ \$? -eq 0 ]; then
|
||||
echo "[INFO] $NAME is running with pid \$PID."
|
||||
sleep 3
|
||||
cat $LOGFILE
|
||||
else
|
||||
echo "[ERR] failed to start $NAME." >&2
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
local PID=\$(shadowsocks _pid)
|
||||
if [ \$PID -eq 0 ]; then
|
||||
echo "[INFO] $NAME is not running."
|
||||
else
|
||||
kill \$PID
|
||||
echo "[INFO] stopped $NAME running with pid \$PID."
|
||||
#tail -n 5 $LOGFILE
|
||||
fi
|
||||
;;
|
||||
restart)
|
||||
shadowsocks stop
|
||||
shadowsocks start
|
||||
;;
|
||||
system_proxy_status)
|
||||
echo "[INFO] System Proxy Setting:"
|
||||
networksetup -getsocksfirewallproxy $NETWORK_INTERFACE | awk '{print " " \$0}'
|
||||
;;
|
||||
system_proxy_enable)
|
||||
sudo networksetup -setsocksfirewallproxy $NETWORK_INTERFACE $PROXY_HOST $PROXY_PORT
|
||||
sudo networksetup -setsocksfirewallproxystate $NETWORK_INTERFACE on
|
||||
shadowsocks system_proxy_status
|
||||
;;
|
||||
system_proxy_disable)
|
||||
sudo networksetup -setsocksfirewallproxystate $NETWORK_INTERFACE off
|
||||
shadowsocks system_proxy_status | head -n 2
|
||||
;;
|
||||
_pid)
|
||||
if [ ! -r $PIDFILE ]; then
|
||||
echo 0
|
||||
return
|
||||
fi
|
||||
local PID=\$(cat $PIDFILE)
|
||||
ps -p \$PID | grep -q $NAME
|
||||
if [ \$? -ne 0 ]; then
|
||||
echo 0
|
||||
return
|
||||
fi
|
||||
echo \$PID
|
||||
;;
|
||||
*)
|
||||
shadowsocks status -s
|
||||
echo "Usage: shadowsocks status|start|stop|restart"
|
||||
echo " shadowsocks system_proxy_(status|enable|disable)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
EOF
|
||||
|
||||
SUBCOMMANDS="restart start status stop system_proxy_disable system_proxy_enable system_proxy_status"
|
||||
|
||||
case $(basename $SHELL) in
|
||||
bash)
|
||||
cat <<EOF
|
||||
_shadowsocks(){
|
||||
local cur
|
||||
COMPREPLY=()
|
||||
cur=\${COMP_WORDS[COMP_CWORD]}
|
||||
|
||||
if [ \$COMP_CWORD -eq 1 ] ; then
|
||||
COMPREPLY=( \$( compgen -W "$SUBCOMMANDS" -- \$cur ) )
|
||||
fi
|
||||
}
|
||||
complete -F _shadowsocks shadowsocks
|
||||
EOF
|
||||
;;
|
||||
zsh)
|
||||
cat <<EOF
|
||||
_shadowsocks(){ compadd restart start status stop system_proxy_disable system_proxy_enable system_proxy_status; }
|
||||
compdef _shadowsocks shadowsocks
|
||||
EOF
|
||||
;;
|
||||
*)
|
||||
# echo "[WARN] shell completion is not supported for $(basename $SHELL)" >&2
|
||||
;;
|
||||
esac
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue