#!/usr/bin/env python import os import pkgutil import random import sys from getpass import getpass from flask_script import Manager, Command, Option from flask_migrate import Migrate, MigrateCommand from jinja2 import Template from werkzeug.security import generate_password_hash from ihatemoney.run import create_app from ihatemoney.models import db class GeneratePasswordHash(Command): """Get password from user and hash it without printing it in clear text.""" def run(self): password = getpass(prompt='Password: ') print(generate_password_hash(password)) class ConfigTemplate(Command): def get_options(self): return [ Option('config_file', choices=[ 'ihatemoney.cfg', 'apache-vhost.conf', 'gunicorn.conf.py', 'supervisord.conf', 'nginx.conf', ]), ] @staticmethod def gen_secret_key(): return ''.join([ random.SystemRandom().choice( 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]) def run(self, config_file): template_content = pkgutil.get_data( 'ihatemoney', os.path.join('conf-templates/', config_file) + '.j2' ).decode('utf-8') bin_path = os.path.join(os.path.dirname(sys.executable)) print(Template(template_content).render( pkg_path=os.path.abspath(os.path.dirname(__file__)), bin_path=bin_path, secret_key=self.gen_secret_key(), )) def main(): QUIET_COMMANDS = ('generate_password_hash', 'generate-config') backup_stderr = sys.stderr # Hack to divert stderr for commands generating content to stdout # to avoid confusing the user if len(sys.argv) > 1 and sys.argv[1] in QUIET_COMMANDS: sys.stderr = open(os.devnull, 'w') app = create_app() Migrate(app, db) # Restore stderr (among other: to be able to display help) sys.stderr = backup_stderr manager = Manager(app) manager.add_command('db', MigrateCommand) manager.add_command('generate_password_hash', GeneratePasswordHash) manager.add_command('generate-config', ConfigTemplate) manager.run() if __name__ == '__main__': main()