diff options
Diffstat (limited to 'lib/irc')
-rw-r--r-- | lib/irc/connection.ex | 10 | ||||
-rw-r--r-- | lib/irc/puppet_connection.ex | 37 |
2 files changed, 38 insertions, 9 deletions
diff --git a/lib/irc/connection.ex b/lib/irc/connection.ex index a0cdc27..52910ac 100644 --- a/lib/irc/connection.ex +++ b/lib/irc/connection.ex @@ -222,11 +222,11 @@ defmodule IRC.Connection do ExIRC.Client.add_handler(client, self()) client end - if state.conn.tls do - ExIRC.Client.connect_ssl!(client, state.conn.host, state.conn.port, [])#[{:ifaddr, {45,150,150,33}}]) - else - ExIRC.Client.connect!(client, state.conn.host, state.conn.port, [])#[{:ifaddr, {45,150,150,33}}]) - end + + opts = [{:nodelay, true}] + conn_fun = if state.conn.tls, do: :connect_ssl!, else: :connect! + apply(ExIRC.Client, conn_fun, [client, to_charlist(state.conn.host), state.conn.port, opts]) + {:noreply, %{state | client: client}} end diff --git a/lib/irc/puppet_connection.ex b/lib/irc/puppet_connection.ex index da6cc93..b92ef2b 100644 --- a/lib/irc/puppet_connection.ex +++ b/lib/irc/puppet_connection.ex @@ -3,6 +3,7 @@ defmodule IRC.PuppetConnection do @min_backoff :timer.seconds(5) @max_backoff :timer.seconds(2*60) @max_idle :timer.hours(12) + @env Mix.env defmodule Supervisor do use DynamicSupervisor @@ -75,6 +76,15 @@ defmodule IRC.PuppetConnection do end def handle_continue(:connect, state) do + ipv6 = if @env == :prod do + subnet = LSG.Subnet.assign(state.account_id) + IRC.Account.put_meta(IRC.Account.get(state.account_id), "subnet", subnet) + ip = Pfx.host(subnet, 1) + {:ok, ipv6} = :inet_parse.ipv6_address(to_charlist(ip)) + System.cmd("add-ip6", [ip]) + ipv6 + end + conn = IRC.Connection.lookup(state.connection_id) client_opts = [] |> Keyword.put(:network, conn.network) @@ -87,11 +97,30 @@ defmodule IRC.PuppetConnection do ExIRC.Client.add_handler(client, self()) client end - if conn.tls do - ExIRC.Client.connect_ssl!(client, conn.host, conn.port, [])#[{:ifaddr, {45,150,150,33}}]) - else - ExIRC.Client.connect!(client, conn.host, conn.port, [])#[{:ifaddr, {45,150,150,33}}]) + + base_opts = [ + {:nodelay, true} + ] + + {ip, opts} = case {@env == :prod && ipv6, :inet_res.resolve(to_charlist(conn.host), :in, :aaaa)} do + {true, {:ok, {:dns_rec, _dns_header, _query, rrs = [{:dns_rr, _, _, _, _, _, _, _, _, _} | _], _, _}}} -> + ip = rrs + |> Enum.map(fn({:dns_rr, _, :aaaa, :in, _, _, ipv6, _, _, _}) -> ipv6 end) + |> Enum.shuffle() + |> List.first() + + opts = [ + :inet6, + {:ifaddr, ipv6} + ] + {ip, opts} + _ -> + {to_charlist(conn.host), []} end + + conn_fun = if conn.tls, do: :connect_ssl!, else: :connect! + apply(ExIRC.Client, conn_fun, [client, ip, conn.port, base_opts ++ opts]) + {:noreply, %{state | client: client}} end |