From 93ec4b46aab9cd61d66cb375fcf7a2599c5ef9bb Mon Sep 17 00:00:00 2001
From: Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
Date: Wed, 15 Jan 2020 17:23:13 +0100
Subject: [PATCH 1/5] [__line] Ensure the line is only added once

---
 cdist/conf/type/__line/explorer/state | 22 +++++++++++-----------
 cdist/conf/type/__line/gencode-remote |  3 +++
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/cdist/conf/type/__line/explorer/state b/cdist/conf/type/__line/explorer/state
index 2ef252c8..9c0dd1b2 100755
--- a/cdist/conf/type/__line/explorer/state
+++ b/cdist/conf/type/__line/explorer/state
@@ -18,6 +18,17 @@
 # along with cdist. If not, see <http://www.gnu.org/licenses/>.
 #
 
+if [ -f "$__object/parameter/file" ]; then
+   file="$(cat "$__object/parameter/file")"
+else
+   file="/$__object_id"
+fi
+
+if [ ! -f "$file" ]; then
+  echo "file_missing"
+  exit 0
+fi
+
 if [ -f "$__object/parameter/before" ]; then
    position="before"
 elif [ -f "$__object/parameter/after" ]; then
@@ -33,17 +44,6 @@ else
    needle="line"
 fi
 
