source: hybrid/branches/releng-10/nanobsd/files/tools/wl-config@ 13574

Last change on this file since 13574 was 12464, checked in by rick, 11 years ago

Een internet verbinding is vandaag de dag beter te vinden als een verbinding naar sunny, geeft hier voorkeur aan

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