Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
1

Работающий сканер доступности узлов по пингу с использованием multiprocessing

14.10.2019, 08:57. Показов 3465. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Выкладываю на обсуждение и улучшение такую маленькую программу.
Входные данные из файла adresa.txt.
Обязательное требование к содержимому этого файла: ip-адрес потом символ таб потом строка описание узла
Никаких дополнительных символов быть не должно.
Кто что может предложить улучшить - дерзайте.
Кому надо пользуйтесь.
Вопросы есть задавайте отвечу по мере сил.

Всем доброго бобра.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- encoding: utf-8 -*-
 
from __future__ import print_function
import os
from multiprocessing import Pool
import datetime
import time
 
def scan(adres):
  n = 0
  for k in range(c):
    response = os.system('ping ' + adres[0:adres.find('\t')] + ' -c 1 > null')
    if i != 0: time.sleep(i)
    if response != 0: n = n + 1
  if n != 0:
    if n == c: return 'Не доступен\t\t- ' + adres
    else: return 'Доступен ' + str(c-n) + ' из ' + str(c) + '\t- ' + adres
  else: return 'Доступен'
 
if __name__ == '__main__':
  adresa = []
  adresa_file = open('/home/ant/IMTC/adresa.txt', 'r')
  for line in adresa_file: adresa.append(line.rstrip())
  adresa_file.close()
 
  c = 10
  i = 1
  print ('------------------------')
  print ('------------------------')
  print ('Опрашиваем объектов -',len(adresa))
  print ('Количество запросов к каждому -',c)
  print ('Интервал опроса -',i)
  print ('\n'.join(adresa))
 
  print ('Время начала опроса\t-',datetime.datetime.today().strftime('%Y-%m-%d--%H:%M:%S'))
  result = Pool(processes=len(adresa)).map(scan, adresa)
  print ('Время окончания опроса\t-',datetime.datetime.today().strftime('%Y-%m-%d--%H:%M:%S'))
 
  for item in range(result.count('Доступен')): result.remove('Доступен')
  print ('\n'.join(map(str, result)))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2019, 08:57
Ответы с готовыми решениями:

Проверка доступности интернет-узлов
Всем привет,Подскажите как организовать батник,что бы он проверял на доступность 2 интернет узла ...

Изменение модификаторов доступности методов и полей стороннего класса с использованием рефлексии
Мне необходимо осуществить изменение модификаторов доступности методов и полей стороннего класса с...

Просчитать путь прохождение конем шахматной доски (с использованием эвристики доступности)
Изучаю с++, наткнулся в учебнике на задачу - просчитать путь прохождение конем шахматной доски +...

Несовместимость по доступности: доступность типа параметра ниже доступности метода
Всем привет! Делаю задание на тему наследия классов. Есть класс «Поликлиника». Туда нужно загрузить...

28
Alli_Lupin
24.10.2019, 15:20     Работающий сканер доступности узлов по пингу с использованием multiprocessing
  #21

Не по теме:

alexskr, так без него даже колесо не переизобрести) у меня по первости они квадратными выходили))

0
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
24.10.2019, 15:36  [ТС] 22
вот нашел ссылку по которой сравнивал что мне лучше
там вообще очень много интересного

http://onreader.mdl.ru/Masteri... /Ch06.html
1
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
06.11.2019, 15:33  [ТС] 23
окончательный вариант сканера выглядит так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- encoding: utf-8 -*-
 
from __future__ import print_function
import os
from multiprocessing import Pool
import multiprocessing
import datetime
import time
 
#--------------------------------------------------------------------------------------------------------------------------------------------
# задаем параметры опроса
source_ip_adresa = '/home/ant/IMTC/adresa.txt'                                                  # расположения файла с адресами
file_output = '/home/ant/IMTC/ping/'+datetime.datetime.today().strftime('%Y-%m-%d')+'-pingpong.output'  # расположение файла с результатами опроса
i = 1                                                                                           # интервал между запросами
#--------------------------------------------------------------------------------------------------------------------------------------------
 
