summaryrefslogtreecommitdiff
path: root/puppet/modules/try/manifests/file.pp
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2013-02-10 23:40:05 -0800
committerelijah <elijah@riseup.net>2013-02-10 23:40:05 -0800
commitea5ec53f0c7b4fd3c400d5976ddb736331e245b8 (patch)
treecd3c89ef07d5d51efb6ffae30695c0e8f875662d /puppet/modules/try/manifests/file.pp
parent3cdd7f5f02c237da0f8a3f3eb898982883fd9b97 (diff)
parent708a7e39af9a337ae38f491e7ca1892dd70002c1 (diff)
Merge branch 'try' into develop
Diffstat (limited to 'puppet/modules/try/manifests/file.pp')
-rw-r--r--puppet/modules/try/manifests/file.pp51
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;
+ }
+ }
+ }
+}