cosmopolitan/tool/net/demo/maxmind.lua
2022-03-18 15:31:54 -07:00

313 lines
9.2 KiB
Lua

local maxmind = require "maxmind"
local kMetroCodes = {
[500] = "Portland-Auburn ME",
[501] = "New York NY",
[502] = "Binghamton NY",
[503] = "Macon GA",
[504] = "Philadelphia PA",
[505] = "Detroit MI",
[506] = "Boston MA-Manchester NH",
[507] = "Savannah GA",
[508] = "Pittsburgh PA",
[509] = "Ft. Wayne IN",
[510] = "Cleveland-Akron (Canton) OH",
[511] = "Washington DC (Hagerstown MD)",
[512] = "Baltimore MD",
[513] = "Flint-Saginaw-Bay City MI",
[514] = "Buffalo NY",
[515] = "Cincinnati OH",
[516] = "Erie PA",
[517] = "Charlotte NC",
[518] = "Greensboro-High Point-Winston Salem NC",
[519] = "Charleston SC",
[520] = "Augusta GA",
[521] = "Providence RI-New Bedford MA",
[522] = "Columbus GA",
[523] = "Burlington VT-Plattsburgh NY",
[524] = "Atlanta GA",
[525] = "Albany GA",
[526] = "Utica NY",
[527] = "Indianapolis IN",
[528] = "Miami-Ft. Lauderdale FL",
[529] = "Louisville KY",
[530] = "Tallahassee FL-Thomasville GA",
[531] = "Tri-Cities TN-VA",
[532] = "Albany-Schenectady-Troy NY",
[533] = "Hartford & New Haven CT",
[534] = "Orlando-Daytona Beach-Melbourne FL",
[535] = "Columbus OH",
[536] = "Youngstown OH",
[537] = "Bangor ME",
[538] = "Rochester NY",
[539] = "Tampa-St. Petersburg (Sarasota) FL",
[540] = "Traverse City-Cadillac MI",
[541] = "Lexington KY",
[542] = "Dayton OH",
[543] = "Springfield-Holyoke MA",
[544] = "Norfolk-Portsmouth-Newport News VA",
[545] = "Greenville-New Bern-Washington NC",
[546] = "Columbia SC",
[547] = "Toledo OH",
[548] = "West Palm Beach-Ft. Pierce FL",
[549] = "Watertown NY",
[550] = "Wilmington NC",
[551] = "Lansing MI",
[552] = "Presque Isle ME",
[553] = "Marquette MI",
[554] = "Wheeling WV-Steubenville OH",
[555] = "Syracuse NY",
[556] = "Richmond-Petersburg VA",
[557] = "Knoxville TN",
[558] = "Lima OH",
[559] = "Bluefield-Beckley-Oak Hill WV",
[560] = "Raleigh-Durham (Fayetteville) NC",
[561] = "Jacksonville FL",
[563] = "Grand Rapids-Kalamazoo-Battle Creek MI",
[564] = "Charleston-Huntington WV",
[565] = "Elmira NY",
[566] = "Harrisburg-Lancaster-Lebanon-York PA",
[567] = "Greenville-Spartanburg SC-Asheville NC-Anderson SC",
[569] = "Harrisonburg VA",
[570] = "Florence-Myrtle Beach SC",
[571] = "Ft. Myers-Naples FL",
[573] = "Roanoke-Lynchburg VA",
[574] = "Johnstown-Altoona PA",
[575] = "Chattanooga TN",
[576] = "Salisbury MD",
[577] = "Wilkes Barre-Scranton PA",
[581] = "Terre Haute IN",
[582] = "Lafayette IN",
[583] = "Alpena MI",
[584] = "Charlottesville VA",
[588] = "South Bend-Elkhart IN",
[592] = "Gainesville FL",
[596] = "Zanesville OH",
[597] = "Parkersburg WV",
[598] = "Clarksburg-Weston WV",
[600] = "Corpus Christi TX",
[602] = "Chicago IL",
[603] = "Joplin MO-Pittsburg KS",
[604] = "Columbia-Jefferson City MO",
[605] = "Topeka KS",
[606] = "Dothan AL",
[609] = "St. Louis MO",
[610] = "Rockford IL",
[611] = "Rochester MN-Mason City IA-Austin MN",
[612] = "Shreveport LA",
[613] = "Minneapolis-St. Paul MN",
[616] = "Kansas City MO",
[617] = "Milwaukee WI",
[618] = "Houston TX",
[619] = "Springfield MO",
[622] = "New Orleans LA",
[623] = "Dallas-Ft. Worth TX",
[624] = "Sioux City IA",
[625] = "Waco-Temple-Bryan TX",
[626] = "Victoria TX",
[627] = "Wichita Falls TX & Lawton OK",
[628] = "Monroe LA-El Dorado AR",
[630] = "Birmingham AL",
[631] = "Ottumwa IA-Kirksville MO",
[632] = "Paducah KY-Cape Girardeau MO-Harrisburg-Mount Vernon IL",
[633] = "Odessa-Midland TX",
[634] = "Amarillo TX",
[635] = "Austin TX",
[636] = "Harlingen-Weslaco-Brownsville-McAllen TX",
[637] = "Cedar Rapids-Waterloo-Iowa City & Dubuque IA",
[638] = "St. Joseph MO",
[639] = "Jackson TN",
[640] = "Memphis TN",
[641] = "San Antonio TX",
[642] = "Lafayette LA",
[643] = "Lake Charles LA",
[644] = "Alexandria LA",
[647] = "Greenwood-Greenville MS",
[648] = "Champaign & Springfield-Decatur,IL",
[649] = "Evansville IN",
[650] = "Oklahoma City OK",
[651] = "Lubbock TX",
[652] = "Omaha NE",
[656] = "Panama City FL",
[657] = "Sherman TX-Ada OK",
[658] = "Green Bay-Appleton WI",
[659] = "Nashville TN",
[661] = "San Angelo TX",
[662] = "Abilene-Sweetwater TX",
[669] = "Madison WI",
[670] = "Ft. Smith-Fayetteville-Springdale-Rogers AR",
[671] = "Tulsa OK",
[673] = "Columbus-Tupelo-West Point MS",
[675] = "Peoria-Bloomington IL",
[676] = "Duluth MN-Superior WI",
[678] = "Wichita-Hutchinson KS",
[679] = "Des Moines-Ames IA",
[682] = "Davenport IA-Rock Island-Moline IL",
[686] = "Mobile AL-Pensacola (Ft. Walton Beach) FL",
[687] = "Minot-Bismarck-Dickinson(Williston) ND",
[691] = "Huntsville-Decatur (Florence) AL",
[692] = "Beaumont-Port Arthur TX",
[693] = "Little Rock-Pine Bluff AR",
[698] = "Montgomery (Selma) AL",
[702] = "La Crosse-Eau Claire WI",
[705] = "Wausau-Rhinelander WI",
[709] = "Tyler-Longview(Lufkin & Nacogdoches) TX",
[710] = "Hattiesburg-Laurel MS",
[711] = "Meridian MS",
[716] = "Baton Rouge LA",
[717] = "Quincy IL-Hannibal MO-Keokuk IA",
[718] = "Jackson MS",
[722] = "Lincoln & Hastings-Kearney NE",
[724] = "Fargo-Valley City ND",
[725] = "Sioux Falls(Mitchell) SD",
[734] = "Jonesboro AR",
[736] = "Bowling Green KY",
[737] = "Mankato MN",
[740] = "North Platte NE",
[743] = "Anchorage AK",
[744] = "Honolulu HI",
[745] = "Fairbanks AK",
[746] = "Biloxi-Gulfport MS",
[747] = "Juneau AK",
[749] = "Laredo TX",
[751] = "Denver CO",
[752] = "Colorado Springs-Pueblo CO",
[753] = "Phoenix AZ",
[754] = "Butte-Bozeman MT",
[755] = "Great Falls MT",
[756] = "Billings MT",
[757] = "Boise ID",
[758] = "Idaho Falls-Pocatello ID",
[759] = "Cheyenne WY-Scottsbluff NE",
[760] = "Twin Falls ID",
[762] = "Missoula MT",
[764] = "Rapid City SD",
[765] = "El Paso TX",
[766] = "Helena MT",
[767] = "Casper-Riverton WY",
[770] = "Salt Lake City UT",
[771] = "Yuma AZ-El Centro CA",
[773] = "Grand Junction-Montrose CO",
[789] = "Tucson (Sierra Vista) AZ",
[790] = "Albuquerque-Santa Fe NM",
[798] = "Glendive MT",
[800] = "Bakersfield CA",
[801] = "Eugene OR",
[802] = "Eureka CA",
[803] = "Los Angeles CA",
[804] = "Palm Springs CA",
[807] = "San Francisco-Oakland-San Jose CA",
[810] = "Yakima-Pasco-Richland-Kennewick WA",
[811] = "Reno NV",
[813] = "Medford-Klamath Falls OR",
[819] = "Seattle-Tacoma WA",
[820] = "Portland OR",
[821] = "Bend OR",
[825] = "San Diego CA",
[828] = "Monterey-Salinas CA",
[839] = "Las Vegas NV",
[855] = "Santa Barbara-Santa Maria-San Luis Obispo CA",
[862] = "Sacramento-Stockton-Modesto CA",
[866] = "Fresno-Visalia CA",
[868] = "Chico-Redding CA",
[881] = "Spokane WA",
}
local function Dump(p)
if type(p) == 'table' then
local a = {}
for k in pairs(p) do
table.insert(a, k)
end
table.sort(a)
Write('<dl>\n')
for i = 1,#a do
local k = a[i]
local v = p[k]
Write('<dt>')
Dump(k)
Write('\n')
Write('<dd>')
if k == 'iso_code' then
Write('<img style="max-width:32px" src="//justine.lol/flags/' .. v:lower() .. '.png"> ')
end
Dump(v)
if k == 'metro_code' then
local metro = kMetroCodes[v]
if metro then
Write(' (' .. metro .. ')')
end
elseif k == 'accuracy_radius' then
Write(' km')
end
Write('\n')
end
Write('</dl>\n')
else
Write(EscapeHtml(tostring(p)))
end
end
local function main()
if GetMethod() ~= 'GET' and GetMethod() ~= 'HEAD' then
ServeError(405)
SetHeader('Allow', 'GET, HEAD')
return
end
local ip = nil
local geo = nil
local asn = nil
local value = ''
if HasParam('ip') then
local geodb = maxmind.open('/usr/local/share/maxmind/GeoLite2-City.mmdb')
local asndb = maxmind.open('/usr/local/share/maxmind/GeoLite2-ASN.mmdb')
ip = ParseIp(GetParam('ip'))
if ip ~= -1 then
value = FormatIp(ip)
geo = geodb:lookup(ip)
if geo then
geo = geo:get()
end
asn = asndb:lookup(ip)
if asn then
asn = asn:get()
end
if not geo and not asn then
SetStatus(404)
end
end
end
SetHeader('Content-Type', 'text/html; charset=utf-8')
Write('<!doctype html>\n')
Write([[
<title>maxmind redbean demo</title>
<form action="maxmind.lua" method="get">
<input type="text" id="ip" name="ip" placeholder="8.8.8.8"
value="]] .. value .. [[">
<label for="ip">ip address</label>
<br>
<input type="submit" value="Lookup">
</form>
]])
if ip then
Write('<h3>Maxmind Geolite DB</h3>')
if geo then
Dump(geo)
else
Write('<p>Not found\n')
end
Write('<h3>Maxmind ASN DB</h3>')
if asn then
Dump(asn)
else
Write('<p>Not found\n')
end
end
end
main()