108 lines
4.2 KiB
Plaintext
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)
|
|
|