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- |
|
|
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- |
|
|
34 |
and password for the initial admin account which ``setup- |
|
|
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- |
|
|
37 |
account. When choosing a root path you can either use a new empty |
|
|
38 |
or a location which already contains existing repositories. If you |
|
|
39 |
location which contains existing repositories RhodeCode will simply |
|
|
40 |
of the repositories at the chosen location to it's database. |
|
|
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- |
|
|
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 |
|
|
|
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