From 81949237fa42ccf51ea8822aef36d2ff488e37a9 Mon Sep 17 00:00:00 2001 From: midoks Date: Tue, 2 Jun 2020 16:55:41 +0800 Subject: [PATCH] shadowsocks --- plugins/shadowsocks/ico.png | Bin 0 -> 1996 bytes plugins/shadowsocks/index.html | 18 ++ plugins/shadowsocks/index.py | 189 +++++++++++++++++++++ plugins/shadowsocks/info.json | 14 ++ plugins/shadowsocks/init.d/shadowsocks.tpl | 63 +++++++ plugins/shadowsocks/install.sh | 40 +++++ plugins/shadowsocks/js/shadowsocks.js | 93 ++++++++++ plugins/shadowsocks/tmp/shadowsocks.json | 12 ++ 8 files changed, 429 insertions(+) create mode 100644 plugins/shadowsocks/ico.png create mode 100755 plugins/shadowsocks/index.html create mode 100755 plugins/shadowsocks/index.py create mode 100755 plugins/shadowsocks/info.json create mode 100755 plugins/shadowsocks/init.d/shadowsocks.tpl create mode 100755 plugins/shadowsocks/install.sh create mode 100755 plugins/shadowsocks/js/shadowsocks.js create mode 100644 plugins/shadowsocks/tmp/shadowsocks.json diff --git a/plugins/shadowsocks/ico.png b/plugins/shadowsocks/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..444bdbb8cf5f5642624f8efc8ddaeff2b4a16b9b GIT binary patch literal 1996 zcmV;-2Q&DIP)#{p3(}_8)PA@wR3jfd@9mDeb5C>M%)EU&J2UL= z46!DA|9bb{^Yy#uoO{lFgwOe)&$<1W0PtCRaKZx<9;omHCPJvf1FV?6tOw?A|EQt1 z&fiQ#3&2)1lw9;8)&dPQ*$PXq0_I}tlXQ`JjxGOam z8AT&-BY;ML(qQg_!UqM!o@Dq7AD2Q}5}3{^;gC1D6$%g*}rAx<)iU0 z6D1R2e=tuweeJQU37NNwDq{|R_}JVIxfj}Tb}DL=O$=%sjUE6mo4R^KA?*kcXfgX< zFmEm({0$S53ivED%?D(daNQ6MZ8mlP{Vs@gNAD))EnXQ6Jbj{V&X0#qJ{1E|bAC?1 zJIr_!#141{77|GJ${=tgt_O_aYo6KS7kS!XpZzv~i*oV%lE{e7$(DwsmnjrY&t@9z z1aL)uok437y8p@ie8$?N&jI{{?3~~3X`6ecYrK(K3DB=yUZNzY)60^pE<8O_ZxeAyMQU}>UR-RsP6 zVc(3I*?dq0uIYY!&Kq)hQHOO=MnE3Yv>e}VQ&*Rj(h=Nw=9{GWxwo-!SdeE@%Bk-mnFW`O7h#Qlw4e!b|nGb+iaH8#N8;4Hc z?g03<-2Aiv2a|f>opO4#Sn4NWdepJ2Am@gAz_9-g@K+@v5thZn>h5xabD?z1OT)l{ zI__V-FEaIPA+Hv-ZUQ@AR%O-q|;E&?jC2aPeqD$IBZu?C%lyh1}Z5 zrmlXecnBGmOf07m5ok@^la$4P1P$vB0=5VZe>8RV+M)nLQEN35p3b@IwS=xNC>xuGB|Y?=9L-SxJpdLD@o=lD2imm` z>vo8dp%aSQHwzLsCGeTC3+n-SfONinh<;dpeYV5bIgncba@*I zfxQgOgAfm!Ee-1nK{R#rU7|2=0<(Kd71n|gg)C%PTN${+BkUN1wkz!0pYaJ>5t$}H z`JuPPVBm#>uHKwYxV{!Z>=Z%-W&O~M)P8`nUSa+#YL!Li3V*j2vp0kJUXPwV#MoBD zIGmp3QBejM>ZgnMy=D6OlYc%)$XAVH?u&;r0Wuo3W ze4@5Q*uPGGYlhVg;1r0qp6RWB_VArFFdl;od8+1t*`3E~rw`2R0{FVD5`M+h1J~z_ ze-OaWJ<5N7fxycBEvhVh6^*I^2pXx41acoWM7%g24s^+v7uWc@vI)(8kF`ex(+$ap z|AR^pR0Tj`Peja*4SOrgd%x(F$&Z_Q;DP@K0Iw3@G+6R!Sj+v_7i*`p;WYFblRpMn zaAV=$jj;f#*aN|6Dnvvwah*Y+=D6_un)Se2;*)uqCPtoqrJ41129sp1lp0i z^SjN6n(y~Z+N2q_;S|UsPsFhTsThFld-7dr;d8H)G2`JWC984(M(=fi@`s#)wD{Ej z#pEjLKSv08J+L(qQJr`Act*tl8aw|}Uq3MQzW@iEkN_=D=zh0}D>Q1!%RDK4%6=U{ z_BYEY-^J(61KFEp*vssssjJgVhL2%A1>i?+(&y^McuqfiX;fh>jP+eBSiCwUijOep z`w3k=oL^gH^j|8F*&_eAxpa&TW<-@$dfcNb0HpT9O6*ufkp0gGV44iDY?D2|BY|QM zl(8bI8UQDhMm`fu*u$Ry$`Vue9~`T}h4fVg;DCr)O8`6x!mOgkF`hCb>OGYj?&eUn z1bO8&c5=PH&$?99D6 +
+
+

