Initial YakPanel commit

This commit is contained in:
Niranjan
2026-04-07 02:04:22 +05:30
commit 2826d3e7f3
5359 changed files with 1390724 additions and 0 deletions

View File

View File

@@ -0,0 +1,69 @@
# coding: utf-8
# -------------------------------------------------------------------
# yakpanel
# -------------------------------------------------------------------
# Copyright (c) 2015-2017 yakpanel(https://www.yakpanel.com) All rights reserved.
# -------------------------------------------------------------------
# Author: baozi <baozi@yakpanel.com>
# -------------------------------------------------------------------
# 新告警通道管理模块
# ------------------------------
from mod.base.msg import SenderManager, update_mod_push_msg
from mod.base.push_mod import SenderConfig
from mod.base import json_response
import public
update_mod_push_msg()
class main(SenderManager):
@staticmethod
def wx_account_auth(get=None):
return WeChatAccountMsg.get_auth_url()
@staticmethod
def unbind_wx_account(get):
try:
sender_id = get.sender_id.strip()
except AttributeError:
return json_response(status=False, msg="Parameter error")
conf = SenderConfig().get_by_id(sender_id)
if not conf:
return json_response(status=False, msg="No binding information was found")
res = WeChatAccountMsg.unbind(conf["data"]["id"])
public.WriteFile(WeChatAccountMsg.need_refresh_file, "")
return res
def set_default_sender(self, get):
try:
try:
sender_id = get.sender_id.strip()
sender_type = get.sender_type.strip()
except AttributeError:
return json_response(status=False, msg="Parameter error")
sc = SenderConfig()
change = False
print("SenderConfig",sc.config)
for conf in sc.config:
if conf["sender_type"] == sender_type:
is_original = conf.get("original", False)
if conf["id"] == sender_id:
change = True
conf["original"] = True
else:
conf["original"] = False
sc.save_config()
if change:
self.set_default_for_compatible(sc.get_by_id(sender_id))
return json_response(status=True, msg="Successfully set")
except Exception as e:
return json_response(status=False, msg=e)

258
mod/project/push/taskMod.py Normal file
View File

