#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2010 Michael Tremer & Christian Schmidt # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### # Regular colours CLR_BLACK_R='\e[0;30m' CLR_RED_R='\e[0;31m' CLR_GREEN_R='\e[0;32m' CLR_YELLOW_R='\e[0;33m' CLR_BLUE_R='\e[0;34m' CLR_PURPLE_R='\e[0;35m' CLR_CYAN_R='\e[0;36m' CLR_WHITE_R='\e[0;37m' # Bold colours CLR_BLACK_B='\e[1;30m' CLR_RED_B='\e[1;31m' CLR_GREEN_B='\e[1;32m' CLR_YELLOW_B='\e[1;33m' CLR_BLUE_B='\e[1;34m' CLR_PURPLE_B='\e[1;35m' CLR_CYAN_B='\e[1;36m' CLR_WHITE_B='\e[1;37m' # Background colors CLR_BLACK_BG='\e[40m' CLR_RED_BG='\e[41m' CLR_GREEN_BG='\e[42m' CLR_YELLOW_BG='\e[43m' CLR_BLUE_BG='\e[44m' CLR_PURPLE_BG='\e[45m' CLR_CYAN_BG='\e[46m' CLR_WHITE_BG='\e[47m' # Font decoration FONT_RESET="\e[0m" FONT_BOLD="\e[1m" FONT_UNDERLINED="\e[4m" FONT_BLINKING="\e[5m" FONT_INVERTED="\e[7m" # Reset everything CLR_RESET="${FONT_RESET}" # Predefined messages MSG_HOOK_UP="${CLR_GREEN_BG}${CLR_WHITE_B} UP ${CLR_RESET}" MSG_HOOK_DOWN="${CLR_RED_BG}${CLR_WHITE_B} DOWN ${CLR_RESET}" MSG_DEVICE_STATUS_UNKNOWN="${CLR_GREY_BG}${CLR_BLACK_B} UNKNOWN ${CLR_RESET}" MSG_DEVICE_STATUS_UP="${CLR_GREEN_BG}${CLR_WHITE_B} UP ${CLR_RESET}" MSG_DEVICE_STATUS_DOWN="${CLR_RED_BG}${CLR_WHITE_B} DOWN ${CLR_RESET}" MSG_DEVICE_STATUS_NOCARRIER="${CLR_YELLOW_BG}${CLR_WHITE_B} NO-CARRIER ${CLR_RESET}" MSG_STP_FORWARDING="${CLR_GREEN_BG}${CLR_WHITE_B} FORWARDING ${CLR_RESET}" 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} case ${action} in set) local color=${4} # Check if we get to many arguments if [ $# -gt 4 ]; then # We want to print only the 5th and greater argument shift 4 error "Too many arguments: $@" return ${EXIT_ERROR} fi color_set ${type} ${name} ${color} ;; reset) # We set the color to white. # Check if we get to many arguments shift if [ $# -gt 3 ]; then # We want to print only the 4th and greater argument shift 3 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 ipsec-connection) echo "${NETWORK_IPSEC_CONNS_DIR}/${name}/color" ;; zone) echo "${NETWORK_ZONES_DIR}/${name}/color" ;; port) echo "${NETWORK_PORTS_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 }