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