def restore(config, srcdir): if 'dest' in config: dest = config['dest'] else: dest = config['dir'] srcdir = os.path.join(srcdir, config['project']) if os.path.exists(srcdir): run_hook('pre-restore-code', [config['project'], dest], logger=logger) logger.info("deleting '%(dest)s'" % {'dest': dest}) rmtree_silent(dest) os.makedirs(dest) logger.info("copying '%(src)s' to '%(dest)s'" % { 'src': srcdir, 'dest': dest }) copytree(srcdir, dest, symlinks=True, keepdst=True) run_hook('post-restore-code', [config['project'], dest], logger=logger) return dest else: logger.debug("'%(srcdir)s' don't exists, no code to restore" % {'srcdir': srcdir}) return None
def dump(config, savedir, symlink=False): if 'active' in config and config['active'] in ('false', 'off', '0'): return if 'src' in config: src = config['src'] else: src = config['dir'] if 'ignore' in config: ignore = ignore_patterns(*[p.strip() for p in config['ignore'].split(',')]) else: ignore = None run_hook('pre-create-code', [config['project'], src], logger=logger, exit_on_error=True) makedirs_silent(savedir) dest = os.path.join(savedir, config['project']) if symlink: logger.info("symlink '%(src)s' to '%(dest)s'" % {'src': src, 'dest': dest}) symlink_silent(src, dest) else: logger.info("copy '%(src)s' to '%(dest)s'" % {'src': src, 'dest': dest}) copytree(src, dest, symlinks=True, ignore=ignore) run_hook('post-create-code', [config['project'], src], logger=logger)
def dump(config, savedir, symlink=False): if 'active' in config and config['active'] in ('false', 'off', '0'): return if 'src' in config: src = config['src'] else: src = config['dir'] if 'ignore' in config: ignore = ignore_patterns( *[p.strip() for p in config['ignore'].split(',')]) else: ignore = None run_hook('pre-create-code', [config['project'], src], logger=logger, exit_on_error=True) makedirs_silent(savedir) dest = os.path.join(savedir, config['project']) if symlink: logger.info("symlink '%(src)s' to '%(dest)s'" % { 'src': src, 'dest': dest }) symlink_silent(src, dest) else: logger.info("copy '%(src)s' to '%(dest)s'" % { 'src': src, 'dest': dest }) copytree(src, dest, symlinks=True, ignore=ignore) run_hook('post-create-code', [config['project'], src], logger=logger)
def dump(config, rawtables, savedir): if 'active' in config and config['active'] in ('false', 'off', '0'): return makedirs_silent(savedir) dump = config['dump'].split() jobs = [] for database, tables in get_tables(rawtables or config['names']).iteritems(): if not tables: # database without a table: dump all cmd = dump + [database] output = file(os.path.join(savedir, database + '.dump'), 'w+b') errors = file(os.path.join(savedir, database + '.dump.log'), 'w') jobs.append({'cmd': cmd, 'args': {'stdout': output, 'stderr': errors}}) else: for table in tables: cmd = [] + dump # clone dump # Enclose table name in doubl quote qtable = '.'.join(['"%s"' % e for e in table.split('.')]) cmd += ['-n'] if config['use_schema'] in ('true', 'yes', '1') \ else ['-t'] cmd += [qtable, database] output = file(os.path.join(savedir, database + '.' + table + '.dump'), 'w+b') errors = file(os.path.join(savedir, database + '.' + table + '.dump.log'), 'w') jobs.append({'cmd': cmd, 'args': {'stdout': output, 'stderr': errors}}) for job in jobs: logger.info("dumping ('%(cmd)s') to '%(dest)s'" % { 'cmd': ' '.join(job['cmd']), 'dest': job['args']['stdout'].name }) p = subprocess.Popen(job['cmd'], **job['args']) exitcode = p.wait() if exitcode != 0: logger.error("dump error, see '%(errors)s'" % {'errors': job['args']['stderr'].name}) sys.exit(1) else: os.remove(job['args']['stderr'].name) run_hook('post-create-database', [savedir], logger=logger, exit_on_error=True)
def restore(config, srcdir): if not os.path.exists(srcdir): logger.debug("'%(srcdir)s' don't exists, no files to restore" % {'srcdir': srcdir}) return run_hook('pre-restore-files', logger=logger) for dest in get_dirs(config['dirs']): logger.info("deleting '%(dest)s'" % {'dest': dest}) rmtree_silent(dest) # first '/' removed in second arg src = os.path.join(srcdir, dest[1:]) logger.info("copying '%(src)s' to '%(dest)s'" % {'src': src, 'dest': dest}) copytree(src, dest, symlinks=True) run_hook('post-restore-files', logger=logger)
def restore(config, codedir): if "active" in config and config["active"] in ("false", "off", "0"): logger.debug("apache is deactivated in config file, nothing to restore") return if not os.path.exists(os.path.dirname(config["dest"])): logger.error("'%(dir)s' do not exists" % {"dir": config["dest"]}) sys.exit(1) run_hook("pre-restore-apache", logger=logger) f = file(config["dest"], "w") if "content" not in config: f.write( "Include %(codedir)s/%(project)s/apache/*.conf\n" % {"codedir": os.path.normpath(codedir), "project": config["project"]} ) else: f.write(config["content"]) f.close() run_hook("post-restore-apache", logger=logger)
def restore(config, codedir): if 'active' in config and config['active'] in ('false', 'off', '0'): logger.debug( "apache is deactivated in config file, nothing to restore") return if not os.path.exists(os.path.dirname(config['dest'])): logger.error("'%(dir)s' do not exists" % {'dir': config['dest']}) sys.exit(1) run_hook('pre-restore-apache', logger=logger) f = file(config['dest'], 'w') if 'content' not in config: f.write("Include %(codedir)s/%(project)s/apache/*.conf\n" % { 'codedir': os.path.normpath(codedir), 'project': config['project'] }) else: f.write(config['content']) f.close() run_hook('post-restore-apache', logger=logger)
def restore(config, srcdir): if 'dest' in config: dest = config['dest'] else: dest = config['dir'] srcdir = os.path.join(srcdir, config['project']) if os.path.exists(srcdir): run_hook('pre-restore-code', [config['project'], dest], logger=logger) logger.info("deleting '%(dest)s'" % {'dest': dest}) rmtree_silent(dest) os.makedirs(dest) logger.info("copying '%(src)s' to '%(dest)s'" % {'src': srcdir, 'dest': dest}) copytree(srcdir, dest, symlinks=True, keepdst=True) run_hook('post-restore-code', [config['project'], dest], logger=logger) return dest else: logger.debug("'%(srcdir)s' don't exists, no code to restore" % {'srcdir': srcdir}) return None
def restore(config, srcdir): if not os.path.exists(srcdir): logger.debug("'%(srcdir)s' don't exists, no database to restore" % {'srcdir': srcdir}) return restore_tmp = config['restore_tmp'].split() restore_table = config['restore_table'].split() psql = config['psql'].split() drop = config['drop'].split() createdb = config['createdb'].split() run_hook('pre-restore-database', get_tables_from_dir(srcdir).keys(), logger=logger) swapjobs = [] for database, tables in get_tables_from_dir(srcdir).iteritems(): if not tables: # database without a table: restore all database dumpfile = os.path.join(srcdir, database + '.dump') tmpdatabase = database + '_deploy_tmp' drop_database(tmpdatabase, dropcmd=drop, psqlcmd=psql) run_job(createdb + ("%(dbname)s" % {'dbname': tmpdatabase}).split()) run_job(restore_tmp + ("%(dbname)s %(dump)s" % {'dbname': tmpdatabase, 'dump': dumpfile}).split()) if database_exists(database, psqlcmd=psql): swapjobs.append("DROP DATABASE %(newname)s;" % {'newname': database}) swapjobs.append("ALTER DATABASE %(oldname)s RENAME TO %(newname)s;" % { 'newname': database, 'oldname': tmpdatabase }) else: # restore a table for table in tables: dumpfile = os.path.join(srcdir, database + '.' + table + '.dump') truncate_table( database, table, psqlcmd=psql, is_schema=config['use_schema'] in ('true', 'yes', '1') ) run_job(restore_table + ['-d', database, dumpfile]) if swapjobs: run_hook('pre-restore-database-swap', get_tables_from_dir(srcdir).keys(), logger=logger) basecmd = psql + "-d template1 -c".split() for cmd in swapjobs: run_job(basecmd + ['%s' % cmd]) run_hook('post-restore-database-swap', get_tables_from_dir(srcdir).keys(), logger=logger) run_hook('post-restore-database', get_tables_from_dir(srcdir).keys(), logger=logger)