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, ,,' -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, ,,' -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
|