From 6a97cf8f26214424d877a474a4ffe85a41233179 Mon Sep 17 00:00:00 2001
From: Jake Guffey <jake.guffey@eprotex.com>
Date: Wed, 15 Feb 2012 14:27:30 -0500
Subject: [PATCH] Initial commit. Includes a few types in development and
 __package_pkg_freebsd.

---
 conf/type/__build/man.text                    |  56 ++++++++
 conf/type/__build/manifest                    |  46 ++++++
 conf/type/__build/parameter/optional          |   2 +
 conf/type/__build_port_freebsd/gencode-remote |  69 +++++++++
 conf/type/__build_port_freebsd/man.text       |  61 ++++++++
 .../__build_port_freebsd/parameter/optional   |   1 +
 conf/type/__package/manifest                  |   1 +
 .../explorer/pkg_version                      |  35 +++++
 .../type/__package_pkg_freebsd/gencode-remote | 135 ++++++++++++++++++
 conf/type/__package_pkg_freebsd/man.text      |  64 +++++++++
 .../__package_pkg_freebsd/parameter/optional  |   4 +
 .../__package_pkg_freebsd/parameter/required  |   1 +
 conf/type/__rsyncer/gencode-local             |  71 +++++++++
 conf/type/__rsyncer/man.text                  |  72 ++++++++++
 conf/type/__rsyncer/manifest                  |  31 ++++
 conf/type/__rsyncer/parameter/optional        |   3 +
 conf/type/__rsyncer/parameter/required        |   1 +
 conf/type/__service/gencode-remote            |  98 +++++++++++++
 conf/type/__service/man.text                  |  48 +++++++
 conf/type/__service/parameter/required        |   1 +
 20 files changed, 800 insertions(+)
 create mode 100644 conf/type/__build/man.text
 create mode 100755 conf/type/__build/manifest
 create mode 100644 conf/type/__build/parameter/optional
 create mode 100755 conf/type/__build_port_freebsd/gencode-remote
 create mode 100644 conf/type/__build_port_freebsd/man.text
 create mode 100644 conf/type/__build_port_freebsd/parameter/optional
 create mode 100755 conf/type/__package_pkg_freebsd/explorer/pkg_version
 create mode 100755 conf/type/__package_pkg_freebsd/gencode-remote
 create mode 100644 conf/type/__package_pkg_freebsd/man.text
 create mode 100644 conf/type/__package_pkg_freebsd/parameter/optional
 create mode 100644 conf/type/__package_pkg_freebsd/parameter/required
 create mode 100755 conf/type/__rsyncer/gencode-local
 create mode 100644 conf/type/__rsyncer/man.text
 create mode 100755 conf/type/__rsyncer/manifest
 create mode 100644 conf/type/__rsyncer/parameter/optional
 create mode 100644 conf/type/__rsyncer/parameter/required
 create mode 100755 conf/type/__service/gencode-remote
 create mode 100644 conf/type/__service/man.text
 create mode 100644 conf/type/__service/parameter/required

