[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