@@ -0,0 +1,258 @@
# coding: utf-8
# -------------------------------------------------------------------
# yakpanel
# -------------------------------------------------------------------
# Copyright (c) 2015-2017 yakpanel(https://www.yakpanel.com) All rights reserved.
# -------------------------------------------------------------------
# Author: baozi <baozi@yakpanel.com>
# -------------------------------------------------------------------
# 新告警通道管理模块
# ------------------------------
import json
import os
import sys
if "/www/server/panel/class" not in sys.path:
sys.path.insert(0, "/www/server/panel/class")
import public
from mod.base import json_response
from mod.base.push_mod import PushManager, TaskConfig, TaskRecordConfig, TaskTemplateConfig, PushSystem
from mod.base.push_mod import update_mod_push_system, UPDATE_MOD_PUSH_FILE, load_task_template_by_file, \
UPDATE_VERSION_FILE
from mod.base.msg import update_mod_push_msg
from mod.base.push_mod.rsync_push import load_rsync_template
from mod.base.push_mod.task_manager_push import load_task_manager_template
from mod.base.push_mod.load_push import load_load_template
def update_mod():
# todo 缺少移除弃用模板的操作
template_ver = "8"
try:
with open(UPDATE_VERSION_FILE, 'r') as f:
if f.read() == template_ver:
pl = False
else:
pl = True
except:
pl = True
if pl:
# 更新标志pl存在时, 只强制更新以下模板的最新配置, 其他不更新
load_task_template_by_file("/www/server/panel/mod/base/push_mod/site_push_template.json")
load_task_template_by_file("/www/server/panel/mod/base/push_mod/system_push_template.json")
load_task_template_by_file("/www/server/panel/mod/base/push_mod/database_push_template.json")
load_task_template_by_file("/www/server/panel/mod/base/push_mod/domain_blcheck_push_template.json")
with open(UPDATE_VERSION_FILE, "w") as f:
f.write(template_ver)
if not os.path.exists(UPDATE_MOD_PUSH_FILE):
update_mod_push_msg()
load_rsync_template()
load_task_manager_template()
load_load_template()
update_mod_push_system()
update_mod()
del update_mod
class main(PushManager):
def get_task_list(self, get=None):
# 通道类型映射,包含模糊匹配规则
channel_map = {
# "wx_account": "wx_account",
"mail": "mail",
"webhook": "webhook",
"feishu": "feishu",
"dingding": "dingding",
# "短信": "sms",
"tg": "tg"
}
try:
if get:
# get["status"] = "false"
# get["keyword"] = "shylock"
# 获取状态和关键词参数
status_filter = get.get("status", None)
keyword_filter = get.get("keyword", None)
else:
status_filter = ""
keyword_filter =""
res = TaskConfig().config
# 按创建时间排序
res.sort(key=lambda x: x["create_time"])
# 读取发送者信息
sender_info = self.get_sender_info()
# 根据状态过滤任务
if status_filter:
res = [task for task in res if str(task["status"]).lower() == status_filter.lower()]
# 根据关键词过滤任务
if keyword_filter:
keyword_filter_lower = keyword_filter.lower()
filtered_res = []
for task in res:
# print("task",task)
task_match = False
if keyword_filter_lower=="Alert when the panel is logged in":
if task['keyword']=="panel_login":
task_match = True
if keyword_filter_lower in task["title"].lower() or \
(task["task_data"].get("title") and keyword_filter_lower in task["task_data"]["title"].lower()) or \
(task["time_rule"].get("send_interval") and keyword_filter_lower in str(task["time_rule"]["send_interval"])) or \
(task["number_rule"].get("day_num") and keyword_filter_lower in str(task["number_rule"]["day_num"])):
task_match = True
else:
for sender_id in task["sender"]:
sender = sender_info.get(sender_id, {})
sender_title = sender.get("data", {}).get("title", "").lower()
sender_type = sender.get("sender_type", "").lower()
if keyword_filter_lower in sender_title or \
keyword_filter_lower in sender_type:
task_match = True
break
# 检查关键词是否包含在通道类型的映射键中
for chinese_name, channel_type in channel_map.items():
if keyword_filter_lower in chinese_name.lower() and channel_type == sender_type:
task_match = True
break
if task_match:
filtered_res.append(task)
res = filtered_res
for i in res:
i['view_msg'] = self.get_view_msg_format(i)
return json_response(status=True, data=res)
except:
import traceback
# public.print_log(traceback.format_exc())
print(traceback.format_exc())
return json_response(status=True, data=res)
def get_sender_info(self):
sender_file = '/www/server/panel/data/mod_push_data/sender.json'
try:
with open(sender_file, 'r', encoding='utf-8') as f:
sender_data = json.load(f)
return {sender['id']: sender for sender in sender_data}
except Exception as e:
return {}
@staticmethod
def get_task_record(get):
page = 1
size = 10
try:
if hasattr(get, "page"):
page = int(get.page.strip())
if hasattr(get, "size"):
size = int(get.size.strip())
task_id = get.task_id.strip()
except (AttributeError, ValueError, TypeError):
return json_response(status=False, msg="Parameter error")
t = TaskRecordConfig(task_id)
t.config.sort(key=lambda x: x["create_time"])
page = max(page, 1)
size = max(size, 1)
count = len(t.config)
data = t.config[(page - 1) * size: page * size]
return json_response(status=True, data={
"count": count,
"list": data,
})
def clear_task_record(self, get):
try:
task_id = get.task_id.strip()
except (AttributeError, ValueError, TypeError):
return json_response(status=False, msg="Parameter error")
self.clear_task_record_by_task_id(task_id)
return json_response(status=True, msg="Cleared successfully")
@staticmethod
def remove_task_records(get):
try:
task_id = get.task_id.strip()
record_ids = set(json.loads(get.record_ids.strip()))
except (AttributeError, ValueError, TypeError):
return json_response(status=False, msg="Parameter error")
task_records = TaskRecordConfig(task_id)
for i in range(len(task_records.config) - 1, -1, -1):
if task_records.config[i]["id"] in record_ids:
del task_records.config[i]
task_records.save_config()
return json_response(status=True, msg="Cleared successfully")
@staticmethod
def get_task_template_list(get=None):
# todo 弃用表
public.check_table('ssl_domains', """CREATE TABLE IF NOT EXISTS `ssl_domains` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`domain` TEXT,
`dns_id` TEXT,
`type_id` INTEGER,
`endtime` INTEGER,
`ps` TEXT
)
""")
# 增加缓存
cache_key = 'mod_task:get_task_template_list'
cache = public.cache_get(cache_key)
if cache:
return json_response(status=True, data=cache)
res = []
p_sys = PushSystem()
for i in TaskTemplateConfig().config:
if not i['used']:
continue
to = p_sys.get_task_object(i["id"], i["load_cls"])
if not to:
continue
# 以下模板,只允许在安全模块中使用
if i['id'] in ['121','122','123','124']:
continue
t = to.filter_template(i["template"])
if not t:
continue
i["template"] = t
res.append(i)
# 缓存两分钟
public.cache_set(cache_key, res, 120)
return json_response(status=True, data=res)
@staticmethod
def get_view_msg_format(task: dict) -> str:
from mod.base.push_mod.rsync_push import ViewMsgFormat as Rv
from mod.base.push_mod.site_push import ViewMsgFormat as Sv
from mod.base.push_mod.task_manager_push import ViewMsgFormat as Tv
from mod.base.push_mod.database_push import ViewMsgFormat as Dv
from mod.base.push_mod.system_push import ViewMsgFormat as SSv
from mod.base.push_mod.load_push import ViewMsgFormat as Lv
from mod.base.push_mod.domain_blcheck_push import ViewMsgFormat as DBv
from mod.base.push_mod.safe_mod_push import ViewMsgFormat as SAv
list_obj = [Rv(), Sv(), Tv(), Dv(), SSv(), Lv(), DBv(), SAv()]
for i in list_obj:
res = i.get_msg(task)
if res is not None:
return res
return '<span>--</span>'