README.md

# geolite2data

[![Hex.pm](https://img.shields.io/hexpm/v/geolite2data.svg)](https://hex.pm/packages/geolite2data)

Downloads and updates the [GeoLite2 databases from MaxMind](https://dev.maxmind.com/geoip/geoip2/geolite2/) for Erlang and Elixir.

Designed to be used alongside other applications like [geolix](https://github.com/mneudert/geolix).

## Installation

Add `geolite2data` to your project's dependencies in `mix.exs`

```elixir
defp deps do
  [
    {:geolite2data, "~> 1.0.0"}
  ]
end
```

Add `geolite2data` to your project's dependencies in your `Makefile` for [`erlang.mk`](https://github.com/ninenines/erlang.mk) or the following to your `rebar.config`

```erlang
{deps, [
  {geolite2data, ".*", {git, "git://github.com/potatosalad/erlang-geolite2data.git", {branch, "master"}}}
]}.
```

## Configuration

When using `mix` along with [geolix](https://github.com/mneudert/geolix), the following configuration may be used:

```elixir
config :geolite2data,
  geolix_updater: true
```

This will automatically check for updates once a day and load any changes into geolix.

The defaults for all configuration options are:

```elixir
config :geolite2data,
  autoupdate: 86400, # 24 hours
  databases: [
    {:city, "https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.md5", "https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz"},
    {:country, "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.md5", "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz"}
  ],
  geolix_updater: false,
  keep_releases: 2,
  logger: false
```

For Erlang applications, there is an event handler that can be used to watch for any changes to database files:

```erlang
-module(example_geolite2data_listener).
-behaviour(gen_server).

-export([start_link/0]).

%% gen_server callbacks
-export([init/1]).
-export([handle_call/3]).
-export([handle_cast/2]).
-export([handle_info/2]).
-export([terminate/2]).
-export([code_change/3]).

-record(state, {}).

start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init([]) ->
    ok = geolite2data_event:add_handler(geolite2data_event_handler, self()),
    {ok, #state{}}.

handle_call(_Request, _From, State) ->
    {reply, ignored, State}.

handle_cast(_Request, State) ->
    {noreply, State}.

handle_info({'$geolite2data-event', {database, announce, Key, Filename}}, State) ->
    %% Handle changes to the database identified by 'Key' and stored at 'Filename'
    {noreply, State};
handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
```

See `geolite2data_geolix_updater` and `geolite2data_logger` for more examples.

## Usage

The current filename for a database can be fetched with `geolite2data:get_database/1`:

```erlang
geolite2data:get_database(city).
% {ok, ".../priv/releases/country/20160513224618GeoLite2-Country.mmdb.gz"}
```

## License

[MIT](https://opensource.org/licenses/MIT/)