--- /dev/null
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw( say );
+
+use MaxMind::DB::Writer::Tree;
+
+my $filename = 'test.mmdb';
+
+# Your top level data structure will always be a map (hash). The MMDB format
+# is strongly typed. Describe your data types here.
+# See https://metacpan.org/pod/MaxMind::DB::Writer::Tree#DATA-TYPES
+
+my %types = (
+ country => 'map',
+ iso_code => 'utf8_string',
+ name => 'utf8_string',
+);
+
+my $tree = MaxMind::DB::Writer::Tree->new(
+
+ # "database_type" is some arbitrary string describing the database. At
+ # MaxMind we use strings like 'GeoIP2-City', 'GeoIP2-Country', etc.
+ database_type => 'GeoIP2-Country',
+
+ # "description" is a hashref where the keys are language names and the
+ # values are descriptions of the database in that language.
+ description =>
+ { en => 'Test IP data', },
+
+ # "ip_version" can be either 4 or 6
+ ip_version => 4,
+
+ # add a callback to validate data going in to the database
+ map_key_type_callback => sub { $types{ $_[0] } },
+
+ # "record_size" is the record size in bits. Either 24, 28 or 32.
+ record_size => 24,
+);
+
+my %ips_list = (
+ '123.125.71.29/32' => {
+ country => { name => 'France', iso_code => 'FR' }
+ },
+ '82.165.177.154/32' => {
+ country => { name => 'Germany', iso_code => 'DE' }
+ },
+);
+
+for my $network ( keys %ips_list ) {
+ $tree->insert_network( $network, $ips_list{$network} );
+}
+
+# Write the database to disk.
+open my $fh, '>:raw', $filename;
+$tree->write_tree( $fh );
+close $fh;
+
+say "$filename has now been created";
--- /dev/null
+alert tcp any any -> any any (msg:"French IP"; flow:established,to_server; geoip:dst,FR; sid:1; rev:1; flowbits:isnotset,french; flowbits:set,french;)
+alert tcp any any -> any any (msg:"German IP"; flow:established,to_server; geoip: dst,DE; sid:2; rev:1; flowbits:isnotset,german; flowbits:set,german;)