##// END OF EJS Templates
implemented gravatars to changesets, updated styling for changesets...
implemented gravatars to changesets, updated styling for changesets added email_or_none filter to webhelpers

File last commit:

r252:3782a6d6 default
r401:b1debb6c default
Show More
backup_manager.py
114 lines | 3.9 KiB | text/x-python | PythonLexer
licensing updates, code cleanups
r252 #!/usr/bin/env python
# encoding: utf-8
# mercurial repository backup manager
# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2
# of the License or (at your opinion) any later version of the license.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
"""
Created on Feb 28, 2010
Mercurial repositories backup manager
@author: marcink
"""
Marcin Kuzminski
backup script for repositories
r25 import logging
from mercurial import config
import tarfile
import os
import datetime
import sys
Marcin Kuzminski
backup script update
r28 import subprocess
Marcin Kuzminski
Added removing of files from data
r33 logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(levelname)-5.5s %(message)s")
Marcin Kuzminski
backup script for repositories
r25
class BackupManager(object):
Made repos path config configurable from pylons app configs. update Readme
r241 def __init__(self, id_rsa_path, repo_conf):
Marcin Kuzminski
Code refactoring, and changed proper way of removing files
r34 self.repos_path = None
self.backup_file_name = None
Made repos path config configurable from pylons app configs. update Readme
r241 self.id_rsa_path = id_rsa_path
Marcin Kuzminski
backup script update
r28 self.check_id_rsa()
Marcin Kuzminski
fixed the backup script path problems
r27 cur_dir = os.path.realpath(__file__)
Marcin Kuzminski
backup script for repositories
r25 dn = os.path.dirname
Marcin Kuzminski
fixed the backup script path problems
r27 self.backup_file_path = os.path.join(dn(dn(dn(cur_dir))), 'data')
Marcin Kuzminski
backup script for repositories
r25 cfg = config.config()
try:
Made repos path config configurable from pylons app configs. update Readme
r241 cfg.read(os.path.join(dn(dn(dn(cur_dir))), repo_conf))
Marcin Kuzminski
backup script for repositories
r25 except IOError:
Made repos path config configurable from pylons app configs. update Readme
r241 logging.error('Could not read %s', repo_conf)
Marcin Kuzminski
backup script for repositories
r25 sys.exit()
self.set_repos_path(cfg.items('paths'))
logging.info('starting backup for %s', self.repos_path)
logging.info('backup target %s', self.backup_file_path)
if not os.path.isdir(self.repos_path):
raise Exception('Not a valid directory in %s' % self.repos_path)
Marcin Kuzminski
backup script update
r28 def check_id_rsa(self):
if not os.path.isfile(self.id_rsa_path):
Marcin Kuzminski
Code refactoring, and changed proper way of removing files
r34 logging.error('Could not load id_rsa key file in %s',
self.id_rsa_path)
Marcin Kuzminski
backup script update
r28 sys.exit()
Marcin Kuzminski
backup script for repositories
r25 def set_repos_path(self, paths):
repos_path = paths[0][1].split('/')
if repos_path[-1] in ['*', '**']:
repos_path = repos_path[:-1]
if repos_path[0] != '/':
repos_path[0] = '/'
self.repos_path = os.path.join(*repos_path)
def backup_repos(self):
today = datetime.datetime.now().weekday() + 1
Marcin Kuzminski
backup script update
r28 self.backup_file_name = "mercurial_repos.%s.tar.gz" % today
bckp_file = os.path.join(self.backup_file_path, self.backup_file_name)
Marcin Kuzminski
backup script for repositories
r25 tar = tarfile.open(bckp_file, "w:gz")
Marcin Kuzminski
Code refactoring, and changed proper way of removing files
r34 for dir_name in os.listdir(self.repos_path):
logging.info('backing up %s', dir_name)
tar.add(os.path.join(self.repos_path, dir_name), dir_name)
Marcin Kuzminski
backup script for repositories
r25 tar.close()
Marcin Kuzminski
Litle info messages update
r26 logging.info('finished backup of mercurial repositories')
Marcin Kuzminski
backup script for repositories
r25
Marcin Kuzminski
backup script update
r28
def transfer_files(self):
params = {
'id_rsa_key': self.id_rsa_path,
'backup_file_path':self.backup_file_path,
'backup_file_name':self.backup_file_name,
}
fix bug in arguments for command
r39 cmd = ['scp', '-l', '40000', '-i', '%(id_rsa_key)s' % params,
Marcin Kuzminski
backup script update
r28 '%(backup_file_path)s/%(backup_file_name)s' % params,
'root@192.168.2.102:/backups/mercurial' % params]
Marcin Kuzminski
Changed to blocking operation
r35 subprocess.call(cmd)
Marcin Kuzminski
backup script update
r28 logging.info('Transfered file %s to %s', self.backup_file_name, cmd[4])
Marcin Kuzminski
Added removing of files from data
r33
def rm_file(self):
Marcin Kuzminski
Added message when file removing
r36 logging.info('Removing file %s', self.backup_file_name)
Marcin Kuzminski
Code refactoring, and changed proper way of removing files
r34 os.remove(os.path.join(self.backup_file_path, self.backup_file_name))
Marcin Kuzminski
Added removing of files from data
r33
Marcin Kuzminski
backup script update
r28
Marcin Kuzminski
backup script for repositories
r25 if __name__ == "__main__":
Made repos path config configurable from pylons app configs. update Readme
r241 B_MANAGER = BackupManager('/home/pylons/id_rsa', 'repositories.config')
Marcin Kuzminski
Code refactoring, and changed proper way of removing files
r34 B_MANAGER.backup_repos()
B_MANAGER.transfer_files()
B_MANAGER.rm_file()
Marcin Kuzminski
backup script for repositories
r25