LINUX系统下的自动备份网站与提醒的思路
首先需要Python作为驱动检测是否备份往完成以及邮件发送是否顺利
因为文件备份在七牛云 所以需要安装七牛云的插件
先上代码
# encoding: utf-8
from qiniu import Auth, put_file, etag, urlsafe_base64_encode
import time
import qiniu.config
import zipfile
import os
import smtplib
import urllib2
from email.mime.text import MIMEText
from email.header import Header
time = time.strftime("%Y%m%d", time.localtime())
access_key = 'AK秘钥'
secret_key = 'SK秘钥'
content = urllib2.urlopen('http://return.abc.com/verify.php').read()
print(content)
if content <> '2':
startdir = "/home"
file_news = startdir + time +'.zip'
z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED)
for dirpath, dirnames, filenames in os.walk(startdir):
fpath = dirpath.replace(startdir,'')
fpath = fpath and fpath + os.sep or ''
for filename in filenames:
z.write(os.path.join(dirpath, filename),fpath+filename)
z.close()
print ('success')
q = Auth(access_key, secret_key)
bucket_name = 'backup'
key = 'back/back' + time +'.zip';
token = q.upload_token(bucket_name, key, 3600)
localfile = file_news
ret, info = put_file(token, key, localfile)
print(info)
assert ret['key'] == key
assert ret['hash'] == etag(localfile)
os.remove(file_news)
file = open('/home/wwwroot/return.abc.com/log/'+time+'.html','w')
file.write('1')
else:
print("backup-success")
我们看到,首先需要AK、SK 但这不是重点
重点是我们首先访问了一个叫做
http://return.abc.com/verify.php
的网页
这个网页的目的就是用来判断我们是否需要进行备份
<?php
//By : Jysir
//Time : 2018-2-16 15:06:42
$date = date('Ymd',time());
$db_host = 'localhost';
$db_user = '用户名';
$db_password = '密码';
$db_name = '名字';
$db_port = '3306';
$con = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die('连接数据库失败!');
mysqli_select_db($con, $db_name) or die('选择数据库失败!');
mysqli_query($con, "INSERT INTO `status` (`day`, `mail`, `msg`, `e_mail`) VALUES ('".$date."', '0', '200', '0');");
$file='./log/'.$date.'.html';
if(is_file($file))
{
#存在
$py_is_run = 1;
}
else
{
#不存在,Python未执行
$py_is_run = 0;
}
$ch = curl_init();
$url='http://back.qwer.com/back/back'.$date.'.zip';
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_NOBODY,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
$http_data = curl_getinfo($ch,CURLINFO_HTTP_CODE);
curl_close($ch);
if ($py_is_run === 1){
if ($http_data <> 200){
if($http_data === 0){}else{
echo "1";
mysqli_query($con, "UPDATE `status` SET `msg` = '".$http_data."' WHERE `status`.`day` = '".$date."'");
}
}else{
mysqli_query($con, "UPDATE `status` SET `msg` = '".$http_data."' WHERE `status`.`day` = '".$date."'");
echo "2";
$ch2 = curl_init();
$url2='http://return.abc.com/mail.php';
curl_setopt($ch2,CURLOPT_URL, $url2);
curl_setopt($ch2,CURLOPT_HEADER, 1);
curl_setopt($ch2,CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch2);
curl_close($ch2);
}
}else{
mysqli_query($con, "UPDATE `status` SET `msg` = '3' WHERE `status`.`day` = '".$date."'");
echo "3";
}
mysqli_close($con);
?>
首先,备份的原理有必要说一下
首先可以看到在Python的文件中我们将 "/home" 中的文件压缩并且赋予它独特的时间戳标记,之后用七牛云的API上传至我们预定好的目录,接下来,在我们指定的网站目录创建了一个与他名字相同的HTML文件用来做备份标记,也就是说,如果存在该HTML那么也意味着备份是成功的,不存在则反之,这也是Verify.php所要做的事情。
Verify.php要做的第二件事情就是将其记录入库,当然了如果验证成功,则会访问一个叫做 http://return.abc.com/mail.php 的页面 这个页面发邮件信号PHP
<?php
//By : Jysir
//Time :2018-2-16 15:06:46
header("Content-type: text/html; charset=utf-8");
$date = date('Ymd',time());
$db_host = 'localhost';
$db_user = '0000';
$db_password = '0000';
$db_name = '0000';
$db_port = '3306';
$con = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die('连接数据库失败!');
mysqli_select_db($con, $db_name) or die('选择数据库失败!');
$result = mysqli_query($con, "SELECT * FROM `status` WHERE `day` = '".$date."'");
$row = mysqli_fetch_assoc($result);
$mail = $row['mail'];
//End1
//发信开始
if ($mail <> 1 ){
mysqli_query($con, "UPDATE `status` SET `mail` = '1' WHERE `status`.`day` = '".$date."'");
//使用Curl
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"邮箱API");
curl_setopt($ch,CURLOPT_USERAGENT,"UA特殊化处理");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
$output = curl_exec($ch);
if($output === FALSE ){
mysqli_query($con, "UPDATE `status` SET `mail` = '0' WHERE `status`.`day` = '".$date."'");
}
curl_close($ch);
}else{
}
mysqli_close($con);
//End4
?>
通过访问这个页面,则会发送一次信息
通过简单的 Crontab 将刚刚的 Python 定时看似就已经可以
但是如果精益求精
或者说是自找麻烦
我又设置了一个页面
这个页面用来设置一个所谓的 “定时提醒”
<?php
//By : Jysir
//Time :2018-2-16 15:06:46
header("Content-type: text/html; charset=utf-8");
$date = date('Ymd',time());
$db_host = 'localhost';
$db_user = '0000';
$db_password = '0000';
$db_name = '0000';
$db_port = '3306';
$con = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die('连接数据库失败!');
mysqli_select_db($con, $db_name) or die('选择数据库失败!');
$result = mysqli_query($con, "SELECT * FROM `status` WHERE `day` = '".$date."'");
$row = mysqli_fetch_assoc($result);
$msg = $row['msg'];
$e_mail=$row['e_mail'];
$ch0=curl_init();
curl_setopt($ch0,CURLOPT_URL,"http://retuan.abc.com/verify.php");
curl_setopt($ch0,CURLOPT_HEADER, 1);
curl_setopt($ch0,CURLOPT_RETURNTRANSFER,1);
curl_exec($ch0);
curl_close($ch0);
$time=date('H:i');
$time1="12:00";#第一个检查时间
$time2="15:10";#第二个检查时间
$line1=strtotime($time1)-strtotime($time);
$line2=strtotime($time2)-strtotime($time);
$is_send=0;
if($line1>0 && $line1<1800){
$is_send=1;
}elseif($line2>0 && $line2<1800){
$is_send=1;
};
echo $is_send;
echo $e_mail;
if($is_send==1 && $e_mail==0){
if($msg<>200){
if($msg==3){
$log='截至目前备份未成功,可能原因:<b><font color="#ff0000">备份服务器通信错误</font></b>';
sendmail($log);
}else{
$log='七牛云备份文件访问错误,错误码:<b><font color="#ff0000">'.$msg.'</font></b>';
sendmail($log);
}
}
}
#发送邮件函数
function sendmail($string) {
global $con,$date;
mysqli_query($con, "UPDATE `status` SET `e_mail` = '1' WHERE `status`.`day` = '".$date."'");
$ch=curl_init();
$post_data = array ("log" => $string);
curl_setopt($ch,CURLOPT_URL,"邮件API");
curl_setopt($ch,CURLOPT_USERAGENT,"0000");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
$output = curl_exec($ch);
if($output === FALSE ){
mysqli_query($con, "UPDATE `status` SET `e_mail` = '0' WHERE `status`.`day` = '".$date."'");
}
curl_close($ch);
}
mysqli_close($con);
?>
这个页面确实冗余至极,舍弃。