diff --git a/conf/type/__directory/gencode-remote b/conf/type/__directory/gencode-remote
index a5458b4b..e9feecf4 100755
--- a/conf/type/__directory/gencode-remote
+++ b/conf/type/__directory/gencode-remote
@@ -17,47 +17,57 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Handle directories
-#
-#
-# __directory /etc [--mode --owner --group --parents [yes|no] ]
-#
destination="/$__object_id"
+state_should="$(cat "$__object/parameter/state")"
-# Include parent directories?
-if [ -f "$__object/parameter/parents" ]; then
- parents="$(cat "$__object/parameter/parents")"
- if [ yes = "$parents" ]; then
- mkdiropt="-p"
- else
- mkdiropt=""
- fi
-fi
+case "$state_should" in
+ present)
+ # Include parent directories?
+ if [ -f "$__object/parameter/parents" ]; then
+ parents="$(cat "$__object/parameter/parents")"
+ if [ yes = "$parents" ]; then
+ mkdiropt="-p"
+ else
+ mkdiropt=""
+ fi
+ fi
-if [ -f "$__object/parameter/recursive" ]; then
- if [ yes = "$(cat "$__object/parameter/recursive")" ]; then
- recursive="-R"
- fi
-fi
+ if [ -f "$__object/parameter/recursive" ]; then
+ if [ yes = "$(cat "$__object/parameter/recursive")" ]; then
+ recursive="-R"
+ fi
+ fi
-# Only create if not already existent
-if [ no = "$(cat "$__object/explorer/exists")" ]; then
- echo mkdir $mkdiropt \"$destination\"
-fi
+ # Only create if not already existent
+ if [ no = "$(cat "$__object/explorer/exists")" ]; then
+ echo mkdir $mkdiropt \"$destination\"
+ fi
-# Mode settings
-if [ -f "$__object/parameter/mode" ]; then
- echo chmod \"$(cat "$__object/parameter/mode")\" \"$destination\"
-fi
+ # Mode settings
+ if [ -f "$__object/parameter/mode" ]; then
+ echo chmod \"$(cat "$__object/parameter/mode")\" \"$destination\"
+ fi
-# Group
-if [ -f "$__object/parameter/group" ]; then
- echo chgrp $recursive \"$(cat "$__object/parameter/group")\" \"$destination\"
-fi
+ # Group
+ if [ -f "$__object/parameter/group" ]; then
+ echo chgrp $recursive \"$(cat "$__object/parameter/group")\" \"$destination\"
+ fi
-# Owner
-if [ -f "$__object/parameter/owner" ]; then
- echo chown $recursive \"$(cat "$__object/parameter/owner")\" \"$destination\"
-fi
+ # Owner
+ if [ -f "$__object/parameter/owner" ]; then
+ echo chown $recursive \"$(cat "$__object/parameter/owner")\" \"$destination\"
+ fi
+ ;;
+ absent)
+ # Only delete if it exists
+ if [ yes = "$(cat "$__object/explorer/exists")" ]; then
+ echo rm -r \"$destination\"
+ fi
+
+ ;;
+ *)
+ echo "Unknown state" >&2
+ exit 1
+ ;;
+esac
diff --git a/conf/type/__directory/man.text b/conf/type/__directory/man.text
index e2201172..315d1fb9 100644
--- a/conf/type/__directory/man.text
+++ b/conf/type/__directory/man.text
@@ -5,12 +5,12 @@ Nico Schottelius
NAME
----
-cdist-type__directory - Create a directory
+cdist-type__directory - Manage a directory
DESCRIPTION
-----------
-This cdist type allows you to create directories on the target.
+This cdist type allows you to create or remove directories on the target.
REQUIRED PARAMETERS
@@ -20,6 +20,9 @@ None.
OPTIONAL PARAMETERS
-------------------
+state::
+ 'present' or 'absent', defaults to 'present'
+
group::
Group to chgrp to.
@@ -45,6 +48,9 @@ EXAMPLES
# A silly example
__directory /tmp/foobar
+# Remove a directory
+__directory /tmp/foobar --ensure absent
+
# Ensure /etc exists correctly
__directory /etc --owner root --group root --mode 0755
diff --git a/conf/type/__directory/manifest b/conf/type/__directory/manifest
new file mode 100755
index 00000000..a8ee5a6f
--- /dev/null
+++ b/conf/type/__directory/manifest
@@ -0,0 +1,23 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+# set defaults
+state="$(cat "$__object/parameter/state" 2>/dev/null \
+ || echo "present" | tee "$__object/parameter/state")"
diff --git a/conf/type/__directory/parameter/optional b/conf/type/__directory/parameter/optional
index 247e2f64..27f9d76a 100644
--- a/conf/type/__directory/parameter/optional
+++ b/conf/type/__directory/parameter/optional
@@ -1,3 +1,4 @@
+state
group
mode
owner
diff --git a/conf/type/__file/gencode-local b/conf/type/__file/gencode-local
index 0c6c249d..d9839a19 100755
--- a/conf/type/__file/gencode-local
+++ b/conf/type/__file/gencode-local
@@ -22,19 +22,22 @@
#
destination="/$__object_id"
+state_should="$(cat "$__object/parameter/state")"
-if [ -f "$__object/parameter/source" ]; then
- source="$(cat "$__object/parameter/source")"
+if [ "$state_should" = "present" ]; then
+ if [ -f "$__object/parameter/source" ]; then
+ source="$(cat "$__object/parameter/source")"
- if [ -f "$source" ]; then
- local_cksum="$(cksum < "$source")"
- remote_cksum="$(cat "$__object/explorer/cksum")"
+ if [ -f "$source" ]; then
+ local_cksum="$(cksum < "$source")"
+ remote_cksum="$(cat "$__object/explorer/cksum")"
- if [ "$local_cksum" != "$remote_cksum" ]; then
- echo "$__remote_copy" "$source" "${__target_host}:${destination}"
+ if [ "$local_cksum" != "$remote_cksum" ]; then
+ echo "$__remote_copy" "$source" "${__target_host}:${destination}"
+ fi
+ else
+ echo "Source \"$source\" does not exist." >&2
+ exit 1
fi
- else
- echo "Source \"$source\" does not exist." >&2
- exit 1
fi
fi
diff --git a/conf/type/__file/gencode-remote b/conf/type/__file/gencode-remote
index 7c5cf7ce..ef42dd54 100755
--- a/conf/type/__file/gencode-remote
+++ b/conf/type/__file/gencode-remote
@@ -22,25 +22,33 @@
#
destination="/$__object_id"
+state_should="$(cat "$__object/parameter/state")"
+exists="$(cat "$__object/explorer/exists")"
-# No source? Create empty file
-if [ ! -f "$__object/parameter/source" ]; then
- if [ no = "$(cat "$__object/explorer/exists")" ]; then
- echo touch \"$destination\"
+if [ "$state_should" = "present" ]; then
+ # No source? Create empty file
+ if [ ! -f "$__object/parameter/source" ]; then
+ if [ "$exists" = "no" ]; then
+ echo touch \"$destination\"
+ fi
+ fi
+
+ # Mode settings
+ if [ -f "$__object/parameter/mode" ]; then
+ echo chmod \"$(cat "$__object/parameter/mode")\" \"$destination\"
+ fi
+
+ # Group
+ if [ -f "$__object/parameter/group" ]; then
+ echo chgrp \"$(cat "$__object/parameter/group")\" \"$destination\"
+ fi
+
+ # Owner
+ if [ -f "$__object/parameter/owner" ]; then
+ echo chown \"$(cat "$__object/parameter/owner")\" \"$destination\"
+ fi
+elif [ "$state_should" = "absent" ]; then
+ if [ "$exists" = "yes" ]; then
+ echo rm -f \"$destination\"
fi
fi
-
-# Mode settings
-if [ -f "$__object/parameter/mode" ]; then
- echo chmod \"$(cat "$__object/parameter/mode")\" \"$destination\"
-fi
-
-# Group
-if [ -f "$__object/parameter/group" ]; then
- echo chgrp \"$(cat "$__object/parameter/group")\" \"$destination\"
-fi
-
-# Owner
-if [ -f "$__object/parameter/owner" ]; then
- echo chown \"$(cat "$__object/parameter/owner")\" \"$destination\"
-fi
diff --git a/conf/type/__file/man.text b/conf/type/__file/man.text
index 67ab53d1..fa6b7644 100644
--- a/conf/type/__file/man.text
+++ b/conf/type/__file/man.text
@@ -5,21 +5,24 @@ Nico Schottelius
NAME
----
-cdist-type__file - Create files
+cdist-type__file - Manage files
DESCRIPTION
-----------
-This cdist type allows you to create files on the target.
+This cdist type allows you to create files, remove files and set file
+attributes on the target.
REQUIRED PARAMETERS
-------------------
None.
-
OPTIONAL PARAMETERS
-------------------
+state::
+ 'present' or 'absent', defaults to 'present'
+
group::
Group to chgrp to.
@@ -40,13 +43,18 @@ EXAMPLES
--------------------------------------------------------------------------------
# Create /etc/cdist-configured as an empty file
__file /etc/cdist-configured
+# The same thing
+__file /etc/cdist-configured --ensure present
+# Delete existing file
+__file /etc/cdist-configured --ensure absent
# Use __file from another type
-__file /etc/issue --source "$__type/files/archlinux"
+__file /etc/issue --source "$__type/files/archlinux" --ensure present
# Supply some more settings
__file /etc/shadow --source "$__type/files/shadow" \
- --owner root --group shadow --mode 0640
+ --owner root --group shadow --mode 0640 \
+ --ensure present
--------------------------------------------------------------------------------
diff --git a/conf/type/__file/manifest b/conf/type/__file/manifest
new file mode 100755
index 00000000..915a2ca9
--- /dev/null
+++ b/conf/type/__file/manifest
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+name="$__object_id"
+
+# set defaults
+state="$(cat "$__object/parameter/state" 2>/dev/null \
+ || echo "present" | tee "$__object/parameter/state")"
diff --git a/conf/type/__file/parameter/optional b/conf/type/__file/parameter/optional
index 06120518..c696d592 100644
--- a/conf/type/__file/parameter/optional
+++ b/conf/type/__file/parameter/optional
@@ -1,3 +1,4 @@
+state
group
mode
owner
diff --git a/conf/type/__link/gencode-remote b/conf/type/__link/gencode-remote
index 07da987c..bb43de2e 100755
--- a/conf/type/__link/gencode-remote
+++ b/conf/type/__link/gencode-remote
@@ -39,4 +39,17 @@ case "$type" in
;;
esac
-echo ln ${lnopt} -f \"$source\" \"$destination\"
+state_should="$(cat "$__object/parameter/state")"
+case "$state_should" in
+ present)
+ echo ln ${lnopt} -f \"$source\" \"$destination\"
+ ;;
+ absent)
+ echo rm -f \"$destination\"
+ ;;
+ *)
+ echo "Unknown state" >&2
+ exit 1
+ ;;
+esac
+
diff --git a/conf/type/__link/man.text b/conf/type/__link/man.text
index fb914298..a7d33c59 100644
--- a/conf/type/__link/man.text
+++ b/conf/type/__link/man.text
@@ -25,7 +25,8 @@ type::
OPTIONAL PARAMETERS
-------------------
-None.
+state::
+ 'present' or 'absent', defaults to 'present'
EXAMPLES
diff --git a/conf/type/__link/manifest b/conf/type/__link/manifest
new file mode 100755
index 00000000..a8ee5a6f
--- /dev/null
+++ b/conf/type/__link/manifest
@@ -0,0 +1,23 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+# set defaults
+state="$(cat "$__object/parameter/state" 2>/dev/null \
+ || echo "present" | tee "$__object/parameter/state")"
diff --git a/conf/type/__link/parameter/optional b/conf/type/__link/parameter/optional
new file mode 100644
index 00000000..ff72b5c7
--- /dev/null
+++ b/conf/type/__link/parameter/optional
@@ -0,0 +1 @@
+state