##// END OF EJS Templates
new setup-rhodecode command with optional defaults
marcink -
r2284:e285aa09 beta
parent child Browse files
Show More
@@ -0,0 +1,87 b''
1 import os
2 from paste.script.appinstall import AbstractInstallCommand
3 from paste.script.command import BadCommand
4 from paste.deploy import appconfig
5
6
7 class SetupCommand(AbstractInstallCommand):
8
9 default_verbosity = 1
10 max_args = 1
11 min_args = 1
12 summary = "Setup an application, given a config file"
13 usage = "CONFIG_FILE"
14
15 description = """\
16 Note: this is an experimental command, and it will probably change
17 in several ways by the next release.
18
19 Setup an application according to its configuration file. This is
20 the second part of a two-phase web application installation
21 process (the first phase is prepare-app). The setup process may
22 consist of things like creating directories and setting up
23 databases.
24 """
25
26 parser = AbstractInstallCommand.standard_parser(
27 simulate=True, quiet=True, interactive=True)
28 parser.add_option('--user',
29 action='store',
30 dest='username',
31 default=None,
32 help='Admin Username')
33 parser.add_option('--email',
34 action='store',
35 dest='email',
36 default=None,
37 help='Admin Email')
38 parser.add_option('--password',
39 action='store',
40 dest='password',
41 default=None,
42 help='Admin password min 6 chars')
43 parser.add_option('--repos',
44 action='store',
45 dest='repos_location',
46 default=None,
47 help='Absolute path to repositories location')
48 parser.add_option('--name',
49 action='store',
50 dest='section_name',
51 default=None,
52 help='The name of the section to set up (default: app:main)')
53
54 def command(self):
55 config_spec = self.args[0]
56 section = self.options.section_name
57 if section is None:
58 if '#' in config_spec:
59 config_spec, section = config_spec.split('#', 1)
60 else:
61 section = 'main'
62 if not ':' in section:
63 plain_section = section
64 section = 'app:'+section
65 else:
66 plain_section = section.split(':', 1)[0]
67 if not config_spec.startswith('config:'):
68 config_spec = 'config:' + config_spec
69 if plain_section != 'main':
70 config_spec += '#' + plain_section
71 config_file = config_spec[len('config:'):].split('#', 1)[0]
72 config_file = os.path.join(os.getcwd(), config_file)
73 self.logging_file_config(config_file)
74 conf = appconfig(config_spec, relative_to=os.getcwd())
75 ep_name = conf.context.entry_point_name
76 ep_group = conf.context.protocol
77 dist = conf.context.distribution
78 if dist is None:
79 raise BadCommand(
80 "The section %r is not the application (probably a filter). "
81 "You should add #section_name, where section_name is the "
82 "section that configures your application" % plain_section)
83 installer = self.get_installer(dist, ep_group, ep_name)
84 installer.setup_config(
85 self, config_file, section, self.sysconfig_install_vars(installer))
86 self.call_sysconfig_functions(
87 'post_setup_hook', installer, config_file) No newline at end of file
@@ -12,7 +12,10 b' 1.4.0 (**2012-XX-XX**)'
12 12
13 13 news
14 14 ++++
15
15
16 - new codereview system
17 - changed setup-app into setup-rhodecode and added default options to it.
18
16 19 fixes
17 20 +++++
18 21
@@ -26,19 +26,20 b' configuration file to use this other dat'
26 26 postgresql, sqlite and mysql databases. Create the database by running
27 27 the following command::
28 28
29 paster setup-app production.ini
29 paster setup-rhodecode production.ini
30 30
31 31 This will prompt you for a "root" path. This "root" path is the location where
32 32 RhodeCode will store all of its repositories on the current machine. After
33 entering this "root" path ``setup-app`` will also prompt you for a username
34 and password for the initial admin account which ``setup-app`` sets up for you.
33 entering this "root" path ``setup-rhodecode`` will also prompt you for a username
34 and password for the initial admin account which ``setup-rhodecode`` sets
35 up for you.
35 36
36 - The ``setup-app`` command will create all of the needed tables and an admin
37 account. When choosing a root path you can either use a new empty location,
38 or a location which already contains existing repositories. If you choose a
39 location which contains existing repositories RhodeCode will simply add all
40 of the repositories at the chosen location to it's database. (Note: make
41 sure you specify the correct path to the root).
37 - The ``setup-rhodecode`` command will create all of the needed tables and an
38 admin account. When choosing a root path you can either use a new empty
39 location, or a location which already contains existing repositories. If you
40 choose a location which contains existing repositories RhodeCode will simply
41 add all of the repositories at the chosen location to it's database.
42 (Note: make sure you specify the correct path to the root).
42 43 - Note: the given path for mercurial_ repositories **must** be write accessible
43 44 for the application. It's very important since the RhodeCode web interface
44 45 will work without write access, but when trying to do a push it will
@@ -51,8 +52,8 b' You are now ready to use RhodeCode, to r'
51 52 - This command runs the RhodeCode server. The web app should be available at the
52 53 127.0.0.1:5000. This ip and port is configurable via the production.ini
53 54 file created in previous step
54 - Use the admin account you created above when running ``setup-app`` to login
55 to the web app.
55 - Use the admin account you created above when running ``setup-rhodecode``
56 to login to the web app.
56 57 - The default permissions on each repository is read, and the owner is admin.
57 58 Remember to update these if needed.
58 59 - In the admin panel you can toggle ldap, anonymous, permissions settings. As
@@ -238,10 +238,15 b' class DbManage(object):'
238 238 self.sa.rollback()
239 239 raise
240 240
241 def admin_prompt(self, second=False):
241 def admin_prompt(self, second=False, defaults={}):
242 242 if not self.tests:
243 243 import getpass
244 244
245 # defaults
246 username = defaults.get('username')
247 password = defaults.get('password')
248 email = defaults.get('email')
249
245 250 def get_password():
246 251 password = getpass.getpass('Specify admin password '
247 252 '(min 6 chars):')
@@ -255,17 +260,17 b' class DbManage(object):'
255 260 return False
256 261
257 262 return password
258
259 username = raw_input('Specify admin username:')
260
261 password = get_password()
262 if not password:
263 #second try
263 if username is None:
264 username = raw_input('Specify admin username:')
265 if password is None:
264 266 password = get_password()
265 267 if not password:
266 sys.exit()
267
268 email = raw_input('Specify admin email:')
268 #second try
269 password = get_password()
270 if not password:
271 sys.exit()
272 if email is None:
273 email = raw_input('Specify admin email:')
269 274 self.create_user(username, password, email, True)
270 275 else:
271 276 log.info('creating admin and regular test users')
@@ -370,11 +375,14 b' class DbManage(object):'
370 375 log.debug('missing default permission for group %s adding' % g)
371 376 ReposGroupModel()._create_default_perms(g)
372 377
373 def config_prompt(self, test_repo_path='', retries=3):
378 def config_prompt(self, test_repo_path='', retries=3, defaults={}):
379 _path = defaults.get('repos_location')
374 380 if retries == 3:
375 381 log.info('Setting up repositories config')
376 382
377 if not self.tests and not test_repo_path:
383 if _path is not None:
384 path = _path
385 elif not self.tests and not test_repo_path:
378 386 path = raw_input(
379 387 'Enter a valid absolute path to store repositories. '
380 388 'All repositories in that path will be added automatically:'
@@ -40,9 +40,10 b' def setup_app(command, conf, vars):'
40 40 tests=False)
41 41 dbmanage.create_tables(override=True)
42 42 dbmanage.set_db_version()
43 dbmanage.create_settings(dbmanage.config_prompt(None))
43 opts = dbmanage.config_prompt(None, defaults=command.options.__dict__)
44 dbmanage.create_settings(opts)
44 45 dbmanage.create_default_user()
45 dbmanage.admin_prompt()
46 dbmanage.admin_prompt(defaults=command.options.__dict__)
46 47 dbmanage.create_permissions()
47 48 dbmanage.populate_default_permissions()
48 49 Session.commit()
@@ -94,6 +94,7 b' setup('
94 94 main = pylons.util:PylonsInstaller
95 95
96 96 [paste.global_paster_command]
97 setup-rhodecode=rhodecode.config.setup:SetupCommand
97 98 make-index=rhodecode.lib.indexers:MakeIndex
98 99 make-rcext=rhodecode.config.rcextensions.make_rcextensions:MakeRcExt
99 100 upgrade-db=rhodecode.lib.dbmigrate:UpgradeDb
General Comments 0
You need to be logged in to leave comments. Login now