Refactor duplicate code for calling into media controls
[WebKit-https.git] / Websites / perf.webkit.org / tools / setup-database.py
1 #!/usr/bin/python
2
3 import json
4 import os
5 import shutil
6 import subprocess
7 import sys
8 import time
9
10
11 def main():
12     if len(sys.argv) <= 1:
13         sys.exit('Specify the database directory')
14
15     database_dir = os.path.abspath(sys.argv[1])
16     if os.path.exists(database_dir) and not os.path.isdir(database_dir):
17         sys.exit('The specified path is not a directory')
18
19     database_config = load_database_config()
20
21     database_name = database_config['name']
22     username = database_config['username']
23     password = database_config['password']
24
25     psql_dir = determine_psql_dir()
26
27     print "Initializing database at %s" % database_dir
28     execute_psql_command(psql_dir, 'initdb', [database_dir])
29
30     print "Starting postgres at %s" % database_dir
31     start_or_stop_database(psql_dir, database_dir, 'start')
32     postgres_is_running = False
33     for unused in range(0, 5):
34         try:
35             execute_psql_command(psql_dir, 'psql', ['--list', '--host', 'localhost'], suppressStdout=True)
36             postgres_is_running = True
37         except subprocess.CalledProcessError:
38             time.sleep(0.5)
39
40     if not postgres_is_running:
41         sys.exit('Postgres failed to start in time')
42     print 'Postgres is running!'
43
44     done = False
45     try:
46         print "Creating database: %s" % database_name
47         execute_psql_command(psql_dir, 'createdb', [database_name, '--host', 'localhost'])
48
49         print "Creating user: %s" % username
50         execute_psql_command(psql_dir, 'psql', [database_name, '--host', 'localhost', '--command',
51             "create role \"%s\" with nosuperuser login encrypted password '%s';" % (username, password)])
52
53         print "Granting all access on %s to %s" % (database_name, username)
54         execute_psql_command(psql_dir, 'psql', [database_name, '--host', 'localhost', '--command',
55             'grant all privileges on database "%s" to "%s";' % (database_name, username)])
56
57         print "Successfully configured postgres database %s at %s" % (database_name, database_dir)
58
59         done = True
60     except Exception as exception:
61         start_or_stop_database(psql_dir, database_dir, 'stop')
62         shutil.rmtree(database_dir)
63         raise exception
64
65     sys.exit(0)
66
67
68 def load_database_config():
69     config_json_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../config.json'))
70     with open(config_json_path) as config_json_file:
71         database_config = json.load(config_json_file).get('database')
72
73     if database_config.get('host') != 'localhost':
74         sys.exit('Cannot setup a database on a remote machine')
75
76     return database_config
77
78
79 def determine_psql_dir():
80     psql_dir = ''
81     try:
82         subprocess.check_output(['initdb', '--version'])
83     except OSError:
84         psql_dir = '/Applications/Server.app/Contents/ServerRoot/usr/bin/'
85         try:
86             subprocess.check_output([psql_dir + 'initdb', '--version'])
87         except OSError:
88             sys.exit('Cannot find psql')
89     return psql_dir
90
91
92 def start_or_stop_database(psql_dir, database_dir, command):
93     execute_psql_command(psql_dir, 'pg_ctl', ['-D', database_dir,
94         '-l', os.path.join(database_dir, 'logfile'),
95         '-o', '-k ' + database_dir,
96         command])
97
98
99 def execute_psql_command(psql_dir, command, args=[], suppressStdout=False):
100     return subprocess.check_output([os.path.join(psql_dir, command)] + args,
101         stderr=subprocess.STDOUT if suppressStdout else None)
102
103
104 if __name__ == "__main__":
105     main()