服务

+

自启动

+

配置修改

+

说明

+
+
+
+
+
+ + \ No newline at end of file diff --git a/plugins/shadowsocks/index.py b/plugins/shadowsocks/index.py new file mode 100755 index 000000000..88de70539 --- /dev/null +++ b/plugins/shadowsocks/index.py @@ -0,0 +1,189 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import shutil + +sys.path.append(os.getcwd() + "/class/core") +import public + +app_debug = False +if public.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'shadowsocks' + + +def getPluginDir(): + return public.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return public.getServerDir() + '/' + getPluginName() + + +def getArgs(): + args = sys.argv[2:] + tmp = {} + args_len = len(args) + + if args_len == 1: + t = args[0].strip('{').strip('}') + t = t.split(':') + tmp[t[0]] = t[1] + elif args_len > 1: + for i in range(len(args)): + t = args[i].split(':') + tmp[t[0]] = t[1] + + return tmp + + +def checkArgs(data, ck=[]): + for i in range(len(ck)): + if not ck[i] in data: + return (False, public.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, public.returnJson(True, 'ok')) + + +def status(): + cmd = "ps -ef|grep ssserver |grep -v grep | awk '{print $2}'" + data = public.execShell(cmd) + if data[0] == '': + return 'stop' + return 'start' + + +def start(): + path = getPathFile() + shell_cmd = 'ssserver -c ' + path + ' -d start' + + data = public.execShell(shell_cmd) + + if data[0] == '': + return 'ok' + return data[1] + + +def stop(): + path = getPathFile() + shell_cmd = 'ssserver -c ' + path + ' -d stop' + + data = public.execShell(shell_cmd) + if data[0] == '': + return 'ok' + return data[1] + + +def restart(): + path = getPathFile() + shell_cmd = 'ssserver -c ' + path + ' -d restart' + data = public.execShell(shell_cmd) + if data[0] == '': + return 'ok' + return data[1] + + +def reload(): + path = getPathFile() + shell_cmd = 'ssserver -c ' + path + ' -d restart' + data = public.execShell(shell_cmd) + if data[0] == '': + return 'ok' + return data[1] + + +def getPathFile(): + return getServerDir() + '/shadowsocks.json' + + +def getInitDTpl(): + path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl" + return path + + +def initDreplace(): + + file_tpl = getInitDTpl() + service_path = os.path.dirname(os.getcwd()) + + initD_path = getServerDir() + '/init.d' + if not os.path.exists(initD_path): + os.mkdir(initD_path) + file_bin = initD_path + '/' + getPluginName() + + # initd replace + content = public.readFile(file_tpl) + content = content.replace('{$SERVER_PATH}', service_path) + public.writeFile(file_bin, content) + public.execShell('chmod +x ' + file_bin) + + return file_bin + + +def getInitDFile(): + if app_debug: + return '/tmp/' + getPluginName() + return '/etc/init.d/' + getPluginName() + + +def initdStatus(): + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + initd_bin = getInitDFile() + if os.path.exists(initd_bin): + return 'ok' + return 'fail' + + +def initdInstall(): + import shutil + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + + source_bin = initDreplace() + initd_bin = getInitDFile() + shutil.copyfile(source_bin, initd_bin) + public.execShell('chmod +x ' + initd_bin) + public.execShell('chkconfig --add ' + getPluginName()) + return 'ok' + + +def initdUinstall(): + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + + public.execShell('chkconfig --del ' + getPluginName()) + initd_bin = getInitDFile() + os.remove(initd_bin) + return 'ok' + +if __name__ == "__main__": + func = sys.argv[1] + if func == 'status': + print status() + elif func == 'start': + print start() + elif func == 'stop': + print stop() + elif func == 'restart': + print restart() + elif func == 'reload': + print reload() + elif func == 'conf': + print getPathFile() + elif func == 'initd_status': + print initdStatus() + elif func == 'initd_install': + print initdInstall() + elif func == 'initd_uninstall': + print initdUinstall() + else: + print 'error' diff --git a/plugins/shadowsocks/info.json b/plugins/shadowsocks/info.json new file mode 100755 index 000000000..963cc3d7c --- /dev/null +++ b/plugins/shadowsocks/info.json @@ -0,0 +1,14 @@ +{ + "title":"shadowsocks", + "tip":"soft", + "name":"shadowsocks", + "type":"运行环境", + "ps":"shadowsocks", + "versions":"1.0", + "shell":"install.sh", + "checks":"server/shadowsocks", + "author":"midoks", + "home":"https://github.com/shadowsocks/shadowsocks", + "date":"2020-06-02", + "pid": "4" +} \ No newline at end of file diff --git a/plugins/shadowsocks/init.d/shadowsocks.tpl b/plugins/shadowsocks/init.d/shadowsocks.tpl new file mode 100755 index 000000000..ec6dba351 --- /dev/null +++ b/plugins/shadowsocks/init.d/shadowsocks.tpl @@ -0,0 +1,63 @@ +#!/bin/sh +# chkconfig: 2345 55 25 +# description: shadowsocks Service + +### BEGIN INIT INFO +# Provides: shadowsocks +# Required-Start: $all +# Required-Stop: $all +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: starts shadowsocks +# Description: starts the shadowsocks +### END INIT INFO + +ROOT_PATH={$SERVER_PATH} + +p_start(){ + isStart=$(ps -ef | grep shadowsocks | grep -v grep | awk '{print $2}') + if [ "$isStart" == "" ];then + echo -e "Starting shadowsocks... \c" + + sleep 0.3 + isStart=$(ps -ef | grep shadowsocks | grep -v grep | awk '{print $2}') + if [ "$isStart" == '' ];then + echo -e "\033[31mError: shadowsocks service startup failed.\033[0m" + return; + fi + echo -e "\033[32mdone\033[0m" + else + echo "Starting shadowsocks(pid $isStart) already running" + fi +} + +p_stop(){ + echo -e "Stopping shadowsocks... \c"; + pids=$(ps -ef | grep shadowsocks | grep -v grep | awk '{print $2}') + arr=($pids) + + for p in ${arr[@]} + do + kill -9 $p + done + echo -e "\033[32mdone\033[0m" +} + + +case "$1" in + start) + p_start + ;; + stop) + p_stop + ;; + restart|reload) + p_stop + sleep 0.3 + p_start + ;; + *) + echo "Please use start or stop as first argument" + ;; +esac + diff --git a/plugins/shadowsocks/install.sh b/plugins/shadowsocks/install.sh new file mode 100755 index 000000000..0d19637bf --- /dev/null +++ b/plugins/shadowsocks/install.sh @@ -0,0 +1,40 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + + +curPath=`pwd` +rootPath=$(dirname "$curPath") +rootPath=$(dirname "$rootPath") +serverPath=$(dirname "$rootPath") + + +install_tmp=${rootPath}/tmp/mw_install.pl + +SYSOS=`uname` + +Install_shadowsocks() +{ + isStart="" + echo '正在安装脚本文件...' > $install_tmp + mkdir -p $serverPath/shadowsocks + echo '1.0' > $serverPath/shadowsocks/version.pl + + pip install shadowsocks + cat $curPath/tmp/shadowsocks.json > $serverPath/shadowsocks/shadowsocks.json + + echo 'install complete' > $install_tmp +} + +Uninstall_shadowsocks() +{ + rm -rf $serverPath/shadowsocks + echo "Uninstall completed" > $install_tmp +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_shadowsocks +else + Uninstall_shadowsocks +fi diff --git a/plugins/shadowsocks/js/shadowsocks.js b/plugins/shadowsocks/js/shadowsocks.js new file mode 100755 index 000000000..853d40d6b --- /dev/null +++ b/plugins/shadowsocks/js/shadowsocks.js @@ -0,0 +1,93 @@ +function str2Obj(str){ + var data = {}; + kv = str.split('&'); + for(i in kv){ + v = kv[i].split('='); + data[v[0]] = v[1]; + } + return data; +} + +function lpPost(method,args,callback, title){ + + var _args = null; + if (typeof(args) == 'string'){ + _args = JSON.stringify(str2Obj(args)); + } else { + _args = JSON.stringify(args); + } + + var _title = '正在获取...'; + if (typeof(title) != 'undefined'){ + _title = title; + } + + var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 }); + $.post('/plugins/run', {name:'shadowsocks', func:method, args:_args}, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + +function lpAsyncPost(method,args){ + var _args = null; + if (typeof(args) == 'string'){ + _args = JSON.stringify(str2Obj(args)); + } else { + _args = JSON.stringify(args); + } + + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + return syncPost('/plugins/run', {name:'l2tp', func:method, args:_args}); +} + +function userList(){ + lpPost('user_list', '' ,function(data){ + var rdata = $.parseJSON(data['data']); + + if (!rdata['status']){ + layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + var list = rdata['data']; + + var con = ''; + con += '
'; + con += ''; + con += ''; + con += ''; + con += ''; + con += ''; + + con += ''; + + for (var i = 0; i < list.length; i++) { + con += ''+ + '' + + '' + + ''; + } + + con += ''; + con += '
用户密码操作(添加)
' + list[i]['user']+'' + list[i]['pwd']+'改密|删除
'; + + $(".soft-man-con").html(con); + }); +} + + + +function readme(){ + var readme = '
    '; + readme += '
  • PPTP需开放端口:UDP:1723
  • '; + readme += '
  • L2TP需开放端口:UDP:500,UDP:4500,UDP:1701
  • '; + readme += '
'; + $('.soft-man-con').html(readme); +} diff --git a/plugins/shadowsocks/tmp/shadowsocks.json b/plugins/shadowsocks/tmp/shadowsocks.json new file mode 100644 index 000000000..69d094e63 --- /dev/null +++ b/plugins/shadowsocks/tmp/shadowsocks.json @@ -0,0 +1,12 @@ +{ + "server":"0.0.0.0", + "local_address":"127.0.0.1", + "local_port":1080, + "port_password": { + "30008": "123123123" + }, + "timeout":300, + "method":"aes-256-cfb", + "fast_open":false, + "workers":5 +} \ No newline at end of file