Files
dnsmgr/app/service/ScheduleService.php
2025-10-16 23:09:13 +08:00

119 lines
4.7 KiB
PHP

<?php
namespace app\service;
use Exception;
use think\facade\Db;
use app\lib\DnsHelper;
/**
* 域名定时切换解析
*/
class ScheduleService
{
public function execute()
{
$list = Db::name('sctask')->where('nexttime', '>', 0)->where('nexttime', '<=', time())->where('active', 1)->select();
if (count($list) == 0) {
return false;
}
echo '开始执行定时切换解析任务,共获取到' . count($list) . '个待执行任务' . "\n";
foreach ($list as $row) {
try {
$this->execute_one($row);
echo '定时切换任务' . $row['id'] . '执行成功' . "\n";
} catch (Exception $e) {
echo '定时切换任务' . $row['id'] . '执行失败,' . $e->getMessage() . "\n";
}
}
config_set('schedule_time', date("Y-m-d H:i:s"));
return true;
}
public function execute_one($row)
{
$drow = Db::name('domain')->alias('A')->join('account B', 'A.aid = B.id')->where('A.id', $row['did'])->field('A.*,B.type,B.ak,B.sk,B.ext')->find();
if (!$drow) throw new Exception('域名不存在');
Db::name('sctask')->where('id', $row['id'])->update(['updatetime' => time()]);
$domain = $row['rr'] . '.' . $drow['name'];
$dns = DnsHelper::getModel2($drow);
if ($row['switchtype'] == 1) {
$res = $dns->setDomainRecordStatus($row['recordid'], '1');
if ($res) {
$this->add_log($domain, '启用解析', '定时启用解析成功');
} else {
$this->add_log($domain, '启用解析失败', $dns->getError());
}
} elseif ($row['switchtype'] == 2) {
$res = $dns->setDomainRecordStatus($row['recordid'], '0');
if ($res) {
$this->add_log($domain, '暂停解析', '定时暂停解析成功');
} else {
$this->add_log($domain, '暂停解析失败', $dns->getError());
}
} elseif ($row['switchtype'] == 3) {
$res = $dns->deleteDomainRecord($row['recordid']);
if ($res) {
$this->add_log($domain, '删除解析', '定时删除解析成功');
} else {
$this->add_log($domain, '删除解析失败', $dns->getError());
}
} else {
$recordinfo = json_decode($row['recordinfo'], true);
if ($drow['type'] == 'cloudflare' && !isNullOrEmpty($row['line'])) {
$recordinfo['Line'] = $row['line'];
}
$res = $dns->updateDomainRecord($row['recordid'], $row['rr'], getDnsType($row['value']), $row['value'], $recordinfo['Line'], $recordinfo['TTL']);
if ($res) {
$this->add_log($domain, '修改解析', $row['rr'].' ['.getDnsType($row['value']).'] '.$row['value'].' (线路:'.$recordinfo['Line'].' TTL:'.$recordinfo['TTL'].')');
} else {
$this->add_log($domain, '修改解析失败', $dns->getError());
}
}
$this->update_nexttime($row);
}
public function update_nexttime($row)
{
if ($row['type'] == 1) {
if ($row['cycle'] == 2) {
$date = intval($row['switchdate']);
$nexttime = strtotime(date('Y-m-') . $date . ' ' . $row['switchtime'] . ':00');
if ($nexttime <= time()) {
$nexttime = strtotime("+1 month", $nexttime);
}
} elseif ($row['cycle'] == 1) {
$weekday = intval($row['switchdate']); // 0-6, 0=周日
$nexttime = strtotime("last Sunday +{$weekday} days {$row['switchtime']}:00");
if ($nexttime <= time()) {
$nexttime = strtotime("+1 week", $nexttime);
if ($nexttime <= time()) {
$nexttime = strtotime("+1 week", $nexttime);
}
}
} else {
$nexttime = strtotime(date('Y-m-d') . ' ' . $row['switchtime'] . ':00');
if ($nexttime <= time()) {
$nexttime = strtotime("+1 day", $nexttime);
}
}
} else {
$nexttime = strtotime($row['switchtime'] . ':00');
if ($nexttime <= time()) {
$nexttime = 0;
}
}
Db::name('sctask')->where('id', $row['id'])->update(['nexttime' => $nexttime]);
}
private function add_log($domain, $action, $data)
{
if (strlen($data) > 500) $data = substr($data, 0, 500);
Db::name('log')->insert(['uid' => 0, 'domain' => $domain, 'action' => $action, 'data' => $data, 'addtime' => date("Y-m-d H:i:s")]);
}
}