pull/109/head
Mr Chen 7 years ago
parent 6e470833b0
commit 4a087ef10c
  1. 139
      class/core/plugin.py
  2. 3
      plugins/csvn/info.json
  3. 1
      plugins/mysql/info.json
  4. 5
      plugins/nginx/info.json
  5. 80
      plugins/php/info.json
  6. 1
      plugins/redis/info.json
  7. 2
      plugins/redis/install.sh
  8. 38
      route/plugins.py
  9. 75
      static/js/soft.js
  10. 6
      task.py
  11. 2
      templates/default/soft.html

@ -0,0 +1,139 @@
# coding: utf-8
import psutil
import time
import os
import public
import re
import json
class plugin:
__tasks = None
__plugin_dir = "plugins"
__type = "data/type.json"
setupPath = None
def __init__(self):
self.setupPath = 'server'
# 进程是否存在
def processExists(self, pname, exe=None):
try:
if not self.pids:
self.pids = psutil.pids()
for pid in self.pids:
try:
p = psutil.Process(pid)
if p.name() == pname:
if not exe:
return True
else:
if p.exe() == exe:
return True
except:
pass
return False
except:
return True
# 检查是否正在安装
def checkSetupTask(self, sName):
if not self.__tasks:
self.__tasks = public.M('tasks').where(
"status!=?", ('1',)).field('status,name').select()
if sName.find('php-') != -1:
tmp = sName.split('-')
sName = tmp[0]
version = tmp[1]
isTask = '1'
for task in self.__tasks:
tmpt = public.getStrBetween('[', ']', task['name'])
if not tmpt:
continue
tmp1 = tmpt.split('-')
name1 = tmp1[0].lower()
if sName == 'php':
if name1 == sName and tmp1[1] == version:
isTask = task['status']
else:
if name1 == 'pure':
name1 = 'pure-ftpd'
if name1 == sName:
isTask = task['status']
return isTask
def checkStatus(self, info):
pass
# 构造本地插件信息
def getPluginInfo(self, info):
print info["checks"]
checks = ""
if info["checks"][0:1] == "/":
checks = info["checks"]
else:
checks = public.getRootDir() + "/" + info['checks']
pluginInfo = {
"id": 10000,
"pid": info['pid'],
"type": 1000,
"name": info['name'],
"title": info['title'],
"ps": info['ps'],
"dependnet": "",
"mutex": "",
"install_checks": checks,
"uninsatll_checks": checks,
"versions": info['versions'],
# "updates": info['updates'],
"setup": False,
"status": False,
}
pluginInfo['task'] = self.checkSetupTask(pluginInfo['name'])
pluginInfo['setup'] = os.path.exists(pluginInfo['install_checks'])
pluginInfo['status'] = os.path.exists(pluginInfo['install_checks'])
return pluginInfo
def getPluginList(self, sType, sPage=1, sPageSize=15):
ret = {}
ret['type'] = json.loads(public.readFile(self.__type))
plugins_info = []
for dirinfo in os.listdir(self.__plugin_dir):
path = self.__plugin_dir + '/' + dirinfo
if os.path.isdir(path):
jsonFile = path + '/info.json'
if os.path.exists(jsonFile):
try:
tmp = json.loads(public.readFile(jsonFile))
if tmp['name'] == 'php':
for v in tmp['versions']:
pg = self.getPluginInfo(tmp)
pg['versions'] = v
# print "sss:", i, v
# pg['updates'] = tmp["updates"][v]
if sType == "0":
plugins_info.append(pg)
else:
if pg['pid'] == sType:
plugins_info.append(pg)
else:
pg = self.getPluginInfo(tmp)
if sType == "0":
plugins_info.append(pg)
else:
if pg['pid'] == sType:
plugins_info.append(pg)
except BaseException, e:
print e
args = {}
args['count'] = len(plugins_info)
args['p1'] = sPage
ret['data'] = plugins_info
ret['list'] = public.getPage(args)
return ret

@ -5,8 +5,9 @@
"name": "csvn",
"title": "CSVN",
"versions": ["5.1"],
"updates":["5.1.4"],
"tip": "soft",
"checks": "server/csvn/VERSION/",
"checks": "server/csvn",
"author": "midoks",
"date": "2017-04-01",
"home": "https://www.collab.net",

