diff --git a/conf/type/__cron/explorer/entry b/conf/type/__cron/explorer/entry
new file mode 100755
index 00000000..362c96fe
--- /dev/null
+++ b/conf/type/__cron/explorer/entry
@@ -0,0 +1,39 @@
+#!/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"
+user="$(cat "$__object/parameter/user")"
+
+prefix="#cdist:__cron/$name"
+suffix="#/cdist:__cron/$name"
+
+crontab -u $user -l | awk -v prefix="$prefix" -v suffix="$suffix" '
+{
+ if (index($0,prefix)) {
+ triggered=1
+ }
+ if (triggered) {
+ if (index($0,suffix)) {
+ triggered=0
+ }
+ print
+ }
+}
+'
diff --git a/conf/type/__cron/gencode-remote b/conf/type/__cron/gencode-remote
new file mode 100755
index 00000000..90b53451
--- /dev/null
+++ b/conf/type/__cron/gencode-remote
@@ -0,0 +1,63 @@
+#!/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 .
+#
+
+user="$(cat "$__object/parameter/user")"
+state_should="$(cat "$__object/parameter/state")"
+state_is=$(cmp --quiet "$__object/parameter/entry" "$__object/explorer/entry" \
+ && echo present \
+ || echo absent
+)
+
+if [ "$state_is" != "$state_should" ]; then
+ case "$state_should" in
+ present)
+ cat << DONE
+tmp=\$(mktemp)
+crontab -u $user -l > \$tmp
+cat >> \$tmp << EOC
+$(cat "$__object/parameter/entry")"
+EOC
+crontab -u $user \$tmp
+rm \$tmp
+DONE
+ ;;
+ absent)
+ # defined in type manifest
+ prefix="$(cat "$__object/parameter/prefix")"
+ suffix="$(cat "$__object/parameter/suffix")"
+ cat << DONE
+crontab -u $user -l | awk -v prefix="$prefix" -v suffix="$suffix" '
+{
+ if (index(\$0,prefix)) {
+ triggered=1
+ }
+ if (triggered) {
+ if (index(\$0,suffix)) {
+ triggered=0
+ }
+ } else {
+ print
+ }
+}
+' | crontab -u $user -
+DONE
+ ;;
+ esac
+fi
diff --git a/conf/type/__cron/man.text b/conf/type/__cron/man.text
new file mode 100644
index 00000000..c4852b7f
--- /dev/null
+++ b/conf/type/__cron/man.text
@@ -0,0 +1,61 @@
+cdist-type__cron(7)
+===================
+Steven Armstrong
+
+
+NAME
+----
+cdist-type__cron - installs and manages cron jobs
+
+
+DESCRIPTION
+-----------
+This cdist type allows you to manage entries in a users crontab.
+
+
+REQUIRED PARAMETERS
+-------------------
+user::
+ The user who's crontab is edited
+command::
+ The command to run.
+
+
+OPTIONAL PARAMETERS
+-------------------
+state::
+ Either present or absent. Defaults to present.
+minute::
+ See crontab(5). Defaults to *
+hour::
+ See crontab(5). Defaults to *
+day_of_month::
+ See crontab(5). Defaults to *
+month::
+ See crontab(5). Defaults to *
+day_of_week::
+ See crontab(5). Defaults to *
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# add cronjob
+__cron some-id --user root --command "/path/to/script"
+
+# remove cronjob
+__cron some-id --user root --command "/path/to/script" --state absent
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+- crontab(5)
+
+
+COPYING
+-------
+Copyright \(C) 2011 Steven Armstrong. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__cron/manifest b/conf/type/__cron/manifest
new file mode 100755
index 00000000..01c4358c
--- /dev/null
+++ b/conf/type/__cron/manifest
@@ -0,0 +1,66 @@
+#!/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"
+user="$(cat "$__object/parameter/user")"
+command="$(cat "$__object/parameter/command")"
+
+# set defaults
+if [ ! -f "$__object/parameter/state" ]; then
+ echo "present" > "$__object/parameter/state"
+fi
+if [ -f "$__object/parameter/minute" ]; then
+ minute="$(cat "$__object/parameter/minute")"
+else
+ minute="*"
+ echo "$minute" > "$__object/parameter/minute"
+fi
+if [ -f "$__object/parameter/hour" ]; then
+ hour="$(cat "$__object/parameter/hour")"
+else
+ hour="*"
+ echo "$hour" > "$__object/parameter/hour"
+fi
+if [ -f "$__object/parameter/day_of_month" ]; then
+ day_of_month="$(cat "$__object/parameter/day_of_month")"
+else
+ day_of_month="*"
+ echo "$day_of_month" > "$__object/parameter/day_of_month"
+fi
+if [ -f "$__object/parameter/month" ]; then
+ month="$(cat "$__object/parameter/month")"
+else
+ month="*"
+ echo "$month" > "$__object/parameter/month"
+fi
+if [ -f "$__object/parameter/day_of_week" ]; then
+ day_of_week="$(cat "$__object/parameter/day_of_week")"
+else
+ day_of_week="*"
+ echo "$day_of_week" > "$__object/parameter/day_of_week"
+fi
+
+# NOTE: if changed, also change in explorers
+prefix="#cdist:__cron/$name"
+suffix="#/cdist:__cron/$name"
+echo "$prefix" | tee "$__object/parameter/prefix" > "$__object/parameter/entry"
+echo "$minute $hour $day_of_month $month $day_of_week $command" >> "$__object/parameter/entry"
+echo "$suffix" | tee "$__object/parameter/suffix" >> "$__object/parameter/entry"
+
diff --git a/conf/type/__cron/parameter/optional b/conf/type/__cron/parameter/optional
new file mode 100644
index 00000000..1a4aae3d
--- /dev/null
+++ b/conf/type/__cron/parameter/optional
@@ -0,0 +1,6 @@
+state
+minute
+hour
+day_of_month
+month
+day_of_week
diff --git a/conf/type/__cron/parameter/required b/conf/type/__cron/parameter/required
new file mode 100644
index 00000000..711a59ab
--- /dev/null
+++ b/conf/type/__cron/parameter/required
@@ -0,0 +1,2 @@
+user
+command
diff --git a/lib/cdist/core/object.py b/lib/cdist/core/object.py
index 5157d86a..778bebe8 100644
--- a/lib/cdist/core/object.py
+++ b/lib/cdist/core/object.py
@@ -60,9 +60,7 @@ class Object(object):
def list_objects(cls, object_base_path, type_base_path):
"""Return a list of object instances"""
for object_name in cls.list_object_names(object_base_path):
- type_name = object_name.split(os.sep)[0]
- # FIXME: allow object without object_id? e.g. for singleton
- object_id = os.sep.join(object_name.split(os.sep)[1:])
+ type_name, object_id = cls.split_name(object_name)
yield cls(cdist.core.Type(type_base_path, type_name), object_base_path, object_id=object_id)
@classmethod
@@ -77,20 +75,26 @@ class Object(object):
if DOT_CDIST in dirs:
yield os.path.relpath(path, object_base_path)
- def object_from_name(self, object_name):
- """Convenience method for creating an object instance from an object name.
+ @staticmethod
+ def split_name(object_name):
+ """split_name('__type_name/the/object_id') -> ('__type_name', 'the/object_id')
- Mainly intended to create objects when resolving requirements.
-
- e.g:
-