summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Basti <mbasti@redhat.com>2016-04-13 16:14:42 +0200
committerMartin Basti <mbasti@redhat.com>2016-04-14 13:53:27 +0200
commit70fd78928cb874006f218ae4e7aca00e0babf99a (patch)
tree6e9a51b711bb5bff59eb4e96afa366fcc4f0c1ff /client
parent62bb478e112cd4677e681f4750c5f5e5c9221607 (diff)
Use netifaces module instead of 'ip' command
Netifaces allows to get addresses from local interfaces of the host in safer way than parsing output of the ip command. https://fedorahosted.org/freeipa/ticket/5591 Reviewed-By: David Kupka <dkupka@redhat.com>
Diffstat (limited to 'client')
-rwxr-xr-xclient/ipa-client-install45
1 files changed, 19 insertions, 26 deletions
diff --git a/client/ipa-client-install b/client/ipa-client-install
index be203586a..c38843f85 100755
--- a/client/ipa-client-install
+++ b/client/ipa-client-install
@@ -33,6 +33,7 @@ try:
from optparse import SUPPRESS_HELP, OptionGroup, OptionValueError
import dns
import gssapi
+ import netifaces
import nss.nss as nss
import SSSDConfig
@@ -1526,39 +1527,31 @@ def unconfigure_nisdomain():
def get_iface_from_ip(ip_addr):
- result = ipautil.run([paths.IP, '-oneline', 'address', 'show'],
- capture_output=True)
- for line in result.output.split('\n'):
- fields = line.split()
- if len(fields) < 6:
- continue
- if fields[2] not in ['inet', 'inet6']:
- continue
- (ip, mask) = fields[3].rsplit('/', 1)
- if ip == ip_addr:
- return fields[1]
+ for interface in netifaces.interfaces():
+ if_addrs = netifaces.ifaddresses(interface)
+ for family in [netifaces.AF_INET, netifaces.AF_INET6]:
+ for ip in if_addrs.get(family, []):
+ if ip['addr'] == ip_addr:
+ return interface
else:
raise RuntimeError("IP %s not assigned to any interface." % ip_addr)
def get_local_ipaddresses(iface=None):
- args = [paths.IP, '-oneline', 'address', 'show']
if iface:
- args += ['dev', iface]
- result = ipautil.run(args, capture_output=True)
- lines = result.output.split('\n')
+ interfaces = [iface]
+ else:
+ interfaces = netifaces.interfaces()
+
ips = []
- for line in lines:
- fields = line.split()
- if len(fields) < 6:
- continue
- if fields[2] not in ['inet', 'inet6']:
- continue
- (ip, mask) = fields[3].rsplit('/', 1)
- try:
- ips.append(ipautil.CheckedIPAddress(ip))
- except ValueError:
- continue
+ for interface in interfaces:
+ if_addrs = netifaces.ifaddresses(interface)
+ for family in [netifaces.AF_INET, netifaces.AF_INET6]:
+ for ip in if_addrs.get(family, []):
+ try:
+ ips.append(ipautil.CheckedIPAddress(ip['addr']))
+ except ValueError:
+ continue
return ips