pull/109/head
midoks 7 years ago
parent d8571903c7
commit 3b90209c4c
  1. 11
      app.py
  2. BIN
      data/default.db
  3. 1609
      static/js/files.js
  4. 4
      static/js/index.js
  5. 180
      static/js/soft.js
  6. 26
      templates/default/site.html
  7. 6
      views/__init__.py
  8. 27
      views/dashboard.py
  9. 17
      views/database.py
  10. 25
      views/plugins.py
  11. 10
      views/site.py
  12. 159
      views/system.py

@ -1,9 +1,11 @@
from flask import Flask
import views
import sys
import io
import os
import views
from flask import Flask
from datetime import timedelta
sys.path.append("class/")
app = Flask(__name__)
@ -18,12 +20,17 @@ DEFAULT_MODULES = (
(views.config, "/config"),
(views.plugins, "/plugins"),
(views.task, "/task"),
(views.system, "/system"),
(views.database, "/database")
)
import time
# print "time.time(): %f " % time.time()
app.config.version = "0.0.1" + str(time.time())
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
def setting_modules(app, modules):
for module, url_prefix in modules:

Binary file not shown.

File diff suppressed because it is too large Load Diff

@ -135,7 +135,7 @@ function GetPercent(num, total) {
function GetDiskInfo() {
$.get('/system?action=GetDiskInfo', function(rdata) {
$.get('/system/disknfo', function(rdata) {
var dBody
for (var i = 0; i < rdata.length; i++) {
if (rdata[i].path == '/' || rdata[i].path == '/www') {
@ -233,7 +233,7 @@ function getNet() {
var down;
$.ajax({
type: "get",
url: "/system?action=GetNetWork",
url: "/system/network",
async: true,
success: function(net) {
$("#InterfaceSpeed").html(lan.index.interfacespeed + ": 1.0Gbps");

@ -1597,96 +1597,96 @@ function phpmyadmin(msg) {
});
}
//首页软件列表
function indexsoft() {
var loadT = layer.msg(lan.soft.get_list, { icon: 16, time: 0, shade: [0.3, '#000'] });
$.post('/plugin?action=getPluginList', 'display=1', function(rdata) {
layer.close(loadT);
var con = '';
for (var i = 0; i < rdata['data'].length - 1; i++) {
var len = rdata.data[i].versions.length;
var version_info = '';
for (var j = 0; j < len; j++) {
if (rdata.data[i].versions[j].status) continue;
version_info += rdata.data[i].versions[j].version + '|';
}
if (version_info != '') {
version_info = version_info.substring(0, version_info.length - 1);
}
if (rdata.data[i].display) {
var isDisplay = false;
if (rdata.data[i].name != 'php') {
for (var n = 0; n < len; n++) {
if (rdata.data[i].versions[n].status == true) {
isDisplay = true;
var version = rdata.data[i].versions[n].version;
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 (isDisplay) {
var clickName = 'SoftMan';
if (rdata.data[i].tip == 'lib') {
clickName = 'PluginMan';
version_info = rdata.data[i].title;
}
con += '<div class="col-sm-3 col-md-3 col-lg-3" data-id="' + rdata.data[i].pid + '">\
<span class="spanmove"></span>\
<div onclick="' + clickName + '(\'' + rdata.data[i].name + '\',\'' + version_info + '\')">\
<div class="image"><img src="/static/img/soft_ico/ico-' + rdata.data[i].name + '.png"></div>\
<div class="sname">' + rdata.data[i].title + ' ' + version + state + '</div>\
</div>\
</div>'
}
} else {
for (var n = 0; n < len; n++) {
if (rdata.data[i].versions[n].status == true) {
var version = rdata.data[i].versions[n].version;
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 (rdata.data[i].versions[n].display == true) {
con += '<div class="col-sm-3 col-md-3 col-lg-3" data-id="' + rdata.data[i].pid + '">\
<span class="spanmove"></span>\
<div onclick="phpSoftMain(\'' + rdata.data[i].versions[n].version + '\',' + n + ')">\
<div class="image"><img src="/static/img/soft_ico/ico-' + rdata.data[i].name + '.png"></div>\
<div class="sname">' + rdata.data[i].title + ' ' + rdata.data[i].versions[n].version + state + '</div>\
</div>\
</div>'
}
}
}
}
}
$("#indexsoft").html(con);
//软件位置移动
var softboxlen = $("#indexsoft > div").length;
var softboxsum = 12;
var softboxcon = '';
var softboxn = softboxlen;
if (softboxlen <= softboxsum) {
for (var i = 0; i < softboxsum - softboxlen; i++) {
softboxn += 1000;
softboxcon += '<div class="col-sm-3 col-md-3 col-lg-3 no-bg" data-id="' + softboxn + '"></div>'
}
$("#indexsoft").append(softboxcon);
}
$("#indexsoft").dragsort({ dragSelector: ".spanmove", dragBetween: true, dragEnd: saveOrder, placeHolderTemplate: "<div class='col-sm-3 col-md-3 col-lg-3 dashed-border'></div>" });
function saveOrder() {
var data = $("#indexsoft > div").map(function() { return $(this).attr("data-id"); }).get();
var ssort = data.join("|");
$("input[name=list1SortOrder]").val(ssort);
$.post("/plugin?action=savePluginSort", 'ssort=' + ssort, function(rdata) {});
};
});
}
// function indexsoft() {
// var loadT = layer.msg(lan.soft.get_list, { icon: 16, time: 0, shade: [0.3, '#000'] });
// $.post('/plugin?action=getPluginList', 'display=1', function(rdata) {
// layer.close(loadT);
// var con = '';
// for (var i = 0; i < rdata['data'].length - 1; i++) {
// var len = rdata.data[i].versions.length;
// var version_info = '';
// for (var j = 0; j < len; j++) {
// if (rdata.data[i].versions[j].status) continue;
// version_info += rdata.data[i].versions[j].version + '|';
// }
// if (version_info != '') {
// version_info = version_info.substring(0, version_info.length - 1);
// }
// if (rdata.data[i].display) {
// var isDisplay = false;
// if (rdata.data[i].name != 'php') {
// for (var n = 0; n < len; n++) {
// if (rdata.data[i].versions[n].status == true) {
// isDisplay = true;
// var version = rdata.data[i].versions[n].version;
// 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 (isDisplay) {
// var clickName = 'SoftMan';
// if (rdata.data[i].tip == 'lib') {
// clickName = 'PluginMan';
// version_info = rdata.data[i].title;
// }
// con += '<div class="col-sm-3 col-md-3 col-lg-3" data-id="' + rdata.data[i].pid + '">\
// <span class="spanmove"></span>\
// <div onclick="' + clickName + '(\'' + rdata.data[i].name + '\',\'' + version_info + '\')">\
// <div class="image"><img src="/static/img/soft_ico/ico-' + rdata.data[i].name + '.png"></div>\
// <div class="sname">' + rdata.data[i].title + ' ' + version + state + '</div>\
// </div>\
// </div>'
// }
// } else {
// for (var n = 0; n < len; n++) {
// if (rdata.data[i].versions[n].status == true) {
// var version = rdata.data[i].versions[n].version;
// 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 (rdata.data[i].versions[n].display == true) {
// con += '<div class="col-sm-3 col-md-3 col-lg-3" data-id="' + rdata.data[i].pid + '">\
// <span class="spanmove"></span>\
// <div onclick="phpSoftMain(\'' + rdata.data[i].versions[n].version + '\',' + n + ')">\
// <div class="image"><img src="/static/img/soft_ico/ico-' + rdata.data[i].name + '.png"></div>\
// <div class="sname">' + rdata.data[i].title + ' ' + rdata.data[i].versions[n].version + state + '</div>\
// </div>\
// </div>'
// }
// }
// }
// }
// }
// $("#indexsoft").html(con);
// //软件位置移动
// var softboxlen = $("#indexsoft > div").length;
// var softboxsum = 12;
// var softboxcon = '';
// var softboxn = softboxlen;
// if (softboxlen <= softboxsum) {
// for (var i = 0; i < softboxsum - softboxlen; i++) {
// softboxn += 1000;
// softboxcon += '<div class="col-sm-3 col-md-3 col-lg-3 no-bg" data-id="' + softboxn + '"></div>'
// }
// $("#indexsoft").append(softboxcon);
// }
// $("#indexsoft").dragsort({ dragSelector: ".spanmove", dragBetween: true, dragEnd: saveOrder, placeHolderTemplate: "<div class='col-sm-3 col-md-3 col-lg-3 dashed-border'></div>" });
// function saveOrder() {
// var data = $("#indexsoft > div").map(function() { return $(this).attr("data-id"); }).get();
// var ssort = data.join("|");
// $("input[name=list1SortOrder]").val(ssort);
// $.post("/plugin?action=savePluginSort", 'ssort=' + ssort, function(rdata) {});
// };
// });
// }
//插件设置菜单
function PluginMan(name, title) {

@ -6,7 +6,7 @@
<div class="container-fluid">
<div class="pos-box bgw mtb15">
<div class="position f14 c9 pull-left">
<a class="plr10 c4" href="/">$tData['lan']['H1']</a>/<span class="plr10 c4">$tData['lan']['H2']</span>
<a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">网站</span>
</div>
<div class="search pull-right">
<form target="hid" onsubmit='getWeb(1,$$("#SearchValue").prop("value"))'>
@ -18,13 +18,13 @@
</div>
<div class="safe bgw mtb15 pd15">
<div class="important-title">
<p><span class="glyphicon glyphicon-alert" style="color: #f39c12; margin-right: 10px;"></span> $tData['lan']['PS']</p>
<p><span class="glyphicon glyphicon-alert" style="color: #f39c12; margin-right: 10px;"></span>使用MDWEB Linux面板创建站点时会自动创建权限配置,统一使用www用户。</p>
</div>
<button onclick="webAdd(0)" class="btn btn-success btn-sm btn-title" type="button">$tData['lan']['BTN1']</button>&nbsp;
<button onclick="SiteDefaultPage()" class="btn btn-default btn-sm btn-title" type="button">$tData['lan']['BTN2']</button>
<button onclick="GetDefaultSite()" class="btn btn-default btn-sm btn-title" type="button">$tData['lan']['BTN3']</button>
<button onclick="webAdd(0)" class="btn btn-success btn-sm btn-title" type="button">添加站点</button>&nbsp;
<button onclick="SiteDefaultPage()" class="btn btn-default btn-sm btn-title" type="button">修改默认页</button>
<button onclick="GetDefaultSite()" class="btn btn-default btn-sm btn-title" type="button">默认站点</button>
<span id="allDelete" style="float: right;display: none;">
<button onclick="allDeleteSite();" class="btn btn-default btn-sm">$tData['lan']['BTN4']</button>
<button onclick="allDeleteSite();" class="btn btn-default btn-sm">网站搜索</button>
</span>
<div class="divtable mtb10">
<div class="tablescroll">
@ -32,14 +32,14 @@
<thead>
<tr>
<th width="30"><input type="checkbox" onclick="checkSelect();" id="setBox"></th>
<th width="150" onclick="listOrder('name','site',this)" style="cursor: pointer;">$tData['lan']['TH1']<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th onclick="listOrder('status','site',this)" style="cursor: pointer;" width="98">$tData['lan']['TH2']<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th width="58">$tData['lan']['TH3']</th>
<th width="26%">$tData['lan']['TH4']</th>
<th onclick="listOrder('edate','site',this)" style="cursor: pointer;" width="86">$tData['lan']['TH5']<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th>$tData['lan']['TH6']</th>
<th width="150" onclick="listOrder('name','site',this)" style="cursor: pointer;">域名<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th onclick="listOrder('status','site',this)" style="cursor: pointer;" width="98">网站状态<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th width="58">备份</th>
<th width="26%">网站目录</th>
<th onclick="listOrder('edate','site',this)" style="cursor: pointer;" width="86">到期日期<span class="glyphicon glyphicon-triangle-top" style="margin-left:5px;color:#bbb"></span></th>
<th>备注</th>
<th>防火墙</th>
<th width='130' class='text-right'>$tData['lan']['TH7']</th>
<th width='130' class='text-right'>操作</th>
</tr>
</thead>
<tbody id="webBody"></tbody>

@ -1,9 +1,9 @@
from dashboard import *
from site import *
from files import *
from soft import *
from config import *
from plugins import *
from task import *
from system import *
from plugins import *
from database import *

@ -13,30 +13,3 @@ dashboard = Blueprint('dashboard', __name__, template_folder='templates')
@dashboard.route("/")
def index():
return render_template('default/index.html')
@dashboard.route("getnetwork")
def getNetWork():
# 取网络流量信息
networkIo = psutil.net_io_counters()[:4]
# if not hasattr(web.ctx.session,'otime'):
# web.ctx.session.up = networkIo[0]
# web.ctx.session.down = networkIo[1]
# web.ctx.session.otime = time.time();
ntime = time.time()
networkInfo = {}
networkInfo['upTotal'] = networkIo[0]
networkInfo['downTotal'] = networkIo[1]
# networkInfo['up'] = round(float(networkIo[0] - web.ctx.session.up) / 1024 / (ntime - web.ctx.session.otime),2)
# networkInfo['down'] = round(float(networkIo[1] - web.ctx.session.down) / 1024 / (ntime - web.ctx.session.otime),2)
networkInfo['downPackets'] = networkIo[3]
networkInfo['upPackets'] = networkIo[2]
# web.ctx.session.up = networkIo[0]
# web.ctx.session.down = networkIo[1]
# web.ctx.session.otime = ntime;
# networkInfo['cpu'] = self.GetCpuInfo()
# networkInfo['load'] = self.GetLoadAverage(get);
return jsonify(networkInfo)

@ -0,0 +1,17 @@
# coding:utf-8
from flask import Flask
from flask import Blueprint, render_template
database = Blueprint('database', __name__, template_folder='templates')
@database.route("/")
def index():
return render_template('default/database.html')
@database.route("/count")
def count():
return "0"

@ -8,11 +8,10 @@ import psutil
import time
import sys
import os
import json
sys.path.append("class/")
import public
import json
plugins = Blueprint('plugins', __name__, template_folder='templates')
@ -96,3 +95,25 @@ def install():
@plugins.route('/uninstall', methods=['POST'])
def uninstall():
pass
@plugins.route('/installed', methods=['POST'])
def installed():
rundir = public.getRunDir()
name = request.form.get('name', '')
if name.strip() == '':
return public.retJson(-1, "缺少name数据!", ())
infoJsonPos = __plugin_name + '/' + name + '/' + 'info.json'
if not os.path.exists(infoJsonPos):
return public.retJson(-1, "info.json数据不存在!", ())
pluginInfo = json.loads(public.readFile(infoJsonPos))
sh = __plugin_name + '/' + name + '/' + pluginInfo['shell']
os.system('/bin/bash ' + sh + ' install')
print request.args
return ''

@ -1,11 +1,17 @@
# coding:utf-8
from flask import Flask
from flask import Blueprint,render_template
from flask import Blueprint, render_template
site = Blueprint('site', __name__, template_folder='templates')
@site.route("/")
def index():
return render_template('default/site.html')
return render_template('default/site.html')
# @site.route("/list")
# def list():
# SQL = public.M('site')

@ -0,0 +1,159 @@
# coding:utf-8
import time
import psutil
import os
import sys
from flask import Flask, session
from flask import Blueprint, render_template
from flask import jsonify
sys.path.append("class/")
import public
system = Blueprint('system', __name__, template_folder='templates')
def GetCpuInfo(interval=1):
# 取CPU信息
cpuCount = psutil.cpu_count()
used = psutil.cpu_percent(interval=interval)
return used, cpuCount
def GetLoadAverage():
c = os.getloadavg()
data = {}
data['one'] = float(c[0])
data['five'] = float(c[1])
data['fifteen'] = float(c[2])
data['max'] = psutil.cpu_count() * 2
data['limit'] = data['max']
data['safe'] = data['max'] * 0.75
return data
def GetMemInfo():
# 取内存信息
mem = psutil.virtual_memory()
memInfo = {'memTotal': mem.total / 1024 / 1024,
'memFree': mem.free / 1024 / 1024,
# 'memBuffers': mem.buffers / 1024 / 1024,
# 'memCached': mem.cached / 1024 / 1024
}
memInfo['memRealUsed'] = memInfo['memTotal'] - \
memInfo['memFree']
#- memInfo['memBuffers'] - memInfo['memCached']
return memInfo
def GetBootTime():
conf = public.readFile('/proc/uptime').split()
tStr = float(conf[0])
min = tStr / 60
hours = min / 60
days = math.floor(hours / 24)
hours = math.floor(hours - (days * 24))
min = math.floor(min - (days * 60 * 24) - (hours * 60))
return public.getMsg('SYS_BOOT_TIME', (str(int(days)), str(int(hours)), str(int(min))))
def GetSystemVersion():
# 取操作系统版本
version = public.readFile('/etc/redhat-release')
if not version:
version = public.readFile(
'/etc/issue').strip().split("\n")[0].replace('\\n', '').replace('\l', '').strip()
else:
version = version.replace('release ', '').strip()
return version
@system.route("/network")
def network():
# 取网络流量信息
networkIo = psutil.net_io_counters()[:4]
if not hasattr(session, 'otime'):
session['up'] = networkIo[0]
session['down'] = networkIo[1]
session['otime'] = time.time()
ntime = time.time()
networkInfo = {}
networkInfo['upTotal'] = networkIo[0]
networkInfo['downTotal'] = networkIo[1]
networkInfo['up'] = round(float(
networkIo[0] - session['up']) / 1024 / (ntime - session['otime']), 2)
networkInfo['down'] = round(
float(networkIo[1] - session['down']) / 1024 / (ntime - session['otime']), 2)
networkInfo['downPackets'] = networkIo[3]
networkInfo['upPackets'] = networkIo[2]
session['up'] = networkIo[0]
session['down'] = networkIo[1]
session['otime'] = time.time()
networkInfo['cpu'] = GetCpuInfo()
networkInfo['load'] = GetLoadAverage()
return jsonify(networkInfo)
@system.route("/diskinfo")
def diskinfo():
# 取磁盘分区信息
temp = public.ExecShell("df -h -P|grep '/'|grep -v tmpfs")[0]
tempInodes = public.ExecShell("df -i -P|grep '/'|grep -v tmpfs")[0]
temp1 = temp.split('\n')
tempInodes1 = tempInodes.split('\n')
diskInfo = []
n = 0
cuts = ['/mnt/cdrom', '/boot', '/boot/efi', '/dev',
'/dev/shm', '/run/lock', '/run', '/run/shm', '/run/user']
for tmp in temp1:
n += 1
inodes = tempInodes1[n - 1].split()
disk = tmp.split()
if len(disk) < 5:
continue
if disk[1].find('M') != -1:
continue
if disk[1].find('K') != -1:
continue
if len(disk[5].split('/')) > 4:
continue
if disk[5] in cuts:
continue
arr = {}
arr['path'] = disk[5]
tmp1 = [disk[1], disk[2], disk[3], disk[4]]
arr['size'] = tmp1
arr['inodes'] = [inodes[1], inodes[2], inodes[3], inodes[4]]
if disk[5] == '/':
bootLog = '/tmp/panelBoot.pl'
if disk[2].find('M') != -1:
if os.path.exists(bootLog):
os.system('rm -f ' + bootLog)
else:
pass
if not os.path.exists(bootLog):
os.system('sleep 1 &')
# print arr
diskInfo.append(arr)
return jsonify(diskInfo)
@system.route("/systemtotal")
def systemtotal():
# 取系统统计信息
data = GetMemInfo()
cpu = GetCpuInfo(1)
data['cpuNum'] = cpu[1]
data['cpuRealUsed'] = cpu[0]
# data['time'] = GetBootTime()
# data['system'] = GetSystemVersion()
data['isuser'] = public.M('users').where('username=?', ('admin',)).count()
data['version'] = '0.0.1'
return jsonify(data)
Loading…
Cancel
Save