文档章节

svn版本备份-- python 脚本

python测试开发人工智能安全
 python测试开发人工智能安全
发布于 2014/04/09 14:28
字数 819
阅读 912
收藏 13
svn版本备份

备份机制

  • 1, 每10分钟检查一次svn(时间可以在配置文件中配置)。

  • 2,检查到有更新时备份最新版本,记录更新内容。

  • 3,删除30天之前的备份(天数可以配置)。

配置文件

# vi ../conf/backup_server.conf 
[common]# How many hours between scanscan_interval = 10log_level = debugbackup_day = 20backup_dir = /opt/backupname = Android:C++:PHP:IPHONEdir_name = /data/soft/rl/mobile_develop/moxian/code/android/MoXian:/data/soft/rl/c++/cframework/src:/data/soft/rl/moxian_system:/data/soft/rl/mobile_develop/moxian/code/iphone/MoXian/MoXian_developer

备份脚本

#!/usr/bin/env python# -*- coding: utf-8 -*-'''
2013/04/06 Rongzhong Xu
'''import osimport ConfigParserimport timeimport randomimport subprocessimport loggingimport logging.handlersimport redebug = Falsesvn_user = 'test'svn_pwd = '***'svn_dir = "svn://192.168.0.7/rl/"svn_quiet = " --non-interactive --trust-server-cert"svn_auth = "{0} --username {1} --password {2}".format(svn_quiet, 
    svn_user, svn_pwd)# Read configuratons of logger and add loggertry:
    parser = ConfigParser.ConfigParser()
    parser.read("../conf/backup_server.conf")
    log_level = parser.get("common", "log_level")
    scan_interval = int(parser.get('common', 'scan_interval'))
    log_num = getattr(logging, log_level.upper(), None)   
    backup_dir = parser.get("common", "backup_dir")     
    back_logger = logging.getLogger('MyLogger')
    back_logger.setLevel(log_num)
    fh = logging.handlers.RotatingFileHandler('../logs/backup_server.log',
        maxBytes=10000000,
        backupCount=5,
    )
    fh.setLevel(log_num)
    formatter = logging.Formatter(u'%(asctime)s [%(levelname)s] %(message)s')  
    fh.setFormatter(formatter)
    back_logger.addHandler(fh)
    back_logger.info("Application starting! \n")except Exception as e:
    print "Read log configurations Failed!"
    print e    for  item in sys.exc_info():
        print item
    sys.exit(str(e))while True:   
    
    time.sleep(60 * scan_interval)
    # Get files from SVN
    try:
        svn_cmd_get = 'cd /data/soft && svn co {0} {1}'.format(
            svn_dir, svn_auth)
        #back_logger.info({0}! \n".format(svn_cmd_get))
        result = subprocess.check_output(svn_cmd_get, shell=True)
        #back_logger.info("update info: {0} ! \n".format(result))       
        if debug:
            print result
        version = re.search('\s+(\d{3,8})',result).group(1)  
        # back_logger.info("version: {0} \n".format(version))
        directory = '{0}/{1}/'.format(backup_dir, version)
        if os.path.exists(directory):
            back_logger.info("version {0} has backuped before! \n".format(
                version))
            continue
        else:
            back_logger.info("updating:\n{0}! \n".format(
                            result))        
    except Exception as e:
        back_logger.critical("Get files from SVN failed! \n")  
        back_logger.critical(str(e), exc_info=True)       
        continue

    # Read common configurations
    try:        
        back_logger.info("Beginning backup! \n")   
        scan_interval = int(parser.get('common', 'scan_interval'))
        backup_day = parser.get("common", "backup_day")
        names = parser.get("common", "name")
        dirs = parser.get("common", "dir_name")    
        name_list = names.split(":")
        dir_list = dirs.split(":")
        number = len(name_list)  
        if len(name_list) != len(dir_list):
            back_logger.critical("backup name and dir number not equal! \n")        
    except Exception as e:
        back_logger.critical("Read common configurations failed! \n")  
        back_logger.critical(str(e), exc_info=True)       
        continue        
       
    for seq in range(number):
        try:
            pack_name = name_list[seq]
            pack_dir = dir_list[seq]
            subprocess.check_output('mkdir -p {0}'.format(directory), 
                shell=True)
            now = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())
            subprocess.call('cd {0}'.format(pack_dir), shell=True)
            file_name = "{0}/{1}-{2}.tar.gz".format(directory,pack_name, now)
            dir_name = os.path.dirname(pack_dir.rstrip('/'))
            base_name = os.path.basename(pack_dir.rstrip('/'))      
            cmd = 'cd {0} && tar czf {1} {2}'.format(dir_name,
                file_name, base_name)
            print cmd
            logging.info(cmd)
            subprocess.call(cmd, shell=True)
        except Exception as e:
            back_logger.critical(str(e), exc_info=True)                   
            continue    
        
    if random.randint(1, 100) % 99 == 0:
        try:
            back_logger.info("Delele old file before {0} days\n".format(
                backup_day))
            subprocess.call(
                'find {0} -mtime +{1} -name "*.tar.gz" | xargs rm -f'.format(
                    backup_dir, backup_day), shell=True)     
        except Exception as e:
            back_logger.error("Delele old file before {0} days Failed\n".format(
                backup_day))
            back_logger.critical(str(e), exc_info=True)       
            continue

启动脚本:

#!/bin/shAPP_MAIN=backup_serverAPP_LOG=logsPID=0

getPID(){
    pythonps=`ps aux | grep $APP_MAIN | grep -v grep`
    if [ -n "$pythonps" ]; then        PID=`echo $pythonps | awk '{print $2}'`
    else        PID=0    fi}startup(){
    getPID    echo "================================================================================================================"
    if [ $PID -ne 0 ]; then        echo "$APP_MAIN already started(PID=$PID)"
        echo "================================================================================================================"
    else        echo -n "Starting $APP_MAIN"
         if [ ! -d "../$APP_LOG" ]; then            mkdir "../$APP_LOG"
         fi        nohup python $APP_MAIN > ../$APP_LOG/nohup.log 2>&1 &
        sleep 2
        getPID        if [ $PID -ne 0 ]; then            echo "(PID=$PID)...[Success]"
            echo "================================================================================================================"
        else            echo "[Failed]"
            echo "================================================================================================================"
        fi
    fi}startup

停止脚本:

#!/bin/shAPP_MAIN=backup_serverPID=0

getPID(){
    pythonps=`ps aux | grep $APP_MAIN | grep -v grep`
    if [ -n "$pythonps" ]; then        PID=`echo $pythonps | awk '{print $2}'`
    else        PID=0    fi}shutdown(){
    getPID    echo "================================================================================================================"
    if [ $PID -ne 0 ]; then        echo -n "Stopping $APP_MAIN(PID=$PID)..."
        kill -9 $PID
        if [ $? -eq 0 ]; then            echo "[Success]"
            echo "================================================================================================================"
        else            echo "[Failed]"
            echo "================================================================================================================"
        fi        getPID        if [ $PID -ne 0 ]; then            shutdown        fi
    else        echo "$APP_MAIN is not running"
        echo "================================================================================================================"
    fi}shutdownexit 0

查看服务状态

#!/bin/shAPP_MAIN=backup_serverPID=0

getPID(){
    pythonps=`ps aux | grep $APP_MAIN | grep -v grep`
    if [ -n "$pythonps" ]; then        PID=`echo $pythonps | awk '{print $2}'`
    else        PID=0    fi}getServerStatus(){
    getPID    echo "================================================================================================================"
    if [ $PID -ne 0 ]; then        echo "$APP_MAIN is running(PID=$PID)"
        echo "================================================================================================================"
    else        echo "$APP_MAIN is not running"
        echo "================================================================================================================"
    fi}getServerStatus

本文地址

参考资料


© 著作权归作者所有

python测试开发人工智能安全
粉丝 206
博文 105
码字总数 391361
作品 0
邵阳
QA/测试工程师
私信 提问
每日备份JENKINS_HOME至SVN

每日备份JENKINS_HOME至版本控制系统SVN Jenkins是一个可扩展的开源的持续集成工具,也是当下最流行的持续集成工具。 易于安装(Easy installation) 易于配置(Easy configuration) 变更集支持...

donhui
2015/04/06
2.5K
0
svn提交自动同步到web服务器

同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器...

wddqing
2014/02/20
3.4K
0
利用SVN hooks +cURL, 对SVN服务器进行实时同步

团队协同开发,一般都要用到svn, svn确实是个好东东。但一些程序员做测试都是在开发服务器上进行,所以开发同学提交到svn的代码 ,还需一步,就是手工更新到开发服务器。 一般的办法是,就是用...

基督山伯爵
2013/03/01
1K
0
Jenkins 持续化部署实例

开始本篇章之前介绍一个写笔记的方法:康奈尔笔记法(新学的,很实用) 在此之前老大让它们弄一个web端更新的界面系统,本来我也打算用django+bootstrap+python实现,但是此时python和boots...

滕先生
2018/06/27
0
0
求svn增量备份,检查hook部署是否成功的python脚本

求svn增量备份,检查hook部署是否成功的python脚本

xurongzhong
2014/05/17
288
1

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部