##// END OF EJS Templates
fixed import problems
marcink -
r841:78b3d2d7 beta
parent child Browse files
Show More
@@ -1,475 +1,476 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.lib.db_manage
4 4 ~~~~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Database creation, and setup module for RhodeCode. Used for creation
7 7 of database as well as for migration operations
8 8
9 9 :created_on: Apr 10, 2010
10 10 :author: marcink
11 11 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
12 12 :license: GPLv3, see COPYING for more details.
13 13 """
14 14 # This program is free software; you can redistribute it and/or
15 15 # modify it under the terms of the GNU General Public License
16 16 # as published by the Free Software Foundation; version 2
17 17 # of the License or (at your opinion) any later version of the license.
18 18 #
19 19 # This program is distributed in the hope that it will be useful,
20 20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 22 # GNU General Public License for more details.
23 23 #
24 24 # You should have received a copy of the GNU General Public License
25 25 # along with this program; if not, write to the Free Software
26 26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
27 27 # MA 02110-1301, USA.
28 28
29 29 import os
30 30 import sys
31 31 import uuid
32 32 import logging
33 33 from os.path import dirname as dn, join as jn
34 34
35 35 from rhodecode import __dbversion__
36 36 from rhodecode.model import meta
37 37
38 38 from rhodecode.lib.auth import get_crypt_password
39 39 from rhodecode.lib.utils import ask_ok
40 40 from rhodecode.model import init_model
41 41 from rhodecode.model.db import User, Permission, RhodeCodeUi, RhodeCodeSettings, \
42 42 UserToPerm, DbMigrateVersion
43 43
44 44 from sqlalchemy.engine import create_engine
45 45
46 from rhodecode.lib.dbmigrate.migrate.versioning import api
47 from rhodecode.lib.dbmigrate.migrate.exceptions import \
48 DatabaseNotControlledError
49
50 46 log = logging.getLogger(__name__)
51 47
52 48 class DbManage(object):
53 49 def __init__(self, log_sql, dbconf, root, tests=False):
54 50 self.dbname = dbconf.split('/')[-1]
55 51 self.tests = tests
56 52 self.root = root
57 53 self.dburi = dbconf
58 54 engine = create_engine(self.dburi, echo=log_sql)
59 55 init_model(engine)
60 56 self.sa = meta.Session()
61 57 self.db_exists = False
62 58
63 59 def check_for_db(self, override):
64 60 db_path = jn(self.root, self.dbname)
65 61 if self.dburi.startswith('sqlite'):
66 62 log.info('checking for existing db in %s', db_path)
67 63 if os.path.isfile(db_path):
68 64
69 65 self.db_exists = True
70 66 if not override:
71 67 raise Exception('database already exists')
72 68
73 69 def create_tables(self, override=False):
74 70 """Create a auth database
75 71 """
76 72
77 73 self.check_for_db(override)
78 74 if self.db_exists:
79 75 log.info("database exist and it's going to be destroyed")
80 76 if self.tests:
81 77 destroy = True
82 78 else:
83 79 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
84 80 if not destroy:
85 81 sys.exit()
86 82 if self.db_exists and destroy:
87 83 os.remove(jn(self.root, self.dbname))
88 84 checkfirst = not override
89 85 meta.Base.metadata.create_all(checkfirst=checkfirst)
90 86 log.info('Created tables for %s', self.dbname)
91 87
92 88
93 89
94 90 def set_db_version(self):
95 91 try:
96 92 ver = DbMigrateVersion()
97 93 ver.version = __dbversion__
98 94 ver.repository_id = 'rhodecode_db_migrations'
99 95 ver.repository_path = 'versions'
100 96 self.sa.add(ver)
101 97 self.sa.commit()
102 98 except:
103 99 self.sa.rollback()
104 100 raise
105 101 log.info('db version set to: %s', __dbversion__)
106 102
107 103
108 104 def upgrade(self):
109 105 """Upgrades given database schema to given revision following
110 106 all needed steps,
111 107
112 108 :param revision: revision to upgrade to
113 109 """
110
111 from rhodecode.lib.dbmigrate.migrate.versioning import api
112 from rhodecode.lib.dbmigrate.migrate.exceptions import \
113 DatabaseNotControlledError
114
114 115 upgrade = ask_ok('You are about to perform database upgrade, make '
115 116 'sure You backed up your database before. '
116 117 'Continue ? [y/n]')
117 118 if not upgrade:
118 119 sys.exit('Nothing done')
119 120
120 121 repository_path = 'rhodecode/lib/dbmigrate'
121 122 db_uri = self.dburi
122 123
123 124 try:
124 125 curr_version = api.db_version(db_uri, repository_path)
125 126 msg = ('Found current database under version'
126 127 ' control with version %s' % curr_version)
127 128
128 129 except (RuntimeError, DatabaseNotControlledError), e:
129 130 curr_version = 1
130 131 msg = ('Current database is not under version control. Setting'
131 132 ' as version %s' % curr_version)
132 133 api.version_control(db_uri, repository_path, curr_version)
133 134
134 135 print (msg)
135 136
136 137 if curr_version == __dbversion__:
137 138 sys.exit('This database is already at the newest version')
138 139
139 140 #======================================================================
140 141 # UPGRADE STEPS
141 142 #======================================================================
142 143 class UpgradeSteps(object):
143 144
144 145 def __init__(self, klass):
145 146 self.klass = klass
146 147
147 148 def step_0(self):
148 149 #step 0 is the schema upgrade, and than follow proper upgrades
149 150 print ('attempting to do database upgrade to version %s' \
150 151 % __dbversion__)
151 152 api.upgrade(db_uri, repository_path, __dbversion__)
152 153 print ('Schema upgrade completed')
153 154
154 155 def step_1(self):
155 156 pass
156 157
157 158 def step_2(self):
158 159 print ('Patching repo paths for newer version of RhodeCode')
159 160 self.klass.fix_repo_paths()
160 161
161 162 print ('Patching default user of RhodeCode')
162 163 self.klass.fix_default_user()
163 164
164 165 log.info('Changing ui settings')
165 166 self.klass.create_ui_settings()
166 167
167 168
168 169 upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
169 170
170 171 #CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
171 172 for step in upgrade_steps:
172 173 print ('performing upgrade step %s' % step)
173 174 callable = getattr(UpgradeSteps(self), 'step_%s' % step)()
174 175
175 176
176 177
177 178 def fix_repo_paths(self):
178 179 """Fixes a old rhodecode version path into new one without a '*'
179 180 """
180 181
181 182 paths = self.sa.query(RhodeCodeUi)\
182 183 .filter(RhodeCodeUi.ui_key == '/')\
183 184 .scalar()
184 185
185 186 paths.ui_value = paths.ui_value.replace('*', '')
186 187
187 188 try:
188 189 self.sa.add(paths)
189 190 self.sa.commit()
190 191 except:
191 192 self.sa.rollback()
192 193 raise
193 194
194 195 def fix_default_user(self):
195 196 """Fixes a old default user with some 'nicer' default values,
196 197 used mostly for anonymous access
197 198 """
198 199 def_user = self.sa.query(User)\
199 200 .filter(User.username == 'default')\
200 201 .one()
201 202
202 203 def_user.name = 'Anonymous'
203 204 def_user.lastname = 'User'
204 205 def_user.email = 'anonymous@rhodecode.org'
205 206
206 207 try:
207 208 self.sa.add(def_user)
208 209 self.sa.commit()
209 210 except:
210 211 self.sa.rollback()
211 212 raise
212 213
213 214
214 215
215 216 def admin_prompt(self, second=False):
216 217 if not self.tests:
217 218 import getpass
218 219
219 220
220 221 def get_password():
221 222 password = getpass.getpass('Specify admin password (min 6 chars):')
222 223 confirm = getpass.getpass('Confirm password:')
223 224
224 225 if password != confirm:
225 226 log.error('passwords mismatch')
226 227 return False
227 228 if len(password) < 6:
228 229 log.error('password is to short use at least 6 characters')
229 230 return False
230 231
231 232 return password
232 233
233 234 username = raw_input('Specify admin username:')
234 235
235 236 password = get_password()
236 237 if not password:
237 238 #second try
238 239 password = get_password()
239 240 if not password:
240 241 sys.exit()
241 242
242 243 email = raw_input('Specify admin email:')
243 244 self.create_user(username, password, email, True)
244 245 else:
245 246 log.info('creating admin and regular test users')
246 247 self.create_user('test_admin', 'test12', 'test_admin@mail.com', True)
247 248 self.create_user('test_regular', 'test12', 'test_regular@mail.com', False)
248 249 self.create_user('test_regular2', 'test12', 'test_regular2@mail.com', False)
249 250
250 251 def create_ui_settings(self):
251 252 """Creates ui settings, fills out hooks
252 253 and disables dotencode
253 254
254 255 """
255 256 #HOOKS
256 257 hooks1_key = 'changegroup.update'
257 258 hooks1_ = self.sa.query(RhodeCodeUi)\
258 259 .filter(RhodeCodeUi.ui_key == hooks1_key).scalar()
259 260
260 261 hooks1 = RhodeCodeUi() if hooks1_ is None else hooks1_
261 262 hooks1.ui_section = 'hooks'
262 263 hooks1.ui_key = hooks1_key
263 264 hooks1.ui_value = 'hg update >&2'
264 265 hooks1.ui_active = False
265 266
266 267 hooks2_key = 'changegroup.repo_size'
267 268 hooks2_ = self.sa.query(RhodeCodeUi)\
268 269 .filter(RhodeCodeUi.ui_key == hooks2_key).scalar()
269 270
270 271 hooks2 = RhodeCodeUi() if hooks2_ is None else hooks2_
271 272 hooks2.ui_section = 'hooks'
272 273 hooks2.ui_key = hooks2_key
273 274 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
274 275
275 276 hooks3 = RhodeCodeUi()
276 277 hooks3.ui_section = 'hooks'
277 278 hooks3.ui_key = 'pretxnchangegroup.push_logger'
278 279 hooks3.ui_value = 'python:rhodecode.lib.hooks.log_push_action'
279 280
280 281 hooks4 = RhodeCodeUi()
281 282 hooks4.ui_section = 'hooks'
282 283 hooks4.ui_key = 'preoutgoing.pull_logger'
283 284 hooks4.ui_value = 'python:rhodecode.lib.hooks.log_pull_action'
284 285
285 286 #For mercurial 1.7 set backward comapatibility with format
286 287 dotencode_disable = RhodeCodeUi()
287 288 dotencode_disable.ui_section = 'format'
288 289 dotencode_disable.ui_key = 'dotencode'
289 290 dotencode_disable.ui_value = 'false'
290 291
291 292 try:
292 293 self.sa.add(hooks1)
293 294 self.sa.add(hooks2)
294 295 self.sa.add(hooks3)
295 296 self.sa.add(hooks4)
296 297 self.sa.add(dotencode_disable)
297 298 self.sa.commit()
298 299 except:
299 300 self.sa.rollback()
300 301 raise
301 302
302 303
303 304 def create_ldap_options(self):
304 305 """Creates ldap settings"""
305 306
306 307 try:
307 308 for k in ['ldap_active', 'ldap_host', 'ldap_port', 'ldap_ldaps',
308 309 'ldap_dn_user', 'ldap_dn_pass', 'ldap_base_dn']:
309 310
310 311 setting = RhodeCodeSettings(k, '')
311 312 self.sa.add(setting)
312 313 self.sa.commit()
313 314 except:
314 315 self.sa.rollback()
315 316 raise
316 317
317 318 def config_prompt(self, test_repo_path=''):
318 319 log.info('Setting up repositories config')
319 320
320 321 if not self.tests and not test_repo_path:
321 322 path = raw_input('Specify valid full path to your repositories'
322 323 ' you can change this later in application settings:')
323 324 else:
324 325 path = test_repo_path
325 326
326 327 if not os.path.isdir(path):
327 328 log.error('You entered wrong path: %s', path)
328 329 sys.exit()
329 330
330 331 self.create_ui_settings()
331 332
332 333 #HG UI OPTIONS
333 334 web1 = RhodeCodeUi()
334 335 web1.ui_section = 'web'
335 336 web1.ui_key = 'push_ssl'
336 337 web1.ui_value = 'false'
337 338
338 339 web2 = RhodeCodeUi()
339 340 web2.ui_section = 'web'
340 341 web2.ui_key = 'allow_archive'
341 342 web2.ui_value = 'gz zip bz2'
342 343
343 344 web3 = RhodeCodeUi()
344 345 web3.ui_section = 'web'
345 346 web3.ui_key = 'allow_push'
346 347 web3.ui_value = '*'
347 348
348 349 web4 = RhodeCodeUi()
349 350 web4.ui_section = 'web'
350 351 web4.ui_key = 'baseurl'
351 352 web4.ui_value = '/'
352 353
353 354 paths = RhodeCodeUi()
354 355 paths.ui_section = 'paths'
355 356 paths.ui_key = '/'
356 357 paths.ui_value = path
357 358
358 359
359 360 hgsettings1 = RhodeCodeSettings('realm', 'RhodeCode authentication')
360 361 hgsettings2 = RhodeCodeSettings('title', 'RhodeCode')
361 362
362 363
363 364 try:
364 365 self.sa.add(web1)
365 366 self.sa.add(web2)
366 367 self.sa.add(web3)
367 368 self.sa.add(web4)
368 369 self.sa.add(paths)
369 370 self.sa.add(hgsettings1)
370 371 self.sa.add(hgsettings2)
371 372
372 373 self.sa.commit()
373 374 except:
374 375 self.sa.rollback()
375 376 raise
376 377
377 378 self.create_ldap_options()
378 379
379 380 log.info('created ui config')
380 381
381 382 def create_user(self, username, password, email='', admin=False):
382 383 log.info('creating administrator user %s', username)
383 384 new_user = User()
384 385 new_user.username = username
385 386 new_user.password = get_crypt_password(password)
386 387 new_user.name = 'RhodeCode'
387 388 new_user.lastname = 'Admin'
388 389 new_user.email = email
389 390 new_user.admin = admin
390 391 new_user.active = True
391 392
392 393 try:
393 394 self.sa.add(new_user)
394 395 self.sa.commit()
395 396 except:
396 397 self.sa.rollback()
397 398 raise
398 399
399 400 def create_default_user(self):
400 401 log.info('creating default user')
401 402 #create default user for handling default permissions.
402 403 def_user = User()
403 404 def_user.username = 'default'
404 405 def_user.password = get_crypt_password(str(uuid.uuid1())[:8])
405 406 def_user.name = 'Anonymous'
406 407 def_user.lastname = 'User'
407 408 def_user.email = 'anonymous@rhodecode.org'
408 409 def_user.admin = False
409 410 def_user.active = False
410 411 try:
411 412 self.sa.add(def_user)
412 413 self.sa.commit()
413 414 except:
414 415 self.sa.rollback()
415 416 raise
416 417
417 418 def create_permissions(self):
418 419 #module.(access|create|change|delete)_[name]
419 420 #module.(read|write|owner)
420 421 perms = [('repository.none', 'Repository no access'),
421 422 ('repository.read', 'Repository read access'),
422 423 ('repository.write', 'Repository write access'),
423 424 ('repository.admin', 'Repository admin access'),
424 425 ('hg.admin', 'Hg Administrator'),
425 426 ('hg.create.repository', 'Repository create'),
426 427 ('hg.create.none', 'Repository creation disabled'),
427 428 ('hg.register.none', 'Register disabled'),
428 429 ('hg.register.manual_activate', 'Register new user with rhodecode without manual activation'),
429 430 ('hg.register.auto_activate', 'Register new user with rhodecode without auto activation'),
430 431 ]
431 432
432 433 for p in perms:
433 434 new_perm = Permission()
434 435 new_perm.permission_name = p[0]
435 436 new_perm.permission_longname = p[1]
436 437 try:
437 438 self.sa.add(new_perm)
438 439 self.sa.commit()
439 440 except:
440 441 self.sa.rollback()
441 442 raise
442 443
443 444 def populate_default_permissions(self):
444 445 log.info('creating default user permissions')
445 446
446 447 default_user = self.sa.query(User)\
447 448 .filter(User.username == 'default').scalar()
448 449
449 450 reg_perm = UserToPerm()
450 451 reg_perm.user = default_user
451 452 reg_perm.permission = self.sa.query(Permission)\
452 453 .filter(Permission.permission_name == 'hg.register.manual_activate')\
453 454 .scalar()
454 455
455 456 create_repo_perm = UserToPerm()
456 457 create_repo_perm.user = default_user
457 458 create_repo_perm.permission = self.sa.query(Permission)\
458 459 .filter(Permission.permission_name == 'hg.create.repository')\
459 460 .scalar()
460 461
461 462 default_repo_perm = UserToPerm()
462 463 default_repo_perm.user = default_user
463 464 default_repo_perm.permission = self.sa.query(Permission)\
464 465 .filter(Permission.permission_name == 'repository.read')\
465 466 .scalar()
466 467
467 468 try:
468 469 self.sa.add(reg_perm)
469 470 self.sa.add(create_repo_perm)
470 471 self.sa.add(default_repo_perm)
471 472 self.sa.commit()
472 473 except:
473 474 self.sa.rollback()
474 475 raise
475 476
@@ -1,26 +1,54 b''
1 """Setup the rhodecode application"""
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.websetup
4 ~~~~~~~~~~~~~~~~~~
5
6 Weboperations and setup for rhodecode
7
8 :created_on: Dec 11, 2010
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
13 # This program is free software; you can redistribute it and/or
14 # modify it under the terms of the GNU General Public License
15 # as published by the Free Software Foundation; version 2
16 # of the License or (at your opinion) any later version of the license.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 # MA 02110-1301, USA.
27
28 import os
29 import logging
30
2 31 from rhodecode.config.environment import load_environment
3 32 from rhodecode.lib.db_manage import DbManage
4 import logging
5 import os
33
6 34
7 35 log = logging.getLogger(__name__)
8 36
9 37 def setup_app(command, conf, vars):
10 38 """Place any commands to setup rhodecode here"""
11 39 dbconf = conf['sqlalchemy.db1.url']
12 40 dbmanage = DbManage(log_sql=True, dbconf=dbconf, root=conf['here'], tests=False)
13 41 dbmanage.create_tables(override=True)
14 42 dbmanage.set_db_version()
15 43 dbmanage.config_prompt(None)
16 44 dbmanage.create_default_user()
17 45 dbmanage.admin_prompt()
18 46 dbmanage.create_permissions()
19 47 dbmanage.populate_default_permissions()
20 48
21 49 load_environment(conf.global_conf, conf.local_conf, initial=True)
22 50
23 51
24 52
25 53
26 54
General Comments 0
You need to be logged in to leave comments. Login now