The configuration of a port was stored in a file called: /etc/network/${port} This is bad because it is very hard to add further information which belong primary not to the configuration to this file.
So we change the settings file to /etc/network/${port}/settings like for the zones.
This make it possible to store other configurations like the color in other files in the directory /etc/network/${port}.
A workaround to move the config file into the new directory scheme is: port=p1 && mv /etc/network/ports/${port} /etc/network/ports/${port}-save \ && mkdir -p /etc/network/ports/${port} \ && mv /etc/network/ports/${port}-save /etc/network/ports/${port}/settings
where port is the name of the port like p1 or p0.
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org --- src/functions/functions.ports | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/functions/functions.ports b/src/functions/functions.ports index 952eef9..c6e45d0 100644 --- a/src/functions/functions.ports +++ b/src/functions/functions.ports @@ -20,7 +20,8 @@ ###############################################################################
port_dir() { - echo "${NETWORK_CONFIG_DIR}/ports" + local port="${1}" + echo "${NETWORK_CONFIG_DIR}/ports/${port}" }
port_list() { @@ -113,13 +114,13 @@ port_file() { local port="${1}" assert isset port
- echo "$(port_dir)/${port}" + echo "$(port_dir ${port})/settings" }
port_exists() { local port=${1}
- [ -f "${NETWORK_CONFIG_DIR}/ports/${port}" ] + [ -d "${NETWORK_CONFIG_DIR}/ports/${port}" ] }
port_get_hook() { @@ -207,7 +208,7 @@ port_destroy() {
port_remove "${port}"
- rm -f $(port_file ${port}) + rm -rf $(port_dir ${port}) }
port_create() {
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org --- src/functions/functions.colors | 192 +++++++++++++++++++++++++++++++++++++++++ src/functions/functions.ports | 8 ++ src/functions/functions.zone | 8 ++ 3 files changed, 208 insertions(+)
diff --git a/src/functions/functions.colors b/src/functions/functions.colors index 8d7193c..433ce78 100644 --- a/src/functions/functions.colors +++ b/src/functions/functions.colors @@ -73,3 +73,195 @@ MSG_STP_DISCARDING="${CLR_RED_BG}${CLR_WHITE_B} DISCARDING ${CLR_RESET}" MSG_STP_LEARNING="${CLR_YELLOW_BG}${CLR_WHITE_B} LEARNING ${CLR_RESET}" MSG_STP_LISTENING="${CLR_YELLOW_BG}${CLR_WHITE_B} LISTENING ${CLR_RESET}" MSG_STP_BLOCKING="${CLR_RED_BG}${CLR_WHITE_B} BLOCKING ${CLR_RESET}" + +color_cli() { + #Is the cli function to parse the options submitted by a user. + local type=${1} + local name=${2} + local action=${3} + shift 3 + + case ${action} in + set) + local color=${4} + # Check if we get to many arguments + shift 1 + if [ $# -gt 0 ]; then + error "Too many arguments: $@" + return ${EXIT_ERROR} + fi + color_set ${type} ${name} ${@} + ;; + reset) + # We set the color to white. + # Check if we get to many arguments + shift + if [ $# -gt 0 ]; then + error "Too many arguments: $@" + return ${EXIT_ERROR} + fi + color_set ${type} ${name} "ffffff" + ;; + *) + error "Invalid argument: ${action}" + ;; + esac + +} + +color_set() { + #Write a given color into the color config file of a zone or port. + assert [ $# -eq 3 ] + + local type=${1} + local name=${2} + local COLOR=${3} + # Check if we get to many arguments + # Check if the color code is valid + if ! color_hex_is_valid ${COLOR}; then + error "Hexadecimal color code '${COLOR}' is not valid" + return ${EXIT_ERROR} + fi + + local file=$(color_format_filename ${type} ${name}) + settings_write ${file} COLOR +} + +color_read() { + #Read a color out of color config file of a zone or port. + #If this is unsuccessful we use white. + local type=${1} + local name=${2} + + local file=$(color_format_filename ${type} ${name}) + + local COLOR + + if ! settings_read ${file} COLOR; then + COLOR="ffffff" + fi + + print "${COLOR}" +} + +color_format_filename() { + #Formats the color config file name. + local type=${1} + local name=${2} + case ${type} in + zone) + echo "$(zone_dir ${name})/color" + ;; + port) + echo "$(port_dir ${name})/color" + ;; + esac +} + +color_hex_is_valid() { + #Check if a color hex is valid. + [[ ${1} =~ ^[0-9a-fA-F]{6}$ ]] +} + +color_hex2rgb() { + #Converts a color hex into rgb values. + local hex=${1} + + assert [ ${#hex} -eq 6 ] + + for (( i = 0; i < 6; i += 2 )); do + hex2dec ${hex:${i}:2} + done | tr '\n' ' ' + + print # newline +} + +_find_nearest_rgb_value() { + # For the calculation of the xterm value the rgb values must be: + # 0; 95; 135; 175; 215; 255; + # this function find the closest value of these 6 numbers for a give rgb number + local rgb=${1} + + local best_value + local best_value_index + + local values=( 0 95 135 175 215 255 ) + local result + local i=0 + + local value + for value in ${values[@]}; do + result=$(( ${value} - ${rgb} )) + result=$(abs ${result}) + + if [ -z ${best_value} ]; then + best_value=${result} + best_value_index=${i} + + # In the first iteration best_value is empty and so set to ${result} + # two lines above. So if statement must use -le because in the first iteration + # is the best_value eqal to result + elif [ ${result} -le ${best_value} ]; then + best_value=${result} + best_value_index=${i} + fi + + (( i++ )) + done + + echo "${best_value_index}" +} + +color_rgb2shell() { + #Converts a rgb value triple into an xterm color code. + assert [ $# -eq 3 ] + + local red=${1} + local green=${2} + local blue=${3} + + local color + for color in red green blue; do + printf -v "${color}" $(_find_nearest_rgb_value ${!color}) + done + + print $(( 16 + 36 * ${red} + 6 * ${green} + ${blue} )) +} + +color_set_shell() { + #Set the shell color which unfourtunately does not work for putty. + local where=${1} + local color=${2} + + local prefix + case "${where}" in + fg) + prefix="\e[38" + ;; + bg) + prefix="\e[48" + ;; + esac + + # Convert color from hex to RGB + local red green blue + read red green blue <<< $(color_hex2rgb ${color}) + + # Set standard shell color + local shell_color=$(color_rgb2shell ${red} ${green} ${blue}) + printf "${prefix};5;${shell_color}m" + + # For shells that support it, we will try to set the RGB color code + case "${TERM}" in + putty*) + # PuTTY is a piece of garbage and does not know + # how to handle colors at all although it has nice + # checkboxes to enable them, but they actually make + # things even worse. So no colors for you Windows + # users. + ;; + *) + printf "${prefix};2;${red};${green};${blue}m" + ;; + esac +} diff --git a/src/functions/functions.ports b/src/functions/functions.ports index c6e45d0..94fc68b 100644 --- a/src/functions/functions.ports +++ b/src/functions/functions.ports @@ -422,3 +422,11 @@ ports_lowest_address() { port_identify() { device_identify $@ } + +port_get_color() { + # This function return the color of a port + assert [ $# -eq 1 ] + + local name=${1} + echo $(color_read "port" ${name}) +} diff --git a/src/functions/functions.zone b/src/functions/functions.zone index 88c81a8..68d4ab6 100644 --- a/src/functions/functions.zone +++ b/src/functions/functions.zone @@ -1200,3 +1200,11 @@ zone_port_settings_remove() { local path="$(zone_dir "${zone}")/ports/${port}" settings_remove "${path}" } + +zone_get_color() { + # This function return the color of a zone + assert [ $# -eq 1 ] + + local name=${1} + echo $(color_read "zone" ${name}) +}
Hi,
there is a problem with the color_cli() function:
On Thu, 2017-06-15 at 18:18 +0200, Jonatan Schlag wrote:
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org
src/functions/functions.colors | 192 +++++++++++++++++++++++++++++++++++++++++ src/functions/functions.ports | 8 ++ src/functions/functions.zone | 8 ++ 3 files changed, 208 insertions(+)
diff --git a/src/functions/functions.colors b/src/functions/functions.colors index 8d7193c..433ce78 100644 --- a/src/functions/functions.colors +++ b/src/functions/functions.colors @@ -73,3 +73,195 @@ MSG_STP_DISCARDING="${CLR_RED_BG}${CLR_WHITE_B} DISCARDING ${CLR_RESET}" MSG_STP_LEARNING="${CLR_YELLOW_BG}${CLR_WHITE_B} LEARNING ${CLR_RESET}" MSG_STP_LISTENING="${CLR_YELLOW_BG}${CLR_WHITE_B} LISTENING ${CLR_RESET}" MSG_STP_BLOCKING="${CLR_RED_BG}${CLR_WHITE_B} BLOCKING ${CLR_RESET}"
+color_cli() {
- #Is the cli function to parse the options submitted by a user.
- local type=${1}
- local name=${2}
- local action=${3}
- shift 3
Here you shift the arguments...
- case ${action} in
set)
local color=${4}
And here you access the fourth one which has been shifted to ${1} by calling shift 3 earlier.
So either drop the shift (preferred), or change the argument to ${1} here.
# Check if we get to many arguments
shift 1
This is shift is also unnecessary. You could just check for > 1 below.
if [ $# -gt 0 ]; then
error "Too many arguments: $@"
return ${EXIT_ERROR}
fi
color_set ${type} ${name} ${@}
;;
reset)
# We set the color to white.
# Check if we get to many arguments
shift
if [ $# -gt 0 ]; then
Same as above.
error "Too many arguments: $@"
return ${EXIT_ERROR}
fi
color_set ${type} ${name} "ffffff"
;;
*)
error "Invalid argument: ${action}"
;;
- esac
+}
+color_set() {
- #Write a given color into the color config file of a zone or port.
- assert [ $# -eq 3 ]
- local type=${1}
- local name=${2}
- local COLOR=${3}
- # Check if we get to many arguments
- # Check if the color code is valid
- if ! color_hex_is_valid ${COLOR}; then
error "Hexadecimal color code '${COLOR}' is not valid"
return ${EXIT_ERROR}
- fi
- local file=$(color_format_filename ${type} ${name})
- settings_write ${file} COLOR
+}
+color_read() {
- #Read a color out of color config file of a zone or port.
- #If this is unsuccessful we use white.
- local type=${1}
- local name=${2}
- local file=$(color_format_filename ${type} ${name})
- local COLOR
- if ! settings_read ${file} COLOR; then
COLOR="ffffff"
- fi
- print "${COLOR}"
+}
+color_format_filename() {
- #Formats the color config file name.
- local type=${1}
- local name=${2}
- case ${type} in
zone)
echo "$(zone_dir ${name})/color"
;;
port)
echo "$(port_dir ${name})/color"
;;
- esac
+}
+color_hex_is_valid() {
- #Check if a color hex is valid.
- [[ ${1} =~ ^[0-9a-fA-F]{6}$ ]]
+}
+color_hex2rgb() {
- #Converts a color hex into rgb values.
- local hex=${1}
- assert [ ${#hex} -eq 6 ]
- for (( i = 0; i < 6; i += 2 )); do
hex2dec ${hex:${i}:2}
- done | tr '\n' ' '
- print # newline
+}
+_find_nearest_rgb_value() {
- # For the calculation of the xterm value the rgb values must be:
- # 0; 95; 135; 175; 215; 255;
- # this function find the closest value of these 6 numbers for a give
rgb number
- local rgb=${1}
- local best_value
- local best_value_index
- local values=( 0 95 135 175 215 255 )
- local result
- local i=0
- local value
- for value in ${values[@]}; do
result=$(( ${value} - ${rgb} ))
result=$(abs ${result})
if [ -z ${best_value} ]; then
best_value=${result}
best_value_index=${i}
# In the first iteration best_value is empty and so set to
${result}
# two lines above. So if statement must use -le because in
the first iteration
# is the best_value eqal to result
elif [ ${result} -le ${best_value} ]; then
best_value=${result}
best_value_index=${i}
fi
(( i++ ))
- done
- echo "${best_value_index}"
+}
+color_rgb2shell() {
- #Converts a rgb value triple into an xterm color code.
- assert [ $# -eq 3 ]
- local red=${1}
- local green=${2}
- local blue=${3}
- local color
- for color in red green blue; do
printf -v "${color}" $(_find_nearest_rgb_value ${!color})
- done
- print $(( 16 + 36 * ${red} + 6 * ${green} + ${blue} ))
+}
+color_set_shell() {
- #Set the shell color which unfourtunately does not work for putty.
- local where=${1}
- local color=${2}
- local prefix
- case "${where}" in
fg)
prefix="\e[38"
;;
bg)
prefix="\e[48"
;;
- esac
- # Convert color from hex to RGB
- local red green blue
- read red green blue <<< $(color_hex2rgb ${color})
- # Set standard shell color
- local shell_color=$(color_rgb2shell ${red} ${green} ${blue})
- printf "${prefix};5;${shell_color}m"
- # For shells that support it, we will try to set the RGB color code
- case "${TERM}" in
putty*)
# PuTTY is a piece of garbage and does not know
# how to handle colors at all although it has nice
# checkboxes to enable them, but they actually make
# things even worse. So no colors for you Windows
# users.
;;
*)
printf "${prefix};2;${red};${green};${blue}m"
;;
- esac
+} diff --git a/src/functions/functions.ports b/src/functions/functions.ports index c6e45d0..94fc68b 100644 --- a/src/functions/functions.ports +++ b/src/functions/functions.ports @@ -422,3 +422,11 @@ ports_lowest_address() { port_identify() { device_identify $@ }
+port_get_color() {
- # This function return the color of a port
- assert [ $# -eq 1 ]
- local name=${1}
- echo $(color_read "port" ${name})
You could just call "color_read port ${name}" here without the echo and the $(...) since color_read already prints the result. This would save us calling a subshell and would also make port_get_color return the exit code of color_read.
+} diff --git a/src/functions/functions.zone b/src/functions/functions.zone index 88c81a8..68d4ab6 100644 --- a/src/functions/functions.zone +++ b/src/functions/functions.zone @@ -1200,3 +1200,11 @@ zone_port_settings_remove() { local path="$(zone_dir "${zone}")/ports/${port}" settings_remove "${path}" }
+zone_get_color() {
- # This function return the color of a zone
- assert [ $# -eq 1 ]
- local name=${1}
- echo $(color_read "zone" ${name})
+}
Likewise.
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org --- src/functions/functions.cli | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/src/functions/functions.cli b/src/functions/functions.cli index a4690b2..5efd923 100644 --- a/src/functions/functions.cli +++ b/src/functions/functions.cli @@ -112,6 +112,18 @@ cli_device_headline() { ;; esac cli_print_fmt1 1 "Status" "${status}" + + # Print the color of the device. + case "${type}" in + port) + cli_print_fmt1 1 "Color" "$(cli_color_bar $(port_get_color ${device}))" + ;; + + zone) + cli_print_fmt1 1 "Color" "$(cli_color_bar $(zone_get_color ${device}))" + ;; + esac + if enabled long; then cli_print_fmt1 1 "Address" "$(device_get_address ${device})" fi @@ -423,3 +435,33 @@ cli_show_man() {
man ${manpage} } + +cli_set_color() { + #Function to set the back and foreground color at once. + local fg=${1} + local bg=${2} + + local i + for i in fg bg; do + # Skip if color is empty + [ -n "${!i}" ] || continue + + # Skip for dash + [ "${!i}" = "-" ] && continue + + color_set_shell ${i} ${!i} + done +} + +cli_reset_color() { + #Reset the shell color. + printf "\e[0m" +} + +cli_color_bar() { + # This function return some colored space + assert [ $# -eq 1 ] + + local color=${1} + echo "$(cli_set_color - ${color}) ${CLR_RESET}" +}
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org --- src/network | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/src/network b/src/network index e0d57a0..ea7f7d6 100644 --- a/src/network +++ b/src/network @@ -518,6 +518,9 @@ cli_port() { edit|create|remove|up|down|status|identify) port_${action} "${port}" $@ ;; + color) + color_cli "port" "${port}" $@ + ;; *) error "Unrecognized argument: ${action}" exit ${EXIT_ERROR} @@ -576,6 +579,9 @@ cli_zone() { config|disable|down|edit|enable|identify|status|up) zone_${action} ${zone} $@ ;; + color) + color_cli "zone" "${zone}" $@ + ;; *) error "Unrecognized argument: ${action}" cli_show_man network-zone
Signed-off-by: Jonatan Schlag jonatan.schlag@ipfire.org --- src/bash-completion/network | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/src/bash-completion/network b/src/bash-completion/network index 4b5e34d..091c1cb 100644 --- a/src/bash-completion/network +++ b/src/bash-completion/network @@ -48,6 +48,17 @@ _network_complete_zones() { COMPREPLY=( $(compgen -W "$(network raw list-zones)" -- "${cur}") ) }
+_network_color() { + local words=( $@ ) + + local commands="set reset" + local cmd="$(_network_find_on_cmdline "${commands}")" + if [[ -z "${cmd}" ]]; then + COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") ) + return 0 + fi +} + _network_device() { local words=( $@ )
@@ -78,7 +89,7 @@ _network_device_subcommand() { COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") ) return 0 fi - + case "${cmd}" in ussd) # TODO @@ -247,12 +258,20 @@ _network_port() { _network_port_subcommand() { local words=( $@ )
- local commands="create down edit identify remove status up" + local commands="color create down edit identify remove status up" local cmd="$(_network_find_on_cmdline "${commands}")" if [[ -z "${cmd}" ]]; then COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") ) return 0 fi + + local args="${words[@]:1}" + case "${cmd}" in + color) + _network_color ${args} + ;; + esac + }
_network_route() { @@ -359,13 +378,13 @@ _network_zone_subcommand() {
local words=( $@ )
- local commands="config disable down edit enable identify port rename status up" + local commands="color config disable down edit enable identify port rename status up" local cmd="$(_network_find_on_cmdline "${commands}")" if [[ -z "${cmd}" ]]; then COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") ) return 0 fi - + local args="${words[@]:1}" case "${cmd}" in config) @@ -374,6 +393,9 @@ _network_zone_subcommand() { port) _network_zone_subcommand_port "${zone}" ${args} ;; + color) + _network_color ${args} + ;; esac }