2021-07-14 08:25:30 +01:00
|
|
|
# testdata
|
|
|
|
|
This directory contains mmdb database files used during the testing of this plugin.
|
|
|
|
|
|
|
|
|
|
# Create mmdb database files
|
|
|
|
|
If you need to change them to add a new value, or field the best is to recreate them, the code snipped used to create them initially is provided next.
|
|
|
|
|
|
2025-11-30 08:36:33 -08:00
|
|
|
```go
|
2021-07-14 08:25:30 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"log"
|
|
|
|
|
"net"
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
|
|
"github.com/maxmind/mmdbwriter"
|
|
|
|
|
"github.com/maxmind/mmdbwriter/inserter"
|
|
|
|
|
"github.com/maxmind/mmdbwriter/mmdbtype"
|
|
|
|
|
)
|
|
|
|
|
|
2025-11-30 08:36:33 -08:00
|
|
|
const cidr = "81.2.69.142/32"
|
2021-07-14 08:25:30 +01:00
|
|
|
|
|
|
|
|
// Create new mmdb database fixtures in this directory.
|
|
|
|
|
func main() {
|
|
|
|
|
createCityDB("GeoLite2-City.mmdb", "DBIP-City-Lite")
|
2025-11-30 08:36:33 -08:00
|
|
|
// Create unknown database type.
|
2021-07-14 08:25:30 +01:00
|
|
|
createCityDB("GeoLite2-UnknownDbType.mmdb", "UnknownDbType")
|
2025-11-30 08:36:33 -08:00
|
|
|
// Create ASN database.
|
|
|
|
|
createASNDB("GeoLite2-ASN.mmdb", "GeoLite2-ASN")
|
2021-07-14 08:25:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createCityDB(dbName, dbType string) {
|
|
|
|
|
// Load a database writer.
|
|
|
|
|
writer, err := mmdbwriter.New(mmdbwriter.Options{DatabaseType: dbType})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Define and insert the new data.
|
2025-11-30 08:36:33 -08:00
|
|
|
_, ip, err := net.ParseCIDR(cidr)
|
2021-07-14 08:25:30 +01:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(snebel29): Find an alternative location in Europe Union.
|
|
|
|
|
record := mmdbtype.Map{
|
|
|
|
|
"city": mmdbtype.Map{
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(2653941),
|
|
|
|
|
"names": mmdbtype.Map{
|
|
|
|
|
"en": mmdbtype.String("Cambridge"),
|
|
|
|
|
"es": mmdbtype.String("Cambridge"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"continent": mmdbtype.Map{
|
|
|
|
|
"code": mmdbtype.String("EU"),
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(6255148),
|
|
|
|
|
"names": mmdbtype.Map{
|
|
|
|
|
"en": mmdbtype.String("Europe"),
|
|
|
|
|
"es": mmdbtype.String("Europa"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"country": mmdbtype.Map{
|
|
|
|
|
"iso_code": mmdbtype.String("GB"),
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(2635167),
|
|
|
|
|
"names": mmdbtype.Map{
|
|
|
|
|
"en": mmdbtype.String("United Kingdom"),
|
|
|
|
|
"es": mmdbtype.String("Reino Unido"),
|
|
|
|
|
},
|
|
|
|
|
"is_in_european_union": mmdbtype.Bool(true),
|
|
|
|
|
},
|
|
|
|
|
"location": mmdbtype.Map{
|
|
|
|
|
"accuracy_radius": mmdbtype.Uint16(200),
|
|
|
|
|
"latitude": mmdbtype.Float64(52.2242),
|
|
|
|
|
"longitude": mmdbtype.Float64(0.1315),
|
|
|
|
|
"metro_code": mmdbtype.Uint64(0),
|
|
|
|
|
"time_zone": mmdbtype.String("Europe/London"),
|
|
|
|
|
},
|
|
|
|
|
"postal": mmdbtype.Map{
|
|
|
|
|
"code": mmdbtype.String("CB4"),
|
|
|
|
|
},
|
|
|
|
|
"registered_country": mmdbtype.Map{
|
|
|
|
|
"iso_code": mmdbtype.String("GB"),
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(2635167),
|
|
|
|
|
"names": mmdbtype.Map{"en": mmdbtype.String("United Kingdom")},
|
|
|
|
|
"is_in_european_union": mmdbtype.Bool(false),
|
|
|
|
|
},
|
|
|
|
|
"subdivisions": mmdbtype.Slice{
|
|
|
|
|
mmdbtype.Map{
|
|
|
|
|
"iso_code": mmdbtype.String("ENG"),
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(6269131),
|
|
|
|
|
"names": mmdbtype.Map{"en": mmdbtype.String("England")},
|
|
|
|
|
},
|
|
|
|
|
mmdbtype.Map{
|
|
|
|
|
"iso_code": mmdbtype.String("CAM"),
|
|
|
|
|
"geoname_id": mmdbtype.Uint64(2653940),
|
|
|
|
|
"names": mmdbtype.Map{"en": mmdbtype.String("Cambridgeshire")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := writer.InsertFunc(ip, inserter.TopLevelMergeWith(record)); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write the DB to the filesystem.
|
|
|
|
|
fh, err := os.Create(dbName)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
_, err = writer.WriteTo(fh)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-11-30 08:36:33 -08:00
|
|
|
|
|
|
|
|
func createASNDB(dbName, dbType string) {
|
|
|
|
|
// Load a database writer.
|
|
|
|
|
// IncludeReservedNetworks allows inserting private IP ranges like 10.0.0.0/8.
|
|
|
|
|
writer, err := mmdbwriter.New(mmdbwriter.Options{
|
|
|
|
|
DatabaseType: dbType,
|
|
|
|
|
IncludeReservedNetworks: true,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Define and insert the new data.
|
|
|
|
|
_, ip, err := net.ParseCIDR(cidr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record := mmdbtype.Map{
|
|
|
|
|
"autonomous_system_number": mmdbtype.Uint64(12345),
|
|
|
|
|
"autonomous_system_organization": mmdbtype.String("Test ASN Organization"),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := writer.InsertFunc(ip, inserter.TopLevelMergeWith(record)); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add "Not routed" entry for private IP range (ASN=0).
|
|
|
|
|
// This tests edge cases from iptoasn.com data where some ranges have no ASN.
|
|
|
|
|
_, notRoutedIP, err := net.ParseCIDR("10.0.0.0/8")
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
notRoutedRecord := mmdbtype.Map{
|
|
|
|
|
"autonomous_system_number": mmdbtype.Uint64(0),
|
|
|
|
|
"autonomous_system_organization": mmdbtype.String("Not routed"),
|
|
|
|
|
}
|
|
|
|
|
if err := writer.InsertFunc(notRoutedIP, inserter.TopLevelMergeWith(notRoutedRecord)); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write the DB to the filesystem.
|
|
|
|
|
fh, err := os.Create(dbName)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
_, err = writer.WriteTo(fh)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-07-14 08:25:30 +01:00
|
|
|
```
|