]>
Commit | Line | Data |
---|---|---|
1848564d MT |
1 | #!/bin/bash |
2 | ############################################################################### | |
3 | # # | |
4 | # IPFire.org - A linux based firewall # | |
5 | # Copyright (C) 2010 Michael Tremer & Christian Schmidt # | |
6 | # # | |
7 | # This program is free software: you can redistribute it and/or modify # | |
8 | # it under the terms of the GNU General Public License as published by # | |
9 | # the Free Software Foundation, either version 3 of the License, or # | |
10 | # (at your option) any later version. # | |
11 | # # | |
12 | # This program is distributed in the hope that it will be useful, # | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # | |
15 | # GNU General Public License for more details. # | |
16 | # # | |
17 | # You should have received a copy of the GNU General Public License # | |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. # | |
19 | # # | |
20 | ############################################################################### | |
21 | ||
22 | function cli_config() { | |
fe688aa4 MT |
23 | if cli_help_requested $@; then |
24 | cli_usage root-config | |
25 | exit ${EXIT_OK} | |
26 | fi | |
27 | ||
1848564d MT |
28 | if [ -n "${1}" ]; then |
29 | network_config_set $@ | |
30 | else | |
31 | network_config_print | |
32 | fi | |
33 | } | |
34 | ||
35 | function cli_device() { | |
711ffac1 MT |
36 | if device_config_exists ${1}; then |
37 | local device=${1} | |
38 | local action=${2} | |
39 | shift 2 | |
1848564d | 40 | |
711ffac1 MT |
41 | case "${action}" in |
42 | down|up) | |
43 | device_${action} ${device} $@ | |
44 | ;; | |
45 | esac | |
46 | else | |
47 | local action=${1} | |
48 | shift | |
1848564d | 49 | |
711ffac1 MT |
50 | case "${action}" in |
51 | create) | |
52 | device_${action} $@ | |
53 | ;; | |
1848564d | 54 | |
711ffac1 MT |
55 | discover) |
56 | echo "# XXX need to implement --raw here" | |
57 | local device | |
58 | for device in ${devices}; do | |
59 | cli_device_discover ${device} $@ | |
60 | done | |
61 | ;; | |
1848564d | 62 | |
711ffac1 MT |
63 | show|"") |
64 | local device | |
65 | for device in $(device_get $@); do | |
66 | device_print ${device} | |
67 | done | |
68 | ;; | |
69 | *) | |
70 | cli_usage device | |
71 | ;; | |
72 | esac | |
1848564d | 73 | fi |
1848564d MT |
74 | } |
75 | ||
76 | function cli_device_discover() { | |
77 | local device=${1} | |
78 | shift | |
79 | ||
80 | local device_type=$(device_get_type ${device}) | |
81 | if [ "${device_type}" != "real" ]; then | |
82 | return ${EXIT_OK} | |
83 | fi | |
84 | ||
85 | local raw | |
86 | ||
87 | while [ $# -gt 0 ]; do | |
88 | case "${1}" in | |
89 | --raw) | |
90 | raw=1 | |
91 | ;; | |
92 | esac | |
93 | shift | |
94 | done | |
95 | ||
96 | local up | |
97 | device_is_up ${device} && up=1 | |
98 | device_set_up ${device} | |
99 | ||
100 | enabled raw || echo "${device}" | |
101 | ||
102 | local hook | |
103 | local out | |
104 | local ret | |
d61a01d4 MT |
105 | for hook in $(hook_zone_get_all); do |
106 | out=$(hook_zone_exec ${hook} discover ${device}) | |
1848564d MT |
107 | ret=$? |
108 | ||
109 | [ ${ret} -eq ${DISCOVER_NOT_SUPPORTED} ] && continue | |
110 | ||
111 | if enabled raw; then | |
112 | case "${ret}" in | |
113 | ${DISCOVER_OK}) | |
114 | echo "${hook}: OK" | |
115 | local line | |
116 | while read line; do | |
117 | echo "${hook}: ${line}" | |
118 | done <<<"${out}" | |
119 | ;; | |
120 | ||
121 | ${DISCOVER_ERROR}) | |
122 | echo "${hook}: FAILED" | |
123 | ;; | |
124 | esac | |
125 | else | |
126 | case "${ret}" in | |
127 | ${DISCOVER_OK}) | |
128 | echo " ${hook} was successful." | |
129 | local line | |
130 | while read line; do | |
131 | echo " ${line}" | |
132 | done <<<"${out}" | |
133 | ;; | |
134 | ||
135 | ${DISCOVER_ERROR}) | |
136 | echo " ${hook} failed." | |
137 | ;; | |
138 | esac | |
139 | fi | |
140 | done | |
141 | ||
142 | echo # New line | |
143 | ||
144 | [ "${up}" = "1" ] || device_set_down ${device} | |
145 | } | |
146 | ||
711ffac1 MT |
147 | function cli_port() { |
148 | if cli_help_requested $@; then | |
149 | cli_usage root-port | |
150 | exit ${EXIT_OK} | |
151 | fi | |
152 | ||
153 | local action | |
154 | local port | |
155 | ||
156 | if port_exists ${1}; then | |
157 | port=${1} | |
158 | action=${2} | |
159 | shift 2 | |
160 | ||
161 | # Action aliases | |
162 | case "${action}" in | |
163 | start) | |
164 | action="up" | |
165 | ;; | |
166 | stop) | |
167 | action="down" | |
168 | ;; | |
169 | show) | |
170 | action="status" | |
171 | ;; | |
172 | esac | |
173 | ||
174 | case "${action}" in | |
175 | edit|up|down|status) | |
176 | port_${action} ${port} $@ | |
177 | ;; | |
178 | *) | |
179 | error "Unrecognized argument: ${action}" | |
180 | exit ${EXIT_ERROR} | |
181 | ;; | |
182 | esac | |
183 | else | |
184 | action=${1} | |
185 | shift | |
186 | ||
187 | case "${action}" in | |
188 | create|destroy) | |
189 | port_${action} $@ | |
190 | ;; | |
191 | *) | |
192 | error "Unrecognized argument: ${action}" | |
193 | exit ${EXIT_ERROR} | |
194 | ;; | |
195 | esac | |
196 | fi | |
197 | } | |
198 | ||
1848564d | 199 | function cli_zone() { |
8db9698f MT |
200 | if cli_help_requested $@; then |
201 | cli_usage root-zone | |
202 | exit ${EXIT_OK} | |
203 | fi | |
204 | ||
1848564d MT |
205 | local action |
206 | local zone | |
207 | ||
208 | if zone_name_is_valid ${1}; then | |
209 | zone=${1} | |
210 | action=${2} | |
211 | shift 2 | |
212 | ||
711ffac1 MT |
213 | # Action aliases |
214 | case "${action}" in | |
215 | start) | |
216 | action="up" | |
217 | ;; | |
218 | stop) | |
219 | action="down" | |
220 | ;; | |
221 | show) | |
222 | action="status" | |
223 | ;; | |
224 | esac | |
225 | ||
1848564d | 226 | case "${action}" in |
711ffac1 | 227 | config|down|edit|port|status|up) |
1848564d MT |
228 | zone_${action} ${zone} $@ |
229 | ;; | |
8db9698f MT |
230 | *) |
231 | error "Unrecognized argument: ${action}" | |
232 | cli_usage root-zone-subcommands | |
233 | exit ${EXIT_ERROR} | |
234 | ;; | |
1848564d MT |
235 | esac |
236 | else | |
237 | action=${1} | |
238 | shift | |
239 | ||
240 | case "${action}" in | |
241 | create|remove) | |
242 | zone_${action} $@ | |
243 | ;; | |
8db9698f MT |
244 | ""|*) |
245 | if [ -n "${action}" ]; then | |
246 | error "Unrecognized argument: '${action}'" | |
247 | echo | |
248 | fi | |
249 | ||
250 | cli_usage root-zone | |
251 | exit ${EXIT_ERROR} | |
1848564d MT |
252 | ;; |
253 | esac | |
254 | fi | |
255 | } | |
256 | ||
257 | function cli_start() { | |
1d7bc4f3 MT |
258 | if cli_help_requested $@; then |
259 | cli_usage root-start | |
260 | exit ${EXIT_OK} | |
261 | fi | |
262 | ||
1848564d MT |
263 | local zones=$(zones_get $@) |
264 | ||
265 | local zone | |
266 | for zone in ${zones}; do | |
267 | zone_up ${zone} | |
268 | done | |
269 | } | |
270 | ||
271 | function cli_stop() { | |
1d7bc4f3 MT |
272 | if cli_help_requested $@; then |
273 | cli_usage root-stop | |
274 | exit ${EXIT_OK} | |
275 | fi | |
276 | ||
1848564d MT |
277 | local zones=$(zones_get $@) |
278 | ||
279 | local zone | |
280 | for zone in ${zones}; do | |
281 | zone_down ${zone} | |
282 | done | |
283 | } | |
284 | ||
bcef495d MT |
285 | function cli_restart() { |
286 | if cli_help_requested $@; then | |
287 | cli_usage root-restart | |
288 | exit ${EXIT_OK} | |
289 | fi | |
290 | ||
291 | cli_stop $@ | |
292 | ||
293 | # Give the system some time to calm down | |
2ae4f579 | 294 | sleep ${TIMEOUT_RESTART} |
bcef495d MT |
295 | |
296 | cli_start $@ | |
297 | } | |
298 | ||
4c5857b2 MT |
299 | function cli_status() { |
300 | if cli_help_requested $@; then | |
301 | cli_usage root-status | |
302 | exit ${EXIT_OK} | |
303 | fi | |
304 | ||
305 | local zones=$(zones_get $@) | |
306 | ||
307 | local zone | |
308 | for zone in ${zones}; do | |
309 | zone_status ${zone} | |
310 | done | |
311 | } | |
312 | ||
f90e550b MT |
313 | function cli_reset() { |
314 | if cli_help_requested $@; then | |
315 | cli_usage root-reset | |
316 | exit ${EXIT_OK} | |
317 | fi | |
318 | ||
319 | warning_log "Will reset the whole network configuration!!!" | |
320 | ||
321 | # Force mode is disabled by default | |
322 | local force=0 | |
323 | ||
324 | while [ $# -gt 0 ]; do | |
325 | case "${1}" in | |
326 | --force|-f) | |
327 | force=1 | |
328 | ;; | |
329 | esac | |
330 | shift | |
331 | done | |
332 | ||
333 | # If we are not running in force mode, we ask the user if he does know | |
334 | # what he is doing. | |
335 | if ! enabled force; then | |
336 | if ! cli_yesno "Do you really want to reset the whole network configuration?"; then | |
337 | exit ${EXIT_ERROR} | |
338 | fi | |
339 | fi | |
340 | ||
341 | local zone | |
342 | for zone in $(zones_get --all); do | |
343 | zone_remove ${zone} | |
344 | done | |
345 | ||
346 | local port | |
347 | for port in $(ports_get --all); do | |
348 | port_remove ${port} | |
349 | done | |
350 | ||
2ae0fb8d MT |
351 | # Re-run the initialization functions |
352 | init_run | |
f90e550b MT |
353 | |
354 | exit ${EXIT_OK} | |
355 | } | |
356 | ||
1d7bc4f3 | 357 | function cli_help_requested() { |
866de228 MT |
358 | local argument="${1}" |
359 | ||
360 | if [ -n "${argument}" ]; then | |
361 | if listmatch ${argument} help -h --help; then | |
1d7bc4f3 MT |
362 | return ${EXIT_OK} |
363 | fi | |
866de228 | 364 | fi |
1d7bc4f3 MT |
365 | |
366 | return ${EXIT_ERROR} | |
367 | } | |
368 | ||
1848564d MT |
369 | function cli_usage() { |
370 | local what=${1} | |
371 | ||
372 | case "${what}" in | |
373 | root) | |
374 | echo "${0}: [command] <options ...>" | |
375 | echo | |
376 | echo " start - ..." | |
377 | echo " stop - ..." | |
bcef495d | 378 | echo " restart - ..." |
4c5857b2 | 379 | echo " status - ..." |
1848564d MT |
380 | echo |
381 | echo " config - ..." | |
382 | echo | |
383 | echo " device - ..." | |
1848564d MT |
384 | echo " zone - ..." |
385 | echo | |
386 | ;; | |
fe688aa4 MT |
387 | root-config) |
388 | echo "${0}: ${what#root-} [KEY=VAL, ...]" | |
389 | echo | |
390 | echo " This command allows setting of global configuration parameters." | |
391 | echo | |
392 | echo " If no additional arguments are passed it will list the current configuration." | |
393 | echo | |
394 | echo " You can overwrite the settings like the following:" | |
395 | echo | |
396 | echo " ${0} ${what#root-} DEBUG=1 ..." | |
397 | echo | |
398 | ;; | |
f90e550b MT |
399 | root-reset) |
400 | echo "${0}: ${what#root-} [--force | -f]" | |
401 | echo | |
402 | echo " This command resets the network configuration." | |
403 | echo | |
404 | echo " Will delete all zones and ports." | |
405 | echo | |
406 | echo -e " ${COLOUR_RED}USE WITH CAUTION!${COLOUR_NORMAL}" | |
407 | echo | |
408 | ;; | |
bcef495d | 409 | root-start|root-stop|root-restart) |
1d7bc4f3 MT |
410 | echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]" |
411 | echo | |
412 | echo " This commands ${what#root-}s all zones by default." | |
413 | echo " One can pass several parameters to only process a subset of all" | |
414 | echo " available zones:" | |
415 | echo | |
2ab7f50f | 416 | echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}" |
1d7bc4f3 MT |
417 | echo " Process all local zones which includes every zone without red." |
418 | echo | |
2ab7f50f | 419 | echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}" |
1d7bc4f3 MT |
420 | echo " Process all remote zones which means only the red ones." |
421 | echo | |
2ab7f50f | 422 | echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}" |
1d7bc4f3 MT |
423 | echo " Process all zones. This is the default parameter." |
424 | echo | |
425 | echo " Additionally, you can pass one or more zone names which will" | |
426 | echo " be processed." | |
427 | echo | |
428 | ;; | |
4c5857b2 MT |
429 | root-status) |
430 | echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]" | |
431 | echo | |
432 | echo " This commands shows status information of all zones by default." | |
433 | echo " One can pass several parameters to only process a subset of all" | |
434 | echo " available zones:" | |
435 | echo | |
2ab7f50f | 436 | echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}" |
4c5857b2 MT |
437 | echo " Process all local zones which includes every zone without red." |
438 | echo | |
2ab7f50f | 439 | echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}" |
4c5857b2 MT |
440 | echo " Process all remote zones which means only the red ones." |
441 | echo | |
2ab7f50f | 442 | echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}" |
4c5857b2 MT |
443 | echo " Process all zones. This is the default parameter." |
444 | echo | |
445 | echo " Additionally, you can pass one or more zone names which will" | |
446 | echo " be processed." | |
447 | echo | |
448 | ;; | |
8db9698f MT |
449 | root-zone) |
450 | echo "${0}: ${what#root-} <create|remove> <zone> [<type> <options...>]" | |
451 | echo | |
452 | echo " Create or remove a zone." | |
453 | echo | |
2ab7f50f | 454 | echo -e " ${COLOUR_BOLD}create <zone> <type> <options>${COLOUR_NORMAL}" |
8db9698f MT |
455 | echo " Create a new zone of type <type> where <zone> is an allowed" |
456 | echo " zone name." | |
457 | echo | |
2ab7f50f | 458 | echo -e " ${COLOUR_BOLD}remove <zone>${COLOUR_NORMAL}" |
8db9698f MT |
459 | echo " Remove the zone <zone>." |
460 | echo | |
461 | echo " You may also edit the configuration of the zones." | |
462 | echo | |
2ab7f50f | 463 | echo -e " ${COLOUR_BOLD}<zone> ...${COLOUR_NORMAL}" |
8db9698f MT |
464 | echo " Edit the zone <zone>." |
465 | echo | |
466 | ;; | |
1848564d MT |
467 | usage) |
468 | echo | |
469 | echo " Run '${0} help' to get information how to use this tool." | |
470 | echo | |
471 | ;; | |
472 | *) | |
473 | error "No help available for this command '${what}'." | |
1d7bc4f3 | 474 | echo |
1848564d MT |
475 | ;; |
476 | esac | |
1d7bc4f3 MT |
477 | |
478 | echo "Network configuration tool. Report all bugs to <http://bugs.ipfire.org>." | |
1848564d | 479 | } |
9178284d MT |
480 | |
481 | function cli_status_headline() { | |
482 | local zone=${1} | |
483 | ||
484 | local state="${COLOUR_DOWN}DOWN${COLOUR_NORMAL}" | |
485 | zone_is_up ${zone} && state="${COLOUR_UP}UP${COLOUR_NORMAL}" | |
486 | ||
487 | echo -e "${zone} - ${state} - $(zone_get_hook ${zone})" | |
488 | } | |
489 | ||
490 | function cli_headline() { | |
491 | echo | |
492 | echo -e "${COLOUR_BOLD}$@${COLOUR_NORMAL}" | |
493 | } | |
f90e550b MT |
494 | |
495 | function cli_yesno() { | |
496 | local message="$@ [y/N] " | |
497 | local yesno | |
498 | ||
499 | echo | |
500 | echo -ne "${message}" | |
501 | read yesno | |
502 | ||
503 | if listmatch ${yesno} y Y j J yes YES Yes; then | |
504 | return ${EXIT_OK} | |
505 | fi | |
506 | ||
507 | return ${EXIT_ERROR} | |
508 | } | |
d76f5107 MT |
509 | |
510 | function cli_get_key() { | |
511 | local key="${1%%=*}" | |
512 | echo "${key/--/}" | |
513 | } | |
514 | ||
515 | function cli_get_val() { | |
516 | echo "${1##*=}" | |
517 | } |