summary refs log tree commit diff
path: root/bin/hspl
blob: aca5516de5b131823cd5670b4435a677b907b8f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/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 '</' | 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

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

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

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