pull/632/head
Mr Chen 5 months ago
parent 5588976f95
commit c91928c55f
  1. 0
      version/r3.6.txt
  2. 0
      version/r3.7.txt
  3. 3
      web/admin/task/__init__.py
  4. 13
      web/admin/user_login_check.py
  5. 87
      web/misc/test/api/mw_api.php
  6. 57
      web/misc/test/api/mw_api.py
  7. 94
      web/misc/version/api/mw_api.php
  8. 125
      web/misc/version/api/mw_api.py
  9. 22
      web/misc/version/info.json
  10. 23
      web/static/app/public.js
  11. 3
      web/thisdb/app.py

@ -26,8 +26,7 @@ blueprint = Blueprint('task', __name__, url_prefix='/task', template_folder='../
@blueprint.route('/count', endpoint='task_count')
@panel_login_required
def task_count():
return str(thisdb.getTaskUnexecutedCount())
return mw.returnData(True, 'ok',thisdb.getTaskUnexecutedCount())
@blueprint.route('/list', endpoint='list', methods=['POST'])
@panel_login_required

@ -11,6 +11,7 @@
from flask import render_template
from flask import Response
from flask import request
from functools import wraps
@ -23,6 +24,18 @@ def panel_login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 面板API调用检查
app_id = request.headers.get('App-Id','')
app_secret = request.headers.get('App-Secret','')
if app_id != '' and app_secret != '':
panel_api = thisdb.getOptionByJson('panel_api', default={"open":True})
if panel_api['open']:
return_code = 404
info = thisdb.getAppByAppId(app_id)
if app_secret != info['app_secret']:
return Response(status=int(return_code))
return func(*args, **kwargs)
if not isLogined():
unauthorized_status = thisdb.getOption('unauthorized_status')
if unauthorized_status == '0':

@ -0,0 +1,87 @@
<?php
/**
* MW API接口示例Demo
* 仅供参考,请根据实际项目需求开发,并做好安全处理
* date 2022-11-28
* author midoks
*/
class mwApi {
private $MW_PANEL = "http://127.0.0.1:64307"; //面板地址
private $MW_APP_ID = 'hC6XArWzRY';
private $MW_APP_SERECT = 'NSGaFhMWyaN5Yi3ftTkZ';
//如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
public function __construct($mw_panel = null, $app_id = null, $app_secret = null) {
if ($mw_panel) {
$this->MW_PANEL = $mw_panel;
}
if ($app_id) {
$this->MW_APP_ID = $app_id;
}
if ($app_secret) {
$this->MW_APP_SERECT = $app_secret;
}
}
/**
* 发起POST请求
* @param String $url 目标网填,带http://
* @param Array|String $data 欲提交的数据
* @return string
*/
private function httpPost($url, $data, $timeout = 60) {
$ch = curl_init();
// 设置头部信息
$headers = [
'app-id: ' . $this->MW_APP_ID,
'app-secret: ' . $this->MW_APP_SERECT,
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
public function panel($endpoint, $data) {
$url = $this->MW_PANEL . $endpoint;
return $this->httpPost($url, $data);
}
//示例取面板日志
public function getLogsList() {
$post_data['p'] = '1';
$post_data['limit'] = 10;
//请求面板接口
$data = $this->panel('/logs/get_log_list', $post_data);
//解析JSON数据
// $data = json_decode($result, true);
return $data;
}
}
//实例化对象
$api = new mwApi();
//获取面板日志
$rdata = $api->getLogsList();
// var_dump($rdata);
//输出JSON数据到浏览器
echo json_encode($rdata);
?>

@ -0,0 +1,57 @@
# coding: utf-8
# +-----------------------------------------------------------------------------------
# | MW Linux面板
# +-----------------------------------------------------------------------------------
# | Copyright (c) 2015-2099 MW(http://github.com/midoks/mdserver) All rights reserved.
# +-----------------------------------------------------------------------------------
# | Author: midoks
# +-----------------------------------------------------------------------------------
#------------------------------
# API-Demo of Python
#------------------------------
import time
import hashlib
import sys
import os
import json
class mwApi:
__MW_PANEL = 'http://127.0.0.1:64307'
__MW_APP_ID = 'hC6XArWzRY'
__MW_APP_SERECT = 'NSGaFhMWyaN5Yi3ftTkZ'
# 如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
def __init__(self, panel_url=None, app_id=None, app_serect=None):
if panel_url:
self.__MW_PANEL = panel_url
self.__MW_APP_ID = app_id
self.__MW_APP_SERECT = app_serect
def post(self, endpoint, request_data):
import requests
url = self.__MW_PANEL + endpoint
post_data = requests.post(url, data=request_data, headers={
'app-id':self.__MW_APP_ID,
'app-secret':self.__MW_APP_SERECT
})
try:
return post_data.json()
except Exception as e:
return post_data.text
# 取面板日志
def getLogs(self):
result = self.post('/logs/get_log_list',{'limit':10,'p':1})
return result
if __name__ == '__main__':
# 实例化MW-API对象
api = mwApi()
# 调用get_logs方法
rdata = api.getLogs()
# 打印响应数据
print(rdata)

@ -1,94 +0,0 @@
<?php
/**
* MW API接口示例Demo
* 仅供参考,请根据实际项目需求开发,并做好安全处理
* date 2022-11-28
* author midoks
*/
class mwApi {
private $MW_KEY = "j7GQhzNcBV4KU9QKYPXvtjSzCcmfkc0e"; //接口密钥
private $MW_PANEL = "http://127.0.0.1:7200"; //面板地址
//如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
public function __construct($mw_panel = null, $mw_key = null) {
if ($mw_panel) {
$this->MW_PANEL = $mw_panel;
}
if ($mw_key) {
$this->MW_KEY = $mw_key;
}
}
/**
* 发起POST请求
* @param String $url 目标网填,带http://
* @param Array|String $data 欲提交的数据
* @return string
*/
private function httpPostCookie($url, $data, $timeout = 60) {
//定义cookie保存位置
$cookie_file = './' . md5($this->MW_PANEL) . '.cookie';
if (!file_exists($cookie_file)) {
$fp = fopen($cookie_file, 'w+');
fclose($fp);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
/**
* 构造带有签名的关联数组
*/
private function getKeyData() {
$now_time = time();
$ready_data = array(
'request_token' => md5($now_time . '' . md5($this->MW_KEY)),
'request_time' => $now_time,
);
return $ready_data;
}
//示例取面板日志
public function getLogsList() {
//拼接URL地址
$url = $this->MW_PANEL . '/api/firewall/get_log_list';
//准备POST数据
$post_data = $this->getKeyData(); //取签名
$post_data['p'] = '1';
$post_data['limit'] = 10;
//请求面板接口
$result = $this->httpPostCookie($url, $post_data);
//解析JSON数据
$data = json_decode($result, true);
return $data;
}
}
//实例化对象
$api = new mwApi();
//获取面板日志
$rdata = $api->getLogsList();
// var_dump($rdata);
//输出JSON数据到浏览器
echo json_encode($rdata);
?>

@ -1,125 +0,0 @@
# coding: utf-8
# +-----------------------------------------------------------------------------------
# | MW Linux面板
# +-----------------------------------------------------------------------------------
# | Copyright (c) 2015-2099 MW(http://github.com/midoks/mdserver) All rights reserved.
# +-----------------------------------------------------------------------------------
# | Author: midoks
# +-----------------------------------------------------------------------------------
#------------------------------
# API-Demo of Python
#------------------------------
import time
import hashlib
import sys
import os
import json
class mwApi:
__MW_KEY = 'uATE5NrKDWIlZuDcYpvLVhoUo1c7A1Pk'
__MW_PANEL = 'http://127.0.0.1:7200'
# 如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
def __init__(self, mw_panel=None, mw_key=None):
if mw_panel:
self.__MW_PANEL = mw_panel
self.__MW_KEY = mw_key
# 计算MD5
def __get_md5(self, s):
m = hashlib.md5()
m.update(s.encode('utf-8'))
return m.hexdigest()
# 构造带有签名的关联数组
def __get_key_data(self):
now_time = int(time.time())
ready_data = {
'request_token': self.__get_md5(str(now_time) + '' + self.__get_md5(self.__MW_KEY)),
'request_time': now_time
}
return ready_data
# 发送POST请求并保存Cookie
#@url 被请求的URL地址(必需)
#@data POST参数,可以是字符串或字典(必需)
#@timeout 超时时间默认1800秒
# return string
def __http_post_cookie(self, url, p_data, timeout=1800):
cookie_file = '/tmp/' + self.__get_md5(self.__MW_PANEL) + '.cookie'
if sys.version_info[0] == 2:
# Python2
import urllib
import urllib2
import ssl
import cookielib
# 创建cookie对象
cookie_obj = cookielib.MozillaCookieJar(cookie_file)
# 加载已保存的cookie
if os.path.exists(cookie_file):
cookie_obj.load(cookie_file, ignore_discard=True,
ignore_expires=True)
ssl._create_default_https_context = ssl._create_unverified_context
data = urllib.urlencode(p_data)
req = urllib2.Request(url, data)
opener = urllib2.build_opener(
urllib2.HTTPCookieProcessor(cookie_obj))
response = opener.open(req, timeout=timeout)
# 保存cookie
cookie_obj.save(ignore_discard=True, ignore_expires=True)
return response.read()
else:
# Python3
import urllib.request
import ssl
import http.cookiejar
cookie_obj = http.cookiejar.MozillaCookieJar(cookie_file)
# 加载已保存的cookie
if os.path.exists(cookie_file):
cookie_obj.load(cookie_file, ignore_discard=True,
ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie_obj)
data = urllib.parse.urlencode(p_data).encode('utf-8')
req = urllib.request.Request(url, data)
opener = urllib.request.build_opener(handler)
response = opener.open(req, timeout=timeout)
cookie_obj.save(ignore_discard=True, ignore_expires=True)
result = response.read()
if type(result) == bytes:
result = result.decode('utf-8')
return result
# 取面板日志
def getLogs(self):
# 拼接URL地址
url = self.__MW_PANEL + '/api/logs/get_log_list'
# 准备POST数据
post_data = self.__get_key_data() # 取签名
post_data['limit'] = 10
post_data['p'] = '1'
# 请求面板接口
result = self.__http_post_cookie(url, post_data)
# 解析JSON数据
return json.loads(result)
if __name__ == '__main__':
# 实例化MW-API对象
api = mwApi()
# 调用get_logs方法
rdata = api.getLogs()
# 打印响应数据
print(rdata)

@ -1,22 +0,0 @@
[
{
"version": "0.9.9",
"content": "* 目标版本。",
},
{
"version": "0.9.2",
"content": "* 批量域名添加修复。<br/> * 常用命令说明。",
"path": "https://github.com/midoks/mdserver-web/releases/download/0.9.2/mdserver-web.zip"
},
{
"version": "0.9.1",
"content": "* 菜单修复。<br/> * 更新修复",
"path": "https://github.com/midoks/mdserver-web/releases/download/0.9.1/mdserver-web.zip",
"purge":"https://purge.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/update.sh"
},
{
"version": "0.9.0",
"content": "* 主流系统支持。<br/> * 插件支持更多参数。<br/>* MySQL主从支持GTID和经典模式。<br/>* MariaDB主从支持GTID和经典模式。<br/>* Rsyncd更新。<br/>* 添加网站统计的插件。<br/>* 添加varnish插件。",
"path": "https://github.com/midoks/mdserver-web/releases/download/0.9.0/mdserver-web.zip"
}
]

@ -940,9 +940,9 @@ function removeTask(b) {
//获取任务总数
function getTaskCount() {
$.get("/task/count", "", function(a) {
$(".task").text(a);
});
$.get("/task/count", '', function(data) {
$(".task").text(data.data);
},'json');
}
getTaskCount();
setInterval(function(){
@ -1342,7 +1342,6 @@ function remind(a){
$.post("/task/list", "table=tasks&result=2,4,6,8&limit=10&p=" + a, function(g) {
var e = '';
var f = false;
var task_count = 0;
for(var d = 0; d < g.data.length; d++) {
var status = g.data[d].status;
var status_text = '已经完成';
@ -1387,12 +1386,10 @@ function remind(a){
</div>\
<div id="taskPage" class="page"></div>\
</div>';
$(".taskcon").html(con);
$(".task_count").text(task_count);
$(".msg_count").text(g.count);
$(".taskcon").html(con);
$("#taskPage").html(g.page);
$("#Rs-checkAll").click(function(){
if($(this).prop("checked")){
$("#remind").find("input").prop("checked",true);
@ -1427,17 +1424,15 @@ function getReloads() {
$(".cmdlist").html('当前没有任务!');
return;
}
var b = "";
var d = "";
$("#task").text(h.count);
$(".task_count").text(h.task.length);
var b = '';
var d = '';
for(var g = 0; g < h.task.length; g++) {
if(h.task[g].status == "-1") {
if(h.task[g].type != "download") {
var c = "";
var f = h.msg.split("\n");
for(var e = 0; e < f.length; e++) {
c += f[e] + "<br>"
c += f[e] + "<br>";
}
if(h.task[g].name.indexOf("扫描") != -1) {
b = "<li>\
@ -1465,6 +1460,8 @@ function getReloads() {
d += "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>等待 | <a style='color:green' href=\"javascript:removeTask(" + h.task[g].id + ')">删除</a></span></li>'
}
}
$("#task").text(h.count);
$(".task_count").text(h.count);
$(".cmdlist").html(b + d);
$(".cmd").html(c);
try{
@ -1530,7 +1527,7 @@ function tasklist(a){
}
$(".task_count").text(g.count);
// $(".task_count").text(g.count);
$(".cmdlist").html(b + c);
getReloads();
return f

@ -40,6 +40,9 @@ def getAppList(page=1,size=10):
def getAppById(aid):
return mw.M('app').field(__FIELD).where("id=?", (aid,)).find()
def getAppByAppId(app_id):
return mw.M('app').field(__FIELD).where("app_id=?", (app_id,)).find()
def deleteAppById(aid):
return mw.M('app').where("id=?", (aid,)).delete()

Loading…
Cancel
Save