Martin,

r.e. your comment: "The command will only get executed in case that
$targeDir/$appName does not exists. The command will always return
0 !!" can I ask what you were referring to here? was it the exec
"check_unpacked_archive_exists_$name"? I tested the statement in the
onlyif and that definitely returns 0 when the directory is absent and
1 when the directory is present. I'm not quite sure what to do here to
correct this?

Cheers,

Edd



On Dec 14, 10:18 am, Edd Grant <e...@eddgrant.com> wrote:
> Wow - thanks for the super quick reply Martin. Will try out your
> suggestions.
>
> Cheers,
>
> Edd
>
> On Dec 14, 10:16 am, Martin Alfke <tux...@gmail.com> wrote:
>
>
>
>
>
>
>
> > Hi,
>
> > my answer is inline..
>
> > On 14.12.2011, at 11:09, Edd Grant wrote:
>
> > > Hi All,
>
> > > I'm trying to write a module which unpacks an archive to a specified 
> > > location, the idea is as follows:
>
> > > Let's say I'm trying to deploy an archive of grails-1.3.7
> > > Check that a directory exists at $targetDir/grails-1.3.7
> > > If it does, do nothing
> > > If it doesn't then do the following...
> > > Copy grails-1.3.7.zip from the module source to $targetDir
> > > Unpack to $targetDir/grails-1.3.7
> > > Delete the archive so we don't end up with mess in our directories
> > > I have this mostly working, i.e. the code below performs all of the steps 
> > > above successfully, but for some reason I cannot stop steps 4 and onwards 
> > > from happening every time Puppet applies the manifests, irrespective of 
> > > whether the $targetDir/grails-1.3.7 directory already exists.
>
> > > Here's the code
> > > Module code: modules/archive/unpack.pp
>
> > > define archive::unpack($archiveName,
> > >                                   $appName,
> > >                                   $archiveDir,
> > >                                   $targetDir,
> > >                                   $pathFolder,
> > >                                   $owner = "root",
> > >                                   $group = "root",
> > >                                   $mode = "644") {
>
> > >   #Set the extraction command appropriately based on the archive type.
> > >   $command = $archiveName ? {
> > >     /(^.*\.tar\.gz$)|(^.*\.tgz$)/ => "/bin/tar zxf 
> > > $targetDir/$archiveName",
> > >     /(^.*\.tar$)/ => "/bin/tar xf $targetDir/$archiveName",
> > >     /^.*\.zip$/ => "/usr/bin/unzip $targetDir/$archiveName",
> > >     default => "Error: Could not detect archive type from archive name 
> > > ($archiveName), cannot unpack. Supported types: .tar.gzip, .zip",
> > >   }
>
> > >   # Check if the unpacked archive directory exists
> > >   # the idea here was to have all subsequent actions
> > >   # subscribe to the outcome of this check so that the archive
> > >   # would only be copied, unpacked, chowned and chmodded if
> > >   # the directory specified by this exec did not exist. This doesn't seem
> > >   # to work though since "copy_archive_$name" always seems to be invoked
> > >   # irrespective of the outcome of the onlyif condition in this exec.
> > >   exec { "check_unpacked_archive_exists_$name":
> > >     command => "/bin/echo '$targetDir/$appName does not exist, it will be 
> > > created.'",
> > >     cwd => $targetDir,
> > >     creates => "$targetDir/$appName",
> > >     onlyif => "/usr/bin/test ! -d $targetDir/$appName",
> > >     logoutput => true,
> > >   }
>
> > The command will only get executed in case that $targeDir/$appName does not 
> > exists.
> > The command will always return 0 !!
>
> > >   # copy file from puppet master to local system
> > >   file { "copy_archive_$name":
> > >     path => "$targetDir/$archiveName",
> > >     source => "$archiveDir/$archiveName",
> > >     replace => false,
> > >     subscribe => Exec["check_unpacked_archive_exists_$name"],
> > >   }
>
> > Here you subscribe to the exec resource.
> > Exec resource will get parsed but the command will not run
> > What you want is
> > require => Exec[...]
>
> > Using require instead of subscribe will make sure that the file resource 
> > will only be done if the exec resource command is executed.
>
> > >    # extract local file
> > >   exec { "unpack_archive_$name":
> > >     command => $command,
> > >     cwd => $targetDir,
> > >     creates => "$targetDir/$appName",
> > >     refreshonly => true,
> > >     logoutput => true,
> > >     subscribe => File["copy_archive_$name"],
> > >   }
>
> > Same here: use require instead of subscribe.
>
> > >   # delete copied archive
> > >   exec { "delete_copied_archive_$name":
> > >     command => "/bin/rm -f $targetDir/$archiveName",
> > >     cwd => "$targetDir",
> > >     subscribe => Exec["unpack_archive_$name"],
> > >     logoutput => true,
> > >   }
> > > }
>
> > Same here.
>
> > Kind regards,
>
> > Martin
>
> > > Invocation code:
>
> > > class grails {
>
> > >   $appName = "grails-2.0.0.M1"
> > >   $archiveName = "$appName.zip"
> > >   $archiveDir = "puppet:///modules/grails"
> > >   $targetDir = "/usr/local/java"
> > >   $pathFolder = "bin"
> > >   $owner = root
> > >   $group = dev
> > >   $mode = 6775
>
> > >   archive::unpack { "install_$appName":
> > >     archiveName => $archiveName,
> > >     appName => $appName,
> > >     archiveDir => $archiveDir,
> > >     targetDir => $targetDir,
> > >     pathFolder => $pathFolder,
> > >     owner => $owner,
> > >     group => $group,
> > >     mode => $mode,
> > >   }
> > > }
>
> > > The frustrating thing is that the exec called 
> > > "check_unpacked_archive_exists_$name" is definitely only firing when it 
> > > finds the sought folder to be missing, which is what I want it to do. 
> > > What I don't understand is why the file called "copy_archive_$name" which 
> > > subscribes to that exec gets fired everytime. I can't help but think that 
> > > this would be made much much easier if only the file resource supported 
> > > 'onlyif'... but while it doesn't does anyone have any insight as to why 
> > > I'm seeing this issue?
>
> > > Cheers,
>
> > > Edd
>
> > > --
> > > Web:http://www.eddgrant.com
> > > Email: e...@eddgrant.com
> > > Mobile: +44 (0) 7861 394 543
>
> > > --
> > > You received this message because you are subscribed to the Google Groups 
> > > "Puppet Users" group.
> > > To post to this group, send email to puppet-users@googlegroups.com.
> > > To unsubscribe from this group, send email to 
> > > puppet-users+unsubscr...@googlegroups.com.
> > > For more options, visit this group 
> > > athttp://groups.google.com/group/puppet-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to