diff --git a/install_iptables.sh b/install_iptables.sh new file mode 100644 index 0000000..f3f851b --- /dev/null +++ b/install_iptables.sh @@ -0,0 +1,148 @@ +#!/bin/bash + +# Installation script for iptables redirect + +RED_COLOR='\033[0;31m' +GREEN_COLOR='\033[0;32m' +GREEN_YELLOW='\033[1;33m' +NO_COLOR='\033[0m' + +ST_PORT=80 + +LINK="" + +P_HA=true +P_ST=true + +declare -a HA_PATHS=( + "$PWD" + "$PWD/config" + "/config" + "/homeassistant" + "$HOME/.homeassistant" + "/usr/share/hassio/homeassistant" +) + +function info() { echo -e $2 "${GREEN_COLOR}$1${NO_COLOR}"; } +function warn() { echo -e $2 "${GREEN_YELLOW}$1${NO_COLOR}"; } +function error() { + echo -e "${RED_COLOR}$1${NO_COLOR}" + if [ "$2" != "false" ]; then exit 1; fi +} + +function check() { + echo -n "Checking dependencies: '$1' ... " + if [ -z "$(command -v "$1")" ]; then + error "not installed" $2 + false + else + info "OK." + true + fi +} + +function validate_ip() { + + if [[ "$1" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then + true + else + false + fi +} + +function validate_num() { + if [[ "$1" =~ ^[0-9]+$ ]]; then true; else false; fi +} + +function validate_dest() { + echo "Validating host '$1' ... " + if ping -c 4; then + info "OK" + true + else + error "cannot reach" false + false + fi +} + +function cont() { + + while true; do + warn "$1" + warn "Do you want to continue? [y/N]: " -n + read -n 1 YN + YN=${YN:-N} + case $YN in + [Yy]) return 0 ;; + [Nn]) error "\nExiting." ;; + *) error "\nInvalid response.\n" false ;; + esac + done +} + +echo +echo "**************************************************************" +echo "* *" +echo -e "* ${GREEN_YELLOW}Installation for iptables_redirect.sh ${NO_COLOR} *" +echo "* *" +echo "**************************************************************" +echo + +check "wget" +check "sed" +check "ping" false && { PING=true; } || { PING=false; } + +echo -n "Trying to find Home Assitant ... " +for PATH in "${HA_PATHS[@]}"; do + if [ -n "$HA_PATH" ]; then + break + fi + + if [ -f "$PATH/.HA_VERSION" ]; then + HA_PATH="$PATH" + fi +done + +#[ -z $HA_PATH ] && { error "Home Assistant not found!"; } +info "found at $HA_PATH" + +while true; do + read -r -p "Your station's IP: " ST_IP + if validate_ip $ST_IP; then break; fi + warn "Provide valid IP address." +done + +while true; do + read -r -p "Home Assistant's IP: " HA_IP + if validate_ip $HA_IP; then break; fi + warn "Provide valid IP address." +done + +while true; do + read -r -p "Home Assistant's port [8123]: " HA_PORT + HA_PORT=${HA_PORT:-8123} + if validate_num $HA_PORT && ((HA_PORT >= 1 && HA_PORT <= 65535)); then + break + fi + warn "Provide valid port number." +done + +if $PING; then + validate_dest $HA_IP || { cont "Home Assistant host is unreachable."; P_HA=false; } + validate_dest $ST_IP || { cont "Station is unreachable."; P_ST=false; } +fi + +info "\nYour configuration:" +info " Home Assistant at: $HA_PATH" +info " Home Assistant server at: $HA_IP:$HA_PORT" -n +if $PING; then + if $P_HA; then info " (ping OK)"; else error " (unreachable)" false; fi +else + error " (not tested)" false +fi +info " Station at: ${ST_IP}:$ST_PORT" -n +if $PING; then + if $P_ST; then info " (ping OK)"; else error " (unreachable)" false; fi +else + error " (not tested)" false +fi diff --git a/iptables_redirect.sh b/iptables_redirect.sh new file mode 100755 index 0000000..3ad002d --- /dev/null +++ b/iptables_redirect.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +# Script for frowarding SWS 12500 station's destination port 80 +# to your Home Assistant's instance port (8123) +# +# Workaround for station's firmware 1.0 bug +# +# +# Script pro přesměrování portu pro stanici SWS12500 + + +STATION_IP=[_STATION_IP_] +HA=[_HA_] +SRC_PORT=[_SRC_PORT_] +DST_PORT=[_DST_PORT_] + +INSTALL_IPTABLES=0 +APK_MISSING=0 + +RED_COLOR='\033[0;31m' +GREEN_COLOR='\033[0;32m' +GREEN_YELLOW='\033[1;33m' +NO_COLOR='\033[0m' + + +function info () { echo -e "${GREEN_COLOR}INFO: $1${NO_COLOR}";} +function warn () { echo -e "${GREEN_YELLOW}WARN: $1${NO_COLOR}";} +function error () { echo -e "${RED_COLOR}ERROR: $1${NO_COLOR}"; if [ "$2" != "false" ]; then exit 1;fi; } + +function check () { + echo -n "Checking dependencies: '$1' ... " + if [ -z "$(command -v "$1")" ]; then + error "not installed" $2 + return 1 + fi + info "OK." + return 0 +} + + +echo +echo "**************************************************************" +echo "* *" +echo -e "* ${GREEN_YELLOW}Running iptables forward for port $SRC_PORT -> $DST_PORT ${NO_COLOR} *" +echo "* *" +echo "**************************************************************" +echo + +# Check for dependencies + +check "iptables" false +INSTALL_IPTABLES=$? + +check "apk" false +APK_MISSING=$? + + +if [ $APK_MISSING -eq 1 ] && [ $INSTALL_IPTABLES -eq 1 ]; then + error "Could not install and run iptables.\n'apk' installer is missing and 'iptables' are not installed.\n" +fi + +if [ $INSTALL_IPTABLES -eq 1 ] && [ $APK_MISSING -eq 0 ]; then + declare -a RUNINSTALL=(apk add iptables) + echo -n "Installing 'iptables' ... ${RUNINSTALL[@]} ... " + ${RUNINSTALL[@]} + EXIT_STATUS=$? + if [ $EXIT_STATUS -ne 0 ]; then + warn "apk error code: $EXIT_STATUS" + error "Installation of iptables failed!" + else + info "'iptables' installed successfully." + fi +fi +declare -a RULE=(PREROUTING -t nat -s $STATION_IP -d $HA -p tcp -m tcp --dport $SRC_PORT -j REDIRECT --to-ports $DST_PORT) +echo -n "Chceking for existing rule in iptables ... " +$(iptables -C ${RULE[@]} 2>/dev/null) +if [ $? -eq 0 ]; then + warn "Rule is already present in PREROUTING chain." +else + echo -n "Inserting iptables rule to PREROUTING chain ... " + $(iptables -I ${RULE[@]}) +fi +EXIT_STATUS=$? +if [ $EXIT_STATUS -ne 0 ]; then + warn "iptables error code: ${EXIT_STATUS} " + error "Rule could not be added!" +fi + +info "iptables are set to forward port $SRC_PORT -> $DST_PORT for station's IP: $STATION_IP" \ No newline at end of file