ikiwiki hosting internals/ bugs/ ipv6 should be priority

I am trying to add an external alias for my site and, because of silly NAT, the IPv4 interface doesn't match what DNS (as opposed to /etc/hosts) returns. IPv6 works fine though, but since ikiwiki-hosting first looks for IPv4 records, it fails to pick that up. I have a crude hack to fix this, but it doesn't seem like the good approach. "Worked for me" though. ;)

Example, without the patch:

    root@marcos:/home/a-wiki# ikisite domains wiki.anarcat.ath.cx --external=anarcat.ath.cx --alias=wiki.anarcat.ath.cx
    DNS not configured correctly for anarcat.ath.cx - 72.0.72.144

Note that I had to patch to even get that debugging information:

[[!format diff """ diff --git a/ikisite b/ikisite index adc5df3..82a29cb 100755 --- a/ikisite +++ b/ikisite @@ -1193,7 +1193,7 @@ sub domains { } if ($address ne $hostname) { if (! grep { defined $ && $ eq $address } site_addresses()) { - print STDERR "DNS not configured correctly for $options{external}\n"; + print STDERR "DNS not configured correctly for $options{external} - got $address\n"; exit 3; # special code } else { """]]

With the following patch, the thing actually works:

[[!format diff """ diff --git a/IkiWiki/Hosting.pm b/IkiWiki/Hosting.pm index b802f21..08365d2 100644 --- a/IkiWiki/Hosting.pm +++ b/IkiWiki/Hosting.pm @@ -128,7 +128,7 @@ sub host_address_or_cname { # cached NXDOMAIN from earlier tests. We want to see the current # state of the DNS. # dig has to be run a second time to check for ipv6 AAAA addresses. - foreach my $atype (qw{A AAAA}) { + foreach my $atype (qw{AAAA A}) { open(DIG, "-|", "dig", "-t$atype", "+nofail", "+trace", "$host.") || error "dig: $!"; while () { next if /^;/; """]]

    root@marcos:/home/a-wiki# ikisite domains wiki.anarcat.ath.cx --external=anarcat.ath.cx --alias=wiki.anarcat.ath.cx
    warning: DNS for anarcat.ath.cx hardcodes IP 2001:1928:1:9:beae:c5ff:fe89:e238
    [...]

As I said, this is a rather naive patch. Maybe this kind of overall prioritisation should be a config option? Or should we have a way to override the IP detection? Not sure how to handle this, really... Maybe the simplest fix is to have a --force argument... -- anarcat

The following patch allows overriding the IP detection mechanism:

[[!format diff """ From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= anarcat@koumbit.org Date: Sat, 17 Dec 2011 14:13:29 -0500 Subject: [PATCH] allow hardcoding the IPs

IkiWiki/Hosting.pm | 9 +++++++++ ikiwiki-hosting.conf | 6 ++++++ 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/IkiWiki/Hosting.pm b/IkiWiki/Hosting.pm index b802f21..f09dd3b 100644 --- a/IkiWiki/Hosting.pm +++ b/IkiWiki/Hosting.pm @@ -104,6 +104,9 @@ sub outtemplate { sub site_addresses { # Looks up the site's main addresses; those that have a default # route. + if ($config{hardcode_ipv4} && $config{hardcode_ipv6}) { + return ($config{hardcode_ipv4}, $config{hardcode_ipv6}); + } my ($defiface) = `ip route` =~ m/^default via . dev ([a-zA-Z0-9]+)/m; if (! $defiface) { # Maybe ipv6 only. @@ -115,6 +118,12 @@ sub site_addresses { my $show=`ip addr show $defiface`; my ($ipv4) = $show =~ m/inet (\d+.\d+.\d+.\d+).scope global/m; my ($ipv6) = $show =~ m/inet6 ([a-zA-Z0-9:]+).*scope global/m; + if ($config{hardcode_ipv4}) { + $ipv4 = $config{hardcode_ipv4}; + } + if ($config{hardcode_ipv6}) { + $ipv6 = $config{hardcode_ipv6}; + } return ($ipv4, $ipv6); }

diff --git a/ikiwiki-hosting.conf b/ikiwiki-hosting.conf index f0f124f..ad8e14c 100644 --- a/ikiwiki-hosting.conf +++ b/ikiwiki-hosting.conf @@ -24,6 +24,12 @@ allow_ipv4=0 allow_ipv6=0 # (Disable all of the above to disable auto-assignment of DNS addresses.)

+# by default, ikiwiki-hosting looks at the first IP on the interface +# that has the default gateway, but this may fail if you're behind NAT +# or else. those allow you to hardcode the IPs +# hardcode_ipv4=10.0.0.1 +# hardcode_ipv6=fr00::0 + # This is the DNS TTL to use when adding a hostname for a site. ttl=28800

-- 1.7.7.3

"""]]]

I am running with this patch in production now, seems to work okay. --anarcat

> applied --Joey