@ -5,6 +5,7 @@
"type":"运行环境",
"ps":"MySQL是一种关系数据库管理系统!",
"versions":["5.5"],
"updates":["5.5"],
"shell":"install.sh",
"checks":"/www/server/panel/plugin/safelogin",
"author":"midoks",

@ -8,8 +8,9 @@
"checks":"server/nginx",
"author":"伊戈尔·赛索耶夫",
"home":"https://www.nginx.org",
"path": "server/nginx",
"checks": "server/nginx",
"date":"2017-11-24",
"pid": "1",
"versions": ["1.14.0", "1.12.2", "1.8.1", "1.15.3", "-Tengine2.2.2", "openresty"]
"versions": ["1.14.0", "1.12.2", "1.8.1", "1.15.3", "-Tengine2.2.2", "openresty"],
"updates": ["1.14.0", "1.12.2", "1.8.1", "1.15.3", "-Tengine2.2.2", "openresty"]
}

@ -5,8 +5,8 @@
"name": "php",
"title": "PHP",
"default": false,
"versions": "5.2,5.3,5.4,5.5,5.6,7.0,7.1,7.2",
"update": "5.2.17p1,5.3.29,5.4.45,5.5.38,5.6.32,7.0.26,7.1.12,7.2.0",
"versions": ["5.2","5.3","5.4","5.5","5.6","7.0","7.1","7.2"],
"updates": ["5.2.17p1","5.3.29","5.4.45","5.5.38","5.6.32","7.0.26","7.1.12","7.2.0"],
"tip": "soft",
"checks": "/www/server/php/VERSION/bin/php",
"display": 1,
@ -14,79 +14,5 @@
"date": "2017-04-01",
"home": "https://www.php.net",
"type": "语言解释器",
"pid": "1",
"versions": [
{
"status": false,
"version": "5.2",
"no": "",
"task": "1"
},
{
"status": false,
"version": "5.3",
"no": "",
"task": "1"
},
{
"status": true,
"task": "1",
"run": true,
"no": "5.4.45",
"fpm": true,
"max": "50",
"version": "5.4",
"pathinfo": true,
"maxTime": "100",
"display": false
},
{
"status": false,
"version": "5.5",
"no": "",
"task": "1"
},
{
"status": true,
"task": "1",
"run": true,
"no": "5.6.30",
"fpm": true,
"max": "50",
"version": "5.6",
"pathinfo": true,
"maxTime": "100",
"display": false
},
{
"status": true,
"task": "1",
"run": true,
"no": "7.0.19",
"fpm": true,
"max": "50",
"version": "7.0",
"pathinfo": true,
"maxTime": "100",
"display": false
},
{
"status": true,
"task": "1",
"run": true,
"no": "7.1.5",
"fpm": true,
"max": "50",
"version": "7.1",
"pathinfo": true,
"maxTime": "100",
"display": false
},
{
"status": false,
"version": "7.2",
"no": "",
"task": "1"
}
]
"pid": "1"
}

@ -6,6 +6,7 @@
"shell": "install.sh",
"default": false,
"versions":["4.0"],
"updates":["4.0.11"],
"tip": "soft",
"checks": "server/redis",
"display": 1,

@ -26,7 +26,7 @@ Install_redis()
echo '安装完成' > $install_tmp
# rm -rf $serverPath/tmp
rm -rf $serverPath/tmp
}
Uninstall_redis()

@ -12,6 +12,7 @@ import json
sys.path.append("class/core")
import public
import plugin
plugins = Blueprint('plugins', __name__, template_folder='templates')
@ -39,40 +40,9 @@ def file():
@plugins.route("/list", methods=['GET', 'POST'])
def list():
data = json.loads(public.readFile("data/type.json"))
ret = {}
ret["type"] = data
plugins_info = []
typeVal = request.args.get('type', '')
if typeVal == "":
typeVal = "0"
for dirinfo in os.listdir(__plugin_name):
path = __plugin_name + "/" + dirinfo
if os.path.isdir(path):
jsonFile = path + "/info.json"
if os.path.exists(jsonFile):
try:
tmp = json.loads(public.readFile(jsonFile))
if typeVal == "0":
plugins_info.append(tmp)
else:
if tmp['pid'] == typeVal:
plugins_info.append(tmp)
except:
pass
ret['data'] = plugins_info
args = {}
args['count'] = len(plugins_info)
args['p1'] = 1
ret['list'] = public.getPage(args)
return jsonify(ret)
typeVal = request.args.get('type', '0')
data = plugin.plugin().getPluginList(typeVal, 1)
return public.getJson(data)
@plugins.route('/install', methods=['POST'])

