diff --git a/plugins/shadowsocks/ico.png b/plugins/shadowsocks/ico.png new file mode 100644 index 000000000..444bdbb8c Binary files /dev/null and b/plugins/shadowsocks/ico.png differ diff --git a/plugins/shadowsocks/index.html b/plugins/shadowsocks/index.html new file mode 100755 index 000000000..681136872 --- /dev/null +++ b/plugins/shadowsocks/index.html @@ -0,0 +1,18 @@ +
+
+
+

服务

+

自启动

+

配置修改

+

说明

+
+
+
+
+
+
+ \ 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 = ''; + $('.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