]> git.ipfire.org Git - people/arne_f/network.git/blame - functions.cli
network: Add reset option.
[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
351 # XXX recreate ethernet ports
352
353 exit ${EXIT_OK}
354}
355
1d7bc4f3
MT
356function cli_help_requested() {
357 local argument
3b838f4b 358 for argument in ${1}; do
1d7bc4f3
MT
359 if [ "${argument}" = "help" -o "${argument}" = "-h" -o "${argument}" = "--help" ]; then
360 return ${EXIT_OK}
361 fi
362 done
363
364 return ${EXIT_ERROR}
365}
366
1848564d
MT
367function cli_usage() {
368 local what=${1}
369
370 case "${what}" in
371 root)
372 echo "${0}: [command] <options ...>"
373 echo
374 echo " start - ..."
375 echo " stop - ..."
bcef495d 376 echo " restart - ..."
4c5857b2 377 echo " status - ..."
1848564d
MT
378 echo
379 echo " config - ..."
380 echo
381 echo " device - ..."
1848564d
MT
382 echo " zone - ..."
383 echo
384 ;;
fe688aa4
MT
385 root-config)
386 echo "${0}: ${what#root-} [KEY=VAL, ...]"
387 echo
388 echo " This command allows setting of global configuration parameters."
389 echo
390 echo " If no additional arguments are passed it will list the current configuration."
391 echo
392 echo " You can overwrite the settings like the following:"
393 echo
394 echo " ${0} ${what#root-} DEBUG=1 ..."
395 echo
396 ;;
f90e550b
MT
397 root-reset)
398 echo "${0}: ${what#root-} [--force | -f]"
399 echo
400 echo " This command resets the network configuration."
401 echo
402 echo " Will delete all zones and ports."
403 echo
404 echo -e " ${COLOUR_RED}USE WITH CAUTION!${COLOUR_NORMAL}"
405 echo
406 ;;
bcef495d 407 root-start|root-stop|root-restart)
1d7bc4f3
MT
408 echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]"
409 echo
410 echo " This commands ${what#root-}s all zones by default."
411 echo " One can pass several parameters to only process a subset of all"
412 echo " available zones:"
413 echo
2ab7f50f 414 echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}"
1d7bc4f3
MT
415 echo " Process all local zones which includes every zone without red."
416 echo
2ab7f50f 417 echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}"
1d7bc4f3
MT
418 echo " Process all remote zones which means only the red ones."
419 echo
2ab7f50f 420 echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}"
1d7bc4f3
MT
421 echo " Process all zones. This is the default parameter."
422 echo
423 echo " Additionally, you can pass one or more zone names which will"
424 echo " be processed."
425 echo
426 ;;
4c5857b2
MT
427 root-status)
428 echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]"
429 echo
430 echo " This commands shows status information of all zones by default."
431 echo " One can pass several parameters to only process a subset of all"
432 echo " available zones:"
433 echo
2ab7f50f 434 echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}"
4c5857b2
MT
435 echo " Process all local zones which includes every zone without red."
436 echo
2ab7f50f 437 echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}"
4c5857b2
MT
438 echo " Process all remote zones which means only the red ones."
439 echo
2ab7f50f 440 echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}"
4c5857b2
MT
441 echo " Process all zones. This is the default parameter."
442 echo
443 echo " Additionally, you can pass one or more zone names which will"
444 echo " be processed."
445 echo
446 ;;
8db9698f
MT
447 root-zone)
448 echo "${0}: ${what#root-} <create|remove> <zone> [<type> <options...>]"
449 echo
450 echo " Create or remove a zone."
451 echo
2ab7f50f 452 echo -e " ${COLOUR_BOLD}create <zone> <type> <options>${COLOUR_NORMAL}"
8db9698f
MT
453 echo " Create a new zone of type <type> where <zone> is an allowed"
454 echo " zone name."
455 echo
2ab7f50f 456 echo -e " ${COLOUR_BOLD}remove <zone>${COLOUR_NORMAL}"
8db9698f
MT
457 echo " Remove the zone <zone>."
458 echo
459 echo " You may also edit the configuration of the zones."
460 echo
2ab7f50f 461 echo -e " ${COLOUR_BOLD}<zone> ...${COLOUR_NORMAL}"
8db9698f
MT
462 echo " Edit the zone <zone>."
463 echo
464 ;;
1848564d
MT
465 usage)
466 echo
467 echo " Run '${0} help' to get information how to use this tool."
468 echo
469 ;;
470 *)
471 error "No help available for this command '${what}'."
1d7bc4f3 472 echo
1848564d
MT
473 ;;
474 esac
1d7bc4f3
MT
475
476 echo "Network configuration tool. Report all bugs to <http://bugs.ipfire.org>."
1848564d 477}
9178284d
MT
478
479function cli_status_headline() {
480 local zone=${1}
481
482 local state="${COLOUR_DOWN}DOWN${COLOUR_NORMAL}"
483 zone_is_up ${zone} && state="${COLOUR_UP}UP${COLOUR_NORMAL}"
484
485 echo -e "${zone} - ${state} - $(zone_get_hook ${zone})"
486}
487
488function cli_headline() {
489 echo
490 echo -e "${COLOUR_BOLD}$@${COLOUR_NORMAL}"
491}
f90e550b
MT
492
493function cli_yesno() {
494 local message="$@ [y/N] "
495 local yesno
496
497 echo
498 echo -ne "${message}"
499 read yesno
500
501 if listmatch ${yesno} y Y j J yes YES Yes; then
502 return ${EXIT_OK}
503 fi
504
505 return ${EXIT_ERROR}
506}