[Checkins] SVN: zc.recipe.deployment/branches/aaron-nonroot/ Has
the prefix and etc-directory arguments.
Aaron Lehmann
aaron at zope.com
Sat Aug 2 19:00:53 EDT 2008
Log message for revision 89241:
Has the prefix and etc-directory arguments.
Changed:
_U zc.recipe.deployment/branches/aaron-nonroot/
U zc.recipe.deployment/branches/aaron-nonroot/buildout.cfg
U zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/README.txt
U zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/__init__.py
U zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/rtests.py
-=-
Property changes on: zc.recipe.deployment/branches/aaron-nonroot
___________________________________________________________________
Name: svn:externals
+ zc.buildout svn+ssh://svn.zope.org/repos/main/zc.buildout/branches/aaron-testing-changes
Modified: zc.recipe.deployment/branches/aaron-nonroot/buildout.cfg
===================================================================
--- zc.recipe.deployment/branches/aaron-nonroot/buildout.cfg 2008-08-02 21:34:56 UTC (rev 89240)
+++ zc.recipe.deployment/branches/aaron-nonroot/buildout.cfg 2008-08-02 23:00:53 UTC (rev 89241)
@@ -1,5 +1,5 @@
[buildout]
-develop = .
+develop = . zc.buildout
parts = test
[test]
Modified: zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/README.txt
===================================================================
--- zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/README.txt 2008-08-02 21:34:56 UTC (rev 89240)
+++ zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/README.txt 2008-08-02 23:00:53 UTC (rev 89241)
@@ -1,46 +1,56 @@
-Using the deployment recipe is pretty simple. Jusr specify a
+Using the deployment recipe is pretty simple. Just specify a
deployment name, specified via the part name, and a deployment user.
Let's add a deployment to a sample buildout:
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo
...
... [foo]
+ ... prefix = %s
... recipe = zc.recipe.deployment
- ... user = jim
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
+ ... user = %s
+ ... etc-user = %s
+ ... ''' % (sample_buildout, user, user))
+ >>> buildout.install([])
Installing foo.
zc.recipe.deployment:
- Creating '/etc/foo',
- mode 755, user 'root', group 'root'
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/log/foo',
- mode 755, user 'jim', group 'jim'
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/run/foo',
- mode 750, user 'jim', group 'jim'
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
+Note that we are providing a prefix and an etc-user here. These options
+default to '/' and 'root', respectively.
-(Note that we have to be running as root and must have a user jim for
-this to work.)
+Now we can see that directories named foo in PREFIX/etc, PREFIX/var/log and
+PREFIX/var/run have been created:
-Now we can see that directories named foo in /etc, /var/log and
-/var/run have been created:
+ >>> import os
+ >>> print ls(os.path.join(sample_buildout, 'etc/foo'))
+ drwxr-xr-x USER USER PREFIX/etc/foo
- >>> print system('ls -ld /etc/foo'),
- drwxr-xr-x 2 root root 4096 2007-02-06 09:50 /etc/foo
+ >>> print ls(os.path.join(sample_buildout, 'var/log/foo'))
+ drwxr-xr-x USER USER PREFIX/var/log/foo
- >>> print system('ls -ld /var/log/foo'),
- drwxr-xr-x 2 jim jim 4096 2007-02-06 09:50 /var/log/foo
+ >>> print ls(os.path.join(sample_buildout, 'var/run/foo'))
+ drwxr-x--- USER USER PREFIX/var/run/foo
- >>> print system('ls -ld /var/run/foo'),
- drwxr-x--- 2 jim jim 40 2007-02-06 09:50 /var/run/foo
-
By looking at .installed.cfg, we can see the options available for use
by other recipes:
@@ -50,61 +60,85 @@
[foo]
__buildout_installed__ =
...
- crontab-directory = /etc/cron.d
- etc-directory = /etc/foo
- log-directory = /var/log/foo
- logrotate-directory = /etc/logrotate.d
+ crontab-directory = PREFIX/etc/cron.d
+ etc-directory = PREFIX/etc/foo
+ etc-user = USER
+ log-directory = PREFIX/var/log/foo
+ logrotate-directory = PREFIX/etc/logrotate.d
name = foo
- rc-directory = /etc/init.d
+ prefix = PREFIX
+ rc-directory = PREFIX/etc/init.d
recipe = zc.recipe.deployment
- run-directory = /var/run/foo
- user = jim
+ run-directory = PREFIX/var/run/foo
+ user = USER
-If we ininstall, then the directories are removed.
+If we uninstall, then the directories are removed.
- >>> print system(join('bin', 'buildout')+' buildout:parts='),
+ >>> buildout.install([], uninstall_args=['foo'])
Uninstalling foo.
Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/foo'
- zc.recipe.deployment: Removing '/var/log/foo'.
- zc.recipe.deployment: Removing '/var/run/foo'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/foo'
+ zc.recipe.deployment: Removing 'PREFIX/etc/cron.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/init.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/logrotate.d'.
+ zc.recipe.deployment: Removing 'PREFIX/var/log/foo'.
+ zc.recipe.deployment: Removing 'PREFIX/var/run/foo'.
- >>> import os
- >>> os.path.exists('/etc/foo')
+ >>> os.path.exists(os.path.join(sample_buildout, 'etc/foo'))
False
- >>> os.path.exists('/var/log/foo')
+ >>> os.path.exists(os.path.join(sample_buildout, 'var/log/foo'))
False
- >>> os.path.exists('/var/run/foo')
+ >>> os.path.exists(os.path.join(sample_buildout, 'var/run/foo'))
False
The log and run directories are only removed if they are empty.
To see that, we'll put a file in each of the directories created:
- >>> print system(join('bin', 'buildout')), # doctest: +ELLIPSIS
+ >>> buildout.install([])
Installing foo.
- ...
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
- >>> write('/etc/foo/x', '')
- >>> write('/var/log/foo/x', '')
- >>> write('/var/run/foo/x', '')
+ >>> write(os.path.join(sample_buildout, 'etc/foo/x'), '')
+ >>> write(os.path.join(sample_buildout, 'var/log/foo/x'), '')
+ >>> write(os.path.join(sample_buildout, 'var/run/foo/x'), '')
And then uninstall:
- >>> print system(join('bin', 'buildout')+' buildout:parts='),
+ >>> buildout.install([], uninstall_args=['foo'])
Uninstalling foo.
Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/foo'
- zc.recipe.deployment: Can't remove non-empty directory '/var/log/foo'.
- zc.recipe.deployment: Can't remove non-empty directory '/var/run/foo'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/foo'
+ zc.recipe.deployment: Removing 'PREFIX/etc/cron.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/init.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/logrotate.d'.
+ zc.recipe.deployment: Can't remove non-empty directory 'PREFIX/var/log/foo'.
+ zc.recipe.deployment: Can't remove non-empty directory 'PREFIX/var/run/foo'.
- >>> os.path.exists('/etc/foo')
+ >>> os.path.exists(os.path.join(sample_buildout, 'etc/foo'))
False
- >>> print system('ls -ld /var/log/foo'),
- drwxr-xr-x 2 jim jim 4096 2007-02-06 09:50 /var/log/foo
+ >>> print ls(os.path.join(sample_buildout, 'var/log/foo'))
+ drwxr-xr-x USER USER PREFIX/var/log/foo
- >>> print system('ls -ld /var/run/foo'),
- drwxr-x--- 2 jim jim 40 2007-02-06 09:50 /var/run/foo
+ >>> print ls(os.path.join(sample_buildout, 'var/run/foo'))
+ drwxr-x--- USER USER PREFIX/var/run/foo
Here we see that the var and run directories are kept. The etc
directory is discarded because only buildout recipes should write to
@@ -113,33 +147,45 @@
If we reinstall, remove the files, and uninstall, then the directories
are removed:
- >>> print system(join('bin', 'buildout')),
+ >>> buildout.install([])
Installing foo.
zc.recipe.deployment:
- Creating '/etc/foo',
- mode 755, user 'root', group 'root'
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Updating '/var/log/foo',
- mode 755, user 'jim', group 'jim'
+ Updating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Updating '/var/run/foo',
- mode 750, user 'jim', group 'jim'
+ Updating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
- >>> os.remove('/var/log/foo/x')
- >>> os.remove('/var/run/foo/x')
+ >>> os.remove(os.path.join(sample_buildout, 'var/log/foo/x'))
+ >>> os.remove(os.path.join(sample_buildout, 'var/run/foo/x'))
- >>> print system(join('bin', 'buildout')+' buildout:parts='),
+ >>> buildout.install([], uninstall_args=['foo'])
Uninstalling foo.
Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/foo'
- zc.recipe.deployment: Removing '/var/log/foo'.
- zc.recipe.deployment: Removing '/var/run/foo'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/foo'
+ zc.recipe.deployment: Removing 'PREFIX/etc/cron.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/init.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/logrotate.d'.
+ zc.recipe.deployment: Removing 'PREFIX/var/log/foo'.
+ zc.recipe.deployment: Removing 'PREFIX/var/run/foo'.
- >>> os.path.exists('/etc/foo')
+ >>> os.path.exists('' + os.path.join(sample_buildout, 'PREFIX/etc/foo'))
False
- >>> os.path.exists('/var/log/foo')
+ >>> os.path.exists('' + os.path.join(sample_buildout, 'PREFIX/var/log/foo'))
False
- >>> os.path.exists('/var/run/foo')
+ >>> os.path.exists('' + os.path.join(sample_buildout, 'PREFIX/var/run/foo'))
False
Deployment Name
@@ -149,37 +195,48 @@
The deployment name defaults to the section name, but the deployment
name can be specified explicitly:
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo
...
... [foo]
... recipe = zc.recipe.deployment
+ ... prefix = %s
... name = bar
- ... user = jim
- ... ''')
+ ... user = %s
+ ... etc-user = %s
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
+ >>> buildout.install([])
Installing foo.
zc.recipe.deployment:
- Creating '/etc/bar',
- mode 755, user 'root', group 'root'
+ Creating 'PREFIX/etc/bar',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/log/bar',
- mode 755, user 'jim', group 'jim'
+ Creating 'PREFIX/var/log/bar',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/run/bar',
- mode 750, user 'jim', group 'jim'
+ Creating 'PREFIX/var/run/bar',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
- >>> print system('ls -ld /etc/bar'),
- drwxr-xr-x 2 root root 4096 2007-02-06 09:50 /etc/bar
+ >>> print ls(os.path.join(sample_buildout, 'etc/bar'))
+ drwxr-xr-x USER USER PREFIX/etc/bar
- >>> print system('ls -ld /var/log/bar'),
- drwxr-xr-x 2 jim jim 4096 2007-02-06 09:50 /var/log/bar
+ >>> print ls(os.path.join(sample_buildout, 'var/log/bar'))
+ drwxr-xr-x USER USER PREFIX/var/log/bar
- >>> print system('ls -ld /var/run/bar'),
- drwxr-x--- 2 jim jim 40 2007-02-06 09:50 /var/run/bar
+ >>> print ls(os.path.join(sample_buildout, 'var/run/bar'))
+ drwxr-x--- USER USER PREFIX/var/run/bar
>>> cat('.installed.cfg') # doctest: +ELLIPSIS
[buildout]
@@ -189,19 +246,21 @@
[foo]
__buildout_installed__ =
...
- crontab-directory = /etc/cron.d
- etc-directory = /etc/bar
- log-directory = /var/log/bar
- logrotate-directory = /etc/logrotate.d
+ crontab-directory = PREFIX/etc/cron.d
+ etc-directory = PREFIX/etc/bar
+ etc-user = USER
+ log-directory = PREFIX/var/log/bar
+ logrotate-directory = PREFIX/etc/logrotate.d
name = bar
- rc-directory = /etc/init.d
+ prefix = PREFIX
+ rc-directory = PREFIX/etc/init.d
recipe = zc.recipe.deployment
- run-directory = /var/run/bar
- user = jim
+ run-directory = PREFIX/var/run/bar
+ user = USER
Note (here and earlier) that the options include the name option,
which defaults to the part name. Other parts that use the deployment
-name should use the name option rather than the part name.
+name should use the name option rather than the part name.
Configuration files
===================
@@ -213,38 +272,44 @@
Let's add a configuration file to our buildout:
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo x.cfg
...
... [foo]
... recipe = zc.recipe.deployment
- ... user = jim
+ ... prefix = %s
+ ... user = %s
+ ... etc-user = %s
...
... [x.cfg]
... recipe = zc.recipe.deployment:configuration
... text = xxx
... yyy
... zzz
- ... ''')
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
- Uninstalling foo.
- Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/bar'
- zc.recipe.deployment: Removing '/var/log/bar'.
- zc.recipe.deployment: Removing '/var/run/bar'.
+ >>> buildout.install([])
Installing foo.
zc.recipe.deployment:
- Creating '/etc/foo',
- mode 755, user 'root', group 'root'
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/log/foo',
- mode 755, user 'jim', group 'jim'
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/run/foo',
- mode 750, user 'jim', group 'jim'
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
Installing x.cfg.
By default, the configuration is installed as a part:
@@ -257,14 +322,16 @@
If a deployment is specified, then the file is placed in the
deployment etc directory:
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo x.cfg
...
... [foo]
... recipe = zc.recipe.deployment
- ... user = jim
+ ... prefix = %s
+ ... user = %s
+ ... etc-user = %s
...
... [x.cfg]
... recipe = zc.recipe.deployment:configuration
@@ -272,17 +339,34 @@
... yyy
... zzz
... deployment = foo
- ... ''')
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
- Uninstalling x.cfg.
- Updating foo.
+ >>> buildout.install([])
+ Installing foo.
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
Installing x.cfg.
>>> os.path.exists(join('parts', 'x.cfg'))
False
- >>> cat('/etc/foo/x.cfg')
+ >>> cat(os.path.join(sample_buildout, 'etc/foo/x.cfg'))
xxx
yyy
zzz
@@ -290,29 +374,47 @@
We can read data from a file rather than specifying in the
configuration:
- >>> write('x.in', '1\n2\n3\n')
-
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo x.cfg
...
... [foo]
... recipe = zc.recipe.deployment
- ... user = jim
+ ... prefix = %s
+ ... user = %s
+ ... etc-user = %s
...
... [x.cfg]
... recipe = zc.recipe.deployment:configuration
... file = x.in
... deployment = foo
- ... ''')
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
- Uninstalling x.cfg.
- Updating foo.
+ >>> write('x.in', '1\n2\n3\n')
+ >>> buildout.install([])
+ Installing foo.
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
Installing x.cfg.
- >>> cat('/etc/foo/x.cfg')
+ >>> cat(os.path.join(sample_buildout, 'etc/foo/x.cfg'))
1
2
3
@@ -324,7 +426,7 @@
...
[x.cfg]
...
- location = /etc/foo/x.cfg
+ location = PREFIX/etc/foo/x.cfg
...
Cron support
@@ -334,85 +436,112 @@
uses a times option to specify times to run the command and a command
option containing the command.
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo cron
...
... [foo]
... recipe = zc.recipe.deployment
- ... user = jim
+ ... prefix = %s
+ ... user = %s
+ ... etc-user = %s
...
... [cron]
... recipe = zc.recipe.deployment:crontab
... times = 30 23 * * *
... command = echo hello world!
... deployment = foo
- ... ''')
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
- Uninstalling x.cfg.
- Updating foo.
+ >>> buildout.install([])
+ Installing foo.
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/log/foo',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/var/run/foo',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
Installing cron.
-This example creates /etc/cron.d/foo-cron
+This example creates PREFIX/etc/cron.d/foo-cron
- >>> open('/etc/cron.d/foo-cron').read()
- '30 23 * * *\tjim\techo hello world!\n'
+ >>> open(os.path.join(sample_buildout, 'etc/cron.d/foo-cron')).read()
+ '30 23 * * *\tUSER\techo hello world!\n'
.. make sure cron recipe honors deployment name option:
- >>> write('buildout.cfg',
+ >>> buildout = setupBuildout(sample_buildout, 'buildout.cfg',
... '''
... [buildout]
... parts = foo cron
...
... [foo]
... recipe = zc.recipe.deployment
+ ... prefix = %s
... name = bar
- ... user = jim
+ ... user = %s
+ ... etc-user = %s
...
... [cron]
... recipe = zc.recipe.deployment:crontab
... times = 30 23 * * *
... command = echo hello world!
... deployment = foo
- ... ''')
+ ... ''' % (sample_buildout, user, user))
- >>> print system(join('bin', 'buildout')),
- Uninstalling cron.
- Uninstalling foo.
- Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/foo'
- zc.recipe.deployment: Removing '/var/log/foo'.
- zc.recipe.deployment: Removing '/var/run/foo'.
+ >>> buildout.install([])
Installing foo.
zc.recipe.deployment:
- Creating '/etc/bar',
- mode 755, user 'root', group 'root'
+ Creating 'PREFIX/etc/bar',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/log/bar',
- mode 755, user 'jim', group 'jim'
+ Creating 'PREFIX/var/log/bar',
+ mode 755, user 'USER', group 'USER'
zc.recipe.deployment:
- Creating '/var/run/bar',
- mode 750, user 'jim', group 'jim'
+ Creating 'PREFIX/var/run/bar',
+ mode 750, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/cron.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/init.d',
+ mode 755, user 'USER', group 'USER'
+ zc.recipe.deployment:
+ Creating 'PREFIX/etc/logrotate.d',
+ mode 755, user 'USER', group 'USER'
Installing cron.
- >>> open('/etc/cron.d/bar-cron').read()
- '30 23 * * *\tjim\techo hello world!\n'
+ >>> open(os.path.join(sample_buildout, 'etc/cron.d/bar-cron')).read()
+ '30 23 * * *\tUSER\techo hello world!\n'
.. cleanup
- >>> print system(join('bin', 'buildout')+' buildout:parts='),
+ >>> buildout.install([], uninstall_args=['cron', 'foo'])
Uninstalling cron.
Uninstalling foo.
Running uninstall recipe.
- zc.recipe.deployment: Removing '/etc/bar'
- zc.recipe.deployment: Removing '/var/log/bar'.
- zc.recipe.deployment: Removing '/var/run/bar'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/bar'
+ zc.recipe.deployment: Removing 'PREFIX/etc/cron.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/init.d'.
+ zc.recipe.deployment: Removing 'PREFIX/etc/logrotate.d'.
+ zc.recipe.deployment: Removing 'PREFIX/var/log/bar'.
+ zc.recipe.deployment: Removing 'PREFIX/var/run/bar'.
- >>> os.path.exists('/etc/cron.d/bar-cron')
+ >>> os.path.exists(os.path.join(sample_buildout, 'etc/cron.d/bar-cron'))
False
Modified: zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/__init__.py
===================================================================
--- zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/__init__.py 2008-08-02 21:34:56 UTC (rev 89240)
+++ zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/__init__.py 2008-08-02 23:00:53 UTC (rev 89241)
@@ -31,29 +31,36 @@
name = options['name']
create = []
+ options['prefix'] = options.get('prefix', '/')
+ options['run-directory'] = os.path.join(
+ options['prefix'], options.get('run', 'var/run'), name)
+ options['log-directory'] = os.path.join(
+ options['prefix'], options.get('log', 'var/log'), name)
+ options['etc-directory'] = os.path.join(
+ options['prefix'], options.get('etc', 'etc'), name)
+ etc = os.path.join(options['prefix'], options.get('etc', 'etc'))
+ options['crontab-directory'] = options.get(
+ 'crontab-directory', os.path.join(etc, 'cron.d'))
+ options['rc-directory'] = options.get(
+ 'rc-directory', os.path.join(etc, 'init.d'))
+ options['logrotate-directory'] = options.get(
+ 'logrotate-directory', os.path.join(etc, 'logrotate.d'))
- options['run-directory'] = os.path.join(options.get('run', '/var/run'),
- name)
- options['log-directory'] = os.path.join(options.get('log', '/var/log'),
- name)
- options['etc-directory'] = os.path.join(options.get('etc', '/etc'),
- name)
- options['crontab-directory'] = options.get('crontab-directory',
- '/etc/cron.d')
- options['rc-directory'] = options.get('rc-directory', '/etc/init.d')
-
- options['logrotate-directory'] = options.get('logrotate-directory',
- '/etc/logrotate.d')
-
def install(self):
options = self.options
- user = options['user']
- uid, gid = pwd.getpwnam(user)[2:4]
+ run_user = options['user']
+ etc_user = options.get('etc-user', 'root')
+ run_uid, run_gid = pwd.getpwnam(run_user)[2:4]
+ etc_uid, etc_gid = pwd.getpwnam(etc_user)[2:4]
created = []
try:
- make_dir(options['etc-directory'], 0, 0, 0755, created)
- make_dir(options['log-directory'], uid, gid, 0755, created)
- make_dir(options['run-directory'], uid, gid, 0750, created)
+ make_dir(options['etc-directory'], etc_uid, etc_gid, 0755, created)
+ make_dir(options['log-directory'], run_uid, run_gid, 0755, created)
+ make_dir(options['run-directory'], run_uid, run_gid, 0750, created)
+ if options['prefix'] != '/':
+ make_dir(options['crontab-directory'], etc_uid, etc_gid, 0755, created)
+ make_dir(options['rc-directory'], etc_uid, etc_gid, 0755, created)
+ make_dir(options['logrotate-directory'], etc_uid, etc_gid, 0755, created)
except Exception:
for d in created:
try:
@@ -73,7 +80,10 @@
path = options['etc-directory']
shutil.rmtree(path)
logger.info("Removing %r", path)
- for d in 'log', 'run':
+ directories = ()
+ if options['prefix'] != '/':
+ directories = ('crontab', 'rc', 'logrotate')
+ for d in directories + ('log', 'run'):
path = options[d+'-directory']
if os.listdir(path):
logger.warn("Can't remove non-empty directory %r.", path)
@@ -85,7 +95,7 @@
uname = pwd.getpwuid(uid)[0]
gname = grp.getgrgid(gid)[0]
if not os.path.isdir(name):
- os.mkdir(name, mode)
+ os.makedirs(name, mode)
created.append(name)
logger.info('\n Creating %r,\n mode %o, user %r, group %r',
name, mode, uname, gname)
Modified: zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/rtests.py
===================================================================
--- zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/rtests.py 2008-08-02 21:34:56 UTC (rev 89240)
+++ zc.recipe.deployment/branches/aaron-nonroot/src/zc/recipe/deployment/rtests.py 2008-08-02 23:00:53 UTC (rev 89241)
@@ -18,11 +18,44 @@
import unittest
import zope.testing
from zope.testing import doctest, renormalizing
+import getpass
+import os
+import os.path
+import stat
+import logging
+import pwd
+import grp
+user = pwd.getpwuid(os.geteuid()).pw_name
+group = grp.getgrgid(os.getegid()).gr_name
+
+def ls(path):
+ def perm(power, mode):
+ bit = (mode & 2 ** power) << (31 - power)
+ if bit:
+ if power in [2, 5, 8]:
+ return 'r'
+ elif power in [1, 4, 7]:
+ return 'w'
+ else:
+ return 'x'
+ else:
+ return '-'
+ st = os.stat(path)
+ if stat.S_ISDIR(st.st_mode):
+ permissions = ['d']
+ else:
+ permissions = ['-']
+ permissions = ''.join(permissions + [perm(power, st.st_mode) for power in reversed(xrange(9))])
+ return '%s %s %s %s' % (permissions, user, group, path)
+
def setUp(test):
zc.buildout.testing.buildoutSetUp(test)
zc.buildout.testing.install_develop('zc.recipe.deployment', test)
+ test.globs['user'] = getpass.getuser()
+ test.globs['ls'] = ls
+
def test_suite():
return unittest.TestSuite((
#doctest.DocTestSuite(),
@@ -31,6 +64,8 @@
setUp=setUp, tearDown=zc.buildout.testing.buildoutTearDown,
checker=renormalizing.RENormalizing([
(re.compile('\d+ \d\d\d\d-\d\d-\d\d \d\d:\d\d'), ''),
+ (re.compile(user), 'USER'),
+ (re.compile('/.*/sample-buildout'), 'PREFIX'),
## zc.buildout.testing.normalize_path,
## zc.buildout.testing.normalize_script,
@@ -39,7 +74,8 @@
## (re.compile('\d[.]\d+ seconds'), '0.001 seconds'),
## (re.compile('zope.testing-[^-]+-'), 'zope.testing-X-'),
## (re.compile('setuptools-[^-]+-'), 'setuptools-X-'),
- ])
+ ]),
+ optionflags = zope.testing.doctest.REPORT_NDIFF,
),
))
More information about the Checkins
mailing list