Bird 2.0 includes IPv4 and IPv6 support in a single daemon. When UNIFIED_DAEMON is set to True, queries are always done with the "ipv4" backend (which handles both protocols), and distinctions between IPv4 and IPv4 are removed in the UI.
111 lines
2.5 KiB
Python
111 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vim: ts=4
|
|
###
|
|
#
|
|
# Copyright (c) 2006 Mehdi Abaakouk
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 3 as
|
|
# published by the Free Software Foundation
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
#
|
|
###
|
|
|
|
from dns import resolver
|
|
import socket
|
|
import pickle
|
|
import xml.parsers.expat
|
|
|
|
resolv = resolver.Resolver()
|
|
resolv.timeout = 0.5
|
|
resolv.lifetime = 1
|
|
|
|
def resolve(n, q):
|
|
return str(resolv.query(n,q)[0])
|
|
|
|
def resolve_any(h):
|
|
try:
|
|
return resolve(h, "AAAA")
|
|
except:
|
|
pass
|
|
return resolve(h, "A")
|
|
|
|
|
|
def mask_is_valid(n):
|
|
if not n:
|
|
return True
|
|
try:
|
|
mask = int(n)
|
|
return ( mask >= 1 and mask <= 128)
|
|
except:
|
|
return False
|
|
|
|
def ip_is_valid(n):
|
|
return ipv4_is_valid(n) or ipv6_is_valid(n)
|
|
|
|
def ipv4_is_valid(n):
|
|
try:
|
|
socket.inet_pton(socket.AF_INET, n)
|
|
return True
|
|
except socket.error:
|
|
return False
|
|
|
|
def ipv6_is_valid(n):
|
|
try:
|
|
socket.inet_pton(socket.AF_INET6, n)
|
|
return True
|
|
except socket.error:
|
|
return False
|
|
|
|
def save_cache_pickle(filename, data):
|
|
output = open(filename, 'wb')
|
|
pickle.dump(data, output)
|
|
output.close()
|
|
|
|
def load_cache_pickle(filename, default = None):
|
|
try:
|
|
pkl_file = open(filename, 'rb')
|
|
except IOError:
|
|
return default
|
|
try:
|
|
data = pickle.load(pkl_file)
|
|
except:
|
|
data = default
|
|
pkl_file.close()
|
|
return data
|
|
|
|
def unescape(s):
|
|
want_unicode = False
|
|
if isinstance(s, unicode):
|
|
s = s.encode("utf-8")
|
|
want_unicode = True
|
|
|
|
# the rest of this assumes that `s` is UTF-8
|
|
list = []
|
|
|
|
# create and initialize a parser object
|
|
p = xml.parsers.expat.ParserCreate("utf-8")
|
|
p.buffer_text = True
|
|
p.returns_unicode = want_unicode
|
|
p.CharacterDataHandler = list.append
|
|
|
|
# parse the data wrapped in a dummy element
|
|
# (needed so the "document" is well-formed)
|
|
p.Parse("<e>", 0)
|
|
p.Parse(s, 0)
|
|
p.Parse("</e>", 1)
|
|
|
|
# join the extracted strings and return
|
|
es = ""
|
|
if want_unicode:
|
|
es = u""
|
|
return es.join(list)
|