Source code for hio.core.coring

# -*- encoding: utf-8 -*-
"""
hio.core.coring Module
"""

import subprocess
import socket

import netifaces

from ..hioing import ValidationError


[docs]def normalizeHost(host): """ Returns ip address host string in normalized dotted form or empty string converts host parameter which may be the dns name or ip address Prefers ipv4 addresses over ipv6 in that it will only return the ipv6 address if no ipv4 address equivalent is available """ if host == "": host = "0.0.0.0" try: # try ipv4 info = socket.getaddrinfo(host, None, socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP, 0) except socket.gaierror as ex: # try ipv6 if host in ("", "0.0.0.0"): host = "::" info = socket.getaddrinfo(host, None, socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_IP, 0) if not info: raise ValidationError("Cannot resolve address for host '{0}'".format(host)) host = info[0][4][0] return host
[docs]def getDefaultHost(): """ Returns host ip address of default interface using netifaces """ iface = netifaces.gateways()['default'][netifaces.AF_INET][1] info = netifaces.ifaddresses(iface)[netifaces.AF_INET][0] host = info['addr'] return host
[docs]def getDefaultBroadcast(): """ Returns broadcast ip address of default interface using netifaces """ iface = netifaces.gateways()['default'][netifaces.AF_INET][1] info = netifaces.ifaddresses(iface)[netifaces.AF_INET][0] bcast = info['broadcast'] return bcast
[docs]def arpCreate(ether, host, interface="en0", temp=True): """ Create arp entry for ethernet mac address ether at ip address host on interface If temp is false then the entry is permanent otherwise its temporary Assumes added /etc/sudoers entry to run arp with no password for user's group $ sudo visudo ## Group to run arp as root with no password Cmnd_Alias ARP = /usr/sbin/arp %arp_group ALL=(ALL) NOPASSWD: ARP """ temp = "temp" if temp else "" console.terse("{0}: Creating {1} arp entry for {2} at {3} on {4}\n".format( datetime.datetime.utcnow().isoformat(), temp, ether, host, interface)) console.flush() # sudo arp -s 10.0.2.49 70:b3:d5:0:e0:30 ifscope en3 temp try: process = subprocess.run(["sudo", "/usr/sbin/arp", "-s", host, ether, "ifscope", interface, temp], check=True) except subprocess.SubprocessError as ex: console.terse("{0}: Failed Creation of {1} arp entry for {2} at {3} on {4}\n".format( datetime.datetime.utcnow().isoformat(), temp, ether, host, interface)) console.flush()
[docs]def arpDelete(host, interface="en0"): """ Delete arp entry for ip address host on interface Assumes added /etc/sudoers entry to run arp with no password for user's group $ sudo visudo ## Group to run arp as root with no password Cmnd_Alias ARP = /usr/sbin/arp %arp_group ALL=(ALL) NOPASSWD: ARP """ console.terse("{0}: Deleting arp entry at {1} on {2}\n".format( datetime.datetime.utcnow().isoformat(), host, interface)) console.flush() # sudo arp -d 10.0.2.49 ifscope en3 try: process = subprocess.run(["sudo", "/usr/sbin/arp", "-d", host, "ifscope", interface], check=True) except subprocess.SubprocessError as ex: console.terse("{0}: Failed Deletion of arp entry at {1} on {2}\n".format( datetime.datetime.utcnow().isoformat(), host, interface)) console.flush()