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('
\n') for i = 1,#a do local k = a[i] local v = p[k] Write('
') Dump(k) Write('\n') Write('
') if k == 'iso_code' then Write(' ') 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('
\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('\n') Write([[ maxmind redbean demo

]]) if ip then Write('

Maxmind Geolite DB

') if geo then Dump(geo) else Write('

Not found\n') end Write('

Maxmind ASN DB

') if asn then Dump(asn) else Write('

Not found\n') end end end main()