import socket import requests def generate_node_nickname(): """ Generates a temporary unit registration ID in the format: "Node-{last octet of local IP}-{last octet of public IP}". This ID is intended for initial unit registration and will be replaced by a server-generated GUID upon assignment. Returns: str: The formatted registration ID. """ local_ip_octet = "unknown" public_ip_octet = "unknown" # Get the last octet of the local IP address try: # Create a UDP socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Connect to an external host (Google's DNS) to get the local IP # This doesn't send any data, just establishes a connection for getsockname() s.connect(("1.1.1.1", 80)) local_ip = s.getsockname()[0] s.close() local_ip_octet = local_ip.split('.')[-1] except Exception as e: print(f"Warning: Could not determine local IP address. Error: {e}") # Get the last octet of the public IP address using an external service try: # Use ipify.org to get the public IP (a widely used, simple service) response = requests.get('https://api.ipify.org?format=json') response.raise_for_status() # Raise an HTTPError for bad responses (4xx or 5xx) public_ip = response.json()['ip'] public_ip_octet = public_ip.split('.')[-1] except requests.exceptions.RequestException as e: print(f"Warning: Could not determine public IP address. Error: {e}") except ValueError as e: print(f"Warning: Could not parse public IP response. Error: {e}") return f"Node-{local_ip_octet}-{public_ip_octet}"