mdserver-web/web/admin/setup/init_cron.py

198 lines
5.8 KiB
Python
Raw Normal View History

2025-03-19 23:48:12 -04:00
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
2025-03-23 05:14:49 -04:00
import os
2026-06-28 12:19:10 -04:00
import fcntl
2025-03-23 04:50:30 -04:00
import core.mw as mw
2025-03-23 05:14:49 -04:00
from utils.crontab import crontab
from croniter import croniter
from datetime import datetime
2025-03-23 12:06:42 -04:00
import thisdb
def cron_todb(data):
# print("------")
rdata = {}
if data[3] == "*" and data[2] != "*" :
rdata['type'] = 'month'
elif data[3] == "*" and data[4] != "*" :
rdata['type'] = 'week'
elif data[3] == "*" and data[4] == "*" and data[2] == "*" :
rdata['type'] = 'day'
elif data[1].find("/") > -1 :
rdata['type'] = 'hour-n'
elif data[0].find("/") > -1 :
rdata['type'] = 'minute-n'
# print(rdata)
# print(data)
return rdata
# print("------")
2025-03-19 23:48:12 -04:00
2025-06-25 10:54:45 -04:00
def init_acme_cron():
2026-06-28 12:19:10 -04:00
# 使用文件锁防止并发添加
lock_file = mw.getPanelDir() + '/logs/init_acme_cron.lock'
lock_fd = None
try:
# 创建锁文件
lock_fd = open(lock_file, 'w')
# 获取非阻塞互斥锁
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
name = "[勿删]ACME定时强制更新"
res = mw.M("crontab").field("id, name").where("name=?", (name,)).find()
if res:
return True
2025-06-25 10:54:45 -04:00
2026-06-28 12:19:10 -04:00
cmd = "/root/.acme.sh/acme.sh --cron --force --standalone"
params = {
'name': name,
'type': 'day-n',
'week': "",
'where1': "15",
'hour': 4,
'minute': 15,
'save': "",
'backup_to': "",
'stype': "toShell",
'sname': '',
'sbody': cmd,
'url_address': '',
'attr':'',
}
2025-06-25 10:54:45 -04:00
2026-06-28 12:19:10 -04:00
crontab.instance().add(params)
return True
except BlockingIOError:
# 锁已被其他进程持有,跳过或等待
return True
except Exception as e:
mw.writeFileLog(f"init_acme_cron error: {e}")
return False
finally:
# 释放锁
if lock_fd:
try:
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_UN)
lock_fd.close()
# 删除锁文件
if os.path.exists(lock_file):
os.remove(lock_file)
except:
pass
2025-06-25 10:54:45 -04:00
2025-10-14 06:32:17 -04:00
def init_auto_update():
2026-06-28 12:19:10 -04:00
# 使用文件锁防止并发添加
lock_file = mw.getPanelDir() + '/logs/init_auto_update.lock'
lock_fd = None
try:
# 创建锁文件
lock_fd = open(lock_file, 'w')
# 获取非阻塞互斥锁
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
name = "[可删]面板自动更新"
res = mw.M("crontab").field("id, name").where("name=?", (name,)).find()
if res:
return True
2025-10-14 06:32:17 -04:00
2026-06-28 12:19:10 -04:00
cmd = "mw update"
params = {
'name': name,
'type': 'month',
'week': "",
'where1': "1",
'hour': 4,
'minute': 15,
'save': "",
'backup_to': "",
'stype': "toShell",
'sname': '',
'sbody': cmd,
'url_address': '',
'attr':'',
}
2025-10-14 06:32:17 -04:00
2026-06-28 12:19:10 -04:00
crontab.instance().add(params)
return True
except BlockingIOError:
# 锁已被其他进程持有,跳过或等待
return True
except Exception as e:
mw.writeFileLog(f"init_auto_update error: {e}")
return False
finally:
# 释放锁
if lock_fd:
try:
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_UN)
lock_fd.close()
# 删除锁文件
if os.path.exists(lock_file):
os.remove(lock_file)
except:
pass
2025-10-14 06:32:17 -04:00
2025-03-19 23:48:12 -04:00
# 识别linux计划任务
def init_cron():
2025-03-23 05:14:49 -04:00
file = ''
cron_file = [
'/var/spool/cron/crontabs/root',
'/var/spool/cron/root',
]
for i in cron_file:
if os.path.exists(i):
file = i
2025-03-23 04:50:30 -04:00
2025-03-23 05:14:49 -04:00
if file == "":
return True
2025-03-23 12:06:42 -04:00
2025-03-23 05:14:49 -04:00
with open(file) as f:
for line in f.readlines():
cron_line = line.strip()
if cron_line.startswith("#"):
continue
2025-03-23 05:27:43 -04:00
2025-03-23 12:06:42 -04:00
cron_expression = cron_line.split(maxsplit=5) # 提取前 5 个字段(* * * * *
2025-03-23 05:27:43 -04:00
command = cron_line.split(maxsplit=5)[5] # 提取命令部分
# 面板计划任务过滤
if command.startswith("/www/server/cron"):
continue
2025-03-23 12:06:42 -04:00
if command.startswith("\"/root/.acme.sh\""):
# print(cron_expression, command)
info = cron_todb(cron_expression)
# print(info)
# add_dbdata = {}
# add_dbdata['name'] = "ACME"
# add_dbdata['type'] = data['type']
# add_dbdata['where1'] = data['where1']
# add_dbdata['where_hour'] = data['hour']
# add_dbdata['where_minute'] = data['minute']
# add_dbdata['save'] = ""
# add_dbdata['backup_to'] = ""
# add_dbdata['sname'] = ""
# add_dbdata['sbody'] = data['sbody']
# add_dbdata['stype'] = "toShell"
# add_dbdata['echo'] = command
# add_dbdata['url_address'] = ''
# thisdb.addCrontab(add_dbdata)
2025-03-23 05:27:43 -04:00
2025-03-23 12:06:42 -04:00
# print(command)
2025-03-23 05:14:49 -04:00
# cron_list = content.split("\n")
# print(cron_list)