OS detection, hostname get/set, get ip address on all platforms
Preperation for fl0w network discovery.
This commit is contained in:
parent
1e5674dd8f
commit
829000e387
1 changed files with 62 additions and 1 deletions
|
@ -1,6 +1,14 @@
|
|||
from traceback import print_exception
|
||||
from sys import exc_info
|
||||
import platform
|
||||
import os
|
||||
import struct
|
||||
import socket
|
||||
import fcntl
|
||||
|
||||
class HostnameNotChangedError(PermissionError):
|
||||
def __init__(self):
|
||||
super(PermissionError, self).__init__("hostname could not be changed")
|
||||
|
||||
def capture_trace():
|
||||
exc_type, exc_value, exc_traceback = exc_info()
|
||||
|
@ -8,4 +16,57 @@ def capture_trace():
|
|||
|
||||
|
||||
def is_wallaby():
|
||||
return "3.18.21-custom" in platform.uname().release
|
||||
return "3.18.21-custom" in platform.uname().release
|
||||
|
||||
|
||||
def is_linux():
|
||||
return platform.uname().system == "Linux"
|
||||
|
||||
|
||||
def is_darwin():
|
||||
return platform.uname().system == "Darwin"
|
||||
|
||||
|
||||
def is_windows():
|
||||
return platform.uname().system == "Windows"
|
||||
|
||||
|
||||
def set_hostname(hostname):
|
||||
if is_linux():
|
||||
if os.geteuid() == 0:
|
||||
open("/etc/hostname", "w").write(hostname)
|
||||
else:
|
||||
raise HostnameNotChangedError()
|
||||
elif is_darwin():
|
||||
if os.geteuid() == 0:
|
||||
subprocess.check_call(["scutil", "--set", "HostName", hostname])
|
||||
else:
|
||||
raise HostnameNotChangedError()
|
||||
else:
|
||||
raise HostnameNotChangedError()
|
||||
|
||||
|
||||
def get_hostname():
|
||||
return platform.uname().node
|
||||
|
||||
|
||||
def get_ip_address(ifname=None):
|
||||
if ifname:
|
||||
if is_linux():
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
try:
|
||||
return socket.inet_ntoa(fcntl.ioctl(
|
||||
s.fileno(),
|
||||
0x8915, # SIOCGIFADDR
|
||||
struct.pack('256s', ifname[:15].encode()))[20:24])
|
||||
except OSError:
|
||||
pass
|
||||
else:
|
||||
if is_darwin() or is_windows():
|
||||
return socket.gethostbyname(socket.gethostname())
|
||||
if is_linux():
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
sock.connect(('8.8.8.8', 53))
|
||||
ip_address = sock.getsockname()[0]
|
||||
sock.close()
|
||||
return ip_address
|
||||
|
|
Reference in a new issue