Parse a string and return the corresponding IP address (as integer) and a guess of the IP version. Following address formats are recognized: >>> parseAddress('0x0123456789abcdef') # IPv4 if <= 0xffffffff else IPv6 (81985529216486895L, 6) >>> parseAddress('123.123
(ipstr)
| 1023 | |
| 1024 | |
| 1025 | def parseAddress(ipstr): |
| 1026 | """ |
| 1027 | Parse a string and return the corresponding IP address (as integer) |
| 1028 | and a guess of the IP version. |
| 1029 | |
| 1030 | Following address formats are recognized: |
| 1031 | |
| 1032 | >>> parseAddress('0x0123456789abcdef') # IPv4 if <= 0xffffffff else IPv6 |
| 1033 | (81985529216486895L, 6) |
| 1034 | >>> parseAddress('123.123.123.123') # IPv4 |
| 1035 | (2071690107L, 4) |
| 1036 | >>> parseAddress('123.123') # 0-padded IPv4 |
| 1037 | (2071658496L, 4) |
| 1038 | >>> parseAddress('1080:0000:0000:0000:0008:0800:200C:417A') |
| 1039 | (21932261930451111902915077091070067066L, 6) |
| 1040 | >>> parseAddress('1080:0:0:0:8:800:200C:417A') |
| 1041 | (21932261930451111902915077091070067066L, 6) |
| 1042 | >>> parseAddress('1080:0::8:800:200C:417A') |
| 1043 | (21932261930451111902915077091070067066L, 6) |
| 1044 | >>> parseAddress('::1') |
| 1045 | (1L, 6) |
| 1046 | >>> parseAddress('::') |
| 1047 | (0L, 6) |
| 1048 | >>> parseAddress('0:0:0:0:0:FFFF:129.144.52.38') |
| 1049 | (281472855454758L, 6) |
| 1050 | >>> parseAddress('::13.1.68.3') |
| 1051 | (218186755L, 6) |
| 1052 | >>> parseAddress('::FFFF:129.144.52.38') |
| 1053 | (281472855454758L, 6) |
| 1054 | """ |
| 1055 | |
| 1056 | if ipstr.startswith('0x'): |
| 1057 | ret = long(ipstr[2:], 16) |
| 1058 | if ret > 0xffffffffffffffffffffffffffffffffL: |
| 1059 | raise ValueError, "%r: IP Address can't be bigger than 2^128" % (ipstr) |
| 1060 | if ret < 0x100000000L: |
| 1061 | return (ret, 4) |
| 1062 | else: |
| 1063 | return (ret, 6) |
| 1064 | |
| 1065 | if ipstr.find(':') != -1: |
| 1066 | return (_parseAddressIPv6(ipstr), 6) |
| 1067 | |
| 1068 | elif len(ipstr) == 32: |
| 1069 | # assume IPv6 in pure hexadecimal notation |
| 1070 | return (long(ipstr, 16), 6) |
| 1071 | |
| 1072 | elif ipstr.find('.') != -1 or (len(ipstr) < 4 and int(ipstr) < 256): |
| 1073 | # assume IPv4 ('127' gets interpreted as '127.0.0.0') |
| 1074 | bytes = ipstr.split('.') |
| 1075 | if len(bytes) > 4: |
| 1076 | raise ValueError, "IPv4 Address with more than 4 bytes" |
| 1077 | bytes += ['0'] * (4 - len(bytes)) |
| 1078 | bytes = [long(x) for x in bytes] |
| 1079 | for x in bytes: |
| 1080 | if x > 255 or x < 0: |
| 1081 | raise ValueError, "%r: single byte must be 0 <= byte < 256" % (ipstr) |
| 1082 | return ((bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3], 4) |
no test coverage detected