From 85f7880c7ed4b86453e837bc781861ac0cd694e5 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 3 Feb 2012 20:50:17 +0100 Subject: [PATCH 1/5] add a hopefully more robust implementation for changing existing values Signed-off-by: Steven Armstrong --- conf/type/__key_value/gencode-remote | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/conf/type/__key_value/gencode-remote b/conf/type/__key_value/gencode-remote index eff0925c..08b3a0f3 100755 --- a/conf/type/__key_value/gencode-remote +++ b/conf/type/__key_value/gencode-remote @@ -40,10 +40,7 @@ DONE else # change value cat << DONE -awk -F "$delimiter" ' -/${key}${delimiter}*/{gsub("$value_is", "$value_should")};{print}' "$file" > "${file}+" \ -&& mv "${file}+" "$file" - +sed -i "s|^$key\($delimiter\+\).*|$key\1$value_should|" "$file" DONE fi ;; From 4628dad04576103945553609c9e46c71cee35de8 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 3 Feb 2012 20:55:24 +0100 Subject: [PATCH 2/5] cleaner way to set default values Signed-off-by: Steven Armstrong --- conf/type/__key_value/explorer/value | 8 +++----- conf/type/__key_value/manifest | 9 +++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/conf/type/__key_value/explorer/value b/conf/type/__key_value/explorer/value index 3afc7cc5..b4e1fafd 100755 --- a/conf/type/__key_value/explorer/value +++ b/conf/type/__key_value/explorer/value @@ -21,11 +21,9 @@ # Get the current value of key or __NOTSET__ if the key doesn't exist. # -if [ -f "$__object/parameter/key" ]; then - key="$(cat "$__object/parameter/key")" -else - key="$__object_id" -fi +key="$(cat "$__object/parameter/key" 2>/dev/null \ + || echo "$__object_id")" + file="$(cat "$__object/parameter/file")" delimiter="$(cat "$__object/parameter/delimiter")" diff --git a/conf/type/__key_value/manifest b/conf/type/__key_value/manifest index 706b0b0d..84c06352 100755 --- a/conf/type/__key_value/manifest +++ b/conf/type/__key_value/manifest @@ -18,9 +18,6 @@ # along with cdist. If not, see . # -if [ -f "$__object/parameter/key" ]; then - key="$(cat "$__object/parameter/key")" -else - echo "$__object_id" > "$__object/parameter/key" -fi - +# set defaults +[ -f "$__object/parameter/key" ] \ + || echo "$__object_id" > "$__object/parameter/key" From cad2097d0559861f66a988c88c4022721fa8c033 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 3 Feb 2012 22:43:34 +0100 Subject: [PATCH 3/5] complete rewrite: use state explorer to determine current state, more robust implementation for adding, changing, removing key/values Signed-off-by: Steven Armstrong --- .../__key_value/explorer/{value => state} | 35 ++++++++---- conf/type/__key_value/gencode-remote | 54 +++++++++++-------- conf/type/__key_value/man.text | 11 ++-- conf/type/__key_value/manifest | 11 +++- conf/type/__key_value/parameter/optional | 2 + conf/type/__key_value/parameter/required | 1 - 6 files changed, 75 insertions(+), 39 deletions(-) rename conf/type/__key_value/explorer/{value => state} (54%) diff --git a/conf/type/__key_value/explorer/value b/conf/type/__key_value/explorer/state similarity index 54% rename from conf/type/__key_value/explorer/value rename to conf/type/__key_value/explorer/state index b4e1fafd..7e66cb69 100755 --- a/conf/type/__key_value/explorer/value +++ b/conf/type/__key_value/explorer/state @@ -17,19 +17,34 @@ # You should have received a copy of the GNU General Public License # along with cdist. If not, see . # -# -# Get the current value of key or __NOTSET__ if the key doesn't exist. -# key="$(cat "$__object/parameter/key" 2>/dev/null \ || echo "$__object_id")" - +state="$(cat "$__object/parameter/state" 2>/dev/null \ + || echo "present")" file="$(cat "$__object/parameter/file")" delimiter="$(cat "$__object/parameter/delimiter")" +value="$(cat "$__object/parameter/value" 2>/dev/null \ + || echo "__CDIST_NOTSET__")" -awk -F "$delimiter" ' -BEGIN { found=0 } -/^'$key'/ { print $2; found=1 } -END { if (found) exit 0; else exit 1 }' "$file" \ -|| echo "__NOTSET__" - +case "$state" in + absent) + # if the key exists, with whatever value, we will have to remove it + # so report it as present + if egrep -q "^$key$delimiter+" "$file"; then + echo present + fi + ;; + present) + if egrep -q "^$key$delimiter+$value$" "$file"; then + # key exists and value is same + echo present + elif egrep -q "^$key$delimiter+" "$file"; then + # key exists, but value is empty or different + echo wrongvalue + else + # key does not exist + echo absent + fi + ;; +esac diff --git a/conf/type/__key_value/gencode-remote b/conf/type/__key_value/gencode-remote index 08b3a0f3..0846dca1 100755 --- a/conf/type/__key_value/gencode-remote +++ b/conf/type/__key_value/gencode-remote @@ -18,32 +18,40 @@ # along with cdist. If not, see . # -value_is="$(cat "$__object/explorer/value")" -value_should="$(cat "$__object/parameter/value")" - key="$(cat "$__object/parameter/key")" file="$(cat "$__object/parameter/file")" delimiter="$(cat "$__object/parameter/delimiter")" +value="$(cat "$__object/parameter/value")" -if [ "$value_is" != "$value_should" ]; then - case "$value_is" in - __NOTSET__) - # add key and value - echo "echo \"${key}${delimiter}${value_should}\" >> \"$file\"" - ;; - *) - if [ "$value_should" = '__NOTSET__' ]; then - # remove key and value - cat << DONE -sed -i '/^${key}/d' "$file" -DONE - else - # change value - cat << DONE -sed -i "s|^$key\($delimiter\+\).*|$key\1$value_should|" "$file" -DONE - fi - ;; - esac +state_is="$(cat "$__object/explorer/state")" +state_should="$(cat "$__object/parameter/state")" + +if [ "$state_is" = "$state_should" ]; then + # nothing to do + exit 0 fi +case "$state_should" in + absent) + # remove lines starting with key + echo "sed -i '/^$key\($delimiter\+\)/d' \"$file\"" + ;; + present) + case "$state_is" in + absent) + # add new key and value + echo "echo \"${key}${delimiter}${value}\" >> \"$file\"" + ;; + wrongvalue) + # change exisiting value + echo "sed -i \"s|^$key\($delimiter\+\).*|$key\1$value|\" \"$file\"" + ;; + *) + echo "Unknown explorer state: $state_is" >&2 + exit 1 + esac + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 +esac diff --git a/conf/type/__key_value/man.text b/conf/type/__key_value/man.text index 3e4e8013..1423fc7d 100644 --- a/conf/type/__key_value/man.text +++ b/conf/type/__key_value/man.text @@ -16,9 +16,6 @@ file. REQUIRED PARAMETERS ------------------- -value:: - The value for the key. Setting the value to `__NOTSET__` will remove the key - from the file. file:: The file to operate on. delimiter:: @@ -27,8 +24,13 @@ delimiter:: OPTIONAL PARAMETERS ------------------- +state:: + present or absent, defaults to present. If present, sets the key to value, + if absent, removes the key from the file. key:: The key to change. Defaults to object_id. +value:: + The value for the key. Optional if state=absent, required otherwise. EXAMPLES @@ -45,6 +47,9 @@ __key_value my-fancy-id --file /etc/login.defs --key SYS_UID_MAX --value 666 \ # Enable packet forwarding __key_value net.ipv4.ip_forward --file /etc/sysctl.conf --value 1 \ --delimiter '=' + +# Remove existing key/value +__key_value LEGACY_KEY --file /etc/somefile --state absent --delimiter '=' -------------------------------------------------------------------------------- diff --git a/conf/type/__key_value/manifest b/conf/type/__key_value/manifest index 84c06352..2e75e175 100755 --- a/conf/type/__key_value/manifest +++ b/conf/type/__key_value/manifest @@ -19,5 +19,12 @@ # # set defaults -[ -f "$__object/parameter/key" ] \ - || echo "$__object_id" > "$__object/parameter/key" +key="$(cat "$__object/parameter/key" 2>/dev/null \ + || echo "$__object_id" | tee "$__object/parameter/key")" +state="$(cat "$__object/parameter/state" 2>/dev/null \ + || echo "present" | tee "$__object/parameter/state")" + +if [ "$state" = "present" -a ! -f "$__object/parameter/value" ]; then + echo "Missing required parameter 'value'" >&2 + exit 1 +fi diff --git a/conf/type/__key_value/parameter/optional b/conf/type/__key_value/parameter/optional index 06bfde49..483e3192 100644 --- a/conf/type/__key_value/parameter/optional +++ b/conf/type/__key_value/parameter/optional @@ -1 +1,3 @@ key +value +state diff --git a/conf/type/__key_value/parameter/required b/conf/type/__key_value/parameter/required index 8f4aa53c..3ae10da3 100644 --- a/conf/type/__key_value/parameter/required +++ b/conf/type/__key_value/parameter/required @@ -1,3 +1,2 @@ -value file delimiter From ef81f03e89a2b53498f52d2e6262ea0ec94afdd4 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 3 Feb 2012 22:49:10 +0100 Subject: [PATCH 4/5] have to report absent state no matter what the desired state is Signed-off-by: Steven Armstrong --- conf/type/__key_value/explorer/state | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/conf/type/__key_value/explorer/state b/conf/type/__key_value/explorer/state index 7e66cb69..ec760f71 100755 --- a/conf/type/__key_value/explorer/state +++ b/conf/type/__key_value/explorer/state @@ -29,10 +29,13 @@ value="$(cat "$__object/parameter/value" 2>/dev/null \ case "$state" in absent) - # if the key exists, with whatever value, we will have to remove it - # so report it as present if egrep -q "^$key$delimiter+" "$file"; then + # if the key exists, with whatever value, we will have to remove it + # so report it as present echo present + else + # key does not exist + echo absent fi ;; present) From 817ce9c2562cc24117702a3eac7c3717766d0a87 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Wed, 8 Feb 2012 08:31:59 +0100 Subject: [PATCH 5/5] /egrep/grep -E/ Signed-off-by: Steven Armstrong --- conf/type/__key_value/explorer/state | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/type/__key_value/explorer/state b/conf/type/__key_value/explorer/state index ec760f71..94a5ea7f 100755 --- a/conf/type/__key_value/explorer/state +++ b/conf/type/__key_value/explorer/state @@ -29,7 +29,7 @@ value="$(cat "$__object/parameter/value" 2>/dev/null \ case "$state" in absent) - if egrep -q "^$key$delimiter+" "$file"; then + if grep -q -E "^$key$delimiter+" "$file"; then # if the key exists, with whatever value, we will have to remove it # so report it as present echo present @@ -39,10 +39,10 @@ case "$state" in fi ;; present) - if egrep -q "^$key$delimiter+$value$" "$file"; then + if grep -q -E "^$key$delimiter+$value$" "$file"; then # key exists and value is same echo present - elif egrep -q "^$key$delimiter+" "$file"; then + elif grep -q -E "^$key$delimiter+" "$file"; then # key exists, but value is empty or different echo wrongvalue else