| #!/usr/bin/python |
| |
| import json |
| import os |
| import shutil |
| import subprocess |
| import sys |
| import time |
| |
| |
| def main(): |
| if len(sys.argv) <= 1: |
| sys.exit('Specify the database directory') |
| |
| database_dir = os.path.abspath(sys.argv[1]) |
| if os.path.exists(database_dir) and not os.path.isdir(database_dir): |
| sys.exit('The specified path is not a directory') |
| |
| database_config = load_database_config() |
| |
| database_name = database_config['name'] |
| username = database_config['username'] |
| password = database_config['password'] |
| |
| psql_dir = determine_psql_dir() |
| |
| print "Initializing database at %s" % database_dir |
| execute_psql_command(psql_dir, 'initdb', [database_dir]) |
| |
| print "Starting postgres at %s" % database_dir |
| start_or_stop_database(psql_dir, database_dir, 'start') |
| postgres_is_running = False |
| for unused in range(0, 5): |
| try: |
| execute_psql_command(psql_dir, 'psql', ['--list', '--host', 'localhost'], suppressStdout=True) |
| postgres_is_running = True |
| except subprocess.CalledProcessError: |
| time.sleep(0.5) |
| |
| if not postgres_is_running: |
| sys.exit('Postgres failed to start in time') |
| print 'Postgres is running!' |
| |
| done = False |
| try: |
| print "Creating database: %s" % database_name |
| execute_psql_command(psql_dir, 'createdb', [database_name, '--host', 'localhost']) |
| |
| print "Creating user: %s" % username |
| execute_psql_command(psql_dir, 'psql', [database_name, '--host', 'localhost', '--command', |
| "create role \"%s\" with nosuperuser login encrypted password '%s';" % (username, password)]) |
| |
| print "Granting all access on %s to %s" % (database_name, username) |
| execute_psql_command(psql_dir, 'psql', [database_name, '--host', 'localhost', '--command', |
| 'grant all privileges on database "%s" to "%s";' % (database_name, username)]) |
| |
| print "Successfully configured postgres database %s at %s" % (database_name, database_dir) |
| |
| done = True |
| except Exception as exception: |
| start_or_stop_database(psql_dir, database_dir, 'stop') |
| shutil.rmtree(database_dir) |
| raise exception |
| |
| sys.exit(0) |
| |
| |
| def load_database_config(): |
| config_json_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../config.json')) |
| with open(config_json_path) as config_json_file: |
| database_config = json.load(config_json_file).get('database') |
| |
| if database_config.get('host') != 'localhost': |
| sys.exit('Cannot setup a database on a remote machine') |
| |
| return database_config |
| |
| |
| def determine_psql_dir(): |
| psql_dir = '' |
| try: |
| subprocess.check_output(['initdb', '--version']) |
| except OSError: |
| psql_dir = '/Applications/Server.app/Contents/ServerRoot/usr/bin/' |
| try: |
| subprocess.check_output([psql_dir + 'initdb', '--version']) |
| except OSError: |
| sys.exit('Cannot find psql') |
| return psql_dir |
| |
| |
| def start_or_stop_database(psql_dir, database_dir, command): |
| execute_psql_command(psql_dir, 'pg_ctl', ['-D', database_dir, |
| '-l', os.path.join(database_dir, 'logfile'), |
| '-o', '-k ' + database_dir, |
| command]) |
| |
| |
| def execute_psql_command(psql_dir, command, args=[], suppressStdout=False): |
| return subprocess.check_output([os.path.join(psql_dir, command)] + args, |
| stderr=subprocess.STDOUT if suppressStdout else None) |
| |
| |
| if __name__ == "__main__": |
| main() |