pud: use more secure strncpy
[olsrd.git] / files / generateEffectiveConfigurationFile
1 #!/bin/bash
2
3 # The olsr.org Optimized Link-State Routing daemon (olsrd)
4 #
5 # (c) by the OLSR project
6 #
7 # See our Git repository to find out who worked on this file
8 # and thus is a copyright holder on it.
9 #
10 # All rights reserved.
11 #
12 # Redistribution and use in source and binary forms, with or without
13 # modification, are permitted provided that the following conditions
14 # are met:
15 #
16 # * Redistributions of source code must retain the above copyright
17 #   notice, this list of conditions and the following disclaimer.
18 # * Redistributions in binary form must reproduce the above copyright
19 #   notice, this list of conditions and the following disclaimer in
20 #   the documentation and/or other materials provided with the
21 #   distribution.
22 # * Neither the name of olsr.org, olsrd nor the names of its
23 #   contributors may be used to endorse or promote products derived
24 #   from this software without specific prior written permission.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
36 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 # POSSIBILITY OF SUCH DAMAGE.
38 #
39 # Visit http://www.olsr.org for more information.
40 #
41 # If you find this software useful feel free to make a donation
42 # to the project. For more information see the website or contact
43 # the copyright holders.
44 #
45
46 set -e
47 set -u
48
49 configFileTmp=""
50 function exitTrapHandler() {
51   local -i exitCode=${?}
52
53   if [ -n "$configFileTmp" ]; then
54     rm -f "$configFileTmp"
55   fi
56
57   if [[ ${exitCode} -ne 0 ]]; then
58     echo "Exiting with code ${exitCode}"
59   fi
60   exit ${exitCode}
61 }
62
63 trap exitTrapHandler EXIT
64
65
66 script="$0"
67 scriptDir="$(dirname "$script")"
68 pushd "$scriptDir" &> /dev/null
69 scriptDir="$(pwd)"
70 popd &> /dev/null
71 baseDir="$(dirname "$scriptDir")"
72
73 olsrd="$baseDir/olsrd"
74
75 arprefreshLib="$baseDir/lib/arprefresh/olsrd_arprefresh.so.0.1"
76 arprefreshLibDir="$(dirname "$arprefreshLib")"
77 dyngwLib="$baseDir/lib/dyn_gw/olsrd_dyn_gw.so.0.5"
78 dyngwLibDir="$(dirname "$dyngwLib")"
79 httpinfoLib="$baseDir/lib/httpinfo/olsrd_httpinfo.so.0.1"
80 httpinfoLibDir="$(dirname "$httpinfoLib")"
81 jsoninfoLib="$baseDir/lib/jsoninfo/olsrd_jsoninfo.so.1.1"
82 jsoninfoLibDir="$(dirname "$jsoninfoLib")"
83 nameserviceLib="$baseDir/lib/nameservice/olsrd_nameservice.so.0.4"
84 nameserviceLibDir="$(dirname "$nameserviceLib")"
85 p2pdinfoLib="$baseDir/lib/p2pd/olsrd_p2pd.so.0.1.0"
86 p2pdinfoLibDir="$(dirname "$p2pdinfoLib")"
87 txtinfoLib="$baseDir/lib/txtinfo/olsrd_txtinfo.so.1.1"
88 txtinfoLibDir="$(dirname "$txtinfoLib")"
89
90
91 # Check root
92 if [ ! "$(whoami)" = "root" ]; then
93   echo "ERROR: must be root."
94   exit 1
95 fi
96
97
98 # Check nc
99 set +e
100 nc="$(which nc 2> /dev/null)"
101 set -e
102 if [ -z "$nc" ]; then
103   echo "ERROR: nc doesn't seem to be installed."
104   exit 1
105 fi
106
107
108 # Check compiled
109 for i in "$olsrd" \
110          "$arprefreshLib" \
111          "$dyngwLib" \
112          "$httpinfoLib" \
113          "$jsoninfoLib" \
114          "$nameserviceLib" \
115          "$p2pdinfoLib" \
116          "$txtinfoLib"; do
117   if [ ! -r "$i" ]; then
118     echo "ERROR: $i is not readable."
119     exit 1
120   fi
121 done
122
123
124 # Check parameters
125 if [ $# -ne 2 ]; then
126   echo "ERROR: specify network interface and configuration file."
127   exit 1
128 fi
129
130 nwif="$1"
131 configFile="$2"
132
133 # Check network interfaces
134 set +e
135 nwifGrep="$(cat /proc/net/dev | grep -E "^[[:space:]]*$nwif[[:space:]]*:[[:space:]]+.*\$")"
136 set -e
137
138 if [ -z "$nwifGrep" ]; then
139   echo "ERROR: network interface $nwif doesn't exist."
140   exit 1
141 fi
142
143
144 # Check configuration file
145 if [ ! -r "$configFile" ]; then
146   echo "ERROR: configuration file $configFile is not readable."
147   exit 1
148 fi
149
150 configFileDir="$(dirname "$configFile")"
151 pushd "$configFileDir" &> /dev/null
152 configFileDir="$(pwd)"
153 popd &> /dev/null
154 configFile="$configFileDir/$(basename "$configFile")"
155
156
157 # Generate adjusted configuration file
158 regex="^([[:space:]]*[Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee][[:space:]]+)"
159 configFileTmp="$(mktemp)"
160 sed -r "s/$regex\"wlan0\"/\1\"$nwif\"/" \
161        "$configFile" \
162        > "$configFileTmp"
163
164
165 echo "Stopping all olsrd instances"
166 set +e
167 killall "$(basename "$olsrd")"
168 set -e
169
170
171 echo "Starting $(basename "$olsrd")"
172 export LD_LIBRARY_PATH="$arprefreshLibDir:$dyngwLibDir:$httpinfoLibDir:$jsoninfoLibDir:$nameserviceLibDir:$p2pdinfoLibDir:$txtinfoLibDir"
173 "$olsrd" -f "$configFileTmp" -nofork & #> /dev/null &
174
175
176 sleep 1
177 echo -n "Sleeping a bit "
178 for i in 3 2 1; do
179   echo -n "$i"
180   sleep 1
181 done
182 echo ""
183
184
185 echo "Generating effective configuration file"
186 echo "  $configFile.txt"
187 set +e
188 echo "/plain/olsrd.conf" | \
189   nc 127.0.0.1 56789 | \
190   tail -n +6 | \
191   sed -r \
192     -e "s/$regex\"$nwif\"/\1\"wlan0\"/" \
193     -e '/^[[:space:]]*PlParam[[:space:]]+"port"[[:space:]]+"56789"[[:space:]]*$/ d' \
194     -e 's/^[[:space:]]*MainIp[[:space:]]+.*$/MainIp 10.0.0.1/' \
195   > "$configFile.txt"
196 chown --reference="$configFile" "$configFile.txt"
197 set -e
198
199
200 echo "Stopping all $(basename "$olsrd") instances"
201 set +e
202 killall "$(basename "$olsrd")"
203 set -e
204
205
206 rm -f "$configFileTmp"
207 configFileTmp=""
208
209 sleep 1
210 echo ""