import hashlib import logging import os import socket import subprocess import uuid def get_cpu_id(): p = subprocess.Popen(["dmidecode -t 4 | grep ID"], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) data = p.stdout lines = [] while True: line = str(data.readline(), encoding="utf-8") if line == '\n': break if line: d = dict([line.strip().split(': ')]) lines.append(d) else: break return lines def get_board_serialnumber(): p = subprocess.Popen(["dmidecode -t 2 | grep Serial"], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) data = p.stdout lines = [] while True: line = str(data.readline(), encoding="utf-8") if line == '\n': break if line: d = dict([line.strip().split(': ')]) lines.append(d) else: break return lines def get_identify_code(): mac = uuid.UUID(int=uuid.getnode()).hex[-12:] mac_addr = ":".join([mac[e:e + 2] for e in range(0, 11, 2)]) host_name = socket.getfqdn(socket.gethostname()) cpu_ids = get_cpu_id() serialnumbers = get_board_serialnumber() s = "" if mac_addr: s += mac_addr if host_name: s += host_name if cpu_ids: for cpu in cpu_ids: s += cpu["ID"] if serialnumbers: for number in serialnumbers: s += number["Serial Number"] logging.info(s) code = hashlib.new('md5', s.encode("utf8")).hexdigest() return code def get_system_uuid(): # 获取系统uuid # 这个 UUID 是与硬件相关的,因此即使在 Docker 容器中,它也应该是唯一的,可以用来标识宿主机,而不是容器本身。 with open("/sys/class/dmi/id/product_uuid", "r") as f: host_uuid = f.read().strip() return host_uuid def get_docker_container_id(): # 获取当前 Docker 容器的 ID cmd = "cat /proc/self/cgroup" output = os.popen(cmd) rests = output.readlines() container_message = rests[-1] if not container_message: container_id = "abc" else: container_id = container_message.strip().split("docker/")[-1] return container_id