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