annotate pylons_app/lib/backup_manager.py @ 125:2811259dc12d

Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 29 Apr 2010 01:26:20 +0200
parents 787e7d307b69
children 48727add84c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
1 '''BACKUP MANAGER'''
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
2 import logging
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
3 from mercurial import config
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
4 import tarfile
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
5 import os
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
6 import datetime
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
7 import sys
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
8 import subprocess
33
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
9 logging.basicConfig(level=logging.DEBUG,
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
10 format="%(asctime)s %(levelname)-5.5s %(message)s")
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
11
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
12 class BackupManager(object):
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
13 def __init__(self):
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
14 self.repos_path = None
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
15 self.backup_file_name = None
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
16 self.id_rsa_path = '/home/pylons/id_rsa'
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
17 self.check_id_rsa()
27
8f29ddc4c147 fixed the backup script path problems
Marcin Kuzminski
parents: 26
diff changeset
18 cur_dir = os.path.realpath(__file__)
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
19 dn = os.path.dirname
27
8f29ddc4c147 fixed the backup script path problems
Marcin Kuzminski
parents: 26
diff changeset
20 self.backup_file_path = os.path.join(dn(dn(dn(cur_dir))), 'data')
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
21 cfg = config.config()
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
22 try:
27
8f29ddc4c147 fixed the backup script path problems
Marcin Kuzminski
parents: 26
diff changeset
23 cfg.read(os.path.join(dn(dn(dn(cur_dir))), 'hgwebdir.config'))
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
24 except IOError:
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
25 logging.error('Could not read hgwebdir.config')
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
26 sys.exit()
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
27 self.set_repos_path(cfg.items('paths'))
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
28 logging.info('starting backup for %s', self.repos_path)
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
29 logging.info('backup target %s', self.backup_file_path)
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
30
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
31 if not os.path.isdir(self.repos_path):
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
32 raise Exception('Not a valid directory in %s' % self.repos_path)
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
33
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
34 def check_id_rsa(self):
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
35 if not os.path.isfile(self.id_rsa_path):
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
36 logging.error('Could not load id_rsa key file in %s',
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
37 self.id_rsa_path)
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
38 sys.exit()
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
39
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
40 def set_repos_path(self, paths):
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
41 repos_path = paths[0][1].split('/')
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
42 if repos_path[-1] in ['*', '**']:
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
43 repos_path = repos_path[:-1]
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
44 if repos_path[0] != '/':
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
45 repos_path[0] = '/'
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
46 self.repos_path = os.path.join(*repos_path)
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
47
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
48 def backup_repos(self):
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
49 today = datetime.datetime.now().weekday() + 1
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
50 self.backup_file_name = "mercurial_repos.%s.tar.gz" % today
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
51 bckp_file = os.path.join(self.backup_file_path, self.backup_file_name)
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
52 tar = tarfile.open(bckp_file, "w:gz")
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
53
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
54 for dir_name in os.listdir(self.repos_path):
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
55 logging.info('backing up %s', dir_name)
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
56 tar.add(os.path.join(self.repos_path, dir_name), dir_name)
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
57 tar.close()
26
b3307ca60bfb Litle info messages update
Marcin Kuzminski
parents: 25
diff changeset
58 logging.info('finished backup of mercurial repositories')
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
59
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
60
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
61
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
62 def transfer_files(self):
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
63 params = {
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
64 'id_rsa_key': self.id_rsa_path,
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
65 'backup_file_path':self.backup_file_path,
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
66 'backup_file_name':self.backup_file_name,
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
67 }
39
787e7d307b69 fix bug in arguments for command
marcink
parents: 38
diff changeset
68 cmd = ['scp', '-l', '40000', '-i', '%(id_rsa_key)s' % params,
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
69 '%(backup_file_path)s/%(backup_file_name)s' % params,
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
70 'root@192.168.2.102:/backups/mercurial' % params]
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
71
35
c92f827280a3 Changed to blocking operation
Marcin Kuzminski <marcin@python-blog.com>
parents: 34
diff changeset
72 subprocess.call(cmd)
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
73 logging.info('Transfered file %s to %s', self.backup_file_name, cmd[4])
33
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
74
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
75
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
76 def rm_file(self):
36
846e2d8672c4 Added message when file removing
Marcin Kuzminski <marcin@python-blog.com>
parents: 35
diff changeset
77 logging.info('Removing file %s', self.backup_file_name)
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
78 os.remove(os.path.join(self.backup_file_path, self.backup_file_name))
33
22b2234e51cd Added removing of files from data
Marcin Kuzminski <marcin@python-blog.com>
parents: 29
diff changeset
79
28
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
80
fd0c6fa2df82 backup script update
Marcin Kuzminski
parents: 27
diff changeset
81
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
82 if __name__ == "__main__":
34
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
83 B_MANAGER = BackupManager()
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
84 B_MANAGER.backup_repos()
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
85 B_MANAGER.transfer_files()
b4b25ece7797 Code refactoring, and changed proper way of removing files
Marcin Kuzminski <marcin@python-blog.com>
parents: 33
diff changeset
86 B_MANAGER.rm_file()
25
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
87
e89967ca7f68 backup script for repositories
Marcin Kuzminski
parents:
diff changeset
88