def scan(adres):
  if os.system('ping -c 1 -W 5 ' + adres[0:adres.find('\t')] + ' > null') != 0:
    return datetime.datetime.today().strftime('%Y-%m-%d--%H:%M:%S') + '\t' + adres
 
def print_parametr():
  f.write('\n'+'-'*44+'\n')
  f.write('Опрашиваем объектов - '+str(len(adresa))+'\n')
  f.write('Интервал опроса - '+str(i)+'\n')
  f.write('\n'.join(adresa))
  f.write('\n'+'-'*44+'\n')
 
def input_file():
  if datetime.datetime.now()-datetime.datetime.fromtimestamp(os.path.getmtime(source_ip_adresa)) <= 420:
    print_parametr()
  adresa = [x.rstrip() for x in open(source_ip_adresa)] 
 
if __name__ == '__main__':
  try:
    if os.path.isfile(file_output):
      f = open(file_output, 'a')
    else:
      f = open(file_output, 'w')
      print_parametr()
 
  finally:
    f.close()
 
  for c in range(10):
    result = Pool(processes=len(adresa)).map(scan, adresa)
    for string in result:
      if string != None: print(string)
данное удовольствие запускается через CRON каждые 7 минут
перед каждым опросом он сравнивает текущее время
и время последнего изменения файла с входными данными
если что-то там изменилось за последние семь минут
то в выходной файл выводится список сканируемых на данный момент адресов
и собственно происходит само сканирование

данная версия работает уже несколько дней
пока замечаний нет

Добавлено через 11 минут
извиняюсь вставил немного другой код
исправляюсь

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- encoding: utf-8 -*-
 
from __future__ import print_function
import os
from multiprocessing import Pool
import datetime
import time
 
#--------------------------------------------------------------------------------------------------------------------------------------------
# задаем параметры опроса
source_ip_adresa = '/home/ant/IMTC/adresa.txt'                                                  # расположения файла с адресами
file_output = '/home/ant/IMTC/ping/'+datetime.datetime.today().strftime('%Y-%m-%d')+'.output'   # расположение файла с результатами опроса
c = 10                                                                                          # количество запросов (сколько раз даем пинг)
i = 1                                                                                           # интервал между запросами
#--------------------------------------------------------------------------------------------------------------------------------------------
def scan(adres):
  n = 0                                                                                         # счетчик пингов на которые объект не ответил
  for k in range(c):                                                                            # собственно сам цикл пингования
    response = os.system('ping -c 1 -W 5 ' + adres[0:adres.find('\t')] + ' > /dev/null')
    if response != 0: n = n + 1                                                                 # если нет ответа на пинг увеличиваем счетчик
    if i != 0: time.sleep(i)                                                                    # если задан интервал между пингами ждем указанное время
  if n != 0:                                                                                    # если какие либо пинги не прошли то анализируем
    if n == c: return 'Не доступен\t\t' + adres                                                 # если не прошли все то обект недоступен
    else: return 'Доступен ' + str(c-n) + ' из ' + str(c) + '\t' + adres                        # если не прошла только часть пингов то доступен частично
  else: return 'Доступен'                                                                       # если счетчик непрошедших пингов равен нулю то объект доступен
 
def print_parametr():
  f.write('Опрашиваем объектов - '+str(len(adresa))+'\n')                                       # количество опрашиваемых объектов
  f.write('Количество запросов к каждому - '+str(c)+'\n')                                       # количество пингов посылаемых к каждому объекту
  f.write('Интервал опроса - '+str(i)+'\n')                                                     # интервал между пингами в секундах
  f.write('\n'.join(adresa))                                                                    # список объектов
  f.write('\n'+'-'*44+'\n')
 
