Сен 4

Это не мое. Использовались python и php скрипты c

http://forum.nag.ru/forum/index.php?showtopic=80677

https://www.evernote.com/shard/s185/sh/ceb0b021-47e7-4c61-ab43-bc6db27fe919/c535b6e5047ec69d304519fe81c2c9ac?noteKey=c535b6e5047ec69d304519fe81c2c9ac&noteGuid=ceb0b021-47e7-4c61-ab43-bc6db27fe919

Для корректной работы их пришлось немного модифицировать.

Задачи:

  1. Получить с сайта реестра запрещенных ресурсов выгрузку в формате xml
  2. Сделать парсинг — извлечь ip и url адреса из файла выгрузки
  3. Закинуть это на маршрутизатор mikrotik

1. Для получения будем использовать python-скрипты от автора Pavel Yegorov

zapretinfo.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__version__ = «0.0.4»
__author__ = «Pavel Yegorov»

import suds
from base64 import b64encode

#API_URL = «http://www.zapret-info.gov.ru/services/OperatorRequest/?wsdl»
API_URL = «http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl»

В нем мы изменили api_url на новый.

zapret_checker.py

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
# yegorov-p.ru
from xml.etree.ElementTree import ElementTree
from datetime import datetime,timedelta
from zapretinfo import ZapretInfo
import time
import zipfile
from base64 import b64decode

XML_FILE_NAME = «/data/reestr/request.xml»
P7S_FILE_NAME = «/data/reestr/request.xml.sig»

Где XML_FILE_NAME и P7S_FILE_NAME файл запроса и файл запроса, подписанный цифровой подписью. Последний может иметь расширения sign, sig, p7s.

Файл запроса должен быть в формате cp1251.

<?xml version=»1.0″ encoding=»windows-1251″?>
<request>
    <requestTime>2012-10-01T01:01:01.000+04:00</requestTime>
    <operatorName>имя оператора</operatorName>
    <inn>ИНН оператора</inn>
    <ogrn>ОГРН оператора</ogrn>
    <email>обратная связь</email>
</request>

Как пишут на http://habrahabr.ru/sandbox/51575/ реально проверяются только ИНН и ОГРН. Я убедился, что можно сколь угодно раз посылать эти два файла и получать выгрузку. Хотя по идее, они должны сверять дату.

Файл провайдер подписывал в Крипто-ПРО. Ее можно установить в пробном режиме на 30 дней. Можно каждый раз создавать новый файл запроса (в вышеуказанных ссылках в скриптах он генерируется) и подписывать через openssl, как, например, здесь http://blog.timba.org.ua/post/1896.

Чтобы скрипт работал, должен быть установлен python2.6 или 2.7 (в версии 3 скрипт не работает. Я тестировал на 2.7) и модуль suds

Python2.7 ставим из портов

cd /usr/ports/lang/python27

make install clean

Модуль suds тоже из портов

cd /usr/ports/net/py-suds

make install clean

или вручную http://www.py-my.ru/post/4e818bd81d41c821a9000003#!

wget https://fedorahosted.org/releases/s/u/suds/python-suds-0.4.tar.gz
tar -xzf python-suds-0.4.tar.gz
cd python-suds-0.4/
python setup.py build
sudo python setup.py install


Присвоим скрипту права на выполнение и запускаем скрипт

chmod +x zapret_checker.py

./zapret_checker.py

В итоге сразу же отобразится идентификатор запроса, через некоторое время (7-10 минут) после фраз «Try it now…» появится фраза «Got in!», что означает, что дамп реестра получен. Этот файл называется dump.xml.

2. Теперь перейдем к парсингу и закидыванию адресов в mikrotik.

В версии скрипта для php есть способ закидывания ip и url в базу данных mysql. Также этот скрипт может подписывать и генерировать xml запрос, кидать его на сайт Роскомнадзора и получать ту же выгрузку. Так как я не сильно силен в php и python, скрипт php почему-то не пошел. Поэтому я убрал из него ненужные функции и оставил только закидывание в БД и на микротик. По сути, в начало скрипта я добавил

exec(‘ssh login@ip /ip firewall address remove [find list=blocklist]’);

Этим мы очистим blocklist. О нем расскажу позже. И в конец файла в цикл работы с базой данных добавляем