diff --git a/conf/type/__build/man.text b/conf/type/__build/man.text
new file mode 100644
index 00000000..1a297ec2
--- /dev/null
+++ b/conf/type/__build/man.text
@@ -0,0 +1,56 @@
+cdist-type__build(7)
+===================
+Jake Guffey <jake.guffey--@--eprotex.com>
+
+
+NAME
+----
+cdist-type__build - Manage software build operations
+
+
+DESCRIPTION
+-----------
+This cdist type allows you to build software on the target.
+It dispatches the actual work to the build-dependant types.
+
+
+REQUIRED PARAMETERS
+-------------------
+None.
+
+OPTIONAL PARAMETERS
+-------------------
+name::
+   The name of the software to build. Default is to use the object_id.
+type::
+   The build type to use. Default is to build a port for direct installation
+   on the target host.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Build and install a port
+__build vim
+
+# Build and install a port explicitly defining to use ports
+__build vim --type port_freebsd
+
+# Build a package to install via __package on another machine
+__build vim --type pkg_freebsd
+
+# Force use of a specific package type
+__build nanobsd --name nanobsd-internaluse-9.0 --type nanobsd
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Jake Guffey. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__build/manifest b/conf/type/__build/manifest
new file mode 100755
index 00000000..c8392d35
--- /dev/null
+++ b/conf/type/__build/manifest
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# __build is an abstract type which dispatches to the lower level
+# __build_$name types which do the actual interaction with the software
+# build system.
+#
+
+if [ -f "$__object/parameter/name" ]; then
+   name="$(cat "$__object/parameter/name")"
+else
+   name="$__object_id"
+fi
+
+if [ -f "$__object/parameter/type" ]; then
+   type="$(cat "$__object/parameter/type")"
+else
+   type="port_freebsd"
+fi
+
+set -- "$@" "$__object_id"
+cd "$__object/parameter"
+for property in $(ls .); do
+   if [ "$property" != "type" ]; then
+      set -- "$@" "--$property" "$(cat "$property")"
+   fi
+done
+
+__build_$type "$@"
diff --git a/conf/type/__build/parameter/optional b/conf/type/__build/parameter/optional
new file mode 100644
index 00000000..d3598a51
--- /dev/null
+++ b/conf/type/__build/parameter/optional
@@ -0,0 +1,2 @@
+name
+type
diff --git a/conf/type/__build_port_freebsd/gencode-remote b/conf/type/__build_port_freebsd/gencode-remote
new file mode 100755
index 00000000..ff0432ba
--- /dev/null
+++ b/conf/type/__build_port_freebsd/gencode-remote
@@ -0,0 +1,69 @@
+#!/bin/sh
+#
+# 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Build ports on FreeBSD
+#
+
+assert ()                 #  If condition false,
+{                         #+ exit from script with error message.
+	E_PARAM_ERR=98
+	E_ASSERT_FAILED=99
+
+	if [ -z "$2" ]          # Not enough parameters passed.
+	then
+		return $E_PARAM_ERR   # No damage done.
+	fi
+
+	lineno=$2
+
+	if [ ! $1 ] 
+	then
+		echo "Assertion failed:  \"$1\""
+		echo "File \"$0\", line $lineno, called by $(caller 0)"
+		exit $E_ASSERT_FAILED
+	fi  
+}
+
+# Debug
+#exec >&2
+#set -x
+
+if [ -f "$__object/parameter/name" ]; then
+	name="$__object/parameter/name"
+else
+	name="$__object_id"
+fi
+
+# Get list of installed ports
+installed="$(cat "$__object/explorer/installed")"
+
+# Is port already built/installed? Check /var/db/ports
+for PORT in $installed; do
+   if [ "$(eval "$PORT" : "$name")" != 0 ]; then	# already installed
+      exit 0;
+   fi
+done
+
+# If not, build
+echo "cd /usr/ports && "
+
+# Debug
+#set +x
+
diff --git a/conf/type/__build_port_freebsd/man.text b/conf/type/__build_port_freebsd/man.text
new file mode 100644
index 00000000..7ce6042b
--- /dev/null
+++ b/conf/type/__build_port_freebsd/man.text
@@ -0,0 +1,61 @@
+cdist-type__package_pkg_freebsd(7)
+==================================
+Jake Guffey <jake.guffey--@--eprotex.com>
+
+
+NAME
+----
+cdist-type__package_pkg_freebsd - Manage FreeBSD packages 
+
+
+DESCRIPTION
+-----------
+This type is usually used on FreeBSD to manage packages.
+
+
+REQUIRED PARAMETERS
+-------------------
+state::
+   Either "installed" or "removed".
+
+
+OPTIONAL PARAMETERS
+-------------------
+name::
+   If supplied, use the name and not the object id as the package name.
+
+flavor::
+   If supplied, use to avoid ambiguity.
+
+version::
+   If supplied, use to install a specific version of the package named.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Ensure zsh is installed
+__package_pkg_freebsd zsh --state installed
+
+# Ensure vim is installed, use flavor no_x11
+__package_pkg_freebsd vim --state installed --flavor no_x11
+
+# If you don't want to follow pythonX packages, but always use python
+__package_pkg_freebsd python --state installed --name python2
+
+# Remove obsolete package
+__package_pkg_freebsd puppet --state removed
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+- cdist-type__package(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Jake Guffey. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__build_port_freebsd/parameter/optional b/conf/type/__build_port_freebsd/parameter/optional
new file mode 100644
index 00000000..f121bdbf
--- /dev/null
+++ b/conf/type/__build_port_freebsd/parameter/optional
@@ -0,0 +1 @@
+name
diff --git a/conf/type/__package/manifest b/conf/type/__package/manifest
index 181da077..7e0d7080 100755
--- a/conf/type/__package/manifest
+++ b/conf/type/__package/manifest
@@ -34,6 +34,7 @@ else
          debian|ubuntu) type="apt" ;;
          gentoo) type="emerge" ;;
          amazon|centos|fedora|redhat) type="yum" ;;
