| #!/usr/bin/env python3 |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| WARBLE_VERSION = '0.1.0' # ABI/API compat demarcation. |
| WARBLE_DB_VERSION = 1 # First DB version evah! |
| |
| import sys |
| |
| if sys.version_info <= (3, 3): |
| print("This script requires Python 3.4 or higher") |
| sys.exit(-1) |
| |
| import os |
| import sys |
| |
| # Test for additional imports, bork if not found |
| try: |
| import yaml |
| import bcrypt |
| import sqlite3 |
| except: |
| print("Looks like you are missing a few python 3 libraries") |
| print("Warble needs the following py3 libs to work: yaml, bcrypt, sqlite3") |
| print("Please install these libraries before continuing") |
| sys.exit(-1) |
| |
| # Figure out absolute setup and api paths |
| setup_path = os.path.dirname(os.path.realpath(__file__)) |
| api_path = os.path.realpath("%s/../api" % setup_path) |
| db_path = os.path.realpath("%s/../db" % setup_path) |
| |
| # Open the DB setup instructions and sample warble server config |
| dbsetup = yaml.load(open("%s/dbs.yaml" % setup_path)) |
| myyaml = yaml.load(open("%s/warble.yaml.sample" % setup_path)) |
| |
| # Set up database path |
| datapath = input("Where would you like to put the Warble databases?: [%s]" % db_path).strip() |
| if not datapath: |
| datapath = db_path |
| print("Creating databases...") |
| if not os.path.isdir(datapath): |
| print("Creating directory %s" % datapath) |
| try: |
| os.mkdir(datapath) |
| except Exception as err: |
| print("Could not create database directory: %s" % err) |
| sys.exit(-1) |
| |
| # Set up individual databases (sqlite only for now!!) |
| for name, settings in dbsetup.items(): |
| if settings['driver'] == 'sqlite': |
| db_filepath = os.path.join(datapath, settings['path']) |
| if os.path.exists(db_filepath): |
| print("Database %s already exists, skipping!" % db_filepath) |
| continue |
| else: |
| print("Creating database file %s" % db_filepath) |
| conn = sqlite3.connect(db_filepath) |
| cursor = conn.cursor() |
| # create a CREATE statement from the yaml layout |
| cstate = "CREATE TABLE %s (%s)" % ( |
| name, |
| ", ".join( ["%s %s" % (k, v) for k, v in settings['layout'].items()] ) |
| ) |
| cursor.execute(cstate) |
| conn.commit() |
| conn.close() |
| |
| # Generate a super user |
| supername = input("Please enter the username of the primary super user to create [admin]: ").strip() |
| if not supername: |
| supername = 'admin' |
| superpass = input("Please enter the password for the super user account: ").strip() |
| |
| # Digest pass with bcrypt |
| salt = bcrypt.gensalt() |
| pwd = bcrypt.hashpw(superpass.encode('utf-8'), salt).decode('ascii') |
| |
| # Save user to new DB |
| db_filepath = os.path.join(datapath, 'accounts.db') |
| conn = sqlite3.connect(db_filepath) |
| c = conn.cursor() |
| try: |
| c.execute("INSERT INTO `accounts` (`userid`, `password`, `superuser`) VALUES (?, ?, 1)", (supername, pwd)) |
| conn.commit() |
| print("Saved new super user account %s in %s" % (supername, db_filepath)) |
| except sqlite3.IntegrityError: |
| print("WARNING: Could not add super user - is the user already in the DB?!") |
| conn.close() |
| |
| |
| # Write new warble yaml config |
| warble_yaml_path = '%s/yaml/warble.yaml' % api_path |
| print("Writing API server config to %s" % warble_yaml_path) |
| if os.path.exists(warble_yaml_path): |
| print("WARNING: Warble YAML already exists on disk, skipping this step!!") |
| else: |
| myconfig = { |
| 'database': { |
| 'version': WARBLE_DB_VERSION, |
| 'driver': 'sqlite', |
| 'path': datapath |
| }, |
| 'mail': { |
| 'host': 'localhost', |
| 'port': 25, |
| 'sender': 'Apache Warble<warble@demo.warble.xyz>' |
| } |
| } |
| with open(warble_yaml_path, "w") as f: |
| f.write(yaml.dump(myconfig, default_flow_style = False)) |
| f.close() |
| |
| |
| print("All done, Warble should...work now :)") |
| print("If needed, you can fine tune %s to suit your needs." % warble_yaml_path) |
| |