import datetime import fcntl import socket import struct from contextlib import contextmanager from enum import Enum from ereuse_utils import Dumpeable class Severity(Enum): Info = 'Info' Error = 'Error' def get_hw_addr(ifname): # http://stackoverflow.com/a/4789267/1538221 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15])) return ':'.join('%02x' % ord(char) for char in info[18:24]) class Measurable(Dumpeable): """A base class that allows measuring execution times.""" def __init__(self) -> None: super().__init__() self.elapsed = None @contextmanager def measure(self): init = datetime.datetime.now(datetime.timezone.utc) yield self.elapsed = datetime.datetime.now(datetime.timezone.utc) - init try: assert self.elapsed.total_seconds() > 0 except AssertionError: self.elapsed = datetime.timedelta(seconds=0)