From d5483f69dfbdcce0a334d99d954e258ef1559115 Mon Sep 17 00:00:00 2001 From: midoks Date: Mon, 20 Jun 2022 16:14:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=20https://github.com/mw-plug?= =?UTF-8?q?in/walle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/walle/ico.png | Bin 5471 -> 0 bytes plugins/walle/index.html | 22 ----- plugins/walle/index.py | 211 ----------------------------------------- plugins/walle/info.json | 16 ---- plugins/walle/init.d/walle.tpl | 114 ---------------------- plugins/walle/install.sh | 51 ---------- plugins/walle/js/walle.js | 99 ------------------- 7 files changed, 513 deletions(-) delete mode 100644 plugins/walle/ico.png delete mode 100755 plugins/walle/index.html delete mode 100755 plugins/walle/index.py delete mode 100644 plugins/walle/info.json delete mode 100644 plugins/walle/init.d/walle.tpl delete mode 100644 plugins/walle/install.sh delete mode 100755 plugins/walle/js/walle.js diff --git a/plugins/walle/ico.png b/plugins/walle/ico.png deleted file mode 100644 index c44b9dc4b671ee931a489ca9ee0d8835549744f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5471 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 diff --git a/plugins/walle/index.html b/plugins/walle/index.html deleted file mode 100755 index 5a15f856a..000000000 --- a/plugins/walle/index.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-

服务

-

自启动

-

配置[Python]

-

命令

-

日志

-

说明

-
-
-
-
-
-
- - \ No newline at end of file diff --git a/plugins/walle/index.py b/plugins/walle/index.py deleted file mode 100755 index be5e524e4..000000000 --- a/plugins/walle/index.py +++ /dev/null @@ -1,211 +0,0 @@ -# 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 mw - -app_debug = False -if mw.isAppleSystem(): - app_debug = True - - -def getPluginName(): - return 'walle' - - -def getPluginDir(): - return mw.getPluginDir() + '/' + getPluginName() - - -def getServerDir(): - return mw.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, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) - return (True, mw.returnJson(True, 'ok')) - - -def status(): - pn = getPluginName() - cmd = "ps -ef|grep 'waller.py' | grep -v grep | awk '{print $2}'" - data = mw.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 = mw.readFile(file_tpl) - content = content.replace('{$SERVER_PATH}', service_path) - mw.writeFile(file_bin, content) - mw.execShell('chmod +x ' + file_bin) - - return file_bin - - -def runShell(shell): - data = mw.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() - cmd = file + ' restart' - data = subprocess.Popen( - cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - return 'ok' - - -def reload(): - file = initDreplace() - data = runShell(file + ' reload') - - solr_log = getServerDir() + "/code/logs/walle.log" - mw.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) - mw.execShell('chmod +x ' + initd_bin) - - if not app_debug: - mw.execShell('chkconfig --add ' + getPluginName()) - return 'ok' - - -def initdUinstall(): - if not app_debug: - mw.execShell('chkconfig --del ' + getPluginName()) - - initd_bin = getInitDFile() - - if os.path.exists(initd_bin): - os.remove(initd_bin) - return 'ok' - - -def prodConf(): - return getServerDir() + "/code/walle/config/settings_prod.py" - - -def initEnv(): - cmd = "cd " + getServerDir() + "/code" + " && sh admin.sh init" - data = mw.execShell(cmd) - return "shell:
" + data[0] + "
" + " error:
" + data[1] - - -def initData(): - cmd = "cd " + getServerDir() + "/code" + " && sh admin.sh migration" - data = mw.execShell(cmd) - return "shell:
" + data[0] + "
" + " error:
" + data[1] -# 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()) - elif func == 'prod_conf': - print(prodConf()) - elif func == 'init_env': - print(initEnv()) - elif func == 'init_data': - print(initData()) - else: - print('error') diff --git a/plugins/walle/info.json b/plugins/walle/info.json deleted file mode 100644 index b3eb2643d..000000000 --- a/plugins/walle/info.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "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 deleted file mode 100644 index 4e6523266..000000000 --- a/plugins/walle/init.d/walle.tpl +++ /dev/null @@ -1,114 +0,0 @@ -#!/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 deleted file mode 100644 index 1f1522f98..000000000 --- a/plugins/walle/install.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/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 deleted file mode 100755 index c0bf3cd75..000000000 --- a/plugins/walle/js/walle.js +++ /dev/null @@ -1,99 +0,0 @@ -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 initEnv(){ - pPost('init_env', {}, function(data){ - layer.msg(data.data,{icon:1,time:6000,shade: [0.3, '#000']}); - },'初始化环境'); -} - -function initData(){ - pPost('init_data', {}, function(data){ - layer.msg(data.data,{icon:1,time:6000,shade: [0.3, '#000']}); - },'初始化数据'); -} - - -function pluginCmd(){ - var serviceCon ='

当前可以运行的命令:

\ -
\ - \ - \ -
'; - $(".soft-man-con").html(serviceCon); -} - - - - -function pRead(){ - var readme = '
    '; - readme += '
  • 使用默认walle端口5000,如有需要自行修改
  • '; - readme += '
  • 修改配置正确后:
  • '; - readme += '
  • 手动[初始化环境]:sh admin.sh init
  • '; - readme += '
  • 手动[初始化数据]:sh admin.sh migration
  • '; - readme += '
  • 官方文档
  • '; - readme += '
'; - - $('.soft-man-con').html(readme); -} \ No newline at end of file