@ -1784,6 +1784,7 @@ function GetSList(isdisplay) {
$(".task").text(rdata.data[rdata.length - 1]);
for (var i = 0; i < rdata.data.length; i++) {
var plugin = rdata.data[i];
var len = rdata.data[i].versions.length;
var version_info = '';
var version = '';
@ -1793,50 +1794,54 @@ function GetSList(isdisplay) {
var indexshow = '';
var checked = '';
checked = rdata.data[i].display ? 'checked' : '';
checked = plugin.display ? 'checked' : '';
if (typeof rdata.data[i].versions == "string"){
version_info += rdata.data[i].versions + '|';
if (typeof plugin.versions == "string"){
version_info += plugin.versions + '|';
} else {
for (var j = 0; j < len; j++) {
version_info += rdata.data[i].versions[j] + '|';
version_info += plugin.versions[j] + '|';
}
}
if (version_info != '') {
version_info = version_info.substring(0, version_info.length - 1);
}
var handle = '<a class="btlink" onclick="AddVersion(\'' + rdata.data[i].name + '\',\'' + version_info + '\',\'' + rdata.data[i].tip + '\',this,\'' + rdata.data[i].title + '\')">' + lan.soft.install + '</a>';
var handle = '<a class="btlink" onclick="AddVersion(\'' + plugin.name + '\',\'' + version_info + '\',\'' + plugin.tip + '\',this,\'' + plugin.title + '\')">安装</a>';
var isSetup = false;
if (rdata.data[i].name != 'php') {
if (plugin.name != 'php') {
for (var n = 0; n < len; n++) {
if (rdata.data[i].versions[n].status == true) {
if (plugin.status == true) {
isSetup = true;
if (rdata.data[i].tip == 'lib') {
var mupdate = (rdata.data[i].versions[n].no == rdata.data[i].versions[n].version) ? '' : '<a class="btlink" onclick="SoftUpdate(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].versions[n].version + '\')">更新</a> | ';
handle = mupdate + '<a class="btlink" onclick="PluginMan(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].title + '\')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].title + '\')">' + lan.soft.uninstall + '</a>';
titleClick = 'onclick="PluginMan(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].title + '\')" style="cursor:pointer"';
if (plugin.tip == 'lib') {
var mupdate = (plugin.versions[n].no == plugin.versions[n].version) ? '' : '<a class="btlink" onclick="SoftUpdate(\'' + plugin.name + '\',\'' + plugin.versions[n].version + '\',\'' + plugin.versions[n].version + '\')">更新</a> | ';
handle = mupdate + '<a class="btlink" onclick="PluginMan(\'' + plugin.name + '\',\'' + plugin.title + '\')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + plugin.name + '\',\'' + plugin.versions[n].version + '\',\'' + plugin.title + '\')">卸载</a>';
titleClick = 'onclick="PluginMan(\'' + plugin.name + '\',\'' + plugin.title + '\')" style="cursor:pointer"';
} else {
var mupdate = (rdata.data[i].versions[n].no == rdata.data[i].update[n]) ? '' : '<a class="btlink" onclick="SoftUpdate(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].update[n] + '\')">更新</a> | ';
if (rdata.data[i].versions[n].no == '') mupdate = '';
handle = mupdate + '<a class="btlink" onclick="SoftMan(\'' + rdata.data[i].name + '\',\'' + version_info + '\')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].title + '\')">' + lan.soft.uninstall + '</a>';
titleClick = 'onclick="SoftMan(\'' + rdata.data[i].name + '\',\'' + version_info + '\')" style="cursor:pointer"';
console.log(plugin, n);
var mupdate = '';//(plugin.versions[n] == plugin.updates[n]) '' : '<a class="btlink" onclick="SoftUpdate(\'' + plugin.name + '\',\'' + plugin.versions[n].version + '\',\'' + plugin.updates[n] + '\')">更新</a> | ';
if (plugin.versions[n] == '') mupdate = '';
handle = mupdate + '<a class="btlink" onclick="SoftMan(\'' + plugin.name + '\',\'' + version_info + '\')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + plugin.name + '\',\'' + plugin.versions[n].version + '\',\'' + plugin.title + '\')">卸载</a>';
titleClick = 'onclick="SoftMan(\'' + plugin.name + '\',\'' + version_info + '\')" style="cursor:pointer"';
}
version = rdata.data[i].versions[n].version;
version = plugin.version;
softPath = '<span class="glyphicon glyphicon-folder-open" title="' + rdata.data[i].path + '" onclick="openPath(\'' + rdata.data[i].path + '\')"></span>';
indexshow = '<div class="index-item"><input class="btswitch btswitch-ios" id="index_' + rdata.data[i].name + '" type="checkbox" ' + checked + '><label class="btswitch-btn" for="index_' + rdata.data[i].name + '" onclick="toIndexDisplay(\'' + rdata.data[i].name + '\',\'' + version + '\')"></label></div>';
indexshow = '<div class="index-item"><input class="btswitch btswitch-ios" id="index_' + rdata.data[i].name + '" type="checkbox" ' + checked + '><label class="btswitch-btn" for="index_' + plugin.name + '" onclick="toIndexDisplay(\'' + plugin.name + '\',\'' + version + '\')"></label></div>';
if (rdata.data[i].versions[n].run == true) {
state = '<span style="color:#20a53a" class="glyphicon glyphicon-play"></span>'
} else {
state = '<span style="color:red" class="glyphicon glyphicon-pause"></span>'
}
}
var isTask = rdata.data[i].versions[n].task;
var isTask = plugin.task;
if (isTask == '-1') {
handle = '<a style="color:green;" href="javascript:task();">' + lan.soft.the_install + '</a>'
handle = '<a style="color:green;" href="javascript:task();">正在安装...</a>';
} else if (isTask == '0') {
handle = '<a style="color:#C0C0C0;" href="javascript:task();">' + lan.soft.sleep_install + '</a>'
handle = '<a style="color:#C0C0C0;" href="javascript:task();">等待安装...</a>';
}
}
@ -1853,18 +1858,18 @@ function GetSList(isdisplay) {
} else {
var pnum = 0;
for (var n = 0; n < len; n++) {
if (rdata.data[i].versions[n].status == true) {
checked = rdata.data[i].versions[n]['display'] ? "checked" : "";
var mupdate = (rdata.data[i].versions[n].no == rdata.data[i].update[n]) ? '' : '<a class="btlink" onclick="SoftUpdate(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].update[n] + '\')">更新</a> | ';
handle = mupdate + '<a class="btlink" onclick="phpSoftMain(\'' + rdata.data[i].versions[n].version + '\',' + n + ')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\',\'' + rdata.data[i].title + '\')">' + lan.soft.uninstall + '</a>';
softPath = '<span class="glyphicon glyphicon-folder-open" title="' + rdata.data[i].path + '" onclick="openPath(\'' + rdata.data[i].path + "/" + rdata.data[i].versions[n].version.replace(/\./, "") + '\')"></span>';
titleClick = 'onclick="phpSoftMain(\'' + rdata.data[i].versions[n].version + '\',' + n + ')" style="cursor:pointer"';
indexshow = '<div class="index-item"><input class="btswitch btswitch-ios" id="index_' + rdata.data[i].name + rdata.data[i].versions[n].version.replace(/\./, "") + '" type="checkbox" ' + checked + '><label class="btswitch-btn" for="index_' + rdata.data[i].name + rdata.data[i].versions[n].version.replace(/\./, "") + '" onclick="toIndexDisplay(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\')"></label></div>';
if (rdata.data[i].versions[n].run == true) {
state = '<span style="color:#20a53a" class="glyphicon glyphicon-play"></span>'
} else {
state = '<span style="color:red" class="glyphicon glyphicon-pause"></span>'
}
if (plugin.status == true) {
// checked = plugin.versions[n]['display'] ? "checked" : "";
// var mupdate = (plugin.versions[n] == plugin.updates[n]) ? '' : '<a class="btlink" onclick="SoftUpdate(\'' + rdata.data[i].name + '\',\'' + plugin.versions[n] + '\',\'' + plugin.updates[n] + '\')">更新</a> | ';
// handle = mupdate + '<a class="btlink" onclick="phpSoftMain(\'' + plugin.versions + '\',' + n + ')">' + lan.soft.setup + '</a> | <a class="btlink" onclick="UninstallVersion(\'' + rdata.data[i].name + '\',\'' + plugin.versions[n] + '\',\'' + plugin.title + '\')">卸载</a>';
// softPath = '<span class="glyphicon glyphicon-folder-open" title="' + plugin.path + '" onclick="openPath(\'' + plugin.path + "/" + plugin.versions[n].replace(/\./, "") + '\')"></span>';
// titleClick = 'onclick="phpSoftMain(\'' + plugin.versions[n] + '\',' + n + ')" style="cursor:pointer"';
// indexshow = '<div class="index-item"><input class="btswitch btswitch-ios" id="index_' + plugin.name + plugin.versions[n].replace(/\./, "") + '" type="checkbox" ' + checked + '><label class="btswitch-btn" for="index_' + plugin.name + plugin.versions[n].replace(/\./, "") + '" onclick="toIndexDisplay(\'' + plugin.name + '\',\'' + plugin.versions[n] + '\')"></label></div>';
// if (plugin.run == true) {
// state = '<span style="color:#20a53a" class="glyphicon glyphicon-play"></span>'
// } else {
// state = '<span style="color:red" class="glyphicon glyphicon-pause"></span>'
// }
} else {
handle = '<a class="btlink" onclick="oneInstall(\'' + rdata.data[i].name + '\',\'' + rdata.data[i].versions[n].version + '\')">' + lan.soft.install + '</a>';
softPath = '';
@ -1922,7 +1927,7 @@ function GetSList(isdisplay) {
$(this).addClass("on").siblings().removeClass("on");
GetSList();
})
})
},'json');
}
//刷新状态
function FPStatus() {
@ -2327,7 +2332,7 @@ function toIndexDisplay(name, version) {
status = $("#index_" + name + verinfo).prop("checked") ? "0" : "1";
}
var data = "name=" + name + "&status=" + status + "&version=" + version;
$.post("/plugins?action=setPluginStatus", data, function(rdata) {
$.post("/plugins/set_plugin_status", data, function(rdata) {
if (rdata.status) {
layer.msg(rdata.msg, { icon: 1 })
}
@ -2345,7 +2350,7 @@ function flush_cache() {
$(function() {
if (window.document.location.pathname == '/soft') {
if (window.document.location.pathname == '/soft/') {
setInterval(function() { GetSList(true); }, 5000);
}
});

@ -9,7 +9,7 @@ import json
# import psutil
import time
sys.path.append(os.getcwd() + "/class/")
sys.path.append(os.getcwd() + "/class/core")
reload(sys)
sys.setdefaultencoding('utf-8')
import db
@ -113,13 +113,13 @@ def startTask():
while True:
try:
if os.path.exists(isTask):
print "run --- !"
# print "run --- !"
sql = db.Sql()
sql.table('tasks').where(
"status=?", ('-1',)).setField('status', '0')
taskArr = sql.table('tasks').where("status=?", ('0',)).field(
'id,type,execstr').order("id asc").select()
print sql
# print sql
for value in taskArr:
start = int(time.time())
if not sql.table('tasks').where("id=?", (value['id'],)).count():

@ -28,8 +28,8 @@
<tr>
<th width="165">软件名称</th>
<th>说明</th>
<th width="40">状态</th>
<th width="40">位置</th>
<th width="40">状态</th>
<th width="64">首页显示</th>
<th style="text-align: right;" width="120">操作</th>
</tr>

Loading…
Cancel
Save