abstracted the file chomping
authorChris Koeritz <fred@gruntose.com>
Wed, 15 Nov 2017 03:35:19 +0000 (22:35 -0500)
committerChris Koeritz <fred@gruntose.com>
Wed, 15 Nov 2017 03:35:19 +0000 (22:35 -0500)
will use this code in a function again shortly, so abstracting it saves effort.

scripts/system/common_sysadmin.sh

index 5c99865dcb7c5a83eda1d8f83dd5bf95999255ae..1285305e8f2aee59f52f424c0baa3b5c19c827f9 100644 (file)
@@ -11,7 +11,8 @@ function remove_domain_file()
 
   local domain_file="/etc/bind/${domain_name}.conf"
   if [ -f "$domain_file" ]; then
-    \rm -f "$domain_file"
+    # don't destroy, just shuffle.
+    \mv -f "$domain_file" "/tmp/${domain_file}-old-${RANDOM}"
     test_or_die "removing domain file: $domain_file"
   fi
 }
@@ -57,6 +58,64 @@ ${domain_name}.      IN A    ${IP_ADDRESS}
   test_or_die "setting ownership on: $domain_file"
 }
 
+#hmmm: move to core!
+
+# given a filename and a string to seek and a number of lines, then this
+# function will remove the first occurrence of a line in the file that
+# matches the string, and it will also axe the next N lines as specified.
+function create_chomped_copy_of_file()
+{
+  local filename="$1"; shift
+  local seeker="$1"; shift
+  local numlines=$1; shift
+
+  # make a backup first, oy.
+  \cp -f "$filename" "$filename.bkup-${RANDOM}" 
+  test_or_die "backing up file: $filename"
+
+  # make a temp file to write to before we move file into place in bind.
+  local new_version="/tmp/${filename}.bkup-${RANDOM}" 
+  \rm -f "$new_version"
+  test_or_die "cleaning out new version of file from: $new_version"
+
+  local line
+  local skip_count=0
+  while read line; do
+    # don't bother looking at the lines if we're already in skip mode.
+    if [[ $skip_count == 0 ]]; then
+      # find the string they're seeking.
+      if [[ ! "$line" =~ *"$seeker"* ]]; then
+        # no match.
+        echo "$line" >> "$new_version"
+      else
+        # a match!  start skipping.  we will delete this line and the next N lines.
+        ((skip_count++))
+echo first skip count is now $skip_count
+      fi
+    else
+      # we're already skipping.  let's keep going until we hit the limit.
+      ((skip_count++))
+echo ongoing skip count is now $skip_count
+      if [[ $skip_count >= $numlines ]]; then
+        echo "Done skipping, and back to writing output file."
+        skip_count=0
+      fi
+    fi
+  done < "$filename"
+
+#put the file back into place.
+echo file we created looks like this:
+filedump "$new_version"
+
+echo bailing
+exit 1
+
+  \mv "$new_version" "$filename"
+  test_or_die "moving the new version into place in: $filename"
+
+  
+}
+
 # takes a zone back out of the local conf file for bind
 function remove_zone_for_domain()
 {
@@ -64,13 +123,18 @@ function remove_zone_for_domain()
 
   local domain_file="/etc/bind/${domain_name}.conf"
 
+  # eat the zone file definition.  this will botch up badly if more text was added
+  # or the zone info shrank.
+  create_chomped_copy_of_file "$domain_file" "zone \"${domain_name}\"" 6
+
+
   \cp -f "$domain_file" "$domain_file.bkup-${RANDOM}" 
   test_or_die "backing up domain file: $domain_file"
 
   # temp file to write to before we move file into place in bind.
   local new_version="/tmp/$domain_file.bkup-${RANDOM}" 
   \rm -f "$new_version"
-  test_or_die "cleaning out new version of domain file from : $new_version"
+  test_or_die "cleaning out new version of domain file from: $new_version"
 
   local line
   local skip_count=0
@@ -102,6 +166,9 @@ filedump "$new_version"
 echo bailing
 exit 1
 
+  \mv "$new_version" "$domain_file"
+  test_or_die "moving the new version into place in: $domain_file"
+
 }
 
 # hooks up a new config file into bind's list of zones.