mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2024-11-08 22:50:26 +00:00
122 lines
3.6 KiB
Python
Executable File
122 lines
3.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import time
|
|
import os.path
|
|
import traceback
|
|
|
|
from migrate.versioning import api
|
|
from config import SQLALCHEMY_DATABASE_URI
|
|
from config import SQLALCHEMY_MIGRATE_REPO
|
|
from app import db
|
|
from app.models import Role, Setting, DomainTemplate
|
|
|
|
|
|
def start():
|
|
wait_time = get_waittime_from_env()
|
|
|
|
if not connect_db(wait_time):
|
|
print("ERROR: Couldn't connect to database server")
|
|
exit(1)
|
|
|
|
init_records()
|
|
|
|
def get_waittime_from_env():
|
|
return int(os.environ.get('WAITFOR_DB', 1))
|
|
|
|
def connect_db(wait_time):
|
|
for i in range(0, wait_time):
|
|
print("INFO: Wait for database server")
|
|
sys.stdout.flush()
|
|
try:
|
|
db.create_all()
|
|
return True
|
|
except:
|
|
traceback.print_exc()
|
|
time.sleep(1)
|
|
|
|
return False
|
|
|
|
def init_roles(db, role_names):
|
|
|
|
# Get key name of data
|
|
name_of_roles = [r.name for r in role_names]
|
|
|
|
# Query to get current data
|
|
rows = db.session.query(Role).filter(Role.name.in_(name_of_roles)).all()
|
|
name_of_rows = [r.name for r in rows]
|
|
|
|
# Check which data that need to insert
|
|
roles = [r for r in role_names if r.name not in name_of_rows]
|
|
|
|
# Insert data
|
|
for role in roles:
|
|
db.session.add(role)
|
|
|
|
def init_settings(db, setting_names):
|
|
|
|
# Get key name of data
|
|
name_of_settings = [r.name for r in setting_names]
|
|
|
|
# Query to get current data
|
|
rows = db.session.query(Setting).filter(Setting.name.in_(name_of_settings)).all()
|
|
|
|
# Check which data that need to insert
|
|
name_of_rows = [r.name for r in rows]
|
|
settings = [r for r in setting_names if r.name not in name_of_rows]
|
|
|
|
# Insert data
|
|
for setting in settings:
|
|
db.session.add(setting)
|
|
|
|
|
|
def init_domain_templates(db, domain_template_names):
|
|
|
|
# Get key name of data
|
|
name_of_domain_templates = map(lambda r: r.name, domain_template_names)
|
|
|
|
# Query to get current data
|
|
rows = db.session.query(DomainTemplate).filter(DomainTemplate.name.in_(name_of_domain_templates)).all()
|
|
|
|
# Check which data that need to insert
|
|
name_of_rows = map(lambda r: r.name, rows)
|
|
domain_templates = filter(lambda r: r.name not in name_of_rows, domain_template_names)
|
|
|
|
# Insert data
|
|
for domain_template in domain_templates:
|
|
db.session.add(domain_template)
|
|
|
|
def init_records():
|
|
# Create initial user roles and turn off maintenance mode
|
|
init_roles(db, [
|
|
Role('Administrator', 'Administrator'),
|
|
Role('User', 'User')
|
|
])
|
|
init_settings(db, [
|
|
Setting('maintenance', 'False'),
|
|
Setting('fullscreen_layout', 'True'),
|
|
Setting('record_helper', 'True'),
|
|
Setting('login_ldap_first', 'True'),
|
|
Setting('default_record_table_size', '15'),
|
|
Setting('default_domain_table_size', '10'),
|
|
Setting('auto_ptr','False')
|
|
])
|
|
# TODO: add sample records to sample templates
|
|
init_domain_templates(db, [
|
|
DomainTemplate('basic_template_1', 'Basic Template #1'),
|
|
DomainTemplate('basic_template_2', 'Basic Template #2'),
|
|
DomainTemplate('basic_template_3', 'Basic Template #3')
|
|
])
|
|
db_commit = db.session.commit()
|
|
commit_version_control(db_commit)
|
|
|
|
def commit_version_control(db_commit):
|
|
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
|
|
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
|
|
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
|
elif db_commit is not None:
|
|
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))
|
|
|
|
if __name__ == '__main__':
|
|
start()
|