From 60d6028a40b37f1c8db71831a898105bd8b6744a Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 5 Dec 2019 23:52:04 +0800 Subject: [PATCH] up --- plugins/walle/ico.png | Bin 0 -> 5471 bytes plugins/walle/index.html | 20 ++++ plugins/walle/index.py | 190 +++++++++++++++++++++++++++++++++ plugins/walle/info.json | 16 +++ plugins/walle/init.d/walle.tpl | 114 ++++++++++++++++++++ plugins/walle/install.sh | 51 +++++++++ plugins/walle/js/walle.js | 71 ++++++++++++ requirements.txt | 4 +- rewrite/nginx/walle.conf | 34 ++++++ 9 files changed, 499 insertions(+), 1 deletion(-) create mode 100644 plugins/walle/ico.png create mode 100755 plugins/walle/index.html create mode 100755 plugins/walle/index.py create mode 100644 plugins/walle/info.json create mode 100644 plugins/walle/init.d/walle.tpl create mode 100644 plugins/walle/install.sh create mode 100755 plugins/walle/js/walle.js create mode 100755 rewrite/nginx/walle.conf diff --git a/plugins/walle/ico.png b/plugins/walle/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..c44b9dc4b671ee931a489ca9ee0d8835549744f7 GIT binary patch literal 5471 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 literal 0 HcmV?d00001 diff --git a/plugins/walle/index.html b/plugins/walle/index.html new file mode 100755 index 000000000..3a87c684a --- /dev/null +++ b/plugins/walle/index.html @@ -0,0 +1,20 @@ +
+
+
+

服务

+

自启动

+

日志

+

说明

