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

198 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
import os
import fcntl
import core.mw as mw
from utils.crontab import crontab
from croniter import croniter
from datetime import datetime
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("------")
def init_acme_cron():
# 使用文件锁防止并发添加
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
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':'',
}
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
def init_auto_update():
# 使用文件锁防止并发添加
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
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':'',
}
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
# 识别linux计划任务
def init_cron():
file = ''
cron_file = [
'/var/spool/cron/crontabs/root',
'/var/spool/cron/root',
]
for i in cron_file:
if os.path.exists(i):
file = i
if file == "":
return True
with open(file) as f:
for line in f.readlines():
cron_line = line.strip()
if cron_line.startswith("#"):
continue
cron_expression = cron_line.split(maxsplit=5) # 提取前 5 个字段(* * * * *
command = cron_line.split(maxsplit=5)[5] # 提取命令部分
# 面板计划任务过滤
if command.startswith("/www/server/cron"):
continue
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)
# print(command)
# cron_list = content.split("\n")
# print(cron_list)