docker-ckan/rootfs/setup/app/prerun.py

187 lines
5.3 KiB
Python
Raw Normal View History

2016-08-25 22:05:30 +02:00
import os
import sys
import subprocess
import psycopg2
import urllib2
import re
2016-08-25 22:05:30 +02:00
2019-01-10 23:25:02 +01:00
import time
2016-08-25 22:05:30 +02:00
2016-08-25 22:10:24 +02:00
ckan_ini = os.environ.get('CKAN_INI', '/srv/app/production.ini')
2016-08-25 22:05:30 +02:00
RETRY = 5
def check_db_connection(retry=None):
2016-08-26 10:44:49 +02:00
2019-01-10 23:25:02 +01:00
print '[prerun] Start check_db_connection...'
if retry is None:
retry = RETRY
elif retry == 0:
print '[prerun] Giving up after 5 tries...'
sys.exit(1)
2016-08-26 10:44:49 +02:00
conn_str = os.environ.get('CKAN_SQLALCHEMY_URL', '')
try:
connection = psycopg2.connect(conn_str)
2016-08-26 10:44:49 +02:00
except psycopg2.Error as e:
print str(e)
print '[prerun] Unable to connect to the database...try again in a while.'
import time
time.sleep(10)
check_db_connection(retry = retry - 1)
else:
connection.close()
2016-08-26 10:44:49 +02:00
def check_solr_connection(retry=None):
2016-08-26 10:44:49 +02:00
2019-01-10 23:25:02 +01:00
print '[prerun] Start check_solr_connection...'
if retry is None:
retry = RETRY
elif retry == 0:
print '[prerun] Giving up after 5 tries...'
sys.exit(1)
2016-08-26 10:44:49 +02:00
url = os.environ.get('CKAN_SOLR_URL', '')
search_url = '{url}/select/?q=*&wt=json'.format(url=url)
2016-08-26 10:44:49 +02:00
try:
connection = urllib2.urlopen(search_url)
except urllib2.URLError as e:
print str(e)
print '[prerun] Unable to connect to solr...try again in a while.'
import time
time.sleep(10)
check_solr_connection(retry = retry - 1)
else:
2019-01-10 23:25:02 +01:00
import re
conn_info = connection.read()
conn_info = re.sub(r'"zkConnected":true', '"zkConnected":True', conn_info)
eval(conn_info)
2016-08-25 22:05:30 +02:00
def init_db():
2019-01-10 23:25:02 +01:00
print '[prerun] Start init_db...'
db_command = ['paster', '--plugin=ckan', 'db', 'init', '-c', ckan_ini]
2019-01-10 23:25:02 +01:00
print '[prerun] Initializing or upgrading db - start using paster db init'
2016-08-25 22:05:30 +02:00
try:
2019-01-10 23:25:02 +01:00
# run init scripts
2016-08-25 22:05:30 +02:00
subprocess.check_output(db_command, stderr=subprocess.STDOUT)
2016-08-25 22:05:30 +02:00
print '[prerun] Initializing or upgrading db - end'
except subprocess.CalledProcessError, e:
if 'OperationalError' in e.output:
print e.output
print '[prerun] Database not ready, waiting a bit before exit...'
import time
time.sleep(5)
sys.exit(1)
else:
print e.output
raise e
2019-01-10 23:25:02 +01:00
print '[prerun] Initializing or upgrading db - finish'
2016-08-25 22:05:30 +02:00
def init_datastore():
conn_str = os.environ.get('CKAN_DATASTORE_WRITE_URL')
if not conn_str:
print '[prerun] Skipping datastore initialization'
return
datastore_perms_command = ['paster', '--plugin=ckan', 'datastore',
'set-permissions', '-c', ckan_ini]
connection = psycopg2.connect(conn_str)
cursor = connection.cursor()
print '[prerun] Initializing datastore db - start'
try:
datastore_perms = subprocess.Popen(
datastore_perms_command,
stdout=subprocess.PIPE)
perms_sql = datastore_perms.stdout.read()
# Remove internal pg command as psycopg2 does not like it
perms_sql = re.sub('\\\\connect \"(.*)\"', '', perms_sql)
cursor.execute(perms_sql)
for notice in connection.notices:
print notice
connection.commit()
print '[prerun] Initializing datastore db - end'
print datastore_perms.stdout.read()
except psycopg2.Error as e:
print '[prerun] Could not initialize datastore'
print str(e)
except subprocess.CalledProcessError, e:
if 'OperationalError' in e.output:
print e.output
print '[prerun] Database not ready, waiting a bit before exit...'
time.sleep(5)
sys.exit(1)
else:
print e.output
raise e
finally:
cursor.close()
connection.close()
2016-08-25 22:05:30 +02:00
def create_sysadmin():
2019-01-10 23:25:02 +01:00
print '[prerun] Start create_sysadmin...'
2016-08-25 22:05:30 +02:00
name = os.environ.get('CKAN_SYSADMIN_NAME')
password = os.environ.get('CKAN_SYSADMIN_PASSWORD')
email = os.environ.get('CKAN_SYSADMIN_EMAIL')
if name and password and email:
# Check if user exists
command = ['paster', '--plugin=ckan', 'user', name, '-c', ckan_ini]
out = subprocess.check_output(command)
if 'User:None' not in re.sub(r'\s', '', out):
2016-08-25 22:05:30 +02:00
print '[prerun] Sysadmin user exists, skipping creation'
return
# Create user
command = ['paster', '--plugin=ckan', 'user', 'add',
name,
'password=' + password,
'email=' + email,
'-c', ckan_ini]
subprocess.call(command)
print '[prerun] Created user {0}'.format(name)
# Make it sysadmin
command = ['paster', '--plugin=ckan', 'sysadmin', 'add',
name,
'-c', ckan_ini]
subprocess.call(command)
print '[prerun] Made user {0} a sysadmin'.format(name)
if __name__ == '__main__':
maintenance = os.environ.get('MAINTENANCE_MODE', '').lower() == 'true'
if maintenance:
print '[prerun] Maintenance mode, skipping setup...'
else:
check_db_connection()
check_solr_connection()
2016-08-25 22:05:30 +02:00
init_db()
if os.environ.get('CKAN_DATASTORE_WRITE_URL'):
init_datastore()
2016-08-25 22:05:30 +02:00
create_sysadmin()
2019-01-10 23:25:02 +01:00
#time.sleep(60000) # don't end the prerun script to allow container dock and debug