python自动压缩文件夹并sftp发送至服务器

记录python使用学习

学习使用:

用zipfile实现压缩,用paramiko来sftp传输,用apscheduler框架设置定时发送

代码:

import os
import subprocess
from subprocess import PIPE
import zipfile
import time
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import paramiko


# 功能1:压缩文件夹,排除附件子文件夹attached
def zip_file(target_path, output_path, zip_name):
    list_file = []
    # 判断压缩对象是否是空文件夹
    if len(os.listdir(target_path)) == 0:
        z = zipfile.ZipFile(output_path + zip_name, 'w', zipfile.ZIP_DEFLATED)
        z.writestr(zipfile.ZipInfo(target_path + '\\'), "")
    # 压缩对象下所有文件的路径
    else:
        for path, dirNames, fileNames in os.walk(target_path):
            # 排除附件文件夹
            if 'attached' not in path:
                if not fileNames and not dirNames:
                    list_file.append(path)
                for file in fileNames:
                    list_file.append(os.path.join(path, file))
    # 添加压缩文件
    zf = zipfile.ZipFile(output_path + zip_name, 'w', zipfile.ZIP_DEFLATED)
    for i in list_file:
        zf.write(i)
    zf.close()
    if zip_name in os.listdir(output_path):
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "  " + zip_name + " 压缩完成!")
        print("")
    else:
        print("压缩失败")
        print("")
    return


# 功能2:上传文件(只上传单个文件,不上传文件夹)
def sftp_upload(host, port, username, password, file_path, server_path, file_name):
    s = paramiko.SSHClient()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    s.connect(hostname=host, port=port, username=username, password=password)
    sftp = s.open_sftp()
    try:
        sftp.put(file_path, server_path)
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + file_name + " 上传结束!")
    except Exception as e:
        print('上传失败!', e)


# 定时job1:删除旧的zip、rar文件
def delete_job():
    path = '文件地址'
    for i in os.listdir(path):
        if 'ROOT_' in i and '.zip' in i:
            os.remove(path + i)
            print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧备份已删除")
        if 'ROOT_' in i and '.rar' in i:
            os.remove(path + i)
            print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧备份已删除")


# 定时job2:关闭生产项目
def shutdown_job():
    path = r'...\apache-tomcat\bin\shutdown.bat'
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "关闭生产项目")
    p = subprocess.Popen(path, shell=False, stdout=PIPE)
    p.wait()
    if p.returncode == 0:
        print("项目关闭成功")
    else:
        print("项目关闭失败")


# 定时job3:数据库备份bak文件发送至linux服务器
def database_job():
    path = '数据库备份地址'
    bak_list = []
    for i in os.listdir(path):
        if '...' + datetime.now().strftime('%Y%m%d') in i:
            bak_list.append(i)
    if len(bak_list) != 0:
        bak_name = bak_list[len(bak_list) - 1]
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传数据库备份bak文件")
        sftp_upload('服务器地址', 端口, 'root', '123456',
                    path + bak_name,
                    '/home/D/backup/' + bak_name, bak_name)


# 关闭sql server服务
def stop_mssql_job():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "关闭sql server服务")
    p = subprocess.Popen("net stop MSSQLserver /y", shell=False, stdout=PIPE)
    p.wait()
    if p.returncode == 0:
        print("sql server关闭成功")
    else:
        print("sql server关闭失败")


# 压缩数据库日志文件夹并发送至linux服务器
def mssql_job():
    # 首先删除上周的旧压缩包
    delete_mssqlzip()
    # 压缩文件夹前先关闭sql server服务
    stop_mssql_job()
    # 压缩
    weekday = datetime.now().isoweekday()
    zip_time = datetime.now()
    zip_name = 'MSSQL_DATA_' + zip_time.strftime('%Y%m%d') + '.zip'
    if weekday == 5 and 220500 <= int(zip_time.strftime("%H%M%S")) <= 235959:
        print(zip_time.strftime("%Y-%m-%d %H:%M:%S") + "  " + "开始压缩MSSQL\\DATA文件夹~")
        zip_file(r'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA',
                 'E:\\数据库备份\\MSSQL备份\\', zip_name)
    # 延时5s,然后上传压缩包
    time.sleep(5)
    if zip_name in os.listdir('E:\\数据库备份\\MSSQL备份\\'):
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传MSSQL压缩包")
        sftp_upload('目标服务器地址', 端口, 'root', '123456',
                    'E:/数据库备份/MSSQL备份/' + zip_name,
                    '/home/D/backup/mssql/' + zip_name, zip_name)
    # 上传结束后开启sql server服务
    start_mssql_job()


