summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/hspl81
1 files changed, 55 insertions, 26 deletions
diff --git a/bin/hspl b/bin/hspl
index 3059400..aca5516 100755
--- a/bin/hspl
+++ b/bin/hspl
@@ -6,22 +6,28 @@ set -e
 print_gateway_uri=
 print_time_diff=
 print_json=
-while getopts djuh opt; do
+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 (Espresso House Berlin)\n"
-		printf "    pbspot (CoffeeFellows Berlin)\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
 		;;
@@ -29,9 +35,7 @@ while getopts djuh opt; do
 done
 shift $((OPTIND - 1))
 
-if=wlan0
-
-gateway=$(ip route show dev "$if" | awk '/default via/{print $3}')
+gateway=$(ip route show dev "$if" | awk '/default via/{print $3; exit}')
 
 if [ -n "$print_gateway_uri" ]; then
 	echo "$gateway"
@@ -43,13 +47,22 @@ html=$(curl -Ls --interface "$if" "$gateway")
 t=
 tx=
 rx=
-vendor=
+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 '</' | tr -d ':' | sed -e 's,s, seconds,' -e 's,m, minutes,')
+	t=${t:-unlimited}
 	tx=$(grep -i 'transmitted' <<<"$html" | awk -F 'td>' '{print $4}' | tr -d '</')
 	rx=$(grep -i 'received' <<<"$html" | awk -F 'td>' '{print $4}' | tr -d '</')
 fi
@@ -57,35 +70,49 @@ fi
 if grep -q hotsplots <<<"$html"; then
 	vendor=hotsplots
 	html=$(sed 's,\/tr>,\/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 '</' | sed -e 's,&nbsp,,' -e 's,h, hours,' -e 's,min, minutes,' -e 's,sec, seconds,')
+	t=${t:-unlimited}
 	tx=$(grep -i 'übertragene daten' <<<"$html" | awk -F 'td>' '{print $3}' | tr -d '</' | sed -e 's,&nbsp,,' -e 's, (.*),,')
 	rx="-"
+	name=$(grep -i 'loginHead' <<<"$html" | awk -F 'h2>' '{print $2}' | tr -d '</')
 fi
 
 # end of hotspot vendor implementations
 
-# no hotspot or unimplemented vendor
-if [ -z "$t" ]; then
+if [ "$logged_in" -eq 0 ]; then
+	echo "not logged in" >&2
+	echo "open" "$gateway" "and complete hotspot sign in process" >&2
+	echo "" >&2
 	exit 1
 fi
 
-expiry_time=$(date --date "now + $t" +%s)
-remaining=$(((expiry_time - $(date +%s))))
-
-if [ -n "$print_time_diff" ]; then
-	echo "$remaining"
-	exit 0
+if [ -z "$t" ]; then
+	echo "no hotspot or unimplemented vendor" >&2
+	exit 1
 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")
+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 '{
@@ -93,10 +120,12 @@ if [ -n "$print_json" ]; then
 		tx:$ARGS.positional[1],
 		rx:$ARGS.positional[2],
 		t:$ARGS.positional[3],
-		vendor:$ARGS.positional[4]
-	}' "$remaining" "$tx" "$rx" "$t" "$vendor"
+		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