You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
8.1 KiB
259 lines
8.1 KiB
<?php |
|
|
|
/* |
|
* 与计划任务操作相关的方法的封装 |
|
*/ |
|
|
|
class Crontab extends Controller { |
|
/* |
|
* 注意事项: |
|
* 1、所有的控制器都要继承基类控制器:Controller |
|
* 2、基类控制器中包含:数据库连接对象、守护进程通信对象、视图层对象、公共函数等,继承后可以直接使用基类的变量和对象 |
|
* |
|
* 用法: |
|
* 1、使用父类的变量:$this->xxx |
|
* 2、使用父类的成员函数:parent::yyy() |
|
* 3、使用父类的非成员函数,直接用即可:zzz() |
|
* 4、 |
|
*/ |
|
|
|
private $svn_repository_path; |
|
private $backup_path; |
|
private $Config; |
|
|
|
function __construct() { |
|
/* |
|
* 避免子类的构造函数覆盖父类的构造函数 |
|
*/ |
|
parent::__construct(); |
|
|
|
/* |
|
* 其它自定义操作 |
|
*/ |
|
$this->Config = new Config(); |
|
|
|
$this->svn_repository_path = $this->Config->Get("SVN_REPOSITORY_PATH"); |
|
$this->backup_path = $this->Config->Get("BACKUP_PATH"); |
|
} |
|
|
|
//添加计划任务 |
|
function AddCrontab($requestPayload) { |
|
$backup_type = $requestPayload['backup_type']; |
|
$cycle_type = $requestPayload['cycle_type']; |
|
$week = $requestPayload['week']; |
|
$hour = $requestPayload['hour']; |
|
$minute = $requestPayload['minute']; |
|
$repository_name = $requestPayload['repository_name']; |
|
$crontab_count = $requestPayload['crontab_count']; |
|
|
|
//检查参数 |
|
if (empty($backup_type) || empty($cycle_type) || empty($repository_name) || empty($crontab_count)) { |
|
$data['status'] = 0; |
|
$data['message'] = '添加失败 参数不完整'; |
|
return $data; |
|
} |
|
|
|
//计划任务文件路径 |
|
$cron_path = "/var/spool/cron/root"; |
|
//检查计划任务文件是否存在 |
|
if (!file_exists($cron_path)) { |
|
parent::RequestReplyExec("touch $cron_path"); |
|
} |
|
|
|
//构造脚本文件标识字符串 |
|
$sign = time() . rand(); |
|
|
|
//构造脚本文件路径 |
|
$shell_path = BASE_PATH . '/data/crond/' . $sign; |
|
parent::RequestReplyExec("touch $shell_path"); |
|
parent::RequestReplyExec("chmod 755 $shell_path"); |
|
|
|
//获取执行周期 |
|
$cycle = $this->EnCrontabFormat($cycle_type, $week, $hour, $minute); |
|
|
|
//shell脚本内容 |
|
$shell_content = ""; |
|
|
|
//根据备份类型构造脚本 |
|
if ($backup_type == "dump") { |
|
//构造脚本文件内容 |
|
$path_1 = $this->svn_repository_path . '/' . $repository_name; |
|
$path_2 = $this->backup_path . '/' . $repository_name . '_' . $sign . '.gz'; |
|
$shell_content = <<<shell |
|
#!/bin/bash |
|
/usr/bin/mkdir -p $this->backup_path |
|
/usr/bin/svnadmin dump -q $path_1 | /usr/bin/gzip > $path_2 |
|
|
|
shell; |
|
} else if ($backup_type == "hotcopy") { |
|
$shell_content = <<<shell |
|
#!/bin/bash |
|
/usr/bin/mkdir $this->backup_path |
|
/usr/bin/svnadmin dump -q $path_1 | /usr/bin/gzip > $path_2 |
|
|
|
shell; |
|
} else { |
|
parent::RequestReplyExec("rm -f $shell_path"); |
|
$data['status'] = 0; |
|
$data['message'] = '失败 备份类型错误'; |
|
return $data; |
|
} |
|
|
|
//向脚本文件并写入内容 |
|
parent::RequestReplyExec("echo '$shell_content' > $shell_path"); |
|
|
|
//将周期+脚本文件路径以追加方式写入计划任务文件 /var/spool/cron/root |
|
//$content = $cycle . ' bash ' . $shell_path; |
|
$content = $cycle . ' bash ' . $shell_path; |
|
parent::RequestReplyExec("echo '$content' >> $cron_path"); |
|
parent::RequestReplyExec("systemctl restart crond"); |
|
|
|
//将信息写入数据库表 |
|
$this->database_medoo->insert("crontab", [ |
|
"backup_type" => $backup_type, |
|
"cycle_type" => $cycle_type, |
|
"week" => $week, |
|
"hour" => $hour, |
|
"minute" => $minute, |
|
"repository_name" => $repository_name, |
|
"crontab_count" => $crontab_count, |
|
"sign" => $sign |
|
]); |
|
|
|
$data['status'] = 1; |
|
$data['message'] = '添加计划任务成功'; |
|
return $data; |
|
} |
|
|
|
//删除计划任务 |
|
function DeleteCrontab($requestPayload) { |
|
$sign = $requestPayload["sign"]; |
|
//从计划任务文件删除 |
|
parent::RequestReplyExec("sed -i '/$sign/d' /var/spool/cron/root"); |
|
//从web路径删除 |
|
parent::RequestReplyExec("rm -f " . BASE_PATH . '/data/crond/' . $sign); |
|
//从数据库删除 |
|
$this->database_medoo->delete("crontab", [ |
|
"AND" => [ |
|
"sign" => $sign, |
|
] |
|
]); |
|
$data['status'] = 1; |
|
$data['message'] = '删除成功'; |
|
return $data; |
|
} |
|
|
|
//获取计划任务列表 |
|
function GetCrontabList($requestPayload) { |
|
$pageSize = trim($requestPayload['pageSize']); |
|
$currentPage = trim($requestPayload['currentPage']); |
|
|
|
//分页处理 |
|
$begin = $pageSize * ($currentPage - 1); |
|
|
|
$list = $this->database_medoo->select("crontab", [ |
|
"id", |
|
"backup_type", |
|
"cycle_type", |
|
"week", |
|
"hour", |
|
"minute", |
|
"repository_name", |
|
"crontab_count", |
|
"sign" |
|
], [ |
|
"ORDER" => ["sign" => "DESC"], |
|
"LIMIT" => [$begin, $pageSize] |
|
]); |
|
|
|
//处理内容 |
|
foreach ($list as $key => $value) { |
|
$list[$key]["crontab_name"] = $value["backup_type"] . '-方式备份SVN仓库-' . $value["repository_name"]; |
|
$list[$key]["crontab_cycle"] = $this->EnTimeFromat($value["cycle_type"]); |
|
$list[$key]["crontab_time"] = $this->DeCrontabFormat($value["cycle_type"], $value["week"], $value["hour"], $value["minute"]); |
|
$list[$key]["crontab_count"] = '保存最新' . $value["crontab_count"] . '份'; |
|
} |
|
|
|
//计算数量 |
|
$total = $this->database_medoo->count("crontab"); |
|
|
|
//处理自增的id |
|
$i = 0; |
|
foreach ($list as $key => $value) { |
|
$list[$key]["id"] = $i + $begin; |
|
$i++; |
|
} |
|
|
|
$data['status'] = 1; |
|
$data['message'] = '获取计划列表成功'; |
|
$data['data'] = $list; |
|
$data['total'] = $total; |
|
return $data; |
|
} |
|
|
|
//立即执行计划任务 |
|
function StartCrontab() { |
|
|
|
} |
|
|
|
//格式化 |
|
private function EnCrontabFormat($cycle_type, $week, $hour, $minute) { |
|
$content = ""; |
|
switch ($cycle_type) { |
|
case 'weekly': { |
|
$content = $content = sprintf("%s %s * * %s", $minute, $hour, $week); |
|
}; |
|
break; |
|
case 'daily': { |
|
$content = $content = sprintf("%s %s * * *", $minute, $hour); |
|
}; |
|
break; |
|
case 'hourly': { |
|
$content = $content = sprintf("%s * * * *", $minute); |
|
}; |
|
break; |
|
} |
|
return $content; |
|
} |
|
|
|
//格式化 |
|
private function DeCrontabFormat($cycle_type, $week, $hour, $minute) { |
|
$content = ""; |
|
switch ($cycle_type) { |
|
case 'weekly': { |
|
$content = "每周" . $week . "的" . $hour . "时" . $minute . "分"; |
|
}; |
|
break; |
|
case 'daily': { |
|
$content = "每天的" . $hour . "时" . $minute . "分"; |
|
}; |
|
break; |
|
case 'hourly': { |
|
$content = "每小时的" . $minute . "分"; |
|
}; |
|
break; |
|
} |
|
return $content; |
|
} |
|
|
|
//格式化 |
|
private function EnTimeFromat($cycle_type) { |
|
$content = ""; |
|
switch ($cycle_type) { |
|
case 'weekly': { |
|
$content = "每周"; |
|
}; |
|
break; |
|
case 'daily': { |
|
$content = "每天"; |
|
}; |
|
break; |
|
case 'hourly': { |
|
$content = "每小时"; |
|
}; |
|
break; |
|
} |
|
return $content; |
|
} |
|
|
|
}
|
|
|