if __name__ == '__main__':
  adresa = [x.rstrip() for x in open(source_ip_adresa)]                                         # считываем адреса из файла в список
  try:
    if os.path.isfile(file_output):
      f = open(file_output, 'a')
    else:
      f = open(file_output, 'w')
      print_parametr()
    izmeneno = datetime.datetime.now()-datetime.datetime.fromtimestamp(os.path.getmtime(source_ip_adresa))
    if izmeneno.seconds <= 420: print_parametr()
    f.write('Время начала опроса\t')
    f.write(datetime.datetime.today().strftime('%Y-%m-%d--%H:%M:%S\n'))
    result = Pool(processes=len(adresa)).map(scan, adresa)
    f.write('Время окончания опроса\t')
    f.write(datetime.datetime.today().strftime('%Y-%m-%d--%H:%M:%S\n'))
    for item in range(len(result)):
     if result[item] != 'Доступен':
       f.write(result[item]+'\n')
    f.write('-'*44+'\n')
  finally:
    f.close()
на этом пока останавливаюсь
есть задумка как организовать круглосуточное периродическое сканирование
запустив скрипт в режиме демона

как будет результат отзвонюсь

всем доброго бобра
0
2 / 2 / 0
Регистрация: 09.08.2016
Сообщений: 40
06.11.2019, 18:16 24
код отличный и полезный!

from __future__ import print_function

что у тебя делает не пойму?
1
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
06.11.2019, 22:18  [ТС] 25
точно - уже не нужно
в одной из предыдущих версий писалось не в файл
а выводилось на экран
спасибо за поправку
0
Эксперт по компьютерным сетям
490 / 89 / 18
Регистрация: 01.12.2009
Сообщений: 370
Записей в блоге: 1
11.11.2019, 16:14 26
Цитата Сообщение от fynhjgjd Посмотреть сообщение
Python
1
2
3
if __name__ == '__main__':
 adresa = [x.rstrip() for x in open(source_ip_adresa)]
...
я так понимаю, если файлика нет, валимся в эксепшн?)
0
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
16.11.2019, 21:53  [ТС] 27
Да, походу так и будет.
Но файл там быть должен иначе зачем это все.
0
Эксперт по компьютерным сетям
490 / 89 / 18
Регистрация: 01.12.2009
Сообщений: 370
Записей в блоге: 1
16.11.2019, 22:19 28
С одной стороны, я вас понимаю - код писался с определенной целью под определенные условия.
С другой стороны, имхо, даже в этом случае не лишним будет обработать пограничные ситуации. Например, раз скрипт выполняется по крону, сделать обработку такого исключения с записью в лог-файл, мало ли, файл будет удален злоумышленником
0
2 / 2 / 1
Регистрация: 20.06.2018
Сообщений: 17
18.11.2019, 13:31  [ТС] 29
Да все правильно
для этого и выкладывал сюда - чтобы указали на ошибки и как можно сделать лучше
что было кардинального исправил
как уже писал эта тема для меня исчерпана
сейчас новый подход
так что то что есть так и будет я на это больше времени тратить не буду
но все добавленное учту при реализации следующей идеи

так что указание - большое спасибо
это не уйдет в никуда

может еще кто-нибудь на что-нибудь укажет
все учтем в будущем
0
18.11.2019, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2019, 13:31
Помогаю со студенческими работами здесь

Допуск по пингу
Здравствуйте, дорогие форумчане. Кто может, напишите, пожалуйста, код, смысл такой: есть сайт, на...

Сканер портов с использованием select-a
Доброе утро! Имеется задание на курсовой: Сканер открытых TCP портов. Сканирует порты в заданном...

Взаимодействие узлов с использованием стека протоколов TCP/IP.
Взаимодействие узлов с использованием стека протоколов TCP/IP.

Несогласованность по доступности: доступность типа параметров "DTreeNode" ниже доступности метода TaskForm.Display
public void Display( int x, int y, int deltaY, int k, DTreeNode rt) { if (rt...

Вычислить сумму значений функции f(x) на сетке узлов с использованием условного оператора IF
Всем привет! Разбираюсь с маткадом, только началась такая дисциплина в вузе, помогите, пожалуйста!...

Несовместимость по доступности: доступность типа поля 1 ниже доступности поля 2
Создаю базу данных C# WPF при попытки создать класс появилась ошибка: &quot;Несовместимость по...

Multiprocessing Queue vs multiprocessing.Manager Queue
Если кому интересно: обычная Queue из мультитпроцессинга имеет ограничение по размеру, если туда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru