source: hybrid/branches/releng-11/nanobsd/files/tools/wl-config@ 13732

Last change on this file since 13732 was 13725, checked in by rick, 8 years ago

Wrong resolv.conf leaves other files dangling, causing cascading failure.

Config files are downloaded in order, since resolv.conf should be downloaded
last, as the system will use this file to download for example the unbound
setup. Without either of them there is no working system possible.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
File size: 8.0 KB
Line 
1#!/bin/sh
2# Wireless Leiden config-update script for FreeBSD 8.0 (nanobsd)
3# Based on the 'API' of Jasper
4# Rick van der Zwet
5# XXX: TODO, some proper error checking for fetch
6
7
8# Slow connection = no connection
9export HTTP_TIMEOUT=10
10
11
12check_access() {
13 # Direct Access - External
14 BASEURL="http://wirelessleiden.nl/config/"
15 fetch -o /dev/null -q $BASEURL > /dev/null && return
16 echo "# WARN: Fetch via external $BASEURL failed"
17
18 # Direct Access - Internal IP
19 BASEURL="http://172.16.4.46/wleiden/config/"
20 # Connectivity check
21 fetch -o /dev/null -q $BASEURL > /dev/null && return
22 echo "# WARN: Fetch via internal $BASEURL failed"
23
24 # Direct Access - External DNS
25 BASEURL="http://132.229.112.21/wleiden/config/"
26 fetch -o /dev/null -q $BASEURL > /dev/null && return
27 echo "# CRIT: Fetch via external $BASEURL failed"
28
29 exit 1
30}
31check_access
32
33
34# Default config to fetch
35CONFIG=`hostname -s`
36
37# Determine it's statup and running location and some other hints
38# Ordering is important! resolv.conf is fetched as last file, as it could
39# potentially break the downloading of other files.
40FILES="authorized_keys dhcpd.conf dnsmasq.conf motd rc.conf.local pf.hybrid.conf.local unbound.wleiden.conf wleiden.yaml resolv.conf"
41file_details() {
42 POST_CMD=""
43 FILE_HINT=""
44
45 case "$1" in
46 'authorized_keys')
47 STARTUP_LOC="/cfg/ssh/${FILE}"
48 RUNNING_LOC="/etc/ssh/${FILE}"
49 ;;
50 'dhcpd.conf')
51 STARTUP_LOC="/cfg/local/${FILE}"
52 RUNNING_LOC="/usr/local/etc/${FILE}"
53 POST_CMD="service isc-dhcpd restart"
54 ;;
55 'dnsmasq.conf')
56 STARTUP_LOC="/cfg/local/${FILE}"
57 RUNNING_LOC="/usr/local/etc/${FILE}"
58 POST_CMD="service dnsmasq restart"
59 ;;
60 'motd')
61 STARTUP_LOC="/cfg/${FILE}"
62 RUNNING_LOC="/etc/${FILE}"
63 POST_CMD="/etc/rc.d/motd onestart"
64 ;;
65 'named.conf')
66 STARTUP_LOC="/cfg/namedb/${FILE}"
67 RUNNING_LOC="/etc/namedb/${FILE}"
68 POST_CMD="service named restart"
69 ;;
70 'rc.conf.local')
71 STARTUP_LOC="/cfg/${FILE}"
72 RUNNING_LOC="/etc/${FILE}"
73 FILE_HINT="Restart interfaces with: nohup service netif restart"
74 ;;
75 'resolv.conf')
76 STARTUP_LOC="/cfg/${FILE}"
77 RUNNING_LOC="/etc/${FILE}"
78 FILE_HINT="To get the ordering right run: nameserver-shuffle"
79 ;;
80 'pf.hybrid.conf.local')
81 STARTUP_LOC="/cfg/${FILE}"
82 RUNNING_LOC="/etc/${FILE}"
83 POST_CMD="service pf reload"
84 ;;
85 'unbound.wleiden.conf')
86 STARTUP_LOC="/cfg/local/${FILE}"
87 RUNNING_LOC="/usr/local/etc/${FILE}"
88 POST_CMD="service unbound reload"
89 ;;
90 'wleiden.yaml')
91 STARTUP_LOC="/cfg/local/${FILE}"
92 RUNNING_LOC="/usr/local/etc/${FILE}"
93 ;;
94 esac
95}
96
97usage() {
98 (
99 echo "Usage: $0 [-bpn] [-c <config>] [-m <all|startup|testing|running>]"
100 echo " -b = batch mode, no user input"
101 echo " -c <config> = default configuration to fetch"
102 echo " -d = do not run the POST_CMD commands [default]"
103 echo " -p = run the POST_CMD commands to activate the services right-away"
104 echo " -n = do not mount config partition"
105 echo " -m all = copy config files to running & config partition [default]"
106 echo " -m startup = copy config files to config partition"
107 echo " -m testing = do not copy config files"
108 echo " -m running = copy config files to running partition"
109 echo " -m hack = copy running files to config partition"
110 ) 1>&2
111 exit 2
112}
113
114# Argument parsing using getopts
115USE_API=1 # Whether or not to use the webinterface
116OPT_MOUNT=1
117OPT_RUNNING=1
118OPT_STARTUP=1
119OPT_HACK=0 # Hack for people without configuration managment and testing
120OPT_BATCH=0
121OPT_POSTCMD=false
122
123parse_options() {
124 while getopts "bc:nm:dp" OPT; do
125 case "$OPT" in
126 b) OPT_BATCH=1;;
127 c) CONFIG="${OPTARG}";;
128 d) OPT_POSTCMD=false;;
129 n) OPT_MOUNT=0;;
130 m) case "$OPTARG" in
131 all) true;;
132 live) OPT_STARTUP=0;;
133 startup) OPT_RUNNING=0;;
134 testing) OPT_RUNNING=0; OPT_STARTUP=0; OPT_MOUNT=0;;
135 hack) OPT_RUNNING=0; OPT_STARTUP=0; OPT_HACK=1; USE_API=0;;
136 *) usage;;
137 esac;;
138 h) usage;;
139 p) OPT_POSTCMD=true;;
140 \?) usage;;
141 esac
142 done
143 # Allow to override automatic mounting, in case of external mount 'managment'
144 if [ "$1" = "-n" ]; then
145 OPT_MOUNT=0
146 fi
147
148 if [ "${OPT_RUNNING}" -eq 1 ]; then
149 echo "# INFO: Storing new config files in running configuration"
150 fi
151
152 if [ "${OPT_STARTUP}" -eq 1 ]; then
153 echo "# INFO: Storing new config files in startup configuration"
154 fi
155
156 if [ "${OPT_HACK}" -eq 1 ]; then
157 echo "# WARN: Copy running configuration to startup configuration"
158 echo "# WARN: Please do mind to document/mention this changes somewhere"
159 fi
160
161 if /bin/df / | grep -q "^/dev/md[0-9]"; then
162 OPT_MOUNT=0
163 echo "# WARN: Mount operations disabled as we are running in a md(4) image"
164 fi
165
166 # New line before the real work gets started
167 echo ""
168}
169
170
171
172
173# test validity of input
174config_validator() {
175 INPUT="$1"
176 `grep -q "^${INPUT}\$" ${TMPDIR}/node_list.txt`
177 if [ $? -eq 0 ]; then
178 return 0
179 else
180 echo "WARNING: Input '${INPUT}' is not valid, some hints..."
181 grep -i "${INPUT}" ${TMPDIR}/node_list.txt
182 return 1
183 fi
184}
185
186
187
188select_node() {
189 # List of all available nodes
190 fetch -q -o ${TMPDIR}/node_list.txt ${BASEURL} || exit 1
191
192 if [ ${OPT_BATCH} -eq 1 ]; then
193 config_validator "${CONFIG}"
194 if [ $? -eq 1 ]; then
195 echo "ERROR: Please provide valid config" 1>&2
196 exit 1
197 fi
198 else
199 # Provide Nodelist and feedback
200 cat ${TMPDIR}/node_list.txt | column
201 echo ' THIS script adds the config from GENESIS to this operating system'
202 echo ' make sure you know what you are doing, if not press control-C'
203 echo ' ENTER CONFIG NAME ......(and press enter)'
204
205 # Have the user to select the right node
206 INVALID_CONFIG=1
207 while [ ${INVALID_CONFIG} -eq 1 ]; do
208 # Ask for node name, play around with prev option
209 echo -n "Name [${CONFIG}]: "
210 read INPUT
211 if [ -z "${INPUT}" ]; then
212 INPUT=${CONFIG}
213 else
214 CONFIG=${INPUT}
215 fi
216
217 config_validator "${INPUT}"
218 if [ $? -eq 0 ]; then
219 INVALID_CONFIG=0
220 fi
221 done
222 fi
223}
224
225
226
227
228# Copy file, saving some bits if no change needed
229copy_file() {
230 SOURCE=$1
231 TARGET=$2
232 diff -I '^FreeBSD ' -I '^# Generated at ' ${TARGET} ${SOURCE} 2>/dev/null
233 if [ $? -ne 0 ]; then
234 mkdir -p `dirname ${TARGET}` || exit 1
235 cp ${SOURCE} ${TARGET} || exit 1
236 return $?
237 fi
238 return 1
239}
240
241# Main function
242main() {
243 TMPDIR=`mktemp -d -t $(basename $0)`
244 # Clear out tempdir when done
245 if [ ${OPT_MOUNT} -eq 1 ]; then
246 trap "rm -Rf ${TMPDIR}; umount /cfg; mount -ro noatime /; exit" 0 1 2 3 15
247 else
248 trap "rm -Rf ${TMPDIR}; exit" 0 1 2 3 15
249
250 fi
251
252 # Mount if requested
253 if [ ${OPT_MOUNT} -eq 1 ]; then
254 mount -uwo noatime /
255 mount /cfg
256 fi
257
258 # Select node from web-interface
259 if [ ${USE_API} -eq 1 ]; then
260 select_node
261 fi
262
263 # Worker, place all files in required directory
264 for FILE in ${FILES}; do
265 if [ ${USE_API} -eq 1 ]; then
266 # Fetch needed file
267 FRESH_LOC=${TMPDIR}/${FILE}
268 fetch -q -o ${FRESH_LOC} ${BASEURL}/${CONFIG}/${FILE} || exit 1
269 fi
270
271 # Needed file details, like locations and hints
272 file_details ${FILE}
273
274 echo "# INFO: Working on file: '${FILE}'"
275 # Copy file boot location
276 if [ ${OPT_STARTUP} -eq 1 ]; then
277 copy_file ${FRESH_LOC} ${STARTUP_LOC}
278 fi
279
280 # Copy file running location
281 if [ ${OPT_RUNNING} -eq 1 ]; then
282 copy_file ${FRESH_LOC} ${RUNNING_LOC}
283 if [ $? -eq 0 ]; then
284 echo "# INFO: '${FILE}' changed"
285 if [ -n "${POST_CMD}" ]; then
286 if $OPT_POSTCMD; then
287 echo "## Running post_cmd: $POST_CMD"
288 $POST_CMD
289 else
290 echo "## To activate run the post_cmd: $POST_CMD"
291 fi
292 fi
293 if [ -n "${FILE_HINT}" ]; then
294 echo "# INFO: ${FILE_HINT}"
295 echo ""
296 fi
297 fi
298 fi
299
300 # Direct copy
301 if [ ${OPT_HACK} -eq 1 ]; then
302 # No checking, just dumb try to copy mode
303 cp -v ${RUNNING_LOC} ${STARTUP_LOC}
304 fi
305 done
306
307 exit 0
308}
309
310parse_options $*
311main
Note: See TracBrowser for help on using the repository browser.