+         freebsd) type="pkg_freebsd" ;;
          *)
             echo "Don't know how to manage packages on: $os" >&2
             exit 1
diff --git a/conf/type/__package_pkg_freebsd/explorer/pkg_version b/conf/type/__package_pkg_freebsd/explorer/pkg_version
new file mode 100755
index 00000000..4bca24b6
--- /dev/null
+++ b/conf/type/__package_pkg_freebsd/explorer/pkg_version
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Retrieve the status of a package - parsed dpkg output
+#
+
+if [ -f "$__object/parameter/name" ]; then
+   name="$(cat "$__object/parameter/name")"
+else
+   name="$__object_id"
+fi
+
+# Don't produce "no pkgs installed" output -- breaks things
+PKG_OUTPUT=$(pkg_info 2>&1)
+if [ ! "$PKG_OUTPUT" = "pkg_info: no packages installed" ]; then
+	echo "$(echo "$PKG_OUTPUT" | grep "^$name-" | cut '-d ' -f1 | sed "s/$name-//g")"
+fi
+
diff --git a/conf/type/__package_pkg_freebsd/gencode-remote b/conf/type/__package_pkg_freebsd/gencode-remote
new file mode 100755
index 00000000..4d3c9844
--- /dev/null
+++ b/conf/type/__package_pkg_freebsd/gencode-remote
@@ -0,0 +1,135 @@
+#!/bin/sh
+#
+# 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Manage packages with pkg on FreeBSD
+#
+
+assert ()                 #  If condition false,
+{                         #+ exit from script with error message.
+	E_PARAM_ERR=98
+	E_ASSERT_FAILED=99
+
+	if [ -z "$2" ]          # Not enough parameters passed.
+	then
+		return $E_PARAM_ERR   # No damage done.
+	fi
+
+	lineno=$2
+
+	if [ ! $1 ] 
+	then
+		echo "Assertion failed:  \"$1\""
+		echo "File \"$0\", line $lineno, called by $(caller 0)"
+		exit $E_ASSERT_FAILED
+	fi  
+}
+
+# Debug
+#exec >&2
+#set -x
+
+if [ -f "$__object/parameter/name" ]; then
+	name="$(cat "$__object/parameter/name")"
+else
+	name="$__object_id"
+fi
+
+if [ -f "$__object/parameter/flavor" ]; then
+	flavor="$(cat "$__object/parameter/flavor")"
+fi
+
+if [ -f "$__object/parameter/version" ]; then
+	version="$(cat "$__object/parameter/version")"
+fi
+
+if [ -f "$__object/parameter/pkgsite" ]; then
+	pkgsite="$(cat "$__object/parameter/pkgsite")"
+fi
+
+state="$(cat "$__object/parameter/state")"
+curr_version="$(cat "$__object/explorer/pkg_version")"
+add_cmd="pkg_add"
+rm_cmd="pkg_delete"
+cmd=""
+
+# Print the command to be executed
+#	Parms:	$1 -- mode, "remove" or "add"
+#		$2 -- the command to be echoed
+# FIXME: This is ugly.
+execcmd(){
+	# Set the PACKAGESITE if we're ADDing a new package
+	if [ "$1" = "add" -a -n "$pkgsite" ]; then
+		# Use http.../All/ if we know the exact version we want, use .../Latest/ otherwise
+		[ -n "$version" ] && pkgsite="${pkgsite}/All/" || pkgsite="${pkgsite}/Latest/"
+		echo "${pkgsite}"
+	fi
+	echo "${2} 2>&- >&-"	# Silence the output of the command
+	echo "status=\$?"
+	echo "if [ \"\$status\" -ne \"0\" ]; then"
+	echo "	echo \"Error: ${cmd} exited nonzero with \$status\"'!' >&2"
+	echo "	exit 1"
+	echo "fi"
+}
+
+if [ -n "$curr_version" ]; then	# PKG *is* installed
+	if [ "$state" = "removed" ]; then	# Shouldn't be installed
+		if [ -n "$flavor" ]; then
+			cmd="${rm_cmd} ${name}-${flavor}-${curr_version}"
+		else
+			cmd="${rm_cmd} ${name}-${curr_version}"
+		fi
+		execcmd "remove" "${cmd}"
+		exit 0
+	else	# Should be installed
+		if [ -n "$version" ]; then	# Want a specific version
+			if [ "$version" = "$curr_version" ]; then	# Current version is correct
+				exit 0
+			else	# Current version is wrong, fix
+				#updatepkg "$name" "$version"
+				assert "! ${version} = ${curr_version}" $LINENO
+				cmd="${rm_cmd} ${name}-${curr_version}"
+				execcmd "remove" "${cmd}"
+				cmd="${add_cmd} ${name}-${version}"
+				execcmd "add" "${cmd}"
+			fi
+		else	# Don't care what version to use
+			exit 0
+		fi
+	fi
+else	# PKG *isn't* installed
+	if [ "$state" = "removed" ]; then	# Shouldn't be installed
+		exit 0
+	elif [ "$state" = "installed" ]; then	# Is not currently installed, should be
+		if [ -n "$flavor" ]; then
+			cmd="${add_cmd} -r ${name}-${flavor}"
+		else
+			cmd="${add_cmd} -r ${name}"
+		fi
+		if [ -n "$version" ]; then
+			cmd="${cmd}-${version}"
+		fi
+		execcmd "add" "${cmd}"
+		exit 0
+	fi
+fi
+
+# Debug
+#set +x
+
diff --git a/conf/type/__package_pkg_freebsd/man.text b/conf/type/__package_pkg_freebsd/man.text
new file mode 100644
index 00000000..882bece9
--- /dev/null
+++ b/conf/type/__package_pkg_freebsd/man.text
@@ -0,0 +1,64 @@
+cdist-type__package_pkg_freebsd(7)
+==================================
+Jake Guffey <jake.guffey--@--eprotex.com>
+
+
+NAME
+----
+cdist-type__package_pkg_freebsd - Manage FreeBSD packages 
+
+
+DESCRIPTION
+-----------
+This type is usually used on FreeBSD to manage packages.
+
+
+REQUIRED PARAMETERS
+-------------------
+state::
+   Either "installed" or "removed".
+
+
+OPTIONAL PARAMETERS
+-------------------
+name::
+   If supplied, use the name and not the object id as the package name.
+
+flavor::
+   If supplied, use to avoid ambiguity.
+
+version::
+   If supplied, use to install a specific version of the package named.
+
+pkgsite::
+   If supplied, use to install from a specific package repository.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Ensure zsh is installed
+__package_pkg_freebsd zsh --state installed
+
+# Ensure vim is installed, use flavor no_x11
+__package_pkg_freebsd vim --state installed --flavor no_x11
+
+# If you don't want to follow pythonX packages, but always use python
+__package_pkg_freebsd python --state installed --name python2
+
+# Remove obsolete package
+__package_pkg_freebsd puppet --state removed
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+- cdist-type__package(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Jake Guffey. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__package_pkg_freebsd/parameter/optional b/conf/type/__package_pkg_freebsd/parameter/optional
new file mode 100644
index 00000000..3fb2f29e
--- /dev/null
+++ b/conf/type/__package_pkg_freebsd/parameter/optional
@@ -0,0 +1,4 @@
+name
+flavor
+version
+pkgsite
diff --git a/conf/type/__package_pkg_freebsd/parameter/required b/conf/type/__package_pkg_freebsd/parameter/required
new file mode 100644
index 00000000..ff72b5c7
--- /dev/null
+++ b/conf/type/__package_pkg_freebsd/parameter/required
@@ -0,0 +1 @@
+state
diff --git a/conf/type/__rsyncer/gencode-local b/conf/type/__rsyncer/gencode-local
new file mode 100755
index 00000000..515ab71b
--- /dev/null
+++ b/conf/type/__rsyncer/gencode-local
@@ -0,0 +1,71 @@
+#!/bin/sh
+#
+# Copyright (C) 2011 Daniel Maher (phrawzty+cdist at gmail.com)
+# Parts copyright (C) 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# This file is part of cdist (https://github.com/telmich/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 <http://www.gnu.org/licenses/>.
+#
+
+# Debug
+#exec >&2
+#set -x
+
+source="$(cat "$__object/parameter/source")"
+
+if [ -f "$__object/parameter/destination" ]; then
+	destination="$(cat "$__object/parameter/destination")"
+else
+	destination="/$__object_id"
+fi
+
+# The system binary is probably ok, but if not...
+if [ -f "$__object/parameter/rsyncbin" ]; then
+	rsyncbin="$(cat "$__object/parameter/rsyncbin")"
+else
+	rsyncbin=`which rsync`
+fi
+
+# Turned this into an array so that we can use the "-e" argument to get the
+#    "root@" stuff fixed and so that "ssh -l root" is a single arg (as rsync
+#    wants it to be).
+args=('-a' '-e' '"ssh -l root"')
+
+# If the --delete argument should be passed to rsync.
+if [ -f "$__object/parameter/delete" ]; then
+# This is from having args defined as an array previously. ${#args[@]}
+#    is the number of indices in args, and args[${#args[@]}]=... creates a
+#    new index of args, which is then filled with "--delete."
+	args[${#args[@]}]="--delete"
+fi
+
+cmd="${rsyncbin} ${args[@]} \"${source}\""
+
+# If the --chroot argument was given
+if [ -f "$__object/parameter/chroot" ]; then
+	chroot=$(cat $__object/parameter/chroot)
+	cmd="${cmd} \"$chroot/$destination\""
+else
+	cmd="${cmd} \"$__target_host:$destination\""
+fi
+
+# FIXME:
+# - align with __remote_{exec,copy} variables? -- done
+
+# Run rsync (locally).
+echo "${cmd}"
+
+#set +x
+
diff --git a/conf/type/__rsyncer/man.text b/conf/type/__rsyncer/man.text
new file mode 100644
index 00000000..18218181
--- /dev/null
+++ b/conf/type/__rsyncer/man.text
@@ -0,0 +1,72 @@
+cdist-type__rsyncer(7)
+======================
+Daniel Maher <phrawzty+cdist at gmail.com>
+Jake Guffey <jake.guffey at eprotex.com>
+
+
+NAME
+----
+cdist-type__rsyncer - Use rsync to copy files.
+
+
+DESCRIPTION
+-----------
+This type is used to trigger rsync to copy files from the machine running cdist
+(source) to the target machine in question (destination). The likely usage is
+the rapid deployment of full directory trees, the cohorency of which can be
+guarunteed with the optional --delete argument, which will remove any files
+from the destination which are not present on the source.
+
+
+REQUIRED PARAMETERS
+-------------------
+source::
+    The full path of the source from which to copy. This is passed directly
+    to rsync.
+
+
+OPTIONAL PARAMETERS
+-------------------
+destination::
+    The full path of the destination. This is passed directly to rsync.
+    Default: object_id
+
+delete::
+    If true, remove files from destination which are not in source. This is
+    effectively the --delete argument of rsync.
+    Default: false
+
+rsyncbin::
+    Specify the full path to the rsync binary.
+    Default: `which rsync`
+
+chroot::
+    Specify the use of a chroot environment. If given, rsync copies the source
+    to $chroot/$destination.
+    Default: none
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Basic example
+__rsyncer '/home/foo' --source '/opt/dist/foo'
+
+# Fancier example
+__rsyncer FOO --source '/opt/dist/foo' --destination '/home/foo/' --delete true
+
+# Chroot example
+__rsyncer '/home/foo' --source '/opt/dist/foo' --chroot '/usr/chroot/home'
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2011-2012 Daniel Maher, Jake Guffey. Free use of this software
+is granted under the terms of the GNU General Public License version 3 (GPLv3).
+
diff --git a/conf/type/__rsyncer/manifest b/conf/type/__rsyncer/manifest
new file mode 100755
index 00000000..fb884bc1
--- /dev/null
+++ b/conf/type/__rsyncer/manifest
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright (C) 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# This file is part of cdist (https://github.com/telmich/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 <http://www.gnu.org/licenses/>.
+#
+
+# Debug
+#exec >&2
+#set -x
+
+# This type has a dependency of the rsync package on the "other" side.
+#	Ensure that it's installed.
+__package rsync --state installed
+
+# Debug
+#set +x
+
diff --git a/conf/type/__rsyncer/parameter/optional b/conf/type/__rsyncer/parameter/optional
new file mode 100644
index 00000000..3bcb4dc7
--- /dev/null
+++ b/conf/type/__rsyncer/parameter/optional
@@ -0,0 +1,3 @@
+destination
+delete
+rsyncbin
diff --git a/conf/type/__rsyncer/parameter/required b/conf/type/__rsyncer/parameter/required
new file mode 100644
index 00000000..5a18cd2f
--- /dev/null
+++ b/conf/type/__rsyncer/parameter/required
@@ -0,0 +1 @@
+source
diff --git a/conf/type/__service/gencode-remote b/conf/type/__service/gencode-remote
new file mode 100755
index 00000000..85bd981c
--- /dev/null
+++ b/conf/type/__service/gencode-remote
@@ -0,0 +1,98 @@
+#!/bin/sh
+#
+# 2012 Jake Guffey (jake.guffey at eprotex.com)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+
+# Debug
+#exec >&2
+#set -x
+
+state="$(cat "$__object/parameter/status")"
+
+### Begin forming $cmd
+cmd=""
+cmd="$(cat <<EOF
+name="$__object_id"
+
+# Stupid Bourne shell and its lack of array support...
+rc_dirs="$(echo /etc/rc.d:/usr/local/etc/rc.d)"
+exists=""
+save_IFS="\$IFS"
+IFS=":"
+for dir in \$rc_dirs; do
+	[ -f "\$dir/\$name" ] && exists="\$dir/\$name"
+done
+IFS="\$save_IFS"
+
+if [ -z "\$exists" ]; then
+	echo "\$name doesn't exist as a system service on \$__target_host." >&2
+	exit -1
+fi
+
+status="\$("\$exists" status || true)"
+if [ "\$(expr "\$status" : "Cannot 'status' \$name. Set \${name}_enable to YES")" != "0" ]; then
+	echo "Can't status \$name. Set \${name}_enable to YES first in rc.conf on \$__target_host." >&2
+	exit -1
+fi
+
+EOF)"
+### End forming $cmd
+
+### Begin forming $running
+running="$(cat <<EOF
+if [ \$(expr "\$status" : ".*stopped.*") != "0" ]; then
+	"\$exists" start 2>&- >&-
+elif [ \$(expr "\$status" : ".*not running.*") != "0" ]; then
+	"\$exists" start 2>&- >&-
+elif [ \$(expr "\$status" : ".*dead.*") != "0" ]; then
+	"\$exists" restart 2>&- >&-
+fi
+EOF)"
+### End forming $running
+
+### Begin forming $stopped
+stopped="$(cat <<EOF
+if [ \$(expr "\$status" : ".*not running.*") != "0" ]; then
+          # Do nothing -- expr cannot handle negative fwd lookups
+          #    (to my knowledge, anyway)
+         echo
+      elif [ \$(expr "\$status" : ".*running.*") != "0" ]; then
+         "\$exists" stop 2>&- >&-
+      fi
+EOF)"
+### End forming $stopped
+
+case "$state" in
+	running)
+		cmd="$(echo "${cmd}\n${running}")"
+		;;
+	stopped)
+		cmd="$(echo "${cmd}\n${stopped}")"
+		;;
+	*)
+		echo "Unknown state: ${state}" >&2
+		exit 1
+		;;
+esac
+
+echo "${cmd}"
+
+# Debug
+#set +x
+
diff --git a/conf/type/__service/man.text b/conf/type/__service/man.text
new file mode 100644
index 00000000..9b55a18f
--- /dev/null
+++ b/conf/type/__service/man.text
@@ -0,0 +1,48 @@
+cdist-type__service(7)
+======================
+Jake Guffey <jake.guffey--@--eprotex.com>
+
+
+NAME
+----
+cdist-type__service - Control a system service (daemon) state
+
+
+DESCRIPTION
+-----------
+This cdist type allows you to control the state of a service (daemon).
+
+
+REQUIRED PARAMETERS
+-------------------
+state::
+   State of the service: Either stopped or running.
+
+
+OPTIONAL PARAMETERS
+-------------------
+None.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Start if not running
+__service syslog-ng --state running
+
+# Stop the process if it is running
+__service sshd --state stopped
+
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Jake Guffey. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__service/parameter/required b/conf/type/__service/parameter/required
new file mode 100644
index 00000000..8be5547d
--- /dev/null
+++ b/conf/type/__service/parameter/required
@@ -0,0 +1 @@
+status