function cli_config() {
if cli_help_requested $@; then
- cli_usage root-config
+ cli_show_man network-config
exit ${EXIT_OK}
fi
if [ -n "${1}" ]; then
- network_config_set $@
+ config_set $@
+ network_config_write
else
network_config_print
fi
}
function cli_device() {
- local action=${1}
- shift
+ local device=${1}
+ local action=${2}
+ shift 2
- local device
- local devices=$@
+ assert device_exists ${device}
- if [ -z "${devices}" ]; then
- devices=$(devices_get_all)
+ if zone_exists ${device} || port_exists ${device}; then
+ error "The device '${device}' has already been configured."
+ error "You cannot do a device action."
+ return ${EXIT_ERROR}
fi
case "${action}" in
discover)
echo "# XXX need to implement --raw here"
- for device in ${devices}; do
- cli_device_discover ${device} $@
- done
+ cli_device_discover ${device} $@
;;
show|"")
- for device in ${devices}; do
- cli_device_print ${device}
- done
+ # XXX device_show needs to be implemented
+ device_show ${device}
;;
*)
- cli_usage device
- ;;
+ cli_show_man network-device
+ ;;
esac
}
-function cli_device_print() {
- local device=${1}
-
- if ! device_exists ${device}; then
- error "Device '${device}' does not exist."
- return ${EXIT_ERROR}
- fi
-
- echo "${device}"
- echo " Type: $(device_get_type ${device})"
- echo " Addr: $(device_get_address ${device})"
- echo
-}
-
function cli_device_discover() {
local device=${1}
shift
local hook
local out
local ret
- for hook in $(hooks_get_all); do
- out=$(hook_exec ${hook} discover ${device})
+ for hook in $(hook_zone_get_all); do
+ out=$(hook_zone_exec ${hook} discover ${device})
ret=$?
[ ${ret} -eq ${DISCOVER_NOT_SUPPORTED} ] && continue
[ "${up}" = "1" ] || device_set_down ${device}
}
+function cli_hostname() {
+ if cli_help_requested $@; then
+ cli_show_man network
+ exit ${EXIT_OK}
+ fi
+
+ local hostname=${1}
+
+ if [ -n "${hostname}" ]; then
+ config_hostname ${hostname}
+ log INFO "Hostname was set to '${hostname}'."
+ log INFO "Changes do only take affect after reboot."
+ exit ${EXIT_OK}
+ fi
+
+ echo "$(config_hostname)"
+ exit ${EXIT_OK}
+}
+
+function cli_port() {
+ if cli_help_requested $@; then
+ cli_show_man network-port
+ exit ${EXIT_OK}
+ fi
+
+ local action
+ local port
+
+ if port_exists ${1}; then
+ port=${1}
+ action=${2}
+ shift 2
+
+ # Action aliases
+ case "${action}" in
+ start)
+ action="up"
+ ;;
+ stop)
+ action="down"
+ ;;
+ show)
+ action="status"
+ ;;
+ esac
+
+ case "${action}" in
+ edit|up|down|status)
+ port_${action} ${port} $@
+ ;;
+ *)
+ error "Unrecognized argument: ${action}"
+ exit ${EXIT_ERROR}
+ ;;
+ esac
+ else
+ action=${1}
+ shift
+
+ case "${action}" in
+ create|destroy)
+ port_${action} $@
+ ;;
+ *)
+ error "Unrecognized argument: ${action}"
+ exit ${EXIT_ERROR}
+ ;;
+ esac
+ fi
+}
+
function cli_zone() {
if cli_help_requested $@; then
- cli_usage root-zone
+ cli_show_man network-zone
exit ${EXIT_OK}
fi
action=${2}
shift 2
+ # Action aliases
case "${action}" in
- config|down|edit|port|show|status|up)
+ start)
+ action="up"
+ ;;
+ stop)
+ action="down"
+ ;;
+ show)
+ action="status"
+ ;;
+ esac
+
+ case "${action}" in
+ config|down|edit|port|status|up)
zone_${action} ${zone} $@
;;
*)
error "Unrecognized argument: ${action}"
- cli_usage root-zone-subcommands
+ cli_show_man network-zone
exit ${EXIT_ERROR}
;;
esac
shift
case "${action}" in
- create|remove)
+ create)
zone_${action} $@
;;
+ remove)
+ cli_zone_remove $@
+ ;;
""|*)
if [ -n "${action}" ]; then
error "Unrecognized argument: '${action}'"
echo
fi
- cli_usage root-zone
+ cli_show_man network-zone
exit ${EXIT_ERROR}
;;
esac
fi
}
+# Removes a zone either immediately, if it is currently down,
+# or adds a tag that the removal will be done when the zone
+# is brought down the next time.
+function cli_zone_remove() {
+ if cli_help_requested $@; then
+ cli_show_man network-zone
+ exit ${EXIT_OK}
+ fi
+
+ local zone=${1}
+ assert zone_exists ${zone}
+
+ if zone_is_up ${zone}; then
+ echo "Zone '${zone}' is up and will be removed when it goes down the next time."
+ zone_remove ${zone}
+ else
+ echo "Removing zone '${zone}' now..."
+ zone_remove_now ${zone}
+ fi
+
+ exit ${EXIT_OK}
+}
+
function cli_start() {
if cli_help_requested $@; then
- cli_usage root-start
+ cli_show_man network
exit ${EXIT_OK}
fi
local zone
for zone in ${zones}; do
- zone_up ${zone}
+ zone_start ${zone} &
done
+
+ wait # until everything is settled
}
function cli_stop() {
if cli_help_requested $@; then
- cli_usage root-stop
+ cli_show_man network
exit ${EXIT_OK}
fi
local zone
for zone in ${zones}; do
- zone_down ${zone}
+ zone_stop ${zone} &
done
+
+ wait # until everything is settled
}
function cli_restart() {
if cli_help_requested $@; then
- cli_usage root-restart
+ cli_show_man network
exit ${EXIT_OK}
fi
function cli_status() {
if cli_help_requested $@; then
- cli_usage root-status
+ cli_show_man network
exit ${EXIT_OK}
fi
+ # When dumping status information, the debug
+ # mode clutters the console which is not what we want.
+ # Logging on the console is disabled for a short time.
+ local log_disable_stdout=${LOG_DISABLE_STDOUT}
+ LOG_DISABLE_STDOUT="true"
+
local zones=$(zones_get $@)
local zone
for zone in ${zones}; do
zone_status ${zone}
done
+
+ # Reset logging.
+ LOG_DISABLE_STDOUT=${log_disable_stdout}
}
-function cli_help_requested() {
- local argument
- for argument in $@; do
- if [ "${argument}" = "help" -o "${argument}" = "-h" -o "${argument}" = "--help" ]; then
- return ${EXIT_OK}
+function cli_reset() {
+ if cli_help_requested $@; then
+ cli_show_man network
+ exit ${EXIT_OK}
+ fi
+
+ warning_log "Will reset the whole network configuration!!!"
+
+ # Force mode is disabled by default
+ local force=0
+
+ while [ $# -gt 0 ]; do
+ case "${1}" in
+ --force|-f)
+ force=1
+ ;;
+ esac
+ shift
+ done
+
+ # If we are not running in force mode, we ask the user if he does know
+ # what he is doing.
+ if ! enabled force; then
+ if ! cli_yesno "Do you really want to reset the whole network configuration?"; then
+ exit ${EXIT_ERROR}
fi
+ fi
+
+ local zone
+ for zone in $(zones_get --all); do
+ zone_remove ${zone}
done
- return ${EXIT_ERROR}
+ local port
+ for port in $(ports_get --all); do
+ port_remove ${port}
+ done
+
+ # Re-run the initialization functions
+ init_run
+
+ exit ${EXIT_OK}
}
-function cli_usage() {
- local what=${1}
-
- case "${what}" in
- root)
- echo "${0}: [command] <options ...>"
- echo
- echo " start - ..."
- echo " stop - ..."
- echo " restart - ..."
- echo " status - ..."
- echo
- echo " config - ..."
- echo
- echo " device - ..."
- echo " zone - ..."
- echo
- ;;
- root-config)
- echo "${0}: ${what#root-} [KEY=VAL, ...]"
- echo
- echo " This command allows setting of global configuration parameters."
- echo
- echo " If no additional arguments are passed it will list the current configuration."
- echo
- echo " You can overwrite the settings like the following:"
- echo
- echo " ${0} ${what#root-} DEBUG=1 ..."
- echo
- ;;
- root-start|root-stop|root-restart)
- echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]"
- echo
- echo " This commands ${what#root-}s all zones by default."
- echo " One can pass several parameters to only process a subset of all"
- echo " available zones:"
- echo
- echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}"
- echo " Process all local zones which includes every zone without red."
- echo
- echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}"
- echo " Process all remote zones which means only the red ones."
- echo
- echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}"
- echo " Process all zones. This is the default parameter."
- echo
- echo " Additionally, you can pass one or more zone names which will"
- echo " be processed."
- echo
- ;;
- root-status)
- echo "${0}: ${what#root-} [--local-only|--remote-only|--all|<zone>...]"
- echo
- echo " This commands shows status information of all zones by default."
- echo " One can pass several parameters to only process a subset of all"
- echo " available zones:"
- echo
- echo -e " ${COLOUR_BOLD}--local-only${COLOUR_NORMAL}"
- echo " Process all local zones which includes every zone without red."
- echo
- echo -e " ${COLOUR_BOLD}--remote-only${COLOUR_NORMAL}"
- echo " Process all remote zones which means only the red ones."
- echo
- echo -e " ${COLOUR_BOLD}--all${COLOUR_NORMAL}"
- echo " Process all zones. This is the default parameter."
- echo
- echo " Additionally, you can pass one or more zone names which will"
- echo " be processed."
- echo
- ;;
- root-zone)
- echo "${0}: ${what#root-} <create|remove> <zone> [<type> <options...>]"
- echo
- echo " Create or remove a zone."
- echo
- echo -e " ${COLOUR_BOLD}create <zone> <type> <options>${COLOUR_NORMAL}"
- echo " Create a new zone of type <type> where <zone> is an allowed"
- echo " zone name."
- echo
- echo -e " ${COLOUR_BOLD}remove <zone>${COLOUR_NORMAL}"
- echo " Remove the zone <zone>."
- echo
- echo " You may also edit the configuration of the zones."
- echo
- echo -e " ${COLOUR_BOLD}<zone> ...${COLOUR_NORMAL}"
- echo " Edit the zone <zone>."
- echo
- ;;
- usage)
- echo
- echo " Run '${0} help' to get information how to use this tool."
- echo
- ;;
- *)
- error "No help available for this command '${what}'."
- echo
- ;;
- esac
+function cli_help_requested() {
+ local argument="${1}"
+
+ if [ -n "${argument}" ]; then
+ if listmatch ${argument} help -h --help; then
+ return ${EXIT_OK}
+ fi
+ fi
- echo "Network configuration tool. Report all bugs to <http://bugs.ipfire.org>."
+ return ${EXIT_ERROR}
}
function cli_status_headline() {
echo
echo -e "${COLOUR_BOLD}$@${COLOUR_NORMAL}"
}
+
+function cli_yesno() {
+ local message="$@ [y/N] "
+ local yesno
+
+ echo
+ echo -ne "${message}"
+ read yesno
+
+ if listmatch ${yesno} y Y j J yes YES Yes; then
+ return ${EXIT_OK}
+ fi
+
+ return ${EXIT_ERROR}
+}
+
+function cli_get_key() {
+ local key="${1%%=*}"
+ echo "${key/--/}"
+}
+
+function cli_get_val() {
+ echo "${@##*=}"
+}
+
+function cli_usage() {
+ local command="$@"
+ local basename="$(basename ${0})"
+
+ if ! isset command; then
+ command="${basename} help"
+ fi
+
+ echo "The given command was not understood by ${basename}." >&2
+ echo "Please run '${command}' for detailed help." >&2
+}
+
+function cli_show_man() {
+ local manpage=${1}
+ assert isset manpage
+
+ if ! binary_exists man; then
+ error "The man package is not installed on this system."
+ error "Please install 'man' in order to view the help."
+ exit ${EXIT_ERROR}
+ fi
+
+ man ${manpage}
+}