comparison pylons_app/lib/backup_manager.py @ 434:bd3f341cad45

simplified and updated backup manager
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 27 Aug 2010 18:48:47 +0200
parents 3782a6d698af
children 9fe5ca6d72f6
comparison
equal deleted inserted replaced
433:aeafda5481e4 434:bd3f341cad45
24 @author: marcink 24 @author: marcink
25 """ 25 """
26 26
27 27
28 import logging 28 import logging
29 from mercurial import config
30 import tarfile 29 import tarfile
31 import os 30 import os
32 import datetime 31 import datetime
33 import sys 32 import sys
34 import subprocess 33 import subprocess
35 logging.basicConfig(level=logging.DEBUG, 34 logging.basicConfig(level=logging.DEBUG,
36 format="%(asctime)s %(levelname)-5.5s %(message)s") 35 format="%(asctime)s %(levelname)-5.5s %(message)s")
37 36
38 class BackupManager(object): 37 class BackupManager(object):
39 def __init__(self, id_rsa_path, repo_conf): 38 def __init__(self, repos_location, rsa_key, backup_server):
40 self.repos_path = None 39 today = datetime.datetime.now().weekday() + 1
41 self.backup_file_name = None 40 self.backup_file_name = "mercurial_repos.%s.tar.gz" % today
42 self.id_rsa_path = id_rsa_path 41
43 self.check_id_rsa() 42 self.id_rsa_path = self.get_id_rsa(rsa_key)
44 cur_dir = os.path.realpath(__file__) 43 self.repos_path = self.get_repos_path(repos_location)
45 dn = os.path.dirname 44 self.backup_server = backup_server
46 self.backup_file_path = os.path.join(dn(dn(dn(cur_dir))), 'data') 45
47 cfg = config.config() 46 self.backup_file_path = '/tmp'
48 try: 47
49 cfg.read(os.path.join(dn(dn(dn(cur_dir))), repo_conf))
50 except IOError:
51 logging.error('Could not read %s', repo_conf)
52 sys.exit()
53 self.set_repos_path(cfg.items('paths'))
54 logging.info('starting backup for %s', self.repos_path) 48 logging.info('starting backup for %s', self.repos_path)
55 logging.info('backup target %s', self.backup_file_path) 49 logging.info('backup target %s', self.backup_file_path)
56 50
57 if not os.path.isdir(self.repos_path):
58 raise Exception('Not a valid directory in %s' % self.repos_path)
59 51
60 def check_id_rsa(self): 52 def get_id_rsa(self, rsa_key):
61 if not os.path.isfile(self.id_rsa_path): 53 if not os.path.isfile(rsa_key):
62 logging.error('Could not load id_rsa key file in %s', 54 logging.error('Could not load id_rsa key file in %s', rsa_key)
63 self.id_rsa_path)
64 sys.exit() 55 sys.exit()
65 56
66 def set_repos_path(self, paths): 57 def get_repos_path(self, path):
67 repos_path = paths[0][1].split('/') 58 if not os.path.isdir(path):
68 if repos_path[-1] in ['*', '**']: 59 logging.error('Wrong location for repositories in %s', path)
69 repos_path = repos_path[:-1] 60 sys.exit()
70 if repos_path[0] != '/': 61 return path
71 repos_path[0] = '/'
72 self.repos_path = os.path.join(*repos_path)
73 62
74 def backup_repos(self): 63 def backup_repos(self):
75 today = datetime.datetime.now().weekday() + 1
76 self.backup_file_name = "mercurial_repos.%s.tar.gz" % today
77 bckp_file = os.path.join(self.backup_file_path, self.backup_file_name) 64 bckp_file = os.path.join(self.backup_file_path, self.backup_file_name)
78 tar = tarfile.open(bckp_file, "w:gz") 65 tar = tarfile.open(bckp_file, "w:gz")
79 66
80 for dir_name in os.listdir(self.repos_path): 67 for dir_name in os.listdir(self.repos_path):
81 logging.info('backing up %s', dir_name) 68 logging.info('backing up %s', dir_name)
86 73
87 74
88 def transfer_files(self): 75 def transfer_files(self):
89 params = { 76 params = {
90 'id_rsa_key': self.id_rsa_path, 77 'id_rsa_key': self.id_rsa_path,
91 'backup_file_path':self.backup_file_path, 78 'backup_file':os.path.join(self.backup_file_path,
92 'backup_file_name':self.backup_file_name, 79 self.backup_file_name),
80 'backup_server':self.backup_server
93 } 81 }
94 cmd = ['scp', '-l', '40000', '-i', '%(id_rsa_key)s' % params, 82 cmd = ['scp', '-l', '40000', '-i', '%(id_rsa_key)s' % params,
95 '%(backup_file_path)s/%(backup_file_name)s' % params, 83 '%(backup_file)s' % params,
96 'root@192.168.2.102:/backups/mercurial' % params] 84 '%(backup_server)s' % params]
97 85
98 subprocess.call(cmd) 86 subprocess.call(cmd)
99 logging.info('Transfered file %s to %s', self.backup_file_name, cmd[4]) 87 logging.info('Transfered file %s to %s', self.backup_file_name, cmd[4])
100 88
101 89
104 os.remove(os.path.join(self.backup_file_path, self.backup_file_name)) 92 os.remove(os.path.join(self.backup_file_path, self.backup_file_name))
105 93
106 94
107 95
108 if __name__ == "__main__": 96 if __name__ == "__main__":
109 B_MANAGER = BackupManager('/home/pylons/id_rsa', 'repositories.config') 97
98 repo_location = '/home/repo_path'
99 backup_server = 'root@192.168.1.100:/backups/mercurial'
100 rsa_key = '/home/id_rsa'
101
102 B_MANAGER = BackupManager(repo_location, rsa_key, backup_server)
110 B_MANAGER.backup_repos() 103 B_MANAGER.backup_repos()
111 B_MANAGER.transfer_files() 104 B_MANAGER.transfer_files()
112 B_MANAGER.rm_file() 105 B_MANAGER.rm_file()
113 106
114 107