addrutil: Re-indent.
[wk-misc.git] / sks-stats.sh
1 #!/bin/sh
2 #
3
4 # Example driver:
5 ##!/bin/sh
6 #
7 #hostsfile="$HOME/bin/hosts.sks"
8 #outfile="/var/www/217.69.76.60/keystats.gnupg.net/htdocs/index.html"
9 #failedfile="/var/www/217.69.76.60/keystats.gnupg.net/htdocs/failed-hosts"
10 #
11 #rm "$failedfile.now" 2>/dev/null || true
12 #$HOME/bin/sks-stats.sh --failed "$failedfile" --hosts "$hostsfile" >"$outfile".tmp 2>/dev/null
13 #mv "$outfile".tmp "$outfile"
14 #if [ -f "$failedfile.now" ]; then
15 #   rm "$failedfile.now" 2>/dev/null
16 #   ( echo "List of failed hosts:"
17 #     cat  "$failedfile" ) |  mail -s "keys.gnupg.net status change detected" keystats-gnupg-net@gnupg.org
18 #fi
19 #
20
21
22 function get_stats () {
23    local host
24    local port
25
26    hostip="$1"    
27    host=""
28    port="$2"
29
30    if [ -n "$hostsfile" -a -f "$hostsfile" ]; then
31       host=$(grep "^$hostip" "$hostsfile" | awk '{print $2; exit}')
32    fi
33    if [ -z "$host" ]; then
34       host="$hostip"
35    fi
36    echo "retrieving $host:$port using $hostip" >&2
37
38   echo "Server $hostip $port"
39   # Note that versions of wget < 1.10 can't override 'Host:'.
40   (wget -qO - -T 30 -t 3 --no-cache --header "Host: $host:$port" \
41      "http://$hostip:$port/pks/lookup?op=stats" || echo) |\
42     awk -v failed="${failed_hosts_file}" -v hostip="$hostip" -v hostn="$host" '
43 /<\/table>/           {in_settings = 0; in_peers = 0; in_daily = 0}
44 /<h2>Settings<\/h2>/  {in_settings = 1 }
45 /<h2>Gossip Peers<\/h2>/ {in_peers = 1 }
46 /<h2>Statistics<\/h2>/   {in_stats = 1 }
47
48 in_settings && /<td>Hostname:/ {split($0, a, /:<td>/); host=a[2] }
49 in_settings && /<td>Version:/ {split($0, a, /:<td>/);  version=a[2] }
50
51 in_peers && /<td>/ {split($0, a , /[ \t\n]+|<td>/);
52                     peers[in_peers]=a[2]; in_peers++;  }
53
54 !in_stats  {next}
55
56 /<h3>Daily Histogram<\/h3>/   {in_daily = 1 }
57
58 !nkeys && /<p>Total number of keys:/ { split($0, a, /Total number of keys:/);
59                                        split(a[2], aa, /</); nkeys = aa[1]; }
60
61 in_daily && /<tr><td>2/ { split($0, a, /<td>/); daily[a[2]] = a[3] " " a[4]; }
62
63 END {
64   if ( host ) {
65     print "Host " host
66     print "Version " version
67     print "Total  " nkeys
68     for ( i in peers ) print "Peer " peers[i];
69     for ( i in daily ) { print "Daily " i " " daily[i]  }
70   } else {
71     print hostip "  " hostn  >> failed
72   }
73 }
74 '
75 echo "Timestamp $(date -u '+%F %T')"
76 }
77
78
79 function print_header2 () {
80 echo "$1"
81 echo '<table cellpadding=5 cellspacing=1 border=1 >
82 <thead>
83 <tr>
84   <td>Host</td>
85   <td>Total keys</td>
86   <td>Version</td>
87   <td>IP:Port</td>
88   <td>Last check (UTC)</td>
89 </tr>
90 </thead>
91 <tbody>'
92 }
93
94 function print_header () {
95 echo '<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
96 <html>
97 <head>
98 <title>Keyserver statistics for gnupg.net</title>
99 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
100 </head>
101 <body>
102 <h1>Keyserver statistics for gnupg.net</h1>
103 <p>
104 This table shows statistics for the keyservers in the
105 keys.gnupg.net and http-keys.gnupg.net pools.
106 </p>
107
108 '
109 }
110
111
112 function print_footer2 () {
113 echo '</tbody>
114 </table>'
115 }
116
117
118 function print_footer () {
119 print_footer2
120
121 echo '<br><br><br><br><br><hr>
122 <div align="left"><font size="-1">
123 Notifications on status changes are automatically posted to the
124 <a href="http://lists.gnupg.org/mailman/listinfo/keystats-gnupg-net"
125 >keystats-gnupg-net</a> mailing list.  You are welcome to subscribe
126 to this announce-only list.
127 </font></div>
128 </body>
129 </html>'
130 }
131
132
133 function make_row () {
134     awk -v scheme=$1 '
135 $1 == "Server" { server = $2; port = $3}
136 $1 == "Host" { host = $2 }
137 $1 == "Total" { nkeys = $2 }
138 $1 == "Version" { version = $2 }
139 $1 == "Timestamp" { timestamp = $2 " " $3 }
140
141 END { if (host) {
142         href = "<a href=\"http://" host ":" port "/pks/lookup?op=stats\">"
143         tmp = "<tr><td>" href scheme "://" host "</a></td>" \
144               "<td align=\"right\">" nkeys \
145               "</td><td>" version "</td>" ;
146       } else {
147         tmp = "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>" ;
148       }
149       print tmp "<td>" server ":" port "</td><td>" timestamp "</td></tr>" 
150
151 '
152 }
153
154
155
156
157 host=""
158 failed_hosts=no
159 if [ "$1" == "--failed" ]; then
160     failed_hosts=yes
161     failed_hosts_file_orig="$2"
162     if [ -z "$failed_hosts_file_orig" ]; then
163         echo "usage: sks-stats.sh --failed FILENAME" >&2
164         exit 1
165     fi
166     shift
167     shift
168     failed_hosts_file="${failed_hosts_file_orig}.tmp"
169     : >> "${failed_hosts_file_orig}"
170     : > "${failed_hosts_file}"
171 else
172     failed_hosts_file="/dev/null"
173 fi
174 if [ "$1" == "--hosts" ]; then
175     hostsfile="$2"
176     shift
177     shift
178 else
179     hostsfile=""
180 fi
181 [ -n "$1" ] && host="$1"
182
183
184 if [ -z "$host" ]; then
185    print_header 
186    print_header2 "<h2>keys.gnupg.net</h2>"
187    (
188        host keys.gnupg.net | awk '/has address/ { print $4 }' \
189            | while read host; do
190            get_stats $host 11371 | make_row "hkp" 
191        done
192    ) | sort
193    print_footer2
194    print_header2 "<h2>http-keys.gnupg.net</h2>"
195    (
196        host http-keys.gnupg.net | awk '/has address/ { print $4 }' \
197            | while read host; do
198            get_stats $host 80 | make_row "http" 
199        done
200    ) | sort
201 else
202   print_header
203   get_stats $host 11371 | make_row "hkp"
204 fi
205 print_footer
206 if [ $failed_hosts = "yes" ]; then
207     if cmp "${failed_hosts_file_orig}" "${failed_hosts_file}" >/dev/null ; then
208         rm "${failed_hosts_file}"
209     else
210         echo "changes in failed hosts detected" >&2
211         mv "${failed_hosts_file}" "${failed_hosts_file_orig}"
212         : > "${failed_hosts_file_orig}.now"
213     fi
214 fi