#!/bin/bash utils="/home/spezi/Scripts/utils" . $utils/logger.sh . $utils/mad-instances.sh . $utils/math.sh location_an=""; for d in mini0{1..5} mini0{7..9} miniwue{01..15} ya01 ip01 ip02; do location_an="$location_an $d"; done location_rot=""; for d in rot{01..12} stack{1..2}{01..12} stack3{01..06}; do location_rot="$location_rot $d"; done #location_dacA=""; for d in dac01 dac02 dac{05..07}; do location_dacA="$location_dacA $d"; done #location_dacB=""; for d in dac03 dac04 dac{08..10}; do location_dacB="$location_dacB $d"; done location_dacA=""; for i in {01..10}; do location_dacA="$location_dacA dac$i"; done location_mer="mer01" location_mes="mes01 mes02 mes04" devicelocations=("an rot dacA mer") # mes") # moved to one location early 2023 # dacB DEVICES_TIMEOUT=5 getdeviceinstance () { grep "location /$1" $nginxconf -A5 | grep proxy_pass | cut -d / -f3 | sed s/rgc// | sed s/pd// | head -n1 } getdevicelocation () { for loc in $devicelocations; do locname="location_$loc" content=${!locname} # if [[ "$1" == *"$content"* ]]; then if [[ "$content" =~ $1 ]]; then echo $loc return 0 fi done echo "None" return 1 } getdeviceip () { device=$1 ip=$(cat $maddir/files/$1.ips | awk -F "," '{print $1}') echo $ip } get_working_device_from_location () { location=$1 locname="location_$location" arr=${!locname} for device in $arr; do res=$(cs_result $device passthrough true) if [[ "$res" == "OK" ]]; then echo $device break fi done } cs_send () { device=$1 csport=$(getcsport $(getdeviceinstance $device)) shift if cs_send_result=$(echo "{\"device\": \"$device\", \"command\": \"$@\"}" | timeout $DEVICES_TIMEOUT nc localhost $csport); then cs_send_result=$(echo $cs_send_result | jq -r .result 2>/dev/null) else cs_send_result="None" fi if [[ $cs_send_result == "None" ]] || [[ $cs_send_result == "null" ]]; then # logger "cs_send result from command <$@> is: $cs_send_result!" echo 1 return 1 fi } cs_result () { device=$1 csport=$(getcsport $(getdeviceinstance $device)) shift if result=$(echo "{\"device\": \"$device\", \"command\": \"$@\"}" | timeout $DEVICES_TIMEOUT nc localhost $csport); then result=$(echo $result | jq -r .result 2>/dev/null) else result="None" fi if [[ $result == "None" ]] || [[ $result == "null" ]]; then # logger "cs_result result from command <$@> is: $result!" echo 1 return 1 fi echo $result } ptcstatus () { cs_result $1 "passthrough curl -s -k -I https://sso.pokemon.com/sso/login -o /dev/null -w '%{http_code}'" | sed "s/\[//" | sed "s/\]//" } deviceip () { cs_result $1 "passthrough curl -k -s https://ifconfig.me" | sed "s/\[//" | sed "s/\]//" } desktop_not_online () { device=$(get_working_device_from_location an) if [[ -z "$device" ]]; then # no device found return 1 fi unreachable=$(cs_result $device "passthrough ping -c1 192.168.1.21 | grep -c Unreachable" | sed "s/\[//" | sed "s/\]//") if [[ "$unreachable" -eq 0 ]]; then return 1 else return 0 fi } reconnect_rot () { # fuck this escaping nightmare ... device=$(get_working_device_from_location rot) if [[ -z "$device" ]]; then echo "no device found" return 1 fi xml="" cmd='curl \"http://192.168.178.1:49000/igdupnp/control/WANIPConn1\" -H \"Content-Type: text/xml; charset=\"\"utf-8\"\"\" -H \"SoapAction: \"\"urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination\"\"\"' cmd+=' -d \"' cmd+=$xml cmd+='\"' echo "cmd to $device: $cmd" cs_result $device "passthrough $cmd" } reconnect_an () { if ! [[ "$1" == "force" ]] && ! desktop_not_online; then # do not reconnect if my desktop is online :-) do not fuck up my home office ... echo "nope! desktop is online" return 1 fi device=$(get_working_device_from_location an) if [[ -z "$device" ]]; then echo "no device found" return 1 fi # fuck this escaping nightmare ... xml="" cmd='curl \"http://192.168.1.1:49000/igdupnp/control/WANIPConn1\" -H \"Content-Type: text/xml; charset=\"\"utf-8\"\"\" -H \"SoapAction: \"\"urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination\"\"\"' cmd+=' -d \"' cmd+=$xml cmd+='\"' echo "cmd to $device: $cmd" cs_result $device "passthrough $cmd" } reboot_rot () { # another escaping nightmare # https://knx-user-forum.de/forum/öffentlicher-bereich/knx-eib-forum/1498696-fritzbox-reboot-mit-curl?p=1498729#post1498729 # auth needed ! not working as-is xml="" cmd='curl \"http://192.168.178.1:49000/upnp/control/deviceconfig\" -H \"Content-Type: text/xml; charset=\"utf-8\"\" -H \"SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot\"' cmd+=' -d \"' cmd+=$xml cmd+='\"' echo "cmd to $1: $cmd" cs_result $1 "passthrough $cmd" } devicetemp () { res=$(cs_result $1 'passthrough cat /sys/class/thermal/thermal_zone0/temp' | sed "s/\[//" | sed "s/\]//") if ! [ -z "$res" ] && [ "$res" -eq "$res" ] 2>/dev/null && [ "$res" -ne 1 ]; then res=$(echo $res | sed "s/\[//" | sed "s/\]//") res=$(divide $res 1000) echo "$1: $res °C" else echo "$1: ?" fi } ptccheck () { if [[ $1 == "debug" ]]; then debuglog="echo DEBUG: $@" else debuglog=":" fi for loc in ${devicelocations[@]}; do $debuglog "check $loc" ip="" locname="location_$loc" arr=(${!locname}) for device in ${arr[@]}; do $debuglog "try $device" if [ -z "$ip" ]; then ip=$(deviceip $device) fi result=$(ptcstatus $device) if [[ "$result" == 1 ]] || [ -z "$ip" ] || [ -z "$result" ]; then continue elif [[ "$result" == "200" ]]; then echo "$loc @ $ip: 200" break elif [[ "$result" == "403" ]]; then echo "$loc @ $ip: 403" break fi echo "$loc @ $ip: $result" done done } tempcheck () { for loc in ${devicelocations[@]}; do locname="location_$loc" arr=(${!locname}) for device in ${arr[@]}; do devicetemp $device done done } cs_result_all () { for loc in ${devicelocations[@]}; do locname="location_$loc" arr=(${!locname}) for device in ${arr[@]}; do res=$(cs_result $device "$@") echo $res done done } tunnel_to_device () { device=$1 ip=$(getdeviceip $device) loc=$(getdevicelocation $device) working=$(get_working_device_from_location $loc) if ! [[ -z "$working" ]]; then tunnel="passthrough pkill shh; curl -s -k -L https://pogoan.de/dropbearmulti -o /data/local/tmp/dropbearmulti; curl -s -k -L https://pogoan.de/bearbox -o /data/local/tmp/bearbox; chmod 600 /data/local/tmp/bearbox; chmod +x /data/local/tmp/dropbearmulti; ln -s /data/local/tmp/dropbearmulti /data/local/tmp/ssh; /data/local/tmp/ssh -f -N -T -R 12345:$ip:5555 madbox@45.132.245.143 -p 2311 -i /data/local/tmp/bearbox -y" res=$(cs_result $working "$tunnel") echo "$working:$device" else return 1 fi } tunnel_on_device () { device=$1 tunnel="passthrough pkill shh; curl -s -k -L https://pogoan.de/dropbearmulti -o /data/local/tmp/dropbearmulti; curl -s -k -L https://pogoan.de/bearbox -o /data/local/tmp/bearbox; chmod 600 /data/local/tmp/bearbox; chmod +x /data/local/tmp/dropbearmulti; ln -s /data/local/tmp/dropbearmulti /data/local/tmp/ssh; /data/local/tmp/ssh -f -N -T -R 12345:127.0.0.1:5555 madbox@45.132.245.143 -p 2311 -i /data/local/tmp/bearbox -y" res=$(cs_result $device "$tunnel") echo $res } ping_device () { device=$1 ip=$(getdeviceip $device) loc=$(getdevicelocation $device) working=$(get_working_device_from_location $loc) if ! [[ -z "$working" ]]; then echo "use $working to ping $device@$ip at $loc" res=$(cs_result $working passthrough ping -c1 $ip) echo $res else return 1 fi } kill_tunnel () { device=$1 res=$(cs_result $device "passthrough pkill ssh") echo $res }