]> git.ipfire.org Git - people/arne_f/network.git/blame - functions.cli
network: STP: Make protocol version configureable.
[people/arne_f/network.git] / functions.cli
CommitLineData
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
22function 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
35function 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
76function 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
147function 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 199function 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
257function 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
271function 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
285function 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
299function 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
313function 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 357function 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
369function 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
481function 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
490function cli_headline() {
491 echo
492 echo -e "${COLOUR_BOLD}$@${COLOUR_NORMAL}"
493}
f90e550b
MT
494
495function 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}