[ipv6-ops] A postgresql & php inet to ip6.arpa snippet
Aaron Hughes
aaronh at bind.com
Tue Jul 26 02:22:05 CEST 2011
Thanks Martin.
This is far more complicated, but php is so common. Just set the "39" to adjust for prefix length return in that $ORIGIN will likely be the /48. In this case 1.0.0.0.0.e.a.f.7.0.6.2.ip6.arpa.
Input: 2607:fae0:1:1:219:e3ff:fefa:927
Output: 7.2.9.0.a.f.e.f.f.f.3.e.9.1.2.0.1.0.0.0
function inet6_expand($addr)
{
/* Check if there are segments missing, insert if necessary */
if (strpos($addr, '::') !== false) {
$part = explode('::', $addr);
$part[0] = explode(':', $part[0]);
$part[1] = explode(':', $part[1]);
$missing = array();
for ($i = 0; $i < (8 - (count($part[0]) + count($part[1]))); $i++)
array_push($missing, '0000');
$missing = array_merge($part[0], $missing);
$part = array_merge($missing, $part[1]);
} else {
$part = explode(":", $addr);
} // if .. else
/* Pad each segment until it has 4 digits */
foreach ($part as &$p) {
while (strlen($p) < 4) $p = '0' . $p;
} // foreach
unset($p);
/* Join segments */
$result = implode(':', $part);
/* Quick check to make sure the length is as expected */
if (strlen($result) == 39) {
return $result;
} else {
return false;
}
}
Cheers,
Aaron
On Tue, Jul 26, 2011 at 02:10:47AM +0200, Martin Millnert wrote:
> 128-bit friends,
>
> I just took the time to come up with a IMHO quite clean way to create
> ip6.arpa strings from inet types in PostgreSQL and thought I'd share (if
> nothing else so for the Internet archives, where I came up empty with a
> similar solution previously):
>
> Prerequisites: a string reverse() function. Either, wait for/install 9.2
> where it seems to be included, or simply install for example this one:
> http://archives.postgresql.org/pgsql-sql/2005-02/msg00334.php
>
> Then:
> sysdb=# SELECT
> reverse(regexp_replace(substring(encode(inet_send('2a02:9a0:100:2::101'::inet), 'hex') from 9), '(.)', E'.\\1', 'g'));
> reverse
> ------------------------------------------------------------------
> 1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.0.0.1.0.0.a.9.0.2.0.a.2.
> (1 row)
>
> It may not look as much, but for me the dark magic was the inet_send
> function to access the raw data of the inet type. I'm using this myself
> now to generate part of a zone file anyway.
>
> Cheers,
> Martin
>
> (If you're not using pgsql already, "you're doing it wrong" ;-) )
--
Aaron Hughes
aaronh at bind.com
+1-831-824-4161
Key fingerprint = AD 67 37 60 7D 73 C5 B7 33 18 3F 36 C3 1C C6 B8
http://www.bind.com/
More information about the ipv6-ops
mailing list