pull/109/head
Mr Chen 6 years ago
parent c2bd1d5dfa
commit 1dc91d8aba
  1. 127
      class/core/firewall_api.py
  2. 2
      class/core/site_api.py
  3. 19
      plugins/qbittorrent/workers/qbittorrent_worker.py
  4. 13
      route/static/app/files.js
  5. 23
      route/static/app/firewall.js
  6. 19
      route/templates/default/crontab.html
  7. 8
      route/templates/default/firewall.html

@ -14,10 +14,135 @@ from flask import request
class firewall_api:
__isFirewalld = False
__isUfw = False
def __init__(self):
pass
if os.path.exists('/usr/sbin/firewalld'):
self.__isFirewalld = True
if os.path.exists('/usr/sbin/ufw'):
self.__isUfw = True
def firewallReload(self):
if self.__isUfw:
public.execShell('/usr/sbin/ufw reload')
return
if self.__isFirewalld:
public.execShell('firewall-cmd --reload')
else:
public.execShell('/etc/init.d/iptables save')
public.execShell('/etc/init.d/iptables restart')
##### ----- start ----- ###
# 添加屏蔽IP
def addDropAddressApi(self):
import re
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
rep = "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$"
if not re.search(rep, port):
return public.returnJson(False, 'FIREWALL_IP_FORMAT')
address = port
if public.M('firewall').where("port=?", (address,)).count() > 0:
return public.returnJson(False, 'FIREWALL_IP_EXISTS')
if self.__isUfw:
public.ExecShell('ufw deny from ' + address + ' to any')
else:
if self.__isFirewalld:
public.ExecShell(
'firewall-cmd --permanent --add-rich-rule=\'rule family=ipv4 source address="' + address + '" drop\'')
else:
public.ExecShell('iptables -I INPUT -s ' +
address + ' -j DROP')
public.writeLog("TYPE_FIREWALL", 'FIREWALL_DROP_IP', (address,))
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
public.M('firewall').add('port,ps,addtime', (address, ps, addtime))
self.firewallReload()
return public.returnJson(True, 'ADD_SUCCESS')
# 删除IP屏蔽
def delDropAddressApi(self):
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
sid = request.form.get('id', '').strip()
address = port
if self.__isUfw:
public.execShell('ufw delete deny from ' + address + ' to any')
else:
if self.__isFirewalld:
public.execShell(
'firewall-cmd --permanent --remove-rich-rule=\'rule family=ipv4 source address="' + address + '" drop\'')
else:
public.execShell('iptables -D INPUT -s ' +
address + ' -j DROP')
public.writeLog("TYPE_FIREWALL", 'FIREWALL_ACCEPT_IP', (address,))
public.M('firewall').where("id=?", (sid,)).delete()
self.firewallReload()
return public.returnJson(True, 'DEL_SUCCESS')
# 添加放行端口
def addAcceptPort(self):
import re
import time
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
sid = request.form.get('id', '').strip()
rep = "^\d{1,5}(:\d{1,5})?$"
if not re.search(rep, port):
return public.returnJson(False, 'PORT_CHECK_RANGE')
if public.M('firewall').where("port=?", (port,)).count() > 0:
return public.returnJson(False, 'FIREWALL_PORT_EXISTS')
if self.__isUfw:
public.execShell('ufw allow ' + port + '/tcp')
else:
if self.__isFirewalld:
# self.__Obj.AddAcceptPort(port)
port = port.replace(':', '-')
public.execShell(
'firewall-cmd --permanent --zone=public --add-port=' + port + '/tcp')
else:
public.execShell(
'iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
public.writeLog("TYPE_FIREWALL", 'FIREWALL_ACCEPT_PORT', (port,))
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
public.M('firewall').add('port,ps,addtime', (port, ps, addtime))
self.firewallReload()
return public.returnJson(True, 'ADD_SUCCESS')
# 删除放行端口
def delAcceptPort(self, get):
port = request.form.get('port', '').strip()
sid = request.form.get('id', '').strip()
try:
if(port == web.ctx.host.split(':')[1]):
return public.returnJson(False, 'FIREWALL_PORT_PANEL')
if self.__isUfw:
public.execShell('ufw delete allow ' + port + '/tcp')
else:
if self.__isFirewalld:
public.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/tcp')
public.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/udp')
else:
public.execShell(
'iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
public.writeLog("TYPE_FIREWALL", 'FIREWALL_DROP_PORT', (port,))
public.M('firewall').where("id=?", (sid,)).delete()
self.firewallReload()
return public.returnJson(True, 'DEL_SUCCESS')
except:
return public.returnJson(False, 'DEL_ERROR')
def getWwwPathApi(self):
path = public.getLogsDir()
return public.getJson({'path': path})

@ -486,7 +486,7 @@ class site_api:
data = {}
data['siteStatus'] = False
public.restartWeb()
return public.getJson(data)
return public.returnJson(True, '添加成功')
def deleteWSLogs(self, webname):
assLogPath = public.getLogsDir() + '/' + webname + '.log'

@ -211,11 +211,27 @@ class downloadBT(Thread):
os.system(cmd_m3u8)
self.execShell('chown -R ' + FILE_OWN + ':' +
FILE_GROUP + ' ' + m3u8_dir)
print self.query("insert into pl_download_list (`info_hash`) values('1221')")
self.add_hash()
else:
print self.debug('m3u8 exists:' + tofile)
# self.unlock(md5file)
def add_hash(self):
ct = formatTime()
print self.sign_torrent
total_size = str(self.sign_torrent['total_size'])
shash = self.sign_torrent['hash']
sname = self.sign_torrent['name']
sql = "select id from pl_hash_list where info_hash='" + shash + "'"
info = self.query(sql)
if len(info[0]) > 0:
sid = str(info[0][0])
print self.query("insert into pl_hash_file (`pid`,`name`,`m3u8`,`length`,`create_time`) values('" + sid + "','" + sname + "','" + 'dd' + "','" + total_size + "','" + ct + "')")
else:
print self.query("insert into pl_hash_list (`name`,`info_hash`,`data_hash`,`length`,`create_time`) values('" + sname + "','" + shash + "','da12','" + total_size + "','" + ct + "')")
def file_arr(self, path, filters=['.DS_Store']):
file_list = []
flist = os.listdir(path)
@ -271,6 +287,7 @@ class downloadBT(Thread):
print "completed torrents count:", tlen
if tlen > 0:
for torrent in torrents:
self.sign_torrent = torrent
# print torrent
path = torrent['save_path'] + torrent['name']
try:

@ -449,7 +449,7 @@ function getFiles(Path) {
</div>";
}
}
var dirInfo = '('+lan.files.get_size.replace('{1}',rdata.DIR.length+'').replace('{2}',rdata.DIR.length+'')+'<font id="pathSize">'+(toSize(totalSize))+'<a class="btlink ml5" onClick="GetPathSize()">'+lan.files.get+'</a></font>)';
var dirInfo = '('+lan.files.get_size.replace('{1}',rdata.DIR.length+'').replace('{2}',rdata.DIR.length+'')+'<font id="pathSize">'+(toSize(totalSize))+'<a class="btlink ml5" onClick="getPathSize()">获取</a></font>)';
$("#DirInfo").html(dirInfo);
if(getCookie("rank")=="a"){
var tablehtml = '<table width="100%" border="0" cellpadding="0" cellspacing="0" class="table table-hover">\
@ -1533,14 +1533,15 @@ function RClickAll(e){
.show();
}
//取目录大小
function GetPathSize(){
function getPathSize(){
var path = encodeURIComponent($("#DirPathPlace input").val());
layer.msg("正在计算,请稍候",{icon:16,time:0,shade: [0.3, '#000']})
$.post("/files?action=GetDirSize","path="+path,function(rdata){
layer.msg("正在计算,请稍候...",{icon:16,time:0,shade: [0.3, '#000']})
$.post("/files/get_dir_size","path="+path,function(rdata){
layer.closeAll();
$("#pathSize").text(rdata)
})
$("#pathSize").text(rdata.msg);
},'json');
}
$("body").not(".def-log").click(function(){
$("#rmenu").hide()
});

@ -215,7 +215,7 @@ function showAccept(page,search) {
}
//添加放行
function AddAcceptPort(){
function addAcceptPort(){
var type = $("#firewalldType").val();
var port = $("#AcceptPort").val();
var ps = $("#Ps").val();
@ -224,7 +224,7 @@ function AddAcceptPort(){
ports = port.split(':');
for(var i=0;i<ports.length;i++){
if(isNaN(ports[i]) || ports[i] < 1 || ports[i] > 65535 ){
layer.msg(lan.firewall.port_err,{icon:5});
layer.msg('端口范围不合法!',{icon:5});
return;
}
}
@ -233,11 +233,11 @@ function AddAcceptPort(){
if(ps.length < 1){
layer.msg(lan.firewall.ps_err,{icon:2});
layer.msg('备注/说明 不能为空!',{icon:2});
$("#Ps").focus();
return;
}
var loadT = layer.msg(lan.public.the_add,{icon:16,time:0,shade: [0.3, '#000']})
var loadT = layer.msg('正在添加,请稍候...',{icon:16,time:0,shade: [0.3, '#000']})
$.post('/firewall?action='+action,'port='+port+"&ps="+ps+'&type='+type,function(rdata){
layer.close(loadT);
if(rdata.status == true || rdata.status == 'true'){
@ -249,10 +249,9 @@ function AddAcceptPort(){
layer.msg(rdata.msg,{icon:2});
}
$("#AcceptPort").attr('value',"");
$("#Ps").attr('value',"");
})
$("#AcceptPort").attr('value','');
$("#Ps").attr('value','');
},'json');
}
//删除放行
@ -262,8 +261,8 @@ function delAcceptPort(id, port) {
action = "DelAcceptPort";
}
layer.confirm(lan.get('confirm_del',[port]), {title: lan.firewall.del_title,closeBtn:2}, function(index) {
var loadT = layer.msg(lan.public.the_del,{icon:16,time:0,shade: [0.3, '#000']})
layer.confirm(lan.get('confirm_del',[port]), {title: '删除防火墙规则',closeBtn:2}, function(index) {
var loadT = layer.msg('正在删除,请稍候...',{icon:16,time:0,shade: [0.3, '#000']})
$.post("/firewall?action="+action,"id=" + id + "&port=" + port, function(ret) {
layer.close(loadT);
layer.msg(ret.msg,{icon:ret.status?1:2})
@ -298,8 +297,8 @@ function getLogs(page,search) {
//清理面板日志
function delLogs(){
layer.confirm(lan.firewall.close_log_msg,{title:lan.firewall.close_log,closeBtn:2},function(){
var loadT = layer.msg(lan.firewall.close_the,{icon:16});
layer.confirm('即将清空面板日志,继续吗?',{title:'清空日志',closeBtn:2},function(){
var loadT = layer.msg('正在清理,请稍候...',{icon:16});
$.post('/ajax?action=delClose','',function(rdata){
layer.close(loadT);
layer.msg(rdata.msg,{icon:rdata.status?1:2});

@ -22,15 +22,11 @@
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="excode">
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="toShell">Shell脚本</a>
</li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="site">备份网站</a>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="logs">日志切割</a>
</li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="rememory">释放内存</a>
</li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="toUrl">访问URL</a>
</li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="toShell">Shell脚本</a></li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="site">备份网站</a></li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="logs">日志切割</a></li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="rememory">释放内存</a></li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="toUrl">访问URL</a></li>
</ul>
</div>
<span class="planSign"><i>*</i>任务类型包含以下部分:Shell脚本、备份网站、日志切割、释放内存、访问URL</span>
@ -58,7 +54,10 @@
</div>
<div id="ptime" class="pull-left">
<div class="dropdown planweek pull-left mr20">
<button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown"><b val="1">周一</b> <span class="caret"></span></button>
<button class="btn btn-default dropdown-toggle" type="button" id="excode" data-toggle="dropdown">
<b val="1">周一</b>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="excode">
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="1">周一</a></li>
<li><a role="menuitem" tabindex="-1" href="javascript:;" value="2">周二</a></li>

@ -92,12 +92,14 @@
<select id="firewalldType" class="bt-input-text c5 mr5" name="type" style="width:80px;">
<option value="port">放行端口</option>
<option value="address">屏蔽</option>
</select><input type="text" class="bt-input-text mr5" style="width: 117px;" id="AcceptPort" placeholder="端口"><input type="text" class="bt-input-text mr5" id="Ps" placeholder="备注/说明"><button id="toAccept" onclick="firewall.add_accept_port()" class="btn btn-default btn-sm va0" type="button">放行</button>
</select>
<input type="text" class="bt-input-text mr5" style="width: 117px;" id="AcceptPort" placeholder="端口">
<input type="text" class="bt-input-text mr5" id="Ps" placeholder="备注/说明">
<button id="toAccept" onclick="addAcceptPort();" class="btn btn-default btn-sm va0" type="button">放行</button>
<span id="f-ps" class="c9" style="margin-left: 10px;">说明: 支持放行端口范围,如: 3000:3500</span>
</div>
<div class="tablescroll">
<table id="firewallBody" class="table table-hover" style="min-width: 640px;border: 0 none;">
</table>
<table id="firewallBody" class="table table-hover" style="min-width: 640px;border: 0 none;"></table>
</div>
<div id="firewallPage" class="dataTables_paginate paging_bootstrap page firewallBody" style="margin-bottom:0">
</div>

Loading…
Cancel
Save