2 # Copyright (C) 2016 Ian Kelling
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
17 local help="Usage: [-h|--help ] [-v] [SECTION_NAME] FILE
18 Create/modify a section in a config file
20 Returns 1 if the file is modified by this command, 2 or higher
23 The section is #comment delimited. Reads STDIN for the contents of the
24 section. Without SECTION_NAME, it acts on a global unnamed
25 section. cedit is short for config edit.
28 -s Silent. Quiet and exit 0 on modified file.
32 local s
diff name init file_dir exists verbose backup quiet silent
33 file_dir
="$(dirname "$file")"
41 -b) backup
=true
; shift ;;
42 -v) verbose
=true
; shift ;;
43 -q) quiet
=true
; shift ;;
44 -s) quiet
=true
; silent
=true
; shift ;;
45 -h|
--help) echo "$help"; return ;;
48 if (( $# == 2 )); then
54 local file_name
="${file##*/}"
59 # bind zone files use ; for comments yes, a little hacky detection.
60 if [[ $file_name == db.
* ]]; then
63 local begin
="$comment start delimiter of cedit section$name. do not modify. $comment"
64 local end
="$comment end delimiter of cedit section$name. do not modify. $comment"
66 if [[ ! -e $file_dir ]]; then
67 if ! mkdir
-p $file_dir; then
69 $s mkdir
-p $file_dir ||
return 2
72 if [[ ! -e $file ]]; then
74 if ! $s touch $file; then
76 $s touch $file ||
return 2
80 [[ -w $file ]] || s
=sudo
83 local in_section
=false
86 local temp
="$(mktemp -d)/$file_name"
89 while IFS
= read -r line
; do
90 tailn
=$
(( tailn
+ 1 ))
91 if [[ $line == "$begin" ]]; then
95 printf '%s\n' "$line" >> $file
99 IFS
= read -d '' -n 1 -r init
101 $s tee -a "$file" >/dev
/null
<<<"$begin"
102 printf '%s' "$init" |
$s tee -a "$file" >/dev
/null
103 $s tee -a "$file" >/dev
/null
104 $s tee -a "$file" >/dev
/null
<<<"$end"
107 if $exists && $in_section; then
108 while IFS
= read -r line
; do
109 if [[ $line == "$begin" ]]; then
112 if ! $in_section; then
113 printf '%s\n' "$line" >> $file
115 if [[ $line == $end ]]; then
118 done < <(tail -n +$tailn "$temp")
125 echo "New file $file:"
128 elif type -t diff &>/dev
/null
; then
129 diff=$
(diff -u "$temp" "$file")
131 if (( $ret )) && ! $quiet; then
132 echo "backup of original at $temp"
133 echo diff -u "$temp" "$file":
136 # echo "No changes made to $file"
139 # for systems like openwrt which don't have diff
140 diff=$
(cmp "$temp" "$file")
146 if ! $backup && $exists; then