exec(«ssh login@ip /ip firewall address-list add list=blocklist address=’$ips'»);

Также вводим параметры подключения к БД

    $db = Database::obtain
    (
        ‘127.0.0.1’,    
        ‘login’,         
        ‘password’,           
        ‘rzs’     
    );

rzs‘   — имя базы данных. Ее необходимо предварительно создать и подготовить. В ней два поля: ip и url. Первое поле тип INT, второе TEXT.

Присвоим скрипту права на выполнение и запускаем скрипт

chmod +x parser.php

./parser.php

3.  Немного о маршрутизаторе Mikrotik. Для начала необходимо добавить в него логин без пароля и предоставить этому логину доступ к ssh с ip  сервера, на котором лежат скрипты. После этого с сервера необходимо один раз подключиться по ssh к Mikrotik, чтобы сервер запомнил ключи ssh. Я осуществил блокировку через access-list, хотя в интернете есть реализация под layer 7, но там вся процедура получения,парсинга и закидывания на Mikrotik описана на языке С.

Закидываем скрипты в cron.

crontab -e

Добавляем

45      9       *       *       *       root    cd /data/reestr/; /data/reestr/zapret_checker.py
0       10      *       *       *       root    cd /data/reestr/; /data/reestr/parser.php

Между скриптами 15 минутный перерыв, так как между запросом и выгрузкой необходимо подождать несколько минут.

Все скрипты в архиве…reestr_mikrotik

UPD: Вышло обновление статьи. Читать Выгрузка реестра запрещенных ресурсов на Mikrotik через сервер с FreeBSD. 2.0

 

 

15 комментариев на “Выгрузка реестра запрещенных ресурсов на Mikrotik через сервер с FreeBSD”

  1. Тимур высказал:

    после выполнение скрипта zapret_checker.py выходит следующее: (Win7)
    F:\Windows\system32>F:\Python27\python.exe F:\zapret_checker.py
    Got code 877c995fbc8fa900014daf8919dec7dc
    Trying to get result…
    Not ready yet.
    Not ready yet.
    Got it!
    Traceback (most recent call last):
    File «F:\zapret_checker.py», line 45, in
    file = open(‘result.zip’, «wb»)
    IOError: [Errno 13] Permission denied: ‘result.zip’

  2. Сергей Лысёнков высказал:

    необходимо адаптировать скрипт под windows. У вас не хватает прав на доступ к файлу result.zip. Проверьте, есть ли запись в папку, куда он будет сбрасываться

  3. Vlad высказал:

    При запуске zapret_checker.py получаю следующее:
    ./zapret_checker.py
    Traceback (most recent call last):
    File «./zapret_checker.py», line 29, in
    request=opener.sendRequest(XML_FILE_NAME,P7S_FILE_NAME)
    File «/usr/scripts/EP/zapretinfo.py», line 19, in sendRequest
    file = open(requestFile, «rb»)
    IOError: [Errno 2] No such file or directory: ‘/usr/scripts/EP/req.xml’

    Все файлы лежат в одной директории. Пути прописаны в файле zapret_checker.py, сайт на который надо обращаться указан как он сейчас реально есть, файл подписи переименован, как рекомендовано.

    Что у меня не так?

  4. Сергей Лысёнков высказал:

    проверьте права на доступ к файлу. И проверьте все же путь к нему. Большие буквы в названиях каталога должны быть большими, маленькие-маленькими

  5. Vlad высказал:

    Подправил найденные ошибки и ..теперь получаю такое:
    # ./zapret_checker.py
    Got code ffa04280ac726c687e839ef87a64b09f
    Trying to get result…
    Error: пЇп╟п©я─п╬я│ п╬п╠я─п╟п╠п╟я┌я▀п╡п╟п╣я┌я│я▐
    #

    Что тут написано….?
    Прбовал в перекодировщике. Не помогло… (((

  6. Сергей Лысёнков высказал:

    это осталось с оригинальных скриптов. Оригинальные скрипты написаны в непонятной кодировке. Попробуйте открыть в текстовом редакторе nLite И пересохранить в нужную кодировку

  7. Vlad высказал:

    Перевел.. Это «Запрос обрабатывается»

    а сколько ждать то?
    прождал более получаса и ничего не приехало. Что упустил я?

  8. Кухонный высказал:

    Спасибо за статью, реально пригодилась!

  9. Андрюха высказал:

    Пытаюсь запустить скрипт но выдается ошибка
    Traceback (most recent call last):
    File «./zapret_checker.py», line 29, in
    request=opener.sendRequest(XML_FILE_NAME,P7S_FILE_NAME)
    File «/home/userbilli/vigruzka/zapretinfo.py», line 32, in sendRequest
    sert = b64encode(sert)
    UnboundLocalError: local variable ‘sert’ referenced before assignment

    На что обратить внимание?

  10. Сергей Лысёнков высказал:

    не находит подписанного файла и файла в формате xml, сделанного по образцу на сайте реестра

  11. Vlad высказал:

    Пробовал выше указанный скрипт. Коенчно установил питона и судс.
    Однако получаю в ответ:
    Есть код 5cd47b9a67f5ec729a450a2a7daddcf7
    Попытка получить результат
    Ошибка-1: Запрос обрабатывается.

    и всё.
    Что может быть причиной такого ответа?

  12. Сергей Лысёнков высказал:

    видимо, сайту реестра не нравится или подписанный файл или xml файл

  13. Андрюха высказал:

    это мой косяк.Со скриптом все нормально.

  14. sustav высказал:

    Плохо, что я не знаю Питон((( У меня такой ответ, и не знаю что с этим делать((
    Traceback (most recent call last):
    File «./zapret_checker.py», line 6, in
    from zapretinfo import ZapretInfo
    ImportError: cannot import name ZapretInfo

  15. Сергей Лысёнков высказал:

    Не находит файл zapretinfo.py .Его необходимо разместить в одном каталоге вместе с zapret_checker.py

Комментировать