+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/plugins/walle/index.py b/plugins/walle/index.py new file mode 100755 index 000000000..ad820116d --- /dev/null +++ b/plugins/walle/index.py @@ -0,0 +1,190 @@ +# coding: utf-8 + +import time +import random +import os +import json +import re +import sys +import subprocess + +sys.path.append(os.getcwd() + "/class/core") +import public + +app_debug = False +if public.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'walle' + + +def getPluginDir(): + return public.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return public.getServerDir() + '/' + getPluginName() + + +def getInitDFile(): + if app_debug: + return '/tmp/' + getPluginName() + return '/etc/init.d/' + getPluginName() + + +def getInitDTpl(): + return getPluginDir() + "/init.d/" + getPluginName() + ".tpl" + + +def getLog(): + return getServerDir() + "/code/logs/error.log" + + +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(): + pn = getPluginName() + cmd = "ps -ef|grep 'waller.py' | grep -v grep | awk '{print $2}'" + data = public.execShell(cmd) + if data[0] == '': + return 'stop' + return 'start' + + +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() + if not os.path.exists(file_bin): + 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 runShell(shell): + data = public.execShell(shell) + return data + + +def start(): + file = initDreplace() + cmd = file + ' start' + data = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return 'ok' + + +def stop(): + file = initDreplace() + data = runShell(file + ' stop') + if data[1] == '': + return 'ok' + return 'fail' + + +def restart(): + file = initDreplace() + data = runShell(file + ' restart') + if data[1] == '': + return 'ok' + return 'fail' + + +def reload(): + file = initDreplace() + data = runShell(file + ' reload') + + solr_log = getServerDir() + "/code/logs/walle.log" + public.writeFile(solr_log, "") + + if data[1] == '': + return 'ok' + return 'fail' + + +def initdStatus(): + initd_bin = getInitDFile() + if os.path.exists(initd_bin): + return 'ok' + return 'fail' + + +def initdInstall(): + import shutil + + source_bin = initDreplace() + initd_bin = getInitDFile() + shutil.copyfile(source_bin, initd_bin) + public.execShell('chmod +x ' + initd_bin) + + if not app_debug: + public.execShell('chkconfig --add ' + getPluginName()) + return 'ok' + + +def initdUinstall(): + if not app_debug: + public.execShell('chkconfig --del ' + getPluginName()) + + initd_bin = getInitDFile() + + if os.path.exists(initd_bin): + os.remove(initd_bin) + return 'ok' + +# rsyncdReceive +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 == 'initd_status': + print initdStatus() + elif func == 'initd_install': + print initdInstall() + elif func == 'initd_uninstall': + print initdUinstall() + elif func == 'run_log': + print getLog() + else: + print 'error' diff --git a/plugins/walle/info.json b/plugins/walle/info.json new file mode 100644 index 000000000..b3eb2643d --- /dev/null +++ b/plugins/walle/info.json @@ -0,0 +1,16 @@ +{ + "id":12, + "title":"walle", + "tip":"soft", + "name":"walle", + "type":"扩展", + "ps":"一款开源的代码部署管理工具", + "versions":"1.0", + "shell":"install.sh", + "checks":"server/walle", + "path": "server/walle", + "author":"midoks", + "home":"", + "date":"2019-12-05", + "pid":"3" +} \ No newline at end of file diff --git a/plugins/walle/init.d/walle.tpl b/plugins/walle/init.d/walle.tpl new file mode 100644 index 000000000..4e6523266 --- /dev/null +++ b/plugins/walle/init.d/walle.tpl @@ -0,0 +1,114 @@ +#!/bin/bash +# chkconfig: 2345 55 25 +# description: Walle Service + +### BEGIN INIT INFO +# Provides: bt +# Required-Start: $all +# Required-Stop: $all +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: starts walle +# Description: starts the walle +### END INIT INFO + + +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin + +app_path={$SERVER_PATH}/walle/code + + +walle_start(){ + isStart=`ps aux | grep 'waller.py'| grep -v grep | awk '{print $2}'` + if [ "$isStart" == '' ];then + echo -e "Starting walle... \c" + cd $app_path && python waller.py >> $app_path/logs/walle.log 2>&1 & + sleep 0.3 + isStart=`ps aux | grep 'waller.py' | grep -v grep | awk '{print $2}'` + sleep 0.2 + if [ "$isStart" == '' ];then + echo -e "\033[31mfailed\033[0m" + echo '------------------------------------------------------' + tail -n 20 $app_path/logs/walle.log + echo '------------------------------------------------------' + echo -e "\033[31mError: walle service startup failed.\033[0m" + return + fi + echo -e "\033[32mdone\033[0m" + else + echo "Starting ... walle (pid $isStart) already running" + fi +} + + +walle_stop() +{ + echo -e "Stopping walle... \c"; + pids=$(ps aux | grep 'waller.py'|grep -v grep|awk '{print $2}') + arr=($pids) + + for p in ${arr[@]} + do + kill -9 $p + done + echo -e "\033[32mdone\033[0m" + + echo -e "Stopping walle... \c"; + arr=`ps aux | grep 'waller.py' | grep -v grep | awk '{print $2}'` + for p in ${arr[@]} + do + kill -9 $p &>/dev/null + done + + if [ -f $pidfile ];then + rm -f $pidfile + fi + echo -e "\033[32mdone\033[0m" +} + + + +walle_reload() +{ + isStart=$(ps aux | grep 'waller.py' | grep -v grep | awk '{print $2}') + + if [ "$isStart" != '' ];then + echo -e "Reload walle... \c"; + arr=`ps aux|grep 'waller.py' |grep -v grep|awk '{print $2}'` + for p in ${arr[@]} + do + kill -9 $p + done + cd $app_path && nohup python waller.py >> $app_path/logs/walle.log 2>&1 & + isStart=`ps aux | grep 'waller.py' | grep -v grep | awk '{print $2}'` + if [ "$isStart" == '' ];then + echo -e "\033[31mfailed\033[0m" + echo '------------------------------------------------------' + tail -n 20 $app_path/logs/walle.log + echo '------------------------------------------------------' + echo -e "\033[31mError: walle service startup failed.\033[0m" + return + fi + echo -e "\033[32mdone\033[0m" + else + echo -e "\033[31m walle not running\033[0m" + mw_start + fi +} + + +error_logs() +{ + tail -n 100 ${app_path}/logs/walle.log +} + +case "$1" in + 'start') walle_start;; + 'stop') walle_stop;; + 'reload') walle_reload;; + 'restart') + walle_stop + walle_start;; + 'logs') error_logs;; +esac + diff --git a/plugins/walle/install.sh b/plugins/walle/install.sh new file mode 100644 index 000000000..5b95fb50b --- /dev/null +++ b/plugins/walle/install.sh @@ -0,0 +1,51 @@ +#!/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 + + +Install_walle() +{ + echo '正在安装脚本文件...' > $install_tmp + mkdir -p $serverPath/walle + echo '1.0' > $serverPath/walle/version.pl + + if [ ! -f $serverPath/source/v2.0.1.tar.gz ];then + wget -O $serverPath/source/v2.0.1.tar.gz https://github.com/meolu/walle-web/archive/v2.0.1.tar.gz + fi + + if [ ! -d $serverPath/source/walle-web-2.0.1 ];then + cd $serverPath/source && tar -zxvf v2.0.1.tar.gz + fi + + if [ ! -d $serverPath/walle/code ];then + mkdir -p $serverPath/walle/code + cp -rf $serverPath/source/walle-web-2.0.1/ $serverPath/walle/code + fi + + cd $serverPath/walle/code && pip install -r $serverPath/walle/code/requirements/prod.txt + + echo '安装完成' > $install_tmp + +} + +Uninstall_walle() +{ + rm -rf $serverPath/walle + echo "卸载完成" > $install_tmp +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_walle +else + Uninstall_walle +fi \ No newline at end of file diff --git a/plugins/walle/js/walle.js b/plugins/walle/js/walle.js new file mode 100755 index 000000000..505727477 --- /dev/null +++ b/plugins/walle/js/walle.js @@ -0,0 +1,71 @@ +function str2Obj(str){ + var data = {}; + kv = str.split('&'); + for(i in kv){ + v = kv[i].split('='); + data[v[0]] = v[1]; + } + return data; +} + +function pPost(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:'walle', 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 pPostCallbak(method, version, args,callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'walle'; + req_data['func'] = method; + args['version'] = version; + + if (typeof(args) == 'string'){ + req_data['args'] = JSON.stringify(str2Obj(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/callback', req_data, 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 pRead(){ + var readme = '
    '; + readme += '
  • 使用默认walle端口5000,如有需要自行修改
  • '; + readme += '
'; + + $('.soft-man-con').html(readme); +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e18a8bf4c..18e4970f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ wheel flask==1.0 flask-session flask-socketio==3.3.2 +flask-helper=0.19 gunicorn==19.9 gevent==1.3.3 gevent-websocket==0.10.1 @@ -11,4 +12,5 @@ pillow chardet flask-sqlalchemy ConfigParser -MySQL-python \ No newline at end of file +MySQL-python +pytest-shutil \ No newline at end of file diff --git a/rewrite/nginx/walle.conf b/rewrite/nginx/walle.conf new file mode 100755 index 000000000..b2f5e1321 --- /dev/null +++ b/rewrite/nginx/walle.conf @@ -0,0 +1,34 @@ + +#upstream webservers { +# server 127.0.0.1:5000; +#} + +location / { + try_files $uri $uri/ /index.html; + add_header access-control-allow-origin *; +} + +location ^~ /api/ { + add_header access-control-allow-origin *; + proxy_pass http://webservers; + proxy_set_header X-Forwarded-Host $host:$server_port; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Origin $host:$server_port; + proxy_set_header Referer $host:$server_port; +} + +location ^~ /socket.io/ { + add_header access-control-allow-origin *; + proxy_pass http://webservers; + proxy_set_header X-Forwarded-Host $host:$server_port; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Origin $host:$server_port; + proxy_set_header Referer $host:$server_port; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + + # WebScoket Support + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; +} \ No newline at end of file