diff options
author | elijah <elijah@riseup.net> | 2013-02-10 23:40:05 -0800 |
---|---|---|
committer | elijah <elijah@riseup.net> | 2013-02-10 23:40:05 -0800 |
commit | ea5ec53f0c7b4fd3c400d5976ddb736331e245b8 (patch) | |
tree | cd3c89ef07d5d51efb6ffae30695c0e8f875662d /puppet/modules/try/manifests/file.pp | |
parent | 3cdd7f5f02c237da0f8a3f3eb898982883fd9b97 (diff) | |
parent | 708a7e39af9a337ae38f491e7ca1892dd70002c1 (diff) |
Merge branch 'try' into develop
Diffstat (limited to 'puppet/modules/try/manifests/file.pp')
-rw-r--r-- | puppet/modules/try/manifests/file.pp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/puppet/modules/try/manifests/file.pp b/puppet/modules/try/manifests/file.pp new file mode 100644 index 00000000..406c0b7a --- /dev/null +++ b/puppet/modules/try/manifests/file.pp @@ -0,0 +1,51 @@ +# +# like built-in type "file", but gets gracefully ignored if the target does not exist or is undefined. +# +# /bin/true and /usr/bin/test are hardcoded to their paths in debian. +# + +define try::file ( + $ensure = undef, + $target = undef, + $restore = true) { + + if $target != undef { + exec { "check_${name}": + command => "/bin/true", + onlyif => "/usr/bin/test -e '${target}'", + loglevel => info; + } + file { "$name": + ensure => $ensure, + target => $target, + require => Exec["check_${name}"], + loglevel => info; + } + } + + # + # if the target does not exist (or is undef), and the file happens to be in a git repo, + # then restore the file to its original state. + # + if $target == undef or $restore { + $file_basename = basename($name) + $file_dirname = dirname($name) + $command = "git rev-parse && unlink '${name}'; git checkout -- '${file_basename}' && chown --reference='${file_dirname}' '${name}'; true" + debug($command) + + if $target == undef { + exec { "restore_${name}": + command => $command, + cwd => $file_dirname, + loglevel => info; + } + } else { + exec { "restore_${name}": + unless => "/usr/bin/test -e '${target}'", + command => $command, + cwd => $file_dirname, + loglevel => info; + } + } + } +} |