diff options
Diffstat (limited to 'devel/portmk/scripts/ranksites-geoip.pl')
-rw-r--r-- | devel/portmk/scripts/ranksites-geoip.pl | 390 |
1 files changed, 390 insertions, 0 deletions
diff --git a/devel/portmk/scripts/ranksites-geoip.pl b/devel/portmk/scripts/ranksites-geoip.pl new file mode 100644 index 000000000000..4631ff6038a3 --- /dev/null +++ b/devel/portmk/scripts/ranksites-geoip.pl @@ -0,0 +1,390 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2004 Oliver Eikemeier. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions of source code must retain the above copyright notice +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# $FreeBSD$ +# +# MAINTAINER= eik@FreeBSD.org +# + +require 5.005; +use strict; +use Geo::IP; +use constant PI => 3.14159265358979323846; + +my $home = $ENV{CC_HOME} ? lc $ENV{CC_HOME} : 'eu'; + +my $dbdir = $ENV{RANKDIR} ? $ENV{RANKDIR} : '/var/db/distrank'; + +-d $dbdir || mkdir $dbdir, 0777 or die "Can't create $dbdir\n"; + +my $rankfile = "$dbdir/ranks-geoip"; + +my $now = time; + +my %distance; + +if (-r $rankfile) { + open RANKS, "<$rankfile"; + while (<RANKS>) { + chomp; + my ($host, $d, $e) = split; + $distance{$host} = [$d, $e] + if defined $e && $e >= $now; + } + close RANKS; +} + +my %mastersites; +my %newdistance; + +my $distgood = -1; +my $distdefault = PI/2; +my $distbad = 2; + +my $expgood = $now + 14 * 86400; +my $expdefault = $now + 7 * 86400; + +my $hostcount = 0; + +while (<>) { + chomp; + next + if exists $mastersites{$_}; + if (m'^(?:ftp|https?)://(?:[^/]*@)?([^/:]+\.[^/:]+)(?::\d+)?(?:/|$)'i) { + my $host = lc $1; + $mastersites{$_} = $host; + if (!defined $distance{$host}) { + $distance{$host} = [$distdefault, $expdefault]; + $newdistance{$host} = undef + } + $hostcount++; + } elsif (m'^file:'i) { + $mastersites{$_} = 'FILE'; + } else { + $mastersites{$_} = 'UNKNOWN'; + } +} + +# calculate_distance and the associated table is from Geo::Mirror, and therefore +# Copyright (c) 2002, T.J. Mather, tjmather@tjmather.com, New York, NY, USA + +my (%lat, %lon); + +sub getlatlon { + my ($cc) = @_; + my ($lat_cc, $lon_cc) = ($lat{$cc}, $lon{$cc}); + + # Convert all the degrees to radians + $lat_cc *= PI/180 + if defined $lat_cc; + $lon_cc *= PI/180 + if defined $lon_cc; + return ($lat_cc, $lon_cc); +} + +if (%newdistance && $hostcount > 1) { + while (<main::DATA>) { + my ($country, $lat, $lon) = split(':'); + + $lat{$country} = $lat; + $lon{$country} = $lon; + } + close main::DATA; + + my $gi = Geo::IP->new(GEOIP_MEMORY_CACHE); + + my ($lat_home, $lon_home) = getlatlon($home); + + foreach (keys %newdistance) { + my $dist; + my $cc = lc $gi->country_code_by_name($_); + my ($lat_cc, $lon_cc) = getlatlon($cc) + if defined $cc; + + # Find the deltas + my $delta_lat = $lat_cc - $lat_home; + my $delta_lon = $lon_cc - $lon_home; + + # Find the Great Circle distance + my $temp = sin($delta_lat/2.0)**2 + cos($lat_home) * cos($lat_cc) * sin($delta_lon/2.0)**2; + $dist = atan2(sqrt($temp),sqrt(1-$temp)); + + $distance{$_} = [$dist, $expgood] + if defined $dist; + } + + open RANKS, ">$rankfile"; + while (my ($host, $val) = each %distance) { + printf RANKS "%s\t%.4f\t%d\n", $host, $val->[0], $val->[1] + if defined $val; + } + close RANKS; +} + +$distance{FILE} = [$distgood, 0]; +$distance{UNKNOWN} = [$distbad, 0]; + +foreach (sort {$distance{$mastersites{$a}}->[0] <=> $distance{$mastersites{$b}}->[0]} keys %mastersites) { + print $_, "\n"; +} + +__END__ +af:33:65 +al:41:20 +dz:28:3 +as:-14:-170 +ad:42:1 +ao:-12:18 +ai:18:-63 +aq:-90:0 +ag:17:-61 +ar:-34:-64 +am:40:45 +aw:12:-69 +au:-27:133 +at:47:13 +az:40:47 +bs:24:-76 +bh:26:50 +bd:24:90 +bb:13:-59 +by:53:28 +be:50:4 +bz:17:-88 +bj:9:2 +bm:32:-64 +bt:27:90 +bo:-17:-65 +ba:44:18 +bw:-22:24 +bv:-54:3 +br:-10:-55 +io:-6:71 +vg:18:-64 +bg:43:25 +bf:13:-2 +bi:-3:30 +kh:13:105 +cm:6:12 +ca:60:-95 +cv:16:-24 +ky:19:-80 +cf:7:21 +td:15:19 +cl:-30:-71 +cn:35:105 +cx:-10:105 +cc:-12:96 +co:4:-72 +km:-12:44 +cd:0:25 +cg:-1:15 +ck:-21:-159 +cr:10:-84 +ci:8:-5 +hr:45:15 +cu:21:-80 +cy:35:33 +cz:49:15 +dk:56:10 +dj:11:43 +dm:15:-61 +do:19:-70 +ec:-2:-77 +eg:27:30 +sv:13:-88 +gq:2:10 +er:15:39 +ee:59:26 +et:8:38 +fk:-51:-59 +fo:62:-7 +fj:-18:175 +fi:64:26 +fr:46:2 +gf:4:-53 +pf:-15:-140 +ga:-1:11 +gm:13:-16 +ge:42:43 +de:51:9 +eu:48:10 +gh:8:-2 +gi:36:-5 +gr:39:22 +gl:72:-40 +gd:12:-61 +gp:16:-61 +gu:13:144 +gt:15:-90 +gn:11:-10 +gw:12:-15 +gy:5:-59 +ht:19:-72 +hm:-53:72 +va:41:12 +hn:15:-86 +hk:22:114 +hu:47:20 +is:65:-18 +in:20:77 +id:-5:120 +ir:32:53 +iq:33:44 +ie:53:-8 +il:31:34 +it:42:12 +jm:18:-77 +sj:71:-8 +jp:36:138 +jo:31:36 +ke:1:38 +ki:1:173 +kp:40:127 +kr:37:127 +kw:29:45 +kg:41:75 +lv:57:25 +lb:33:35 +ls:-29:28 +lr:6:-9 +ly:25:17 +li:47:9 +lt:56:24 +lu:49:6 +mo:22:113 +mk:41:22 +mg:-20:47 +mw:-13:34 +my:2:112 +mv:3:73 +ml:17:-4 +mt:35:14 +mh:9:168 +mq:14:-61 +mr:20:-12 +mu:-20:57 +yt:-12:45 +mx:23:-102 +fm:6:158 +mc:43:7 +mn:46:105 +ms:16:-62 +ma:32:-5 +mz:-18:35 +na:-22:17 +nr:-0:166 +np:28:84 +nl:52:5 +an:12:-68 +nc:-21:165 +nz:-41:174 +ni:13:-85 +ne:16:8 +ng:10:8 +nu:-19:-169 +nf:-29:167 +mp:15:145 +no:62:10 +om:21:57 +pk:30:70 +pw:7:134 +pa:9:-80 +pg:-6:147 +py:-23:-58 +pe:-10:-76 +ph:13:122 +pn:-25:-130 +pl:52:20 +pt:39:-8 +pr:18:-66 +qa:25:51 +re:-21:55 +ro:46:25 +ru:60:100 +rw:-2:30 +sh:-15:-5 +kn:17:-62 +lc:13:-60 +pm:46:-56 +vc:13:-61 +ws:-13:-172 +sm:43:12 +st:1:7 +sa:25:45 +sn:14:-14 +sc:-4:55 +sl:8:-11 +sg:1:103 +sk:48:19 +si:46:15 +sb:-8:159 +so:10:49 +za:-29:24 +gs:-54:-37 +es:40:-4 +lk:7:81 +sd:15:30 +sr:4:-56 +sj:78:20 +sz:-26:31 +se:62:15 +ch:47:8 +sy:35:38 +tj:39:71 +tz:-6:35 +th:15:100 +tg:8:1 +tk:-9:-172 +to:-20:-175 +tt:11:-61 +tn:34:9 +tr:39:35 +tm:40:60 +tc:21:-71 +tv:-8:178 +ug:1:32 +ua:49:32 +ae:24:54 +gb:54:-2 +us:38:-97 +uy:-33:-56 +uz:41:64 +vu:-16:167 +ve:8:-66 +vn:16:106 +vi:18:-64 +wf:-13:-176 +eh:24:-13 +ye:15:48 +yu:44:21 +zm:-15:30 +zw:-20:30 +tw:23:121 |