# 删除旧压缩包
def delete_mssqlzip():
    path = 'E:\\数据库备份\\MSSQL备份\\'
    for i in os.listdir(path):
        if 'MSSQL_DATA_' in i and '.zip' in i:
            os.remove(path + i)
            print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧MSSQL备份已删除")


# 打开sql server服务
def start_mssql_job():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开启sql server服务")
    p = subprocess.Popen("net start MSSQLserver", shell=False, stdout=PIPE)
    p.wait()
    if p.returncode == 0:
        print("sql server开启成功")
    else:
        print("sql server开启失败")


# 定时job4:压缩指定路径的文件,压缩结束后将压缩包发送至linux服务器
def zip_job():
    weekday = datetime.now().isoweekday()
    zip_time = datetime.now()
    zip_name = 'ROOT_' + zip_time.strftime('%Y%m%d') + '.zip'
    if weekday == 5 and 220500 <= int(zip_time.strftime("%H%M%S")) <= 235959:
        print(zip_time.strftime("%Y-%m-%d %H:%M:%S") + "  " + "开始压缩ROOT文件夹~")
        zip_file(r'E:\apache-tomcat\webapps\ROOT', 'E:\\', zip_name)
    # 延时5s,然后上传压缩包
    time.sleep(5)
    if zip_name in os.listdir('E:\\'):
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传项目压缩包")
        sftp_upload('目标服务器地址', 端口, 'root', '123456',
                    'E:/' + zip_name,
                    '/home/D/backup/code/' + zip_name, zip_name)
    time.sleep(5)
    # 上传完ROOT压缩包后直接启动项目
    startup_job()


# 定时job5:启动生产项目
def startup_job():
    path = r'E:\apache-tomcat\bin\startup.bat'
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "重启生产项目")
    p = subprocess.Popen(path, shell=False, stdout=PIPE)
    p.wait()
    if p.returncode == 0:
        print("项目启动成功")
    else:
        print("项目启动失败")


def zip_start():
    print("*************************************************脚本信息***************************************************")
    print("每周五晚上开始工作")
    print("(1)需要被压缩的目录为:E:\\apache-tomcat\\webapps\\ROOT")
    print("   压缩包存放的目录为:E:\\")
    print("   压缩包名为:ROOT_+压缩时间.zip")
    print("(2)需要被压缩的目录为:D:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA")
    print("   压缩包存放的目录为:E:\\数据库备份\\MSSQL备份\\")
    print("   压缩包名为:MSSQL_DATA_+压缩时间.zip")
    print("")
    print("step1: 21:55删除文件夹E:\\下名称包含ROOT_的zip和rar文件")
    print("step2: 22:01关闭项目")
    print("step3: 22:05将数据库备份发送至linux服务器(navicat在22:02进行备份生成bak文件:XGML_'%Y%m%d'_'%H%M%S'.bak)")
    print("step4: 22:15压缩数据库日志文件夹MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA,压缩结束后自动将压缩包发送至linux服务器")
    print("step5: 22:25压缩项目文件夹ROOT,压缩结束后自动将压缩包发送至linux服务器(压缩文件夹中排除了附件文件夹attached)")
    print("step6: ROOT传输结束后启动项目")
    print("***********************************************************************************************************")


if __name__ == '__main__':
    zip_start()
    scheduler = BlockingScheduler()
    # 每周五21:55:00执行zip_delete
    trigger1 = CronTrigger(day_of_week='fri', hour=21, minute=55, second=0)
    scheduler.add_job(delete_job, trigger1, misfire_grace_time=300)
    # 每周五22:01:00执行shutdown_job
    trigger2 = CronTrigger(day_of_week='fri', hour=22, minute=1, second=0)
    scheduler.add_job(shutdown_job, trigger2)
    # 每周五22:05:00执行database_job
    trigger3 = CronTrigger(day_of_week='fri', hour=22, minute=5, second=0)
    scheduler.add_job(database_job, trigger3, misfire_grace_time=300)

    # 每周五22:15:00执行mssql_job
    trigger6 = CronTrigger(day_of_week='fri', hour=22, minute=15, second=0)
    scheduler.add_job(mssql_job, trigger6, misfire_grace_time=300)

    # 每周五22:25:00执行zip_job
    trigger4 = CronTrigger(day_of_week='fri', hour=22, minute=25, second=0)
    scheduler.add_job(zip_job, trigger4)

    # 每周六03:00:00执行startup_job
    # trigger5 = CronTrigger(day_of_week='sat', hour=3, minute=0, second=0)
    # scheduler.add_job(startup_job, trigger5)
    try:
        scheduler.start()
    except(KeyboardInterrupt, SystemExit):
        scheduler.shutdown()


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值