##// END OF EJS Templates
Add hgsubversion entry for RhodeCode UI (disabled by default)
marcink -
r2705:bf177b49 beta
parent child Browse files
Show More
@@ -1,523 +1,531 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.lib.db_manage
3 rhodecode.lib.db_manage
4 ~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Database creation, and setup module for RhodeCode. Used for creation
6 Database creation, and setup module for RhodeCode. Used for creation
7 of database as well as for migration operations
7 of database as well as for migration operations
8
8
9 :created_on: Apr 10, 2010
9 :created_on: Apr 10, 2010
10 :author: marcink
10 :author: marcink
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
12 :license: GPLv3, see COPYING for more details.
12 :license: GPLv3, see COPYING for more details.
13 """
13 """
14 # This program is free software: you can redistribute it and/or modify
14 # This program is free software: you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
17 # (at your option) any later version.
18 #
18 #
19 # This program is distributed in the hope that it will be useful,
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
22 # GNU General Public License for more details.
23 #
23 #
24 # You should have received a copy of the GNU General Public License
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26
26
27 import os
27 import os
28 import sys
28 import sys
29 import uuid
29 import uuid
30 import logging
30 import logging
31 from os.path import dirname as dn, join as jn
31 from os.path import dirname as dn, join as jn
32
32
33 from rhodecode import __dbversion__
33 from rhodecode import __dbversion__
34 from rhodecode.model import meta
34 from rhodecode.model import meta
35
35
36 from rhodecode.model.user import UserModel
36 from rhodecode.model.user import UserModel
37 from rhodecode.lib.utils import ask_ok
37 from rhodecode.lib.utils import ask_ok
38 from rhodecode.model import init_model
38 from rhodecode.model import init_model
39 from rhodecode.model.db import User, Permission, RhodeCodeUi, \
39 from rhodecode.model.db import User, Permission, RhodeCodeUi, \
40 RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup,\
40 RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup,\
41 UserRepoGroupToPerm
41 UserRepoGroupToPerm
42
42
43 from sqlalchemy.engine import create_engine
43 from sqlalchemy.engine import create_engine
44 from rhodecode.model.repos_group import ReposGroupModel
44 from rhodecode.model.repos_group import ReposGroupModel
45
45
46 log = logging.getLogger(__name__)
46 log = logging.getLogger(__name__)
47
47
48
48
49 class DbManage(object):
49 class DbManage(object):
50 def __init__(self, log_sql, dbconf, root, tests=False):
50 def __init__(self, log_sql, dbconf, root, tests=False):
51 self.dbname = dbconf.split('/')[-1]
51 self.dbname = dbconf.split('/')[-1]
52 self.tests = tests
52 self.tests = tests
53 self.root = root
53 self.root = root
54 self.dburi = dbconf
54 self.dburi = dbconf
55 self.log_sql = log_sql
55 self.log_sql = log_sql
56 self.db_exists = False
56 self.db_exists = False
57 self.init_db()
57 self.init_db()
58
58
59 def init_db(self):
59 def init_db(self):
60 engine = create_engine(self.dburi, echo=self.log_sql)
60 engine = create_engine(self.dburi, echo=self.log_sql)
61 init_model(engine)
61 init_model(engine)
62 self.sa = meta.Session()
62 self.sa = meta.Session()
63
63
64 def create_tables(self, override=False, defaults={}):
64 def create_tables(self, override=False, defaults={}):
65 """
65 """
66 Create a auth database
66 Create a auth database
67 """
67 """
68 quiet = defaults.get('quiet')
68 quiet = defaults.get('quiet')
69 log.info("Any existing database is going to be destroyed")
69 log.info("Any existing database is going to be destroyed")
70 if self.tests or quiet:
70 if self.tests or quiet:
71 destroy = True
71 destroy = True
72 else:
72 else:
73 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
73 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
74 if not destroy:
74 if not destroy:
75 sys.exit()
75 sys.exit()
76 if destroy:
76 if destroy:
77 meta.Base.metadata.drop_all()
77 meta.Base.metadata.drop_all()
78
78
79 checkfirst = not override
79 checkfirst = not override
80 meta.Base.metadata.create_all(checkfirst=checkfirst)
80 meta.Base.metadata.create_all(checkfirst=checkfirst)
81 log.info('Created tables for %s' % self.dbname)
81 log.info('Created tables for %s' % self.dbname)
82
82
83 def set_db_version(self):
83 def set_db_version(self):
84 ver = DbMigrateVersion()
84 ver = DbMigrateVersion()
85 ver.version = __dbversion__
85 ver.version = __dbversion__
86 ver.repository_id = 'rhodecode_db_migrations'
86 ver.repository_id = 'rhodecode_db_migrations'
87 ver.repository_path = 'versions'
87 ver.repository_path = 'versions'
88 self.sa.add(ver)
88 self.sa.add(ver)
89 log.info('db version set to: %s' % __dbversion__)
89 log.info('db version set to: %s' % __dbversion__)
90
90
91 def upgrade(self):
91 def upgrade(self):
92 """
92 """
93 Upgrades given database schema to given revision following
93 Upgrades given database schema to given revision following
94 all needed steps, to perform the upgrade
94 all needed steps, to perform the upgrade
95
95
96 """
96 """
97
97
98 from rhodecode.lib.dbmigrate.migrate.versioning import api
98 from rhodecode.lib.dbmigrate.migrate.versioning import api
99 from rhodecode.lib.dbmigrate.migrate.exceptions import \
99 from rhodecode.lib.dbmigrate.migrate.exceptions import \
100 DatabaseNotControlledError
100 DatabaseNotControlledError
101
101
102 if 'sqlite' in self.dburi:
102 if 'sqlite' in self.dburi:
103 print (
103 print (
104 '********************** WARNING **********************\n'
104 '********************** WARNING **********************\n'
105 'Make sure your version of sqlite is at least 3.7.X. \n'
105 'Make sure your version of sqlite is at least 3.7.X. \n'
106 'Earlier versions are known to fail on some migrations\n'
106 'Earlier versions are known to fail on some migrations\n'
107 '*****************************************************\n'
107 '*****************************************************\n'
108 )
108 )
109 upgrade = ask_ok('You are about to perform database upgrade, make '
109 upgrade = ask_ok('You are about to perform database upgrade, make '
110 'sure You backed up your database before. '
110 'sure You backed up your database before. '
111 'Continue ? [y/n]')
111 'Continue ? [y/n]')
112 if not upgrade:
112 if not upgrade:
113 sys.exit('Nothing done')
113 sys.exit('Nothing done')
114
114
115 repository_path = jn(dn(dn(dn(os.path.realpath(__file__)))),
115 repository_path = jn(dn(dn(dn(os.path.realpath(__file__)))),
116 'rhodecode/lib/dbmigrate')
116 'rhodecode/lib/dbmigrate')
117 db_uri = self.dburi
117 db_uri = self.dburi
118
118
119 try:
119 try:
120 curr_version = api.db_version(db_uri, repository_path)
120 curr_version = api.db_version(db_uri, repository_path)
121 msg = ('Found current database under version'
121 msg = ('Found current database under version'
122 ' control with version %s' % curr_version)
122 ' control with version %s' % curr_version)
123
123
124 except (RuntimeError, DatabaseNotControlledError):
124 except (RuntimeError, DatabaseNotControlledError):
125 curr_version = 1
125 curr_version = 1
126 msg = ('Current database is not under version control. Setting'
126 msg = ('Current database is not under version control. Setting'
127 ' as version %s' % curr_version)
127 ' as version %s' % curr_version)
128 api.version_control(db_uri, repository_path, curr_version)
128 api.version_control(db_uri, repository_path, curr_version)
129
129
130 print (msg)
130 print (msg)
131
131
132 if curr_version == __dbversion__:
132 if curr_version == __dbversion__:
133 sys.exit('This database is already at the newest version')
133 sys.exit('This database is already at the newest version')
134
134
135 #======================================================================
135 #======================================================================
136 # UPGRADE STEPS
136 # UPGRADE STEPS
137 #======================================================================
137 #======================================================================
138 class UpgradeSteps(object):
138 class UpgradeSteps(object):
139 """
139 """
140 Those steps follow schema versions so for example schema
140 Those steps follow schema versions so for example schema
141 for example schema with seq 002 == step_2 and so on.
141 for example schema with seq 002 == step_2 and so on.
142 """
142 """
143
143
144 def __init__(self, klass):
144 def __init__(self, klass):
145 self.klass = klass
145 self.klass = klass
146
146
147 def step_0(self):
147 def step_0(self):
148 # step 0 is the schema upgrade, and than follow proper upgrades
148 # step 0 is the schema upgrade, and than follow proper upgrades
149 print ('attempting to do database upgrade to version %s' \
149 print ('attempting to do database upgrade to version %s' \
150 % __dbversion__)
150 % __dbversion__)
151 api.upgrade(db_uri, repository_path, __dbversion__)
151 api.upgrade(db_uri, repository_path, __dbversion__)
152 print ('Schema upgrade completed')
152 print ('Schema upgrade completed')
153
153
154 def step_1(self):
154 def step_1(self):
155 pass
155 pass
156
156
157 def step_2(self):
157 def step_2(self):
158 print ('Patching repo paths for newer version of RhodeCode')
158 print ('Patching repo paths for newer version of RhodeCode')
159 self.klass.fix_repo_paths()
159 self.klass.fix_repo_paths()
160
160
161 print ('Patching default user of RhodeCode')
161 print ('Patching default user of RhodeCode')
162 self.klass.fix_default_user()
162 self.klass.fix_default_user()
163
163
164 log.info('Changing ui settings')
164 log.info('Changing ui settings')
165 self.klass.create_ui_settings()
165 self.klass.create_ui_settings()
166
166
167 def step_3(self):
167 def step_3(self):
168 print ('Adding additional settings into RhodeCode db')
168 print ('Adding additional settings into RhodeCode db')
169 self.klass.fix_settings()
169 self.klass.fix_settings()
170 print ('Adding ldap defaults')
170 print ('Adding ldap defaults')
171 self.klass.create_ldap_options(skip_existing=True)
171 self.klass.create_ldap_options(skip_existing=True)
172
172
173 def step_4(self):
173 def step_4(self):
174 print ('create permissions and fix groups')
174 print ('create permissions and fix groups')
175 self.klass.create_permissions()
175 self.klass.create_permissions()
176 self.klass.fixup_groups()
176 self.klass.fixup_groups()
177
177
178 def step_5(self):
178 def step_5(self):
179 pass
179 pass
180
180
181 def step_6(self):
181 def step_6(self):
182 pass
182 pass
183 upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
183 upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
184
184
185 # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
185 # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
186 for step in upgrade_steps:
186 for step in upgrade_steps:
187 print ('performing upgrade step %s' % step)
187 print ('performing upgrade step %s' % step)
188 getattr(UpgradeSteps(self), 'step_%s' % step)()
188 getattr(UpgradeSteps(self), 'step_%s' % step)()
189 self.sa.commit()
189 self.sa.commit()
190
190
191 def fix_repo_paths(self):
191 def fix_repo_paths(self):
192 """
192 """
193 Fixes a old rhodecode version path into new one without a '*'
193 Fixes a old rhodecode version path into new one without a '*'
194 """
194 """
195
195
196 paths = self.sa.query(RhodeCodeUi)\
196 paths = self.sa.query(RhodeCodeUi)\
197 .filter(RhodeCodeUi.ui_key == '/')\
197 .filter(RhodeCodeUi.ui_key == '/')\
198 .scalar()
198 .scalar()
199
199
200 paths.ui_value = paths.ui_value.replace('*', '')
200 paths.ui_value = paths.ui_value.replace('*', '')
201
201
202 try:
202 try:
203 self.sa.add(paths)
203 self.sa.add(paths)
204 self.sa.commit()
204 self.sa.commit()
205 except:
205 except:
206 self.sa.rollback()
206 self.sa.rollback()
207 raise
207 raise
208
208
209 def fix_default_user(self):
209 def fix_default_user(self):
210 """
210 """
211 Fixes a old default user with some 'nicer' default values,
211 Fixes a old default user with some 'nicer' default values,
212 used mostly for anonymous access
212 used mostly for anonymous access
213 """
213 """
214 def_user = self.sa.query(User)\
214 def_user = self.sa.query(User)\
215 .filter(User.username == 'default')\
215 .filter(User.username == 'default')\
216 .one()
216 .one()
217
217
218 def_user.name = 'Anonymous'
218 def_user.name = 'Anonymous'
219 def_user.lastname = 'User'
219 def_user.lastname = 'User'
220 def_user.email = 'anonymous@rhodecode.org'
220 def_user.email = 'anonymous@rhodecode.org'
221
221
222 try:
222 try:
223 self.sa.add(def_user)
223 self.sa.add(def_user)
224 self.sa.commit()
224 self.sa.commit()
225 except:
225 except:
226 self.sa.rollback()
226 self.sa.rollback()
227 raise
227 raise
228
228
229 def fix_settings(self):
229 def fix_settings(self):
230 """
230 """
231 Fixes rhodecode settings adds ga_code key for google analytics
231 Fixes rhodecode settings adds ga_code key for google analytics
232 """
232 """
233
233
234 hgsettings3 = RhodeCodeSetting('ga_code', '')
234 hgsettings3 = RhodeCodeSetting('ga_code', '')
235
235
236 try:
236 try:
237 self.sa.add(hgsettings3)
237 self.sa.add(hgsettings3)
238 self.sa.commit()
238 self.sa.commit()
239 except:
239 except:
240 self.sa.rollback()
240 self.sa.rollback()
241 raise
241 raise
242
242
243 def admin_prompt(self, second=False, defaults={}):
243 def admin_prompt(self, second=False, defaults={}):
244 if not self.tests:
244 if not self.tests:
245 import getpass
245 import getpass
246
246
247 # defaults
247 # defaults
248 username = defaults.get('username')
248 username = defaults.get('username')
249 password = defaults.get('password')
249 password = defaults.get('password')
250 email = defaults.get('email')
250 email = defaults.get('email')
251
251
252 def get_password():
252 def get_password():
253 password = getpass.getpass('Specify admin password '
253 password = getpass.getpass('Specify admin password '
254 '(min 6 chars):')
254 '(min 6 chars):')
255 confirm = getpass.getpass('Confirm password:')
255 confirm = getpass.getpass('Confirm password:')
256
256
257 if password != confirm:
257 if password != confirm:
258 log.error('passwords mismatch')
258 log.error('passwords mismatch')
259 return False
259 return False
260 if len(password) < 6:
260 if len(password) < 6:
261 log.error('password is to short use at least 6 characters')
261 log.error('password is to short use at least 6 characters')
262 return False
262 return False
263
263
264 return password
264 return password
265 if username is None:
265 if username is None:
266 username = raw_input('Specify admin username:')
266 username = raw_input('Specify admin username:')
267 if password is None:
267 if password is None:
268 password = get_password()
268 password = get_password()
269 if not password:
269 if not password:
270 #second try
270 #second try
271 password = get_password()
271 password = get_password()
272 if not password:
272 if not password:
273 sys.exit()
273 sys.exit()
274 if email is None:
274 if email is None:
275 email = raw_input('Specify admin email:')
275 email = raw_input('Specify admin email:')
276 self.create_user(username, password, email, True)
276 self.create_user(username, password, email, True)
277 else:
277 else:
278 log.info('creating admin and regular test users')
278 log.info('creating admin and regular test users')
279 from rhodecode.tests import TEST_USER_ADMIN_LOGIN,\
279 from rhodecode.tests import TEST_USER_ADMIN_LOGIN,\
280 TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL,\
280 TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL,\
281 TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,\
281 TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,\
282 TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR2_LOGIN, \
282 TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR2_LOGIN, \
283 TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL
283 TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL
284
284
285 self.create_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
285 self.create_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
286 TEST_USER_ADMIN_EMAIL, True)
286 TEST_USER_ADMIN_EMAIL, True)
287
287
288 self.create_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,
288 self.create_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,
289 TEST_USER_REGULAR_EMAIL, False)
289 TEST_USER_REGULAR_EMAIL, False)
290
290
291 self.create_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS,
291 self.create_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS,
292 TEST_USER_REGULAR2_EMAIL, False)
292 TEST_USER_REGULAR2_EMAIL, False)
293
293
294 def create_ui_settings(self):
294 def create_ui_settings(self):
295 """
295 """
296 Creates ui settings, fills out hooks
296 Creates ui settings, fills out hooks
297 and disables dotencode
297 and disables dotencode
298 """
298 """
299
299
300 #HOOKS
300 #HOOKS
301 hooks1_key = RhodeCodeUi.HOOK_UPDATE
301 hooks1_key = RhodeCodeUi.HOOK_UPDATE
302 hooks1_ = self.sa.query(RhodeCodeUi)\
302 hooks1_ = self.sa.query(RhodeCodeUi)\
303 .filter(RhodeCodeUi.ui_key == hooks1_key).scalar()
303 .filter(RhodeCodeUi.ui_key == hooks1_key).scalar()
304
304
305 hooks1 = RhodeCodeUi() if hooks1_ is None else hooks1_
305 hooks1 = RhodeCodeUi() if hooks1_ is None else hooks1_
306 hooks1.ui_section = 'hooks'
306 hooks1.ui_section = 'hooks'
307 hooks1.ui_key = hooks1_key
307 hooks1.ui_key = hooks1_key
308 hooks1.ui_value = 'hg update >&2'
308 hooks1.ui_value = 'hg update >&2'
309 hooks1.ui_active = False
309 hooks1.ui_active = False
310
310
311 hooks2_key = RhodeCodeUi.HOOK_REPO_SIZE
311 hooks2_key = RhodeCodeUi.HOOK_REPO_SIZE
312 hooks2_ = self.sa.query(RhodeCodeUi)\
312 hooks2_ = self.sa.query(RhodeCodeUi)\
313 .filter(RhodeCodeUi.ui_key == hooks2_key).scalar()
313 .filter(RhodeCodeUi.ui_key == hooks2_key).scalar()
314
314
315 hooks2 = RhodeCodeUi() if hooks2_ is None else hooks2_
315 hooks2 = RhodeCodeUi() if hooks2_ is None else hooks2_
316 hooks2.ui_section = 'hooks'
316 hooks2.ui_section = 'hooks'
317 hooks2.ui_key = hooks2_key
317 hooks2.ui_key = hooks2_key
318 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
318 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
319
319
320 hooks3 = RhodeCodeUi()
320 hooks3 = RhodeCodeUi()
321 hooks3.ui_section = 'hooks'
321 hooks3.ui_section = 'hooks'
322 hooks3.ui_key = RhodeCodeUi.HOOK_PUSH
322 hooks3.ui_key = RhodeCodeUi.HOOK_PUSH
323 hooks3.ui_value = 'python:rhodecode.lib.hooks.log_push_action'
323 hooks3.ui_value = 'python:rhodecode.lib.hooks.log_push_action'
324
324
325 hooks4 = RhodeCodeUi()
325 hooks4 = RhodeCodeUi()
326 hooks4.ui_section = 'hooks'
326 hooks4.ui_section = 'hooks'
327 hooks4.ui_key = RhodeCodeUi.HOOK_PULL
327 hooks4.ui_key = RhodeCodeUi.HOOK_PULL
328 hooks4.ui_value = 'python:rhodecode.lib.hooks.log_pull_action'
328 hooks4.ui_value = 'python:rhodecode.lib.hooks.log_pull_action'
329
329
330 # For mercurial 1.7 set backward comapatibility with format
330 # For mercurial 1.7 set backward comapatibility with format
331 dotencode_disable = RhodeCodeUi()
331 dotencode_disable = RhodeCodeUi()
332 dotencode_disable.ui_section = 'format'
332 dotencode_disable.ui_section = 'format'
333 dotencode_disable.ui_key = 'dotencode'
333 dotencode_disable.ui_key = 'dotencode'
334 dotencode_disable.ui_value = 'false'
334 dotencode_disable.ui_value = 'false'
335
335
336 # enable largefiles
336 # enable largefiles
337 largefiles = RhodeCodeUi()
337 largefiles = RhodeCodeUi()
338 largefiles.ui_section = 'extensions'
338 largefiles.ui_section = 'extensions'
339 largefiles.ui_key = 'largefiles'
339 largefiles.ui_key = 'largefiles'
340 largefiles.ui_value = ''
340 largefiles.ui_value = ''
341
341
342 # enable hgsubversion disabled by default
343 hgsubversion = RhodeCodeUi()
344 hgsubversion.ui_section = 'extensions'
345 hgsubversion.ui_key = 'hgsubversion'
346 hgsubversion.ui_value = ''
347 hgsubversion.ui_active = False
348
342 self.sa.add(hooks1)
349 self.sa.add(hooks1)
343 self.sa.add(hooks2)
350 self.sa.add(hooks2)
344 self.sa.add(hooks3)
351 self.sa.add(hooks3)
345 self.sa.add(hooks4)
352 self.sa.add(hooks4)
346 self.sa.add(largefiles)
353 self.sa.add(largefiles)
354 self.sa.add(hgsubversion)
347
355
348 def create_ldap_options(self, skip_existing=False):
356 def create_ldap_options(self, skip_existing=False):
349 """Creates ldap settings"""
357 """Creates ldap settings"""
350
358
351 for k, v in [('ldap_active', 'false'), ('ldap_host', ''),
359 for k, v in [('ldap_active', 'false'), ('ldap_host', ''),
352 ('ldap_port', '389'), ('ldap_tls_kind', 'PLAIN'),
360 ('ldap_port', '389'), ('ldap_tls_kind', 'PLAIN'),
353 ('ldap_tls_reqcert', ''), ('ldap_dn_user', ''),
361 ('ldap_tls_reqcert', ''), ('ldap_dn_user', ''),
354 ('ldap_dn_pass', ''), ('ldap_base_dn', ''),
362 ('ldap_dn_pass', ''), ('ldap_base_dn', ''),
355 ('ldap_filter', ''), ('ldap_search_scope', ''),
363 ('ldap_filter', ''), ('ldap_search_scope', ''),
356 ('ldap_attr_login', ''), ('ldap_attr_firstname', ''),
364 ('ldap_attr_login', ''), ('ldap_attr_firstname', ''),
357 ('ldap_attr_lastname', ''), ('ldap_attr_email', '')]:
365 ('ldap_attr_lastname', ''), ('ldap_attr_email', '')]:
358
366
359 if skip_existing and RhodeCodeSetting.get_by_name(k) != None:
367 if skip_existing and RhodeCodeSetting.get_by_name(k) != None:
360 log.debug('Skipping option %s' % k)
368 log.debug('Skipping option %s' % k)
361 continue
369 continue
362 setting = RhodeCodeSetting(k, v)
370 setting = RhodeCodeSetting(k, v)
363 self.sa.add(setting)
371 self.sa.add(setting)
364
372
365 def fixup_groups(self):
373 def fixup_groups(self):
366 def_usr = User.get_by_username('default')
374 def_usr = User.get_by_username('default')
367 for g in RepoGroup.query().all():
375 for g in RepoGroup.query().all():
368 g.group_name = g.get_new_name(g.name)
376 g.group_name = g.get_new_name(g.name)
369 self.sa.add(g)
377 self.sa.add(g)
370 # get default perm
378 # get default perm
371 default = UserRepoGroupToPerm.query()\
379 default = UserRepoGroupToPerm.query()\
372 .filter(UserRepoGroupToPerm.group == g)\
380 .filter(UserRepoGroupToPerm.group == g)\
373 .filter(UserRepoGroupToPerm.user == def_usr)\
381 .filter(UserRepoGroupToPerm.user == def_usr)\
374 .scalar()
382 .scalar()
375
383
376 if default is None:
384 if default is None:
377 log.debug('missing default permission for group %s adding' % g)
385 log.debug('missing default permission for group %s adding' % g)
378 ReposGroupModel()._create_default_perms(g)
386 ReposGroupModel()._create_default_perms(g)
379
387
380 def config_prompt(self, test_repo_path='', retries=3, defaults={}):
388 def config_prompt(self, test_repo_path='', retries=3, defaults={}):
381 _path = defaults.get('repos_location')
389 _path = defaults.get('repos_location')
382 if retries == 3:
390 if retries == 3:
383 log.info('Setting up repositories config')
391 log.info('Setting up repositories config')
384
392
385 if _path is not None:
393 if _path is not None:
386 path = _path
394 path = _path
387 elif not self.tests and not test_repo_path:
395 elif not self.tests and not test_repo_path:
388 path = raw_input(
396 path = raw_input(
389 'Enter a valid absolute path to store repositories. '
397 'Enter a valid absolute path to store repositories. '
390 'All repositories in that path will be added automatically:'
398 'All repositories in that path will be added automatically:'
391 )
399 )
392 else:
400 else:
393 path = test_repo_path
401 path = test_repo_path
394 path_ok = True
402 path_ok = True
395
403
396 # check proper dir
404 # check proper dir
397 if not os.path.isdir(path):
405 if not os.path.isdir(path):
398 path_ok = False
406 path_ok = False
399 log.error('Given path %s is not a valid directory' % path)
407 log.error('Given path %s is not a valid directory' % path)
400
408
401 elif not os.path.isabs(path):
409 elif not os.path.isabs(path):
402 path_ok = False
410 path_ok = False
403 log.error('Given path %s is not an absolute path' % path)
411 log.error('Given path %s is not an absolute path' % path)
404
412
405 # check write access
413 # check write access
406 elif not os.access(path, os.W_OK) and path_ok:
414 elif not os.access(path, os.W_OK) and path_ok:
407 path_ok = False
415 path_ok = False
408 log.error('No write permission to given path %s' % path)
416 log.error('No write permission to given path %s' % path)
409
417
410 if retries == 0:
418 if retries == 0:
411 sys.exit('max retries reached')
419 sys.exit('max retries reached')
412 if path_ok is False:
420 if path_ok is False:
413 retries -= 1
421 retries -= 1
414 return self.config_prompt(test_repo_path, retries)
422 return self.config_prompt(test_repo_path, retries)
415
423
416 return path
424 return path
417
425
418 def create_settings(self, path):
426 def create_settings(self, path):
419
427
420 self.create_ui_settings()
428 self.create_ui_settings()
421
429
422 #HG UI OPTIONS
430 #HG UI OPTIONS
423 web1 = RhodeCodeUi()
431 web1 = RhodeCodeUi()
424 web1.ui_section = 'web'
432 web1.ui_section = 'web'
425 web1.ui_key = 'push_ssl'
433 web1.ui_key = 'push_ssl'
426 web1.ui_value = 'false'
434 web1.ui_value = 'false'
427
435
428 web2 = RhodeCodeUi()
436 web2 = RhodeCodeUi()
429 web2.ui_section = 'web'
437 web2.ui_section = 'web'
430 web2.ui_key = 'allow_archive'
438 web2.ui_key = 'allow_archive'
431 web2.ui_value = 'gz zip bz2'
439 web2.ui_value = 'gz zip bz2'
432
440
433 web3 = RhodeCodeUi()
441 web3 = RhodeCodeUi()
434 web3.ui_section = 'web'
442 web3.ui_section = 'web'
435 web3.ui_key = 'allow_push'
443 web3.ui_key = 'allow_push'
436 web3.ui_value = '*'
444 web3.ui_value = '*'
437
445
438 web4 = RhodeCodeUi()
446 web4 = RhodeCodeUi()
439 web4.ui_section = 'web'
447 web4.ui_section = 'web'
440 web4.ui_key = 'baseurl'
448 web4.ui_key = 'baseurl'
441 web4.ui_value = '/'
449 web4.ui_value = '/'
442
450
443 paths = RhodeCodeUi()
451 paths = RhodeCodeUi()
444 paths.ui_section = 'paths'
452 paths.ui_section = 'paths'
445 paths.ui_key = '/'
453 paths.ui_key = '/'
446 paths.ui_value = path
454 paths.ui_value = path
447
455
448 sett1 = RhodeCodeSetting('realm', 'RhodeCode authentication')
456 sett1 = RhodeCodeSetting('realm', 'RhodeCode authentication')
449 sett2 = RhodeCodeSetting('title', 'RhodeCode')
457 sett2 = RhodeCodeSetting('title', 'RhodeCode')
450 sett3 = RhodeCodeSetting('ga_code', '')
458 sett3 = RhodeCodeSetting('ga_code', '')
451
459
452 sett4 = RhodeCodeSetting('show_public_icon', True)
460 sett4 = RhodeCodeSetting('show_public_icon', True)
453 sett5 = RhodeCodeSetting('show_private_icon', True)
461 sett5 = RhodeCodeSetting('show_private_icon', True)
454 sett6 = RhodeCodeSetting('stylify_metatags', False)
462 sett6 = RhodeCodeSetting('stylify_metatags', False)
455
463
456 self.sa.add(web1)
464 self.sa.add(web1)
457 self.sa.add(web2)
465 self.sa.add(web2)
458 self.sa.add(web3)
466 self.sa.add(web3)
459 self.sa.add(web4)
467 self.sa.add(web4)
460 self.sa.add(paths)
468 self.sa.add(paths)
461 self.sa.add(sett1)
469 self.sa.add(sett1)
462 self.sa.add(sett2)
470 self.sa.add(sett2)
463 self.sa.add(sett3)
471 self.sa.add(sett3)
464 self.sa.add(sett4)
472 self.sa.add(sett4)
465 self.sa.add(sett5)
473 self.sa.add(sett5)
466 self.sa.add(sett6)
474 self.sa.add(sett6)
467
475
468 self.create_ldap_options()
476 self.create_ldap_options()
469
477
470 log.info('created ui config')
478 log.info('created ui config')
471
479
472 def create_user(self, username, password, email='', admin=False):
480 def create_user(self, username, password, email='', admin=False):
473 log.info('creating user %s' % username)
481 log.info('creating user %s' % username)
474 UserModel().create_or_update(username, password, email,
482 UserModel().create_or_update(username, password, email,
475 firstname='RhodeCode', lastname='Admin',
483 firstname='RhodeCode', lastname='Admin',
476 active=True, admin=admin)
484 active=True, admin=admin)
477
485
478 def create_default_user(self):
486 def create_default_user(self):
479 log.info('creating default user')
487 log.info('creating default user')
480 # create default user for handling default permissions.
488 # create default user for handling default permissions.
481 UserModel().create_or_update(username='default',
489 UserModel().create_or_update(username='default',
482 password=str(uuid.uuid1())[:8],
490 password=str(uuid.uuid1())[:8],
483 email='anonymous@rhodecode.org',
491 email='anonymous@rhodecode.org',
484 firstname='Anonymous', lastname='User')
492 firstname='Anonymous', lastname='User')
485
493
486 def create_permissions(self):
494 def create_permissions(self):
487 # module.(access|create|change|delete)_[name]
495 # module.(access|create|change|delete)_[name]
488 # module.(none|read|write|admin)
496 # module.(none|read|write|admin)
489
497
490 for p in Permission.PERMS:
498 for p in Permission.PERMS:
491 if not Permission.get_by_key(p[0]):
499 if not Permission.get_by_key(p[0]):
492 new_perm = Permission()
500 new_perm = Permission()
493 new_perm.permission_name = p[0]
501 new_perm.permission_name = p[0]
494 new_perm.permission_longname = p[0]
502 new_perm.permission_longname = p[0]
495 self.sa.add(new_perm)
503 self.sa.add(new_perm)
496
504
497 def populate_default_permissions(self):
505 def populate_default_permissions(self):
498 log.info('creating default user permissions')
506 log.info('creating default user permissions')
499
507
500 default_user = self.sa.query(User)\
508 default_user = self.sa.query(User)\
501 .filter(User.username == 'default').scalar()
509 .filter(User.username == 'default').scalar()
502
510
503 reg_perm = UserToPerm()
511 reg_perm = UserToPerm()
504 reg_perm.user = default_user
512 reg_perm.user = default_user
505 reg_perm.permission = self.sa.query(Permission)\
513 reg_perm.permission = self.sa.query(Permission)\
506 .filter(Permission.permission_name == 'hg.register.manual_activate')\
514 .filter(Permission.permission_name == 'hg.register.manual_activate')\
507 .scalar()
515 .scalar()
508
516
509 create_repo_perm = UserToPerm()
517 create_repo_perm = UserToPerm()
510 create_repo_perm.user = default_user
518 create_repo_perm.user = default_user
511 create_repo_perm.permission = self.sa.query(Permission)\
519 create_repo_perm.permission = self.sa.query(Permission)\
512 .filter(Permission.permission_name == 'hg.create.repository')\
520 .filter(Permission.permission_name == 'hg.create.repository')\
513 .scalar()
521 .scalar()
514
522
515 default_repo_perm = UserToPerm()
523 default_repo_perm = UserToPerm()
516 default_repo_perm.user = default_user
524 default_repo_perm.user = default_user
517 default_repo_perm.permission = self.sa.query(Permission)\
525 default_repo_perm.permission = self.sa.query(Permission)\
518 .filter(Permission.permission_name == 'repository.read')\
526 .filter(Permission.permission_name == 'repository.read')\
519 .scalar()
527 .scalar()
520
528
521 self.sa.add(reg_perm)
529 self.sa.add(reg_perm)
522 self.sa.add(create_repo_perm)
530 self.sa.add(create_repo_perm)
523 self.sa.add(default_repo_perm)
531 self.sa.add(default_repo_perm)
General Comments 0
You need to be logged in to leave comments. Login now