-if [ -f "$__object/parameter/file" ]; then
-   file="$(cat "$__object/parameter/file")"
-else
-   file="/$__object_id"
-fi
-
-if [ ! -f "$file" ]; then
-  echo "file_missing"
-  exit 0
-fi
-
 awk -v position="$position" -v needle="$needle" '
 function _find(_text, _pattern) {
    if (needle == "regex") {
diff --git a/cdist/conf/type/__line/gencode-remote b/cdist/conf/type/__line/gencode-remote
index 03e90c1b..0dd8609a 100755
--- a/cdist/conf/type/__line/gencode-remote
+++ b/cdist/conf/type/__line/gencode-remote
@@ -1,6 +1,7 @@
 #!/bin/sh -e
 #
 # 2018 Steven Armstrong (steven-cdist at armstrong.cc)
+# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 #
 # This file is part of cdist.
 #
@@ -104,10 +105,12 @@ BEGIN {
       if (anchor && match(\$0, anchor)) {
          if (position == "before") {
             print line
+            add = 0
             print
          } else if (position == "after") {
             print
             print line
+            add = 0
          }
          next
       }

From 629d0795c80bdf8af83a71712c643275be0799f1 Mon Sep 17 00:00:00 2001
From: Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
Date: Wed, 15 Jan 2020 17:23:26 +0100
Subject: [PATCH 2/5] [__line] Always add line to end if anchor is not found

---
 cdist/conf/type/__line/gencode-remote | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cdist/conf/type/__line/gencode-remote b/cdist/conf/type/__line/gencode-remote
index 0dd8609a..c8c90c38 100755
--- a/cdist/conf/type/__line/gencode-remote
+++ b/cdist/conf/type/__line/gencode-remote
@@ -118,7 +118,7 @@ BEGIN {
    print
 }
 END {
-   if (add && position == "end") {
+   if (add) {
       print line
    }
 }

From 4cdb8aaa03d07aa72de8dd5961844699ad5888bd Mon Sep 17 00:00:00 2001
From: Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
Date: Wed, 15 Jan 2020 17:39:21 +0100
Subject: [PATCH 3/5] [__line/state] Make sure the index match is at the
 beginning

Without the == 1 all lines which contain --line as a substring match.  e.g. if
--line is "line" and the file contains the line "wrong line" this was considered
a match.
---
 cdist/conf/type/__line/explorer/state | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cdist/conf/type/__line/explorer/state b/cdist/conf/type/__line/explorer/state
index 9c0dd1b2..28ec35e2 100755
--- a/cdist/conf/type/__line/explorer/state
+++ b/cdist/conf/type/__line/explorer/state
@@ -49,7 +49,7 @@ function _find(_text, _pattern) {
    if (needle == "regex") {
       return match(_text, _pattern)
    } else {
-      return index(_text, _pattern)
+      return index(_text, _pattern) == 1
    }
 }
 BEGIN {

From 51b1b11cc21e257acbce420ecfcd48ec37e66705 Mon Sep 17 00:00:00 2001
From: Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
Date: Wed, 15 Jan 2020 17:54:40 +0100
Subject: [PATCH 4/5] [__line/state] Logic fixes in explorer

This commit fixes the incorrectly reported state "wrongposition" if position is
"after" and anchor is present in the file but the line missing.
---
 cdist/conf/type/__line/explorer/state | 41 +++++++++++++++------------
 1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/cdist/conf/type/__line/explorer/state b/cdist/conf/type/__line/explorer/state
index 28ec35e2..6ff0a798 100755
--- a/cdist/conf/type/__line/explorer/state
+++ b/cdist/conf/type/__line/explorer/state
@@ -1,6 +1,7 @@
 #!/bin/sh -e
 #
 # 2018 Steven Armstrong (steven-cdist at armstrong.cc)
+# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 #
 # This file is part of cdist.
 #
@@ -19,7 +20,7 @@
 #
 
 if [ -f "$__object/parameter/file" ]; then
-   file="$(cat "$__object/parameter/file")"
+   file=$(cat "$__object/parameter/file")
 else
    file="/$__object_id"
 fi
@@ -55,41 +56,45 @@ function _find(_text, _pattern) {
 BEGIN {
    getline anchor < (ENVIRON["__object"] "/parameter/" position)
    getline pattern < (ENVIRON["__object"] "/parameter/" needle)
-   state = "absent"
+
+   found_line = 0
+   correct_pos = (position != "after" && position != "before")
 }
 {
    if (position == "after") {
       if (match($0, anchor)) {
          getline
          if (_find($0, pattern)) {
-            state = "present"
+            found_line++
+            correct_pos = 1
+            exit 0
          }
-         else {
-            state = "wrongposition"
-         }
-         exit 0
+      } else if (_find($0, pattern)) {
+         found_line++
       }
-   }
-   else if (position == "before") {
+   } else if (position == "before") {
       if (_find($0, pattern)) {
+         found_line++
          getline
          if (match($0, anchor)) {
-            state = "present"
+            correct_pos = 1
+            exit 0
          }
-         else {
-            state = "wrongposition"
-         }
-         exit 0
       }
-   }
-   else {
+   } else {
       if (_find($0, pattern)) {
-         state = "present"
+         found_line++
          exit 0
       }
    }
 }
 END {
-   print state
+   if (found_line && correct_pos) {
+      print "present"
+   } else if (found_line) {
+      print "wrongposition"
+   } else {
+      print "absent"
+   }
 }
 ' "$file"

From 5a9a1ba57fc45df63cff123a42905360c3a7bddb Mon Sep 17 00:00:00 2001
From: Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
Date: Wed, 15 Jan 2020 22:00:56 +0100
Subject: [PATCH 5/5] [__line] Produce error when file does not exist

---
 cdist/conf/type/__line/explorer/state |  5 +----
 cdist/conf/type/__line/gencode-remote | 17 +++++++++++------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/cdist/conf/type/__line/explorer/state b/cdist/conf/type/__line/explorer/state
index 6ff0a798..e8fc3630 100755
--- a/cdist/conf/type/__line/explorer/state
+++ b/cdist/conf/type/__line/explorer/state
@@ -25,10 +25,7 @@ else
    file="/$__object_id"
 fi
 
-if [ ! -f "$file" ]; then
-  echo "file_missing"
-  exit 0
-fi
+[ -f "$file" ] || exit 0
 
 if [ -f "$__object/parameter/before" ]; then
    position="before"
diff --git a/cdist/conf/type/__line/gencode-remote b/cdist/conf/type/__line/gencode-remote
index c8c90c38..88cae68b 100755
--- a/cdist/conf/type/__line/gencode-remote
+++ b/cdist/conf/type/__line/gencode-remote
@@ -24,9 +24,20 @@ if [ -f "$__object/parameter/before" ] && [ -f "$__object/parameter/after" ]; th
    exit 1
 fi
 
+if [ -f "$__object/parameter/file" ]; then
+   file="$(cat "$__object/parameter/file")"
+else
+   file="/$__object_id"
+fi
+
 state_should="$(cat "$__object/parameter/state")"
 state_is="$(cat "$__object/explorer/state")"
 
+if [ -z "$state_is" ]; then
+   printf 'The file "%s" is missing. Please create it before using %s on it.\n' "$file" "${__type##*/}" >&2
+   exit 1
+fi
+
 if [ "$state_should" = "$state_is" ]; then
    # nothing to do
    exit 0
@@ -47,12 +58,6 @@ else
    needle="line"
 fi
 
-if [ -f "$__object/parameter/file" ]; then
-   file="$(cat "$__object/parameter/file")"
-else
-   file="/$__object_id"
-fi
-
 add=0
 remove=0
 case "$state_should" in