python-erpdbcopy/bin/erpdbcopy

108 lines
4.2 KiB
Plaintext

#This file is part of ERP DB Copy. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import sys
import os
import optparse
import subprocess
import logging
from psycopg2 import connect
from erpdbcopy import version
LOG = '/var/log/erpdbcopy.log'
def psql_version():
"""Get PSQL version"""
psql_version = os.popen('psql --version',"r")
version = psql_version.readline().split( )[2]
return version
def create_db_copy(user, password, dbname, port=5432):
"""Create new database_test"""
logging.basicConfig(format='%(asctime)s %(message)s',
filename=LOG, level=logging.INFO)
logging.info('Start copy database: %s' % dbname)
logging.info('Create db copy: %s' % dbname)
version = psql_version()
if version < '9.2':
process = subprocess.Popen("""
export PGPASSWORD="erpdbcopy"
psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with superuser"
export PGPASSWORD=%(password)s
psql %(dbname)s -U %(user)s --quiet -c "select pg_terminate_backend(procpid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s'"
psql %(dbname)s_test -U %(user)s --quiet -c "select pg_terminate_backend(procpid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s_test'"
dropdb -U %(user)s %(dbname)s_test
createdb -U %(user)s -T %(dbname)s %(dbname)s_test -O %(user)s
export PGPASSWORD="erpdbcopy"
psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with nosuperuser"
export PGPASSWORD=""" % {'user': user, 'password': password, 'dbname': dbname}, shell=True)
process.wait()
else:
process = subprocess.Popen("""
export PGPASSWORD="erpdbcopy"
psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with superuser"
export PGPASSWORD=%(password)s
psql %(dbname)s -U %(user)s --quiet -c "select pg_terminate_backend(pid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s'"
psql %(dbname)s_test -U %(user)s --quiet -c "select pg_terminate_backend(pid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s_test'"
dropdb -U %(user)s %(dbname)s_test
createdb -U %(user)s -T %(dbname)s %(dbname)s_test -O %(user)s
export PGPASSWORD="erpdbcopy"
psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with nosuperuser"
export PGPASSWORD=""" % {'user': user, 'password': password, 'dbname': dbname}, shell=True)
process.wait()
try:
logging.info('Dissable crons copy: %s_test' % dbname)
conn = connect("dbname=%s_test user=%s password=%s port=%s" % (dbname, user, password, port))
cur = conn.cursor()
cur.execute("SELECT id FROM ir_cron WHERE active=True")
rows = cur.fetchall()
for row in rows:
cur.execute("UPDATE ir_cron SET active = False WHERE id = %s" % row[0])
conn.commit()
cur.close()
conn.close()
except:
logging.error('Dissable crons copy db: %s_test' % dbname)
pass
def parse_arguments(arguments):
parser = optparse.OptionParser(usage='erpdbcopy.py [options]', version=version.VERSION)
parser.add_option("-u", "--user", dest="user")
parser.add_option("-p", "--password", dest="password")
parser.add_option("-P", "--port", dest="port")
parser.add_option("-d", "--dbname", dest="dbname")
(opt, _) = parser.parse_args(arguments)
logging.basicConfig(format='%(asctime)s %(message)s',
filename=LOG, level=logging.INFO)
if not opt.user:
logging.info('Option user')
exit()
if not opt.password:
logging.info('Option password')
exit()
if not opt.dbname:
logging.info('Option dbname')
exit()
return opt
if __name__ == "__main__":
options = parse_arguments(sys.argv)
port = options.port
if port is None:
port = 5432
create_db_copy(user=options.user, password=options.password,
dbname=options.dbname, port=port)