#!/bin/bash set -e [ -n "$DEBUG" ] && set -x print_gateway_uri= print_time_diff= print_json= if=wlan0 debug= while getopts djuhDI: opt; do case "$opt" in d) print_time_diff=1 ;; j) print_json=1 ;; u) print_gateway_uri=1 ;; I) if=$OPTARG ;; D) debug=1 ;; h | ?) printf "usage: hspl [options]\n" printf "\n" printf "supported hotspot vendors:\n" printf " hotsplots.de (e.g. Espresso House / public libraries)\n" printf " pbspot (e.g. CoffeeFellows)\n" printf "\n" printf "options:\n" printf " -d print time until expiry in seconds\n" printf " -j output json\n" printf " -u print gateway address\n" printf " -I use a specific interface (default: %s)\n" "$if" printf " -D emit the html for debugging\n" printf "\n" exit 2 ;; esac done shift $((OPTIND - 1)) gateway=$(ip route show dev "$if" | awk '/default via/{print $3; exit}') if [ -n "$print_gateway_uri" ]; then echo "$gateway" exit 0 fi html=$(curl -Ls --interface "$if" "$gateway") t= tx= rx= logged_in=0 vendor=unknown name=unknown if [ -n "$debug" ]; then echo "$html" exit 1 fi # hotspot vendor implementations go here: if grep -q pbspot <<<"$html"; then vendor=pbspot # TODO: logged_in=$(grep -qi 'eingeloggt seit' && echo 1) t=$(grep -i 'expires' <<<"$html" | awk -F 'td>' '{print $4}' | tr -d '' '{print $4}' | tr -d '' '{print $4}' | tr -d ',\/tr>\n,g' <<<"$html") logged_in=$(grep -qi 'eingeloggt seit' <<<"$html" && echo 1 || echo 0) t=$(grep -i 'verbleibende zeit' <<<"$html" | awk -F 'td>' '{print $3}' | tr -d '' '{print $3}' | tr -d '' '{print $2}' | tr -d '&2 echo "open" "$gateway" "and complete hotspot sign in process" >&2 echo "" >&2 exit 1 fi if [ -z "$t" ]; then echo "no hotspot or unimplemented vendor" >&2 exit 1 fi if [ "$t" != "unlimited" ]; then expiry_time=$(date --date "now + $t" +%s) remaining=$(((expiry_time - $(date +%s)))) if [ -n "$print_time_diff" ]; then echo "$remaining" exit 0 fi # format remaining time like: 5h30m or 10s remaining=$(awk '{ s=$0 h=(s/60/60); if(h>1){ printf "%dh", h } m=(s/60%60) if(m>1){ printf "%dm", m } if(h<1 && m<1){ printf "%ds", $0 } }' <<<"$remaining") else remaining=$t fi if [ -n "$print_json" ]; then jq -n --args '{ remaining:$ARGS.positional[0], tx:$ARGS.positional[1], rx:$ARGS.positional[2], t:$ARGS.positional[3], vendor:$ARGS.positional[4], name:$ARGS.positional[5] }' "$remaining" "$tx" "$rx" "$t" "$vendor" "$name" else echo "$remaining" echo "TX:" "$tx" echo "RX:" "$rx" echo "[" "$name" "]" fi