diff --git a/.gitignore b/.gitignore
index 76ed1fcb..63f8076a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ cdist/version.py
build
.lock-*
.git-current-branch
+.lock*
diff --git a/cdist/conf/type/__directory/explorer/owner b/cdist/conf/type/__directory/explorer/owner
deleted file mode 100644
index cebd199b..00000000
--- a/cdist/conf/type/__directory/explorer/owner
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
-#
-# 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 .
-#
-#
-# Check whether file exists or not
-#
-
-destination="/$__object_id"
-os=$("$__explorer/os")
-
-case "$os" in
- "freebsd")
- cmd="stat -f %Su"
- ;;
- *)
- cmd="stat -c %U"
- ;;
-esac
-
-if [ -e "$destination" ]; then
- $cmd "$destination"
-fi
-
diff --git a/cdist/conf/type/__directory/explorer/group b/cdist/conf/type/__directory/explorer/stat
old mode 100644
new mode 100755
similarity index 65%
rename from cdist/conf/type/__directory/explorer/group
rename to cdist/conf/type/__directory/explorer/stat
index e5be37da..d8cdbb9e
--- a/cdist/conf/type/__directory/explorer/group
+++ b/cdist/conf/type/__directory/explorer/stat
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,23 +17,27 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Check whether file exists or not
-#
destination="/$__object_id"
-os=$("$__explorer/os")
+# nothing to work with, nothing we could do
+[ -e "$destination" ] || exit 0
+
+os=$("$__explorer/os")
case "$os" in
"freebsd")
- cmd="stat -f %Sg"
- ;;
+ # FIXME: should be something like this based on man page, but can not test
+ stat -f "type: %ST
+owner: %Du %Su
+group: %Dg %Sg
+mode: %Op %Sp
+" "$destination"
+ ;;
*)
- cmd="stat -c %G"
- ;;
+ stat --printf="type: %F
+owner: %u %U
+group: %g %G
+mode: %a %A
+" "$destination"
+ ;;
esac
-
-if [ -e "$destination" ]; then
- $cmd "$destination"
-fi
-
diff --git a/cdist/conf/type/__file/explorer/exists b/cdist/conf/type/__directory/explorer/type
similarity index 72%
rename from cdist/conf/type/__file/explorer/exists
rename to cdist/conf/type/__directory/explorer/type
index c319cb5d..e723047c 100755
--- a/cdist/conf/type/__file/explorer/exists
+++ b/cdist/conf/type/__directory/explorer/type
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,14 +17,17 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Check whether file exists or not
-#
destination="/$__object_id"
-if [ -e "$destination" ]; then
- echo yes
+if [ ! -e "$destination" ]; then
+ echo none
+elif [ -h "$destination" ]; then
+ echo symlink
+elif [ -f "$destination" ]; then
+ echo file
+elif [ -d "$destination" ]; then
+ echo directory
else
- echo no
+ echo unknown
fi
diff --git a/cdist/conf/type/__directory/gencode-remote b/cdist/conf/type/__directory/gencode-remote
index f46a5967..800fc6e4 100755
--- a/cdist/conf/type/__directory/gencode-remote
+++ b/cdist/conf/type/__directory/gencode-remote
@@ -1,6 +1,7 @@
#!/bin/sh
#
-# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -19,53 +20,84 @@
#
destination="/$__object_id"
+state_should="$(cat "$__object/parameter/state")"
+type="$(cat "$__object/explorer/type")"
+stat_file="$__object/explorer/stat"
-state_is="$(cat "$__object/explorer/state")"
-owner_is="$(cat "$__object/explorer/owner")"
-group_is="$(cat "$__object/explorer/group")"
-mode_is="$(cat "$__object/explorer/mode")"
+# variable to keep track if we have to set directory attributes
+set_attributes=
-state_should="present"
-[ -f "$__object/parameter/state" ] && state_should="$(cat "$__object/parameter/state")"
-mode=""
-[ -f "$__object/parameter/mode" ] && mode="$(cat "$__object/parameter/mode")"
-owner=""
-[ -f "$__object/parameter/owner" ] && owner="$(cat "$__object/parameter/owner")"
-group=""
-[ -f "$__object/parameter/group" ] && group="$(cat "$__object/parameter/group")"
mkdiropt=""
-[ -f "$__object/parameter/parents" ] && mkdiropt="-p"
+[ -f "$__object/parameter/parents" ] && mkdiropt="-p"
+
recursive=""
-[ -f "$__object/parameter/recursive" ] && recursive="-R"
+if [ -f "$__object/parameter/recursive" ]; then
+ recursive="-R"
+ # need to allways set attributes when recursive is given
+ # as we don't want to check all subfolders/files
+ set_attributes=1
+fi
+
+get_current_value() {
+ if [ -s "$stat_file" ]; then
+ _name="$1"
+ _value="$2"
+ case "$_value" in
+ [0-9]*)
+ _index=2
+ ;;
+ *)
+ _index=3
+ ;;
+ esac
+ awk '/'"$_name"':/ { print $'$_index' }' "$stat_file"
+ unset _name _value _index
+ fi
+}
+
+set_group() {
+ echo chgrp $recursive \"$1\" \"$destination\"
+}
+
+set_owner() {
+ echo chown $recursive \"$1\" \"$destination\"
+}
+
+set_mode() {
+ echo chmod $recursive \"$1\" \"$destination\"
+}
case "$state_should" in
- present)
- if [ "$state_is" != "present" ]; then
- echo mkdir $mkdiropt \"$destination\"
- fi
+ present)
+ if [ "$type" != "directory" ]; then
+ # our destination is not a directory, remove whatever is there
+ # and then create our directory and set all attributes
+ set_attributes=1
+ cat << DONE
+rm -f "$destination"
+mkdir $mkdiropt "$destination"
+DONE
+ fi
- # Mode settings
- if [ "$mode" ] && [ "$mode_is" != "$mode" -o -n "$recursive" ]; then
- echo chmod $recursive \"$mode\" \"$destination\"
- fi
-
- # Group
- if [ "$group" ] && [ "$group_is" != "$group" -o -n "$recursive" ]; then
- echo chgrp $recursive \"$group\" \"$destination\"
- fi
-
- # Owner
- if [ "$owner" ] && [ "$owner_is" != "$owner" -o -n "$recursive" ]; then
- echo chown $recursive \"$owner\" \"$destination\"
- fi
- ;;
- absent)
- if [ "$state_is" != "absent" ]; then
- echo rm -rf \"$destination\"
- fi
- ;;
- *)
- echo "Unknown state: $state_should" >&2
- exit 1
- ;;
+ # Note: Mode - needs to happen last as a chown/chgrp can alter mode by
+ # clearing S_ISUID and S_ISGID bits (see chown(2))
+ for attribute in group owner mode; do
+ if [ -f "$__object/parameter/$attribute" ]; then
+ value_should="$(cat "$__object/parameter/$attribute")"
+ value_is="$(get_current_value "$attribute" "$value_should")"
+ if [ "$set_attributes" -o "$value_should" != "$value_is" ]; then
+ "set_$attribute" "$value_should"
+ fi
+ fi
+ done
+ ;;
+ absent)
+ if [ "$type" = "directory" ]; then
+ echo rm -rf \"$destination\"
+ fi
+ ;;
+ *)
+ echo "Unknown state: $state_should" >&2
+ exit 1
+ ;;
esac
diff --git a/cdist/conf/type/__directory/parameter/default/state b/cdist/conf/type/__directory/parameter/default/state
new file mode 100644
index 00000000..e7f6134f
--- /dev/null
+++ b/cdist/conf/type/__directory/parameter/default/state
@@ -0,0 +1 @@
+present
diff --git a/cdist/conf/type/__directory/explorer/mode b/cdist/conf/type/__file/explorer/stat
old mode 100644
new mode 100755
similarity index 63%
rename from cdist/conf/type/__directory/explorer/mode
rename to cdist/conf/type/__file/explorer/stat
index f75b282b..298221b7
--- a/cdist/conf/type/__directory/explorer/mode
+++ b/cdist/conf/type/__file/explorer/stat
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,23 +17,31 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Check whether file exists or not
-#
destination="/$__object_id"
-os=$("$__explorer/os")
+# nothing to work with, nothing we could do
+[ -e "$destination" ] || exit 0
+
+os=$("$__explorer/os")
case "$os" in
"freebsd")
- cmd="stat -f %Op"
- ;;
+ # FIXME: should be something like this based on man page, but can not test
+ stat -f "type: %ST
+owner: %Du %Su
+group: %Dg %Sg
+mode: %Op %Sp
+size: %Dz
+links: %Dl
+" "$destination"
+ ;;
*)
- cmd="stat -c %a"
- ;;
+ stat --printf="type: %F
+owner: %u %U
+group: %g %G
+mode: %a %A
+size: %s
+links: %h
+" "$destination"
+ ;;
esac
-
-if [ -e "$destination" ]; then
- $cmd "$destination"
-fi
-
diff --git a/cdist/conf/type/__directory/explorer/state b/cdist/conf/type/__file/explorer/type
similarity index 72%
rename from cdist/conf/type/__directory/explorer/state
rename to cdist/conf/type/__file/explorer/type
index 9bdd9024..e723047c 100755
--- a/cdist/conf/type/__directory/explorer/state
+++ b/cdist/conf/type/__file/explorer/type
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,14 +17,17 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Check whether file exists or not
-#
destination="/$__object_id"
-if [ -e "$destination" ]; then
- echo present
+if [ ! -e "$destination" ]; then
+ echo none
+elif [ -h "$destination" ]; then
+ echo symlink
+elif [ -f "$destination" ]; then
+ echo file
+elif [ -d "$destination" ]; then
+ echo directory
else
- echo absent
+ echo unknown
fi
diff --git a/cdist/conf/type/__file/gencode-local b/cdist/conf/type/__file/gencode-local
index 8cd9b24e..a9eb6b10 100755
--- a/cdist/conf/type/__file/gencode-local
+++ b/cdist/conf/type/__file/gencode-local
@@ -1,6 +1,7 @@
#!/bin/sh
#
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,35 +18,59 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# __file is a very basic type, which will probably be reused quite often
-#
destination="/$__object_id"
-state_should=present
-[ -f "$__object/parameter/state" ] && state_should="$(cat "$__object/parameter/state")"
-exists="$(cat "$__object/explorer/exists")"
+state_should="$(cat "$__object/parameter/state")"
+type="$(cat "$__object/explorer/type")"
-[ "$state_should" = "exists" -a "$exists" = "yes" ] && exit 0 # nothing to do
+[ "$state_should" = "exists" -a "$type" = "file" ] && exit 0 # nothing to do
+upload_file=
+create_file=
if [ "$state_should" = "present" -o "$state_should" = "exists" ]; then
- if [ -f "$__object/parameter/source" ]; then
+ if [ ! -f "$__object/parameter/source" ]; then
+ create_file=1
+ else
source="$(cat "$__object/parameter/source")"
if [ "$source" = "-" ]; then
source="$__object/stdin"
fi
-
- 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}"
- echo "copy" >> "$__messages_out"
- fi
- else
+ if [ ! -f "$source" ]; then
echo "Source \"$source\" does not exist." >&2
exit 1
+ else
+ if [ "$type" != "file" ]; then
+ # destination is not a regular file, upload source to replace it
+ upload_file=1
+ else
+ local_cksum="$(cksum < "$source")"
+ remote_cksum="$(cat "$__object/explorer/cksum")"
+ if [ "$local_cksum" != "$remote_cksum" ]; then
+ # destination is a regular file, but not the right one
+ upload_file=1
+ fi
+ fi
fi
fi
+ if [ "$create_file" -o "$upload_file" ]; then
+ # tell gencode-remote that we created or uploaded a file and that it must
+ # set all attributes no matter what the explorer retreived
+ mkdir "$__object/files"
+ touch "$__object/files/set-attributes"
+
+ # upload file to temp location
+ tempfile_template="${destination}.cdist.XXXXXXXXXX"
+ cat << DONE
+destination_upload="\$($__remote_exec $__target_host "mktemp $tempfile_template")"
+DONE
+ if [ "$upload_file" ]; then
+ cat << DONE
+$__remote_copy $source ${__target_host}:\$destination_upload
+DONE
+ fi
+# move uploaded file into place
+cat << DONE
+$__remote_exec $__target_host "rm -rf \"$destination\"; mv \"\$destination_upload\" \"$destination\""
+DONE
+ fi
fi
diff --git a/cdist/conf/type/__file/gencode-remote b/cdist/conf/type/__file/gencode-remote
index 6e1fa5be..e80d5fae 100755
--- a/cdist/conf/type/__file/gencode-remote
+++ b/cdist/conf/type/__file/gencode-remote
@@ -1,6 +1,7 @@
#!/bin/sh
#
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist armstrong.cc)
#
# This file is part of cdist.
#
@@ -17,59 +18,66 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# __file is a very basic type, which will probably be reused quite often
-#
destination="/$__object_id"
-state_should=present
-[ -f "$__object/parameter/state" ] && state_should="$(cat "$__object/parameter/state")"
-exists="$(cat "$__object/explorer/exists")"
+state_should="$(cat "$__object/parameter/state")"
+type="$(cat "$__object/explorer/type")"
+stat_file="$__object/explorer/stat"
+
+get_current_value() {
+ if [ -s "$stat_file" ]; then
+ _name="$1"
+ _value="$2"
+ case "$_value" in
+ [0-9]*)
+ _index=2
+ ;;
+ *)
+ _index=3
+ ;;
+ esac
+ awk '/'"$_name"':/ { print $'$_index' }' "$stat_file"
+ unset _name _value _index
+ fi
+}
+
+set_group() {
+ echo chgrp \"$1\" \"$destination\"
+}
+
+set_owner() {
+ echo chown \"$1\" \"$destination\"
+}
+
+set_mode() {
+ echo chmod \"$1\" \"$destination\"
+}
+
+set_attributes=
case "$state_should" in
present|exists)
- # No source? Create empty file
- if [ ! -f "$__object/parameter/source" ]; then
- if [ "$exists" = "no" ]; then
- echo touch \"$destination\"
+ # Note: Mode - needs to happen last as a chown/chgrp can alter mode by
+ # clearing S_ISUID and S_ISGID bits (see chown(2))
+ for attribute in group owner mode; do
+ if [ -f "$__object/parameter/$attribute" ]; then
+ value_should="$(cat "$__object/parameter/$attribute")"
+ value_is="$(get_current_value "$attribute" "$value_should")"
+ if [ -f "$__object/files/set-attributes" -o "$value_should" != "$value_is" ]; then
+ "set_$attribute" "$value_should"
+ fi
fi
- fi
-
- # Group
- if [ -f "$__object/parameter/group" ]; then
- echo chgrp \"$(cat "$__object/parameter/group")\" \"$destination\"
-# FIXME: only if necessary, not if parameter is present
-# echo "chgrp" >> "$__object/notifications"
- fi
-
- # Owner
- if [ -f "$__object/parameter/owner" ]; then
- echo chown \"$(cat "$__object/parameter/owner")\" \"$destination\"
-# FIXME: only if necessary, not if parameter is present
-# echo "chown" >> "$__object/notifications"
- fi
-
- # Mode - needs to happen last as a chown/chgrp can alter mode by
- # clearing S_ISUID and S_ISGID bits (see chown(2))
- if [ -f "$__object/parameter/mode" ]; then
- echo chmod \"$(cat "$__object/parameter/mode")\" \"$destination\"
-# FIXME: only if necessary, not if parameter is present
-# echo "chmod" >> "$__object/notifications"
- fi
+ done
;;
absent)
-
- if [ "$exists" = "yes" ]; then
+ if [ "$type" = "file" ]; then
echo rm -f \"$destination\"
- echo "remove" >> "$__messages_out"
fi
-
;;
*)
echo "Unknown state: $state_should" >&2
exit 1
;;
-
esac
diff --git a/cdist/conf/type/__file/man.text b/cdist/conf/type/__file/man.text
index 9ac82d0f..b76573bb 100644
--- a/cdist/conf/type/__file/man.text
+++ b/cdist/conf/type/__file/man.text
@@ -13,6 +13,15 @@ DESCRIPTION
This cdist type allows you to create files, remove files and set file
attributes on the target.
+If the file already exists on the target, then if it is a:
+- regular file, and state is:
+ present: replace it with the source file if they are not equal
+ exists: do nothing
+- symlink: replace it with the source file
+- directory: replace it with the source file
+
+In any case, make sure that the file attributes are as specified.
+
REQUIRED PARAMETERS
-------------------
diff --git a/cdist/conf/type/__file/parameter/default/state b/cdist/conf/type/__file/parameter/default/state
new file mode 100644
index 00000000..e7f6134f
--- /dev/null
+++ b/cdist/conf/type/__file/parameter/default/state
@@ -0,0 +1 @@
+present
diff --git a/cdist/conf/type/__link/explorer/type b/cdist/conf/type/__link/explorer/type
new file mode 100755
index 00000000..579fd081
--- /dev/null
+++ b/cdist/conf/type/__link/explorer/type
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# 2013 Steven Armstrong (steven-cdist 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 .
+#
+#
+# Mostly a wrapper for ln
+#
+
+destination="/$__object_id"
+
+if [ ! -e "$destination" ]; then
+ echo none
+elif [ -h "$destination" ]; then
+ echo symlink
+elif [ -f "$destination" ]; then
+ type="$(cat "$__object/parameter/type")"
+ case "$type" in
+ hard)
+ link_count=$(ls -l "$destination" | awk '{ print $2 }')
+ if [ $link_count -gt 1 ]; then
+ echo hardlink
+ exit 0
+ fi
+ ;;
+ esac
+ echo file
+elif [ -d "$destination" ]; then
+ echo directory
+else
+ echo unknown
+fi
diff --git a/cdist/conf/type/__link/gencode-remote b/cdist/conf/type/__link/gencode-remote
index 2975ef69..cbdfd30f 100755
--- a/cdist/conf/type/__link/gencode-remote
+++ b/cdist/conf/type/__link/gencode-remote
@@ -1,6 +1,7 @@
#!/bin/sh
#
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
+# 2013 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
@@ -40,17 +41,30 @@ case "$type" in
esac
state_is="$(cat "$__object/explorer/state")"
-state_should=present
-[ -f "$__object/parameter/state" ] && state_should="$(cat "$__object/parameter/state")"
+state_should="$(cat "$__object/parameter/state")"
[ "$state_should" = "$state_is" ] && exit 0
+file_type="$(cat "$__object/explorer/type")"
case "$state_should" in
present)
- echo ln ${lnopt} -f \"$source\" \"$destination\"
+ if [ "$file_type" = "directory" ]; then
+ # our destination is currently a directory, delete it
+ cat << DONE
+rm -rf "$destination"
+DONE
+ fi
+
+ # create our link
+ cat << DONE
+ln ${lnopt} -f "$source" "$destination"
+DONE
;;
absent)
- echo rm -f \"$destination\"
+ # only delete if it is a sym/hard link
+ if [ "$file_type" = "symlink" -o "$file_type" = "hardlink" ]; then
+ echo rm -f \"$destination\"
+ fi
;;
*)
echo "Unknown state: $state_should" >&2
diff --git a/cdist/conf/type/__link/parameter/default/state b/cdist/conf/type/__link/parameter/default/state
new file mode 100644
index 00000000..e7f6134f
--- /dev/null
+++ b/cdist/conf/type/__link/parameter/default/state
@@ -0,0 +1 @@
+present
diff --git a/cdist/conf/type/__package_zypper/explorer/pkg_version b/cdist/conf/type/__package_zypper/explorer/pkg_version
old mode 100755
new mode 100644
index fb3b7753..655b464d
--- a/cdist/conf/type/__package_zypper/explorer/pkg_version
+++ b/cdist/conf/type/__package_zypper/explorer/pkg_version
@@ -27,4 +27,4 @@ else
name="$__object_id"
fi
-rpm -q --whatprovides "$name" 2>/dev/null || true
+rpm -q --whatprovides "$name" | grep -v 'no package provides' || true
diff --git a/cdist/conf/type/__package_zypper/gencode-remote b/cdist/conf/type/__package_zypper/gencode-remote
old mode 100755
new mode 100644
index ca9aec33..d1766126
--- a/cdist/conf/type/__package_zypper/gencode-remote
+++ b/cdist/conf/type/__package_zypper/gencode-remote
@@ -39,15 +39,22 @@ else
state_should="present"
fi
+pkg_version="$(cat "$__object/explorer/pkg_version")"
+if [ -z "$pkg_version" ]; then
+ state_is="absent"
+else
+ state_is="present"
+fi
+
# Exit if nothing is needed to be done
[ "$state_is" = "$state_should" ] && exit 0
case "$state_should" in
present)
- echo zypper "$globalopts" install --auto-agree-with-licenses \"$name\"
+ echo zypper $globalopts install --auto-agree-with-licenses \"$name\" ">/dev/null"
;;
absent)
- echo pacman "$globalopts" remove \"$name\"
+ echo zypper $globalopts remove \"$name\" ">/dev/null"
;;
*)
echo "Unknown state: $state_should" >&2
diff --git a/cdist/config.py b/cdist/config.py
index 7e003835..3f8a7fc6 100644
--- a/cdist/config.py
+++ b/cdist/config.py
@@ -249,7 +249,7 @@ class Config(object):
cdist_type = cdist_object.cdist_type
# Generate
- self.log.info("Generating and executing code for %s" % (cdist_object.name))
+ self.log.info("Generating code for %s" % (cdist_object.name))
cdist_object.code_local = self.code.run_gencode_local(cdist_object)
cdist_object.code_remote = self.code.run_gencode_remote(cdist_object)
if cdist_object.code_local or cdist_object.code_remote:
@@ -257,6 +257,8 @@ class Config(object):
# Execute
if not self.dry_run:
+ if cdist_object.code_local or cdist_object.code_remote:
+ self.log.info("Executing code for %s" % (cdist_object.name))
if cdist_object.code_local:
self.code.run_code_local(cdist_object)
if cdist_object.code_remote:
diff --git a/cdist/exec/local.py b/cdist/exec/local.py
index f1313eea..72c7e70f 100644
--- a/cdist/exec/local.py
+++ b/cdist/exec/local.py
@@ -196,8 +196,13 @@ class Local(object):
def save_cache(self):
destination = os.path.join(self.cache_path, self.target_host)
self.log.debug("Saving " + self.base_path + " to " + destination)
- if os.path.exists(destination):
- shutil.rmtree(destination)
+
+ try:
+ if os.path.exists(destination):
+ shutil.rmtree(destination)
+ except PermissionError as e:
+ raise cdist.Error("Cannot delete old cache %s: %s" % (destination, e))
+
shutil.move(self.base_path, destination)
def _create_messages(self):
diff --git a/doc/dev/logs/2012-05-24.preos b/doc/dev/logs/2012-05-24.preos
new file mode 100644
index 00000000..e4f988a7
--- /dev/null
+++ b/doc/dev/logs/2012-05-24.preos
@@ -0,0 +1,72 @@
+Todo for preos:
+
+get debian installer (?)
+ x86, amd64
+configure sshd
+ add authorized_keys
+output files
+ tftp: cuni: curl -s "http://http.us.debian.org/debian/dists/$version/main/installer-$arch/current/images/netboot/netboot.tar.gz" | tar xz
+ iso
+
+
+http://wiki.debian.org/DebianInstaller/
+--------------------------------------------------------------------------------
+debootstrap:
+ [19:33] brief:hack% sudo debootstrap squeeze ./debian-squeeze
+ [19:30] brief:hack# du -sh .
+ 213M .
+
+install kernel
+ [19:35] brief:hack# chroot debian-squeeze/ apt-get -y install linux-image-amd64
+ [19:37] brief:debian-squeeze# ls boot/initrd*
+ boot/initrd.img-2.6.32-5-amd64
+ [19:37] brief:debian-squeeze# ls boot/vmlinuz*
+ boot/vmlinuz-2.6.32-5-amd64
+
+install sshd
+ [19:37] brief:hack# chroot debian-squeeze/ apt-get -y --force-yes install openssh-server
+
+ - connect back?
+ - generate sshd keys?
+
+--------------------------------------------------------------------------------
+initramfs:
+ find . -print0 | bsdcpio $( (( QUIET )) && echo '--quiet' ) -R 0:0 -0oH newc | $COMPRESSION $COMPRESSION_OPTIONS > "$IMGPATH"
+
+ /init for booting
+ find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/my-initramfs.cpio.gz
+ cpio -H newc -o
+ find . | cpio -H newc -o > ../initramfs.cpio # <-- this is the actual initramfs
+
+
+[19:39] brief:debian-squeeze# find . | bsdcpio -H newc -o > ../initramfs.cpio
+[19:43] brief:debian-squeeze# xz ../initramfs.cpio
+
+
+--------------------------------------------------------------------------------
+cdrom:
+ http://tldp.org/HOWTO/Bootdisk-HOWTO/cd-roms.html
+
+--------------------------------------------------------------------------------
+
+[19:34] brief:hack# chroot debian-squeeze/ apt-cache search kernel | grep linux-image
+linux-image-2.6.32-5-amd64-dbg - Debugging infos for Linux 2.6.32-5-amd64
+linux-image-2.6.32-5-amd64 - Linux 2.6.32 for 64-bit PCs
+linux-image-2.6.32-5-openvz-amd64-dbg - Debugging infos for Linux 2.6.32-5-openvz-amd64
+linux-image-2.6.32-5-openvz-amd64 - Linux 2.6.32 for 64-bit PCs, OpenVZ support
+linux-image-2.6.32-5-vserver-amd64-dbg - Debugging infos for Linux 2.6.32-5-vserver-amd64
+linux-image-2.6.32-5-vserver-amd64 - Linux 2.6.32 for 64-bit PCs, Linux-VServer support
+linux-image-2.6.32-5-xen-amd64-dbg - Debugging infos for Linux 2.6.32-5-xen-amd64
+linux-image-2.6.32-5-xen-amd64 - Linux 2.6.32 for 64-bit PCs, Xen dom0 support
+linux-image-2.6-amd64 - Linux 2.6 for 64-bit PCs (meta-package)
+linux-image-2.6-openvz-amd64 - Linux 2.6 for 64-bit PCs (meta-package), OpenVZ support
+linux-image-2.6-vserver-amd64 - Linux 2.6 for 64-bit PCs (meta-package), Linux-VServer support
+linux-image-2.6-xen-amd64 - Linux 2.6 for 64-bit PCs (meta-package), Xen dom0 support
+linux-image-amd64 - Linux for 64-bit PCs (meta-package)
+linux-image-openvz-amd64 - Linux for 64-bit PCs (meta-package), OpenVZ support
+linux-image-vserver-amd64 - Linux for 64-bit PCs (meta-package), Linux-VServer support
+linux-image-xen-amd64 - Linux for 64-bit PCs (meta-package), Xen dom0 support
+[19:34] brief:hack#
+
+--------------------------------------------------------------------------------
+
diff --git a/docs/changelog b/docs/changelog
index e7d90609..b6122bec 100644
--- a/docs/changelog
+++ b/docs/changelog
@@ -4,6 +4,14 @@ Changelog
* Changes are always commented with their author in (braces)
* Exception: No braces means author == Nico Schottelius
+2.3.7: 2013-12-02
+ * Type __file: Secure the file transfer by using mktemp (Steven Armstrong)
+ * Type __file: Only remove file when state is absent (Steven Armstrong)
+ * Type __link: Only remove link when state is absent (Steven Armstrong)
+ * Type __directory: Only remove directory when state is absent (Steven Armstrong)
+ * Type __package_zypper: Fix explorer and parameter issue (Daniel Heule)
+ * Core: Fix backtrace when cache cannot be deleted
+
2.3.6: 2013-11-25
* New Type: __locale
* Type __line: Ensure special characters are not interpreted