db_manage.py
265 lines
| 9.1 KiB
| text/x-python
|
PythonLexer
r252 | #!/usr/bin/env python | |||
# encoding: utf-8 | ||||
# database managment for hg app | ||||
# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com> | ||||
r351 | # | |||
r252 | # This program is free software; you can redistribute it and/or | |||
# modify it under the terms of the GNU General Public License | ||||
# as published by the Free Software Foundation; version 2 | ||||
# of the License or (at your opinion) any later version of the license. | ||||
# | ||||
# This program is distributed in the hope that it will be useful, | ||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
# | ||||
# You should have received a copy of the GNU General Public License | ||||
# along with this program; if not, write to the Free Software | ||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||||
# MA 02110-1301, USA. | ||||
""" | ||||
Created on April 10, 2010 | ||||
database managment and creation for hg app | ||||
@author: marcink | ||||
""" | ||||
r239 | from os.path import dirname as dn, join as jn | |||
r249 | import os | |||
import sys | ||||
r327 | import uuid | |||
r249 | ROOT = dn(dn(dn(os.path.realpath(__file__)))) | |||
sys.path.append(ROOT) | ||||
r239 | from pylons_app.lib.auth import get_crypt_password | |||
r351 | from pylons_app.lib.utils import ask_ok | |||
r239 | from pylons_app.model import init_model | |||
r417 | from pylons_app.model.db import User, Permission, HgAppUi, HgAppSettings, \ | |||
UserToPerm | ||||
r350 | from pylons_app.model import meta | |||
r239 | from sqlalchemy.engine import create_engine | |||
|
r59 | import logging | ||
r351 | log = logging.getLogger(__name__) | |||
|
r66 | |||
r226 | class DbManage(object): | |||
r491 | def __init__(self, log_sql, dbname, tests=False): | |||
r459 | self.dbname = dbname | |||
self.tests = tests | ||||
r234 | dburi = 'sqlite:////%s' % jn(ROOT, self.dbname) | |||
r229 | engine = create_engine(dburi, echo=log_sql) | |||
r226 | init_model(engine) | |||
r350 | self.sa = meta.Session | |||
r243 | self.db_exists = False | |||
r226 | ||||
def check_for_db(self, override): | ||||
r229 | log.info('checking for exisiting db') | |||
r234 | if os.path.isfile(jn(ROOT, self.dbname)): | |||
r243 | self.db_exists = True | |||
r229 | log.info('database exisist') | |||
if not override: | ||||
r226 | raise Exception('database already exists') | |||
r229 | ||||
r226 | def create_tables(self, override=False): | |||
""" | ||||
Create a auth database | ||||
""" | ||||
self.check_for_db(override) | ||||
r229 | if override: | |||
log.info("database exisist and it's going to be destroyed") | ||||
r459 | if self.tests: | |||
r491 | destroy = True | |||
r459 | else: | |||
destroy = ask_ok('Are you sure to destroy old database ? [y/n]') | ||||
r351 | if not destroy: | |||
sys.exit() | ||||
if self.db_exists and destroy: | ||||
r243 | os.remove(jn(ROOT, self.dbname)) | |||
r351 | checkfirst = not override | |||
meta.Base.metadata.create_all(checkfirst=checkfirst) | ||||
r229 | log.info('Created tables for %s', self.dbname) | |||
|
r59 | |||
r226 | def admin_prompt(self): | |||
r459 | if not self.tests: | |||
import getpass | ||||
username = raw_input('Specify admin username:') | ||||
password = getpass.getpass('Specify admin password:') | ||||
r491 | email = raw_input('Specify admin email:') | |||
self.create_user(username, password, email, True) | ||||
r459 | else: | |||
log.info('creating admin and regular test users') | ||||
r491 | self.create_user('test_admin', 'test', 'test_admin@mail.com', True) | |||
self.create_user('test_regular', 'test', 'test_regular@mail.com', False) | ||||
self.create_user('test_regular2', 'test', 'test_regular2@mail.com', False) | ||||
r459 | ||||
r341 | ||||
r491 | def config_prompt(self, test_repo_path=''): | |||
r345 | log.info('Setting up repositories config') | |||
r226 | ||||
r459 | if not self.tests and not test_repo_path: | |||
path = raw_input('Specify valid full path to your repositories' | ||||
r351 | ' you can change this later in application settings:') | |||
r459 | else: | |||
path = test_repo_path | ||||
r341 | if not os.path.isdir(path): | |||
r491 | log.error('You entered wrong path: %s', path) | |||
r341 | sys.exit() | |||
r392 | hooks1 = HgAppUi() | |||
hooks1.ui_section = 'hooks' | ||||
hooks1.ui_key = 'changegroup.update' | ||||
hooks1.ui_value = 'hg update >&2' | ||||
r341 | ||||
r392 | hooks2 = HgAppUi() | |||
hooks2.ui_section = 'hooks' | ||||
hooks2.ui_key = 'changegroup.repo_size' | ||||
hooks2.ui_value = 'python:pylons_app.lib.hooks.repo_size' | ||||
r341 | web1 = HgAppUi() | |||
web1.ui_section = 'web' | ||||
web1.ui_key = 'push_ssl' | ||||
web1.ui_value = 'false' | ||||
web2 = HgAppUi() | ||||
web2.ui_section = 'web' | ||||
web2.ui_key = 'allow_archive' | ||||
web2.ui_value = 'gz zip bz2' | ||||
web3 = HgAppUi() | ||||
web3.ui_section = 'web' | ||||
web3.ui_key = 'allow_push' | ||||
web3.ui_value = '*' | ||||
web4 = HgAppUi() | ||||
web4.ui_section = 'web' | ||||
web4.ui_key = 'baseurl' | ||||
web4.ui_value = '/' | ||||
paths = HgAppUi() | ||||
paths.ui_section = 'paths' | ||||
paths.ui_key = '/' | ||||
paths.ui_value = os.path.join(path, '*') | ||||
r381 | hgsettings1 = HgAppSettings() | |||
hgsettings1.app_settings_name = 'realm' | ||||
hgsettings1.app_settings_value = 'hg-app authentication' | ||||
hgsettings2 = HgAppSettings() | ||||
hgsettings2.app_settings_name = 'title' | ||||
hgsettings2.app_settings_value = 'hg-app' | ||||
r345 | ||||
r341 | try: | |||
r392 | self.sa.add(hooks1) | |||
self.sa.add(hooks2) | ||||
r341 | self.sa.add(web1) | |||
self.sa.add(web2) | ||||
self.sa.add(web3) | ||||
self.sa.add(web4) | ||||
self.sa.add(paths) | ||||
r381 | self.sa.add(hgsettings1) | |||
self.sa.add(hgsettings2) | ||||
r341 | self.sa.commit() | |||
except: | ||||
self.sa.rollback() | ||||
raise | ||||
log.info('created ui config') | ||||
r491 | def create_user(self, username, password, email='', admin=False): | |||
r229 | log.info('creating administrator user %s', username) | |||
r234 | new_user = User() | |||
r226 | new_user.username = username | |||
new_user.password = get_crypt_password(password) | ||||
r296 | new_user.name = 'Hg' | |||
r262 | new_user.lastname = 'Admin' | |||
r491 | new_user.email = email | |||
r226 | new_user.admin = admin | |||
new_user.active = True | ||||
try: | ||||
r459 | self.sa.add(new_user) | |||
self.sa.commit() | ||||
except: | ||||
self.sa.rollback() | ||||
raise | ||||
def create_default_user(self): | ||||
log.info('creating default user') | ||||
#create default user for handling default permissions. | ||||
def_user = User() | ||||
def_user.username = 'default' | ||||
def_user.password = get_crypt_password(str(uuid.uuid1())[:8]) | ||||
def_user.name = 'default' | ||||
def_user.lastname = 'default' | ||||
def_user.email = 'default@default.com' | ||||
def_user.admin = False | ||||
def_user.active = False | ||||
try: | ||||
r341 | self.sa.add(def_user) | |||
r226 | self.sa.commit() | |||
except: | ||||
self.sa.rollback() | ||||
raise | ||||
|
r66 | |||
r239 | def create_permissions(self): | |||
r240 | #module.(access|create|change|delete)_[name] | |||
r296 | #module.(read|write|owner) | |||
perms = [('repository.none', 'Repository no access'), | ||||
('repository.read', 'Repository read access'), | ||||
('repository.write', 'Repository write access'), | ||||
('repository.admin', 'Repository admin access'), | ||||
r307 | ('hg.admin', 'Hg Administrator'), | |||
r417 | ('hg.create.repository', 'Repository create'), | |||
('hg.create.none', 'Repository creation disabled'), | ||||
('hg.register.none', 'Register disabled'), | ||||
('hg.register.manual_activate', 'Register new user with hg-app without manual activation'), | ||||
('hg.register.auto_activate', 'Register new user with hg-app without auto activation'), | ||||
r371 | ] | |||
r239 | ||||
for p in perms: | ||||
new_perm = Permission() | ||||
new_perm.permission_name = p[0] | ||||
new_perm.permission_longname = p[1] | ||||
try: | ||||
self.sa.add(new_perm) | ||||
self.sa.commit() | ||||
except: | ||||
self.sa.rollback() | ||||
raise | ||||
r417 | ||||
def populate_default_permissions(self): | ||||
log.info('creating default user permissions') | ||||
default_user = self.sa.query(User)\ | ||||
.filter(User.username == 'default').scalar() | ||||
reg_perm = UserToPerm() | ||||
reg_perm.user = default_user | ||||
reg_perm.permission = self.sa.query(Permission)\ | ||||
.filter(Permission.permission_name == 'hg.register.manual_activate')\ | ||||
.scalar() | ||||
create_repo_perm = UserToPerm() | ||||
create_repo_perm.user = default_user | ||||
create_repo_perm.permission = self.sa.query(Permission)\ | ||||
.filter(Permission.permission_name == 'hg.create.repository')\ | ||||
.scalar() | ||||
default_repo_perm = UserToPerm() | ||||
default_repo_perm.user = default_user | ||||
default_repo_perm.permission = self.sa.query(Permission)\ | ||||
.filter(Permission.permission_name == 'repository.read')\ | ||||
.scalar() | ||||
try: | ||||
self.sa.add(reg_perm) | ||||
self.sa.add(create_repo_perm) | ||||
self.sa.add(default_repo_perm) | ||||
self.sa.commit() | ||||
except: | ||||
self.sa.rollback() | ||||
raise | ||||