分类 默认分类 下的文章

首先需要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);
?>

这个页面确实冗余至极,舍弃。