0
|
1 #! /bin/sh -e |
|
2 |
|
3 # generate a new dcc_conf file from an existing file |
|
4 |
|
5 # Copyright (c) 2008 by Rhyolite Software, LLC |
|
6 # |
|
7 # This agreement is not applicable to any entity which sells anti-spam |
|
8 # solutions to others or provides an anti-spam solution as part of a |
|
9 # security solution sold to other entities, or to a private network |
|
10 # which employs the DCC or uses data provided by operation of the DCC |
|
11 # but does not provide corresponding data to other users. |
|
12 # |
|
13 # Permission to use, copy, modify, and distribute this software without |
|
14 # changes for any purpose with or without fee is hereby granted, provided |
|
15 # that the above copyright notice and this permission notice appear in all |
|
16 # copies and any distributed versions or copies are either unchanged |
|
17 # or not called anything similar to "DCC" or "Distributed Checksum |
|
18 # Clearinghouse". |
|
19 # |
|
20 # Parties not eligible to receive a license under this agreement can |
|
21 # obtain a commercial license to use DCC by contacting Rhyolite Software |
|
22 # at sales@rhyolite.com. |
|
23 # |
|
24 # A commercial license would be for Distributed Checksum and Reputation |
|
25 # Clearinghouse software. That software includes additional features. This |
|
26 # free license for Distributed ChecksumClearinghouse Software does not in any |
|
27 # way grant permision to use Distributed Checksum and Reputation Clearinghouse |
|
28 # software |
|
29 # |
|
30 # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL |
|
31 # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |
|
32 # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC |
|
33 # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES |
|
34 # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
|
35 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
|
36 # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
|
37 # SOFTWARE. |
|
38 |
|
39 # Rhyolite Software DCC 1.3.103-1.23 $Revision$ |
|
40 |
|
41 FNAME=dcc_conf |
|
42 |
|
43 CUR= |
|
44 PROTOTYPE=$FNAME |
|
45 SUFFIX=new |
|
46 NEW= |
|
47 DCC_HOMEDIR= |
|
48 |
|
49 USAGE="$0: [-x] [-i cur] [-s new-suffix] [-p prototype] [-o new] -h homedir" |
|
50 while getopts "xi:s:p:o:h:" c; do |
|
51 case $c in |
|
52 x) set -x;; |
|
53 i) CUR="$OPTARG";; |
|
54 s) if test -n "$OPTARG"; then |
|
55 SUFFIX="$OPTARG" |
|
56 fi |
|
57 ;; |
|
58 p) PROTOTYPE="$OPTARG";; |
|
59 o) NEW="$OPTARG";; |
|
60 h) DCC_HOMEDIR="$OPTARG";; |
|
61 *) echo "$USAGE" 1>&2; exit 1;; |
|
62 esac |
|
63 done |
|
64 shift `expr $OPTIND - 1 || true` |
|
65 if test "$#" -ne 0 -o ! -d "$DCC_HOMEDIR"; then |
|
66 echo "$USAGE" 1>&2 |
|
67 exit 1 |
|
68 fi |
|
69 |
|
70 if test ! -s "$PROTOTYPE"; then |
|
71 echo "prototype $PROTOTYPE does not exist" 1>&2 |
|
72 exit 1 |
|
73 fi |
|
74 |
|
75 if test -z "$CUR"; then |
|
76 CUR="$DCC_HOMEDIR/$FNAME" |
|
77 fi |
|
78 if test ! -f "$CUR"; then |
|
79 echo "$CUR does not exist" 1>&2 |
|
80 exit 1 |
|
81 fi |
|
82 |
|
83 if test -z "$NEW"; then |
|
84 NEW="$CUR-$SUFFIX" |
|
85 fi |
|
86 |
|
87 # Use /^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/ patterns instead of easier to read, |
|
88 # probably faster /^[A-Z/ patterns because someone has decided that |
|
89 # GNU Awk 3.1.3 (at least on x86_64) should have /^[A-Z]/ match "fi" |
|
90 # with IGNORECASE=0 and even in traditional mode. |
|
91 |
|
92 rm -f $NEW |
|
93 awk '(first_file == "") { |
|
94 first_file = FILENAME; |
|
95 } |
|
96 /^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/ { |
|
97 # deal with continuation lines |
|
98 line = $0; |
|
99 while (substr(line,length(line)) == "\\") { |
|
100 if (getline <= 0) { |
|
101 break; |
|
102 } |
|
103 line = line "\n" $0; |
|
104 } |
|
105 # divide the line into the variable name or key and its value |
|
106 inx = index(line, "="); |
|
107 if (inx == 0) { |
|
108 inx = length(line)+1; |
|
109 } |
|
110 key = substr(line, 1, inx-1); |
|
111 val = substr(line, inx+1); |
|
112 # only record things in the first file |
|
113 if (first_file == FILENAME) { |
|
114 defined[key] = 1; |
|
115 mem[key] = val; |
|
116 if (cur_comment) { |
|
117 comments[key] = cur_comment; |
|
118 cur_comment = ""; |
|
119 } |
|
120 } else { |
|
121 # on first line of second file, make compatibility adjustments |
|
122 if (!adjusted) { |
|
123 adjusted = 1; |
|
124 if (mem["DCCD_ENABLE"] == "") { |
|
125 defined["DCCD_ENABLE"] = 1; |
|
126 if (mem["SRVR_ID"] == "") { |
|
127 mem["DCCD_ENABLE"] = "off"; |
|
128 } else { |
|
129 mem["DCCD_ENABLE"] = "on"; |
|
130 } |
|
131 } |
|
132 # fix DCC_RUNDIR=@dcc_rundir@ bug in 1.2.14 and preceding |
|
133 if (defined["DCC_RUNDIR"]) { |
|
134 if (mem["DCC_RUNDIR"] == "@dcc_rundir@") { |
|
135 defined["DCC_RUNDIR"] = 0; |
|
136 } |
|
137 } |
|
138 # Use new values of some variables if their old values were |
|
139 # defaults. This makes ./configure changes effective. |
|
140 if (mem["Configure_DCC_LIBEXEC"] == mem["DCC_LIBEXEC"]) { |
|
141 defined["DCC_LIBEXEC"] = 0; |
|
142 } |
|
143 if (mem["Configure_DCC_RUNDIR"] == mem["DCC_RUNDIR"]) { |
|
144 defined["DCC_RUNDIR"] = 0; |
|
145 } |
|
146 if (mem["Configure_DCCSUID"] == mem["DCCSUID"]) { |
|
147 defined["DCCSUID"] = 0; |
|
148 } |
|
149 if (mem["Configure_DCC_LOGGER"] == mem["DCC_LOGGER"]) { |
|
150 defined["DCC_LOGGER"] = 0; |
|
151 } |
|
152 # use new, configured values of some variables |
|
153 if (defined["DCC_CONF_VERSION"]) |
|
154 old_version = mem["DCC_CONF_VERSION"]; |
|
155 defined["DCC_CONF_VERSION"] = 0; |
|
156 defined["Configure_DCC_LIBEXEC"] = 0; |
|
157 defined["Configure_DCC_RUNDIR"] = 0; |
|
158 defined["Configure_DCCSUID"] = 0; |
|
159 defined["Configure_DCC_LOGGER"] = 0; |
|
160 } |
|
161 if (defined[key]) { |
|
162 if (comments[key] && old_version > 3) { |
|
163 print comments[key]; |
|
164 } |
|
165 print key "=" mem[key]; |
|
166 } else { |
|
167 print line; |
|
168 } |
|
169 } |
|
170 } |
|
171 !/^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/ { |
|
172 if (FILENAME != first_file) { |
|
173 print $0; |
|
174 } else { |
|
175 if ($0 ~ /^ *#/ && $1 != "#") { |
|
176 if (cur_comment) { |
|
177 cur_comment = cur_comment "\n" $0; |
|
178 } else { |
|
179 cur_comment = $0; |
|
180 } |
|
181 } |
|
182 } |
|
183 }' $CUR $PROTOTYPE >$NEW |