LINUX.ORG.RU

Работа с модулем multiping на python2.7

 ,


0

1

Здравствуйте!

Я использую питоновский модуль multiping (https://pypi.python.org/pypi/multiping/1.1.0) для проверки доступности узлов. На Астру устанавливаю, скачав multiping-1.1.0.tar.gz, через easy_install. Вот код работы программы:

#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-

from multiping import MultiPing

host_list = ["8.8.8.8", "127.0.0.1"]

mp = MultiPing(host_list)
mp.send()
resp = mp.receive(1)
print(resp)

Но на строке

resp = mp.receive(1)

Происходит вылет прогаммы:

Traceback (most recent call last):
  File "./test.py", line 11, in <module>
    resp = mp.receive(1)
  File "/usr/local/lib/python2.7/dist-packages/multiping-1.1.0-py2.7.egg/multiping/__init__.py", line 388, in receive
    "d", payload[:self._time_stamp_size])[0]
struct.error: unpack requires a string argument of length 8

При этом, на машине с Debian 9 модуль благополучно работет, проблем не возникает. Я даже смотрел на Астра линукс файл usr/local/lib/python2.7/dist-packages/multiping-1.1.0-py2.7.egg/multiping/__init__.py, где происходит ошибка, и выводил на экран размер структуры struct - она составляла как раз 8 байт (как и на Debian). Из-за чего может возникать такая ошибка?

Астра линукс:

# lsb_release -a
No LSB modules are available.
Distributor ID: AstraLinuxSE
Description:    Astra Linux SE 1.5 (Smolensk)
Release:        1.5
Codename:       smolensk

Программу запускаю от пользователя root.

Хм логгируй куда-нить в файлих эти payload и сравни.

Было бы забавно, если это из-за parsec`а т.к. он может модифицировать сетевые пакеты(но он модифицирует определенную область, специально для этого предназначенную так что вряд ли).

pawnhearts ★★★★ ()
Ответ на: комментарий от pawnhearts

Добавил вывод значения payload[:self._time_stamp_size]. Для Debian это такие значения, например:

0xd2899328b1a5d641
0x213b9328b1a5d641
0xba869328b1a5d641
0xaf419328b1a5d641
0x96429328b1a5d641
0x444c9328b1a5d641
0x84469328b1a5d641
0x624b9328b1a5d641
0x96429328b1a5d641
0x444c9328b1a5d641
0x84469328b1a5d641
0x624b9328b1a5d641
0x4fea9228b1a5d641
0x17f49228b1a5d641
0x4e0a9328b1a5d641

А вот, какие значение у Астры:

0x419e5a7bb1a5d641
0xcb2b5b7bb1a5d641
0xa7775b7bb1a5d641
0xb79b5b7bb1a5d641
0xce8d5b7bb1a5d641

Примерно тоже самое. Размер одинаковый. Вывожу в районе 386 строки файла /usr/local/lib/python2.7/dist-packages/multiping-1.1.0-py2.7.egg/multiping/__init__.py:

...
if pkt_id in self._remaining_ids:
    # The sending timestamp was encoded in the echo request
    # body and is now returned to us in the response. Note
    # that network byte order doesn't matter here, since we
    # get exactly the order of bytes back that we
    # originally sent from this host.
    print ''.join('{:02x}'.format(x) for x in payload[:self._time_stamp_size])
    req_sent_time = struct.unpack(
        "d", payload[:self._time_stamp_size])[0]
    results[self._id_to_addr[pkt_id]] = \
        resp_receive_time - req_sent_time
    self._remaining_ids.remove(pkt_id)
...

researcher ()

Попробуй использовать pip и virtualenv, сомнительно, чтобы их не было в репозиториях Астры. Какой версии multiping в Debian?

Вообще сам в тред зашел, чтобы кого-нибудь спросить, не может ли теоретически быть конфликтов у системного пакета и пакета в virtualenv, потыкал сейчас сам, после . bin/activate команда pip list системные пакеты не показывает, во всяком случае

mazdai ★★ ()
Последнее исправление: mazdai (всего исправлений: 1)
Ответ на: комментарий от anonymous

На дебиане питон 2.7.13-2, а на астре версия 2.7.3-6. Правда, я так и не понял, как на дебиане посатавить старую версию 2.7.3.

# aptitude install python2.7=2.7.3
Unable to find a version "2.7.3" for the package "python2.7"
Unable to apply some actions, aborting
А на астре это последняя версия питона.
# dpkg -l "python2.7*" 
ii  python2.7                2.7.3-6+deb7u2    amd64             Interactive high-level object-oriented language (versi

Версия muptiping и на астре, и на дебиане совпадает, 1.1.0.

researcher ()
Ответ на: комментарий от anonymous

Может быть есть альтернативные питон модули для множественного пинга узлов? У меня в параллельных потоках происходит сканирование доступности узлов сети, multiping благополучно справлялся на Debian, проблемы начались только при переносе на Астру. Но может есть другие аналогичные библиотеки для python2.7?

При одиночном пинге в потоках при использовании модуля ping 0.2 (https://pypi.python.org/pypi/ping/0.2) почему-то вылетает с ошибкой даже на Debian.

Exception in thread Thread-15912:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/home/alex/code/py/pinger/thready.py", line 42, in run
    status = self.__pinger.ping(ip)
  File "/home/alex/code/py/pinger/pinger.py", line 46, in ping
    status = ping.quiet_ping(ip, timeout=self.__ping_timeout, count=2)
  File "/usr/local/lib/python2.7/dist-packages/ping.py", line 250, in quiet_ping
    delay = do_one(dest_addr, timeout, psize)
  File "/usr/local/lib/python2.7/dist-packages/ping.py", line 195, in do_one
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
  File "/usr/lib/python2.7/socket.py", line 191, in __init__
    _sock = _realsocket(family, type, proto)
error: [Errno 93] Protocol not supported
Связываю это с большой нагрузкой, т.к. при одиночном пинге в тестовой программе все благополучно отрабатывает.

researcher ()