########################################################################
#
#  Copyright (C) 2009, CZ.NIC, z.s.p.o.
# 
#  This file is part of dnstester.
#
#  dnstester is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  dnstester 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, see <http://www.gnu.org/licenses/>.
#
########################################################################

from subprocess import Popen, PIPE
import re, traceback, sys, string
import misc

def host_addresses():

    try:
        ip = Popen(args=['/sbin/ip', 'addr', 'show'], stdout=PIPE, stderr=PIPE)
        retcode = ip.wait()
        ferr = ip.stderr
        log = misc.readall(ferr)
    except Exception, e:
        retcode = -1
        log = traceback.format_exc()

    if retcode == 0:

        fout = ip.stdout
        line = fout.readline()

        addresses = []
        ipv4 = re.compile(r'    inet ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2})')
        ipv6 = re.compile(r'    inet6 ([a-f0-9:]{2,39}/[0-9]{1,2})')

        while line != "":

            match = ipv4.match(line)
            if match:
                addresses.append(match.group(1))
            else:
                match = ipv6.match(line)
                if match:
                    addresses.append(match.group(1))

            line = fout.readline()

        return addresses, log
    else:
        return None, log
