Задать вопрос

Почему не выполняется параметр функции?

Есть вот такой
Скрипт
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('D:\\EasyUEFI\\bin\\EasyUEFIC.exe --one-time-boot --index 6 & 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 происходит перезагрузка в Arch (в конце скрипта), а вот если запускаю в Arch, то перезагрузка не происходит (порт слушается).
Почему?
  • Вопрос задан
  • 155 просмотров
Подписаться 1 Простой 17 комментариев
Решения вопроса 1
BlagoYar
@BlagoYar Автор вопроса
Всё, как всегда просто. Нужно с телефона (в моём случае; или с устройства, с которого посылается пакет) указывать не только mac адрес (как в случае с Windows), но и IP, то есть, например скриптом termux-а на андроид прописываю такую команду:
wol -p [порт] -h [ip] [mac-address]

На Windows достаточно так
wol -p [порт] [mac-address]

ПС. Все спасибо за помощь!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы