]>
Commit | Line | Data |
---|---|---|
82981855 JP |
1 | #!/usr/bin/python |
2 | ||
6ddefa00 | 3 | import os, sys, time |
fe255fa9 JP |
4 | from mitsql import db |
5 | from mitsql.util import new_cursor, get_dbs, db_backup_pre, db_backup_mkdir | |
82981855 JP |
6 | from Queue import Queue, Empty |
7 | import threading | |
8 | import subprocess | |
9 | ||
10 | MYSQLDUMP_ARGS = ['--compact', '--add-drop-table', '--add-locks', | |
11 | '--create-options', '--disable-keys', '--dump-date', | |
12 | '--extended-insert', '--quick', | |
13 | '--no-autocommit', '--quote-names', '--routines', | |
14 | '--single-transaction', '--triggers', '--force'] | |
15 | ||
16 | finished = False | |
17 | queue = Queue() | |
18 | ||
19 | def consumer(): | |
20 | while True: | |
21 | try: | |
22 | next = queue.get(timeout=3) | |
cd14464c | 23 | print "Consuming", next |
4057614b | 24 | #print next[0] + ':', |
e4fd5e1b | 25 | log = db.Backup.get_by(db=next[0]) |
82981855 | 26 | if not log: |
e4fd5e1b | 27 | log = db.Backup(db=next[0]) |
82981855 | 28 | log.dump_path = next[1] |
e4fd5e1b | 29 | log.dump_date = db.func.now() |
82981855 JP |
30 | db_backup_mkdir(next[1]) |
31 | args = ['mysqldump', next[0]] | |
32 | args.extend(MYSQLDUMP_ARGS) | |
fe255fa9 JP |
33 | err = '' |
34 | try: | |
35 | p0 = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
36 | p1 = subprocess.Popen(['gzip'], stdin=p0.stdout, stdout=file(next[1], 'w+')) | |
37 | p1.wait() | |
38 | err = p0.stderr.read() | |
39 | except Exception, e: | |
cd14464c JP |
40 | print "Error on", next |
41 | print e | |
fe255fa9 | 42 | err = str(e) |
82981855 JP |
43 | if len(err): |
44 | log.dump_errnum = p0.returncode | |
45 | log.dump_errstr = err | |
46 | else: | |
47 | log.dump_errnum = None | |
48 | log.dump_errstr = None | |
49 | log.save_or_update() | |
e4fd5e1b | 50 | db.session.flush() |
4057614b | 51 | #print 'Done' |
82981855 | 52 | except (KeyboardInterrupt, SystemExit): |
cd14464c | 53 | print "Got exit request" |
82981855 JP |
54 | break |
55 | except Empty: | |
cd14464c | 56 | print "No queue." |
82981855 | 57 | if finished: |
cd14464c | 58 | print "Done!" |
82981855 JP |
59 | break |
60 | ||
61 | t_consumer = threading.Thread(target=consumer) | |
62 | t_consumer.start() | |
63 | ||
64 | def producer(): | |
65 | c = new_cursor('mysqldump') | |
fe255fa9 JP |
66 | for dbname in get_dbs(c): |
67 | log = db.Backup.get_by(db=dbname) | |
82981855 | 68 | if not log: |
fe255fa9 | 69 | log = db.Backup(db=dbname) |
4057614b | 70 | elif log.skip_date and log.skip_date.timetuple: |
6ddefa00 JP |
71 | if time.mktime(log.skip_date.timetuple()) + 3600 > time.time(): |
72 | # never recheck a db skipped in the past hour | |
73 | continue | |
fe255fa9 | 74 | d = db_backup_pre(c, dbname) |
82981855 | 75 | if d[0]: |
fe255fa9 | 76 | queue.put((dbname, d[1])) |
82981855 JP |
77 | log.skip_reason = None |
78 | log.skip_date = None | |
79 | else: | |
80 | log.skip_reason = d[1] | |
e4fd5e1b | 81 | log.skip_date = db.func.now() |
82981855 | 82 | log.save_or_update() |
e4fd5e1b | 83 | #db.session.flush() |
82981855 JP |
84 | |
85 | try: | |
86 | producer() | |
87 | except KeyboardInterrupt: | |
88 | sys.exit(1) | |
89 | finally: | |
90 | finished = True |