IP geolocation library
							parent
							
								
									bcb6a47ec7
								
							
						
					
					
						commit
						7bba8871a3
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Slava Pestov
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
USING: kernel sequences io.files io.launcher io.encodings.ascii
 | 
			
		||||
io.streams.string http.client sequences.lib combinators
 | 
			
		||||
math.parser math.vectors math.intervals interval-maps memoize
 | 
			
		||||
csv accessors assocs strings math splitting ;
 | 
			
		||||
IN: geo-ip
 | 
			
		||||
 | 
			
		||||
: db-path "IpToCountry.csv" temp-file ;
 | 
			
		||||
 | 
			
		||||
: db-url "http://software77.net/cgi-bin/ip-country/geo-ip.pl?action=download" ;
 | 
			
		||||
 | 
			
		||||
: download-db ( -- path )
 | 
			
		||||
    db-path dup exists? [
 | 
			
		||||
        db-url over ".gz" append download-to
 | 
			
		||||
        { "gunzip" } over ".gz" append (normalize-path) suffix try-process
 | 
			
		||||
    ] unless ;
 | 
			
		||||
 | 
			
		||||
TUPLE: ip-entry from to registry assigned city cntry country ;
 | 
			
		||||
 | 
			
		||||
: parse-ip-entry ( row -- ip-entry )
 | 
			
		||||
    7 firstn {
 | 
			
		||||
        [ string>number ]
 | 
			
		||||
        [ string>number ]
 | 
			
		||||
        [ ]
 | 
			
		||||
        [ ]
 | 
			
		||||
        [ ]
 | 
			
		||||
        [ ]
 | 
			
		||||
        [ ]
 | 
			
		||||
    } spread ip-entry boa ;
 | 
			
		||||
 | 
			
		||||
MEMO: ip-db ( -- seq )
 | 
			
		||||
    download-db ascii file-lines
 | 
			
		||||
    [ "#" head? not ] filter "\n" join <string-reader> csv
 | 
			
		||||
    [ parse-ip-entry ] map ;
 | 
			
		||||
 | 
			
		||||
MEMO: ip-intervals ( -- interval-map )
 | 
			
		||||
    ip-db [ [ [ from>> ] [ to>> ] bi [a,b] ] keep ] { } map>assoc
 | 
			
		||||
    <interval-map> ;
 | 
			
		||||
 | 
			
		||||
GENERIC: lookup-ip ( ip -- ip-entry )
 | 
			
		||||
 | 
			
		||||
M: string lookup-ip
 | 
			
		||||
    "." split [ string>number ] map
 | 
			
		||||
    { HEX: 1000000 HEX: 10000 HEX: 100 1 } v.
 | 
			
		||||
    lookup-ip ;
 | 
			
		||||
 | 
			
		||||
M: integer lookup-ip ip-intervals interval-at ;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
IP address geolocation using database from http://software77.net/cgi-bin/ip-country/
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
enterprise
 | 
			
		||||
		Loading…
	
		Reference in New Issue