Всем доброго времени суток.
Вот такой скрипт
Отлично работает в Windows. То есть суть такая, запускаю скрипт, он слушает порт 9999 по magic пакету (wol). с телефона посылаю на этот порт пакет и соответственно в зависимости от ОС (это в условии скрипта) выполняется команда.
Так вот в Arch запускаю, netstat -tulpan показывает, что порт слушается, отправляю с телефона пакет и ничего не происходит, хотя должна быть перезагрузка. Команду отдельно проверял - os.system("reboot") работает.
Кто на опыте, подскажите в чём проблема?
ПС. Файервол не стоит, iptables -L всё стоит на ACCEPT.
Вот такой скрипт
Python:
import socket
import os
import logging
import psutil
WOL_PORT = 9999
INTERFACE_NAME = "My Lan"
INTERFACE_NAME_ARCH = "enp37s0"
logging.basicConfig(format="%(levelname)s: %(asctime)s %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)
def get_ip_mac_address(interface_name: str) -> tuple:
ip_addr = mac_addr = None
for item in psutil.net_if_addrs()[interface_name]:
addr = item.address
if "." in addr:
ip_addr = addr
elif ("-" in addr or ":" in addr) and "::" not in addr:
mac_addr = addr.replace(":", "-").upper()
if not ip_addr or not mac_addr or ip_addr == "127.0.0.1":
raise "Не удалось получить IP или MAC-адрес сетевого интерфейса"
return ip_addr, mac_addr
def assemble_wol_packet(mac_address: str) -> str:
return f'{"FF-" * 6}{(mac_address + "-") * 16}'
def check_is_wol_packet(raw_bytes: bytes, assembled_wol_packet: str) -> int:
decoded_packet_data = "-".join(f"{byte:02x}" for byte in raw_bytes).upper() + "-"
if decoded_packet_data == assembled_wol_packet:
return 1
return 0
def run_udp_port_listener(port: int, interface_name: str):
ip_addr, mac_addr = get_ip_mac_address(interface_name)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind((ip_addr, port))
logger.info(f"Listening on {ip_addr}:{port}")
assembled_wol_packet = assemble_wol_packet(mac_addr)
while True:
data, _ = server_socket.recvfrom(1024)
is_wol_packet = check_is_wol_packet(data, assembled_wol_packet)
if is_wol_packet == 1:
if os.name == "posix":
os.system("reboot")
elif os.name == "nt":
os.system(
"shutdown -r -t 0 -f"
)
if os.name == "posix":
run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH)
elif os.name == "nt":
run_udp_port_listener(WOL_PORT, INTERFACE_NAME)
Отлично работает в Windows. То есть суть такая, запускаю скрипт, он слушает порт 9999 по magic пакету (wol). с телефона посылаю на этот порт пакет и соответственно в зависимости от ОС (это в условии скрипта) выполняется команда.
Так вот в Arch запускаю, netstat -tulpan показывает, что порт слушается, отправляю с телефона пакет и ничего не происходит, хотя должна быть перезагрузка. Команду отдельно проверял - os.system("reboot") работает.
Кто на опыте, подскажите в чём проблема?
ПС. Файервол не стоит, iptables -L всё стоит на ACCEPT.