Как стать автором
Обновить
0

Сетевой мультитул для ИТ и ИБ-специалистов: zero-skill создание Telegram чат-бота с помощью ChatGPT

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров7.4K

DISCLAIMER: Представленные в статье методы написания кода и подходы к процессу разработки не претендуют на эталонность или экспертный уровень. Терминология может быть неточной. Вся представленная информация является внезапным озарением, догадками и собственным видением автора, применением его немногочисленного опыта, накопленного в попытках быстро освоить программирование на Python с нуля без глубокого погружения. Критика и советы в комментариях приветствуются и будут приняты на вооружение.

Давайте знакомиться

Привет, Хабр! Меня зовут Руслан, я – инженер по сетевой и информационной безопасности в компании-интеграторе STEP LOGIC. Решаю различные задачи, связанные с настройкой и поддержкой сетевого оборудования в компьютерных сетях, работаю над проектами, требующими планирования архитектуры сети, проведения расчетов с IP-адресами, а также подготовки конфигурационных файлов для настройки межсетевых экранов и криптошлюзов. Программированием и кодингом никогда ранее не занимался. В этой статье я расскажу о своем опыте создания при помощи нейросетей Telegram чат-бота, полезного для сетевых инженеров и администраторов.

Как пришла идея создания чат-бота

Любой сетевой инженер периодически сталкивается с ситуацией, когда нужно быстро определить доступные IP-адреса в сети с заданной маской, найти первый и последний IP для назначения его шлюзом по умолчанию, узнать, сколько всего помещается хостов в данной сети, и т.д. и т.п. Одни выучивают IP-сети с масками и их хостами как таблицу умножения, другие же пользуются онлайн или мобильными калькуляторами.

Я отношусь к последним, зубрить – не моё. В связи с этим меня всегда занимал вопрос, почему калькуляторами называются программы, которые по сути могут лишь показать в ответ на введенный “IP-адрес + префикс сети” информацию о его сетевой/wildcard маске, адресе сети, бродкаст адресе, минимальном и максимальном хосте и их количестве в сети.

Рис. 1. Типичный IP-калькулятор
Рис. 1. Типичный IP-калькулятор

На мой взгляд, основная задача калькулятора – это выполнение 4-х простых арифметических операций ((+), (-), (×) и (÷)) над 2 или более заданными числами. Так почему же сетевые калькуляторы не могут в арифметику, когда вместо чисел нужно провести вычисления с несколькими сетями? Например, для деления широкой сети 10.0.0.0/24 на несколько узких /28 или для вычитания из сети 0.0.0.0/0 всех частных подсетей? Почему нельзя с помощью калькулятора сложить все смежные сети в списке в общие с более широкой маской или провести умножение (тиражирование) сети от начальной с заданной маской и до нужного количества сетей? Получается, настоящего сетевого калькулятора не существует…  

Имея стойкое желание исправить это недоразумение при полном отсутствии опыта программирования, но испытывая большой энтузиазм по поводу возможностей нейросетей, я решил написать свой собственный калькулятор с блэкджеком… арифметикой и прочими приколюхами!

Нейросеть приходит на помощь

Сначала была идея разработки с помощью нейросетей iOS/Android-приложения, но подходящих инструментов для этого я не нашёл. Попадались либо новейшие и якобы полностью автоматизированные профессиональные и дорогостоящие AI-инструменты, которые скорее рассчитаны на использование средним бизнесом без штатных программистов, либо более дешевые No-code/Zero-code платформы для разработки графических интерфейсов для мобильных приложений с ограниченным набором функций на выбор, а для моих задач все равно потребовалась бы кодировка логики и алгоритмов для выполняемых приложением функций и вычислений, или продвинутые среды разработки, требующие знания языка программирования, но ускоряющие процесс кодинга с помощью подсказок от ИИ и автозаполнения, где возможно. Все это требовало либо большого количества денег, либо времени для длительного погружения в специфику работы данных инструментов. Кроме того, мне пришлось бы разбираться в нюансах дальнейшей публикации приложения в Google Play и AppStore, что не вписывалось в формат “нейросеть всё сделает сама”, на который я нацелился.

Потом я вспомнил про свой опыт запуска готовых Telegram-ботов с Github с помощью BotFather (https://t.me/botfather), что было максимально просто и доступно, и подумал, а чем Telegram-бот не кроссплатформенное GUI-приложение, работающее на любом телефоне и компьютере? Тем более что из графики для калькулятора потребуется только несколько кнопок (средство ввода чисел) и однострочный дисплей (средство вывода результата), а всё это, и даже больше, есть в Telegram-ботах. И, как говорится в рекламе, если не видно разницы, зачем платить больше?

Лиха беда начало

Для того, чтобы убедиться, что ChatGPT в принципе умеет программировать, я попросил его написать простой Python-скрипт, генерирующий пароль заданной длины и сложности.

Результат меня удовлетворил - с первой же попытки я получил рабочий код, поэтому следующим заданием для нейросети стало написание кода, который повторял бы функционал уже готовых онлайн и мобильных IP-калькуляторов. Этого удалось добиться примерно за десяток запросов. Для проверки полученного результата я не использовал специализированное ПО типа сред разработки, а ограничился лишь Notepad++ для разметки и подсветки синтаксиса (для улучшения читаемости), а далее сохранял файл с расширением .py и запускал полученный скрипт в командной строке через Python.

Если скрипт не работал – копировал сообщение об ошибке в ChatGPT (иногда даже без дополнительных комментариев и просьб типа “разберись почему не работает и исправь” - нейросеть и так понимала контекст сообщения и что мне от неё сейчас нужно) и после получения предложений с исправлениями повторял процедуру.

После того, как стандартный функционал был готов, нужно было придумать, как реализовать и добавить остальные 4 простые арифметические функции с заданными сетями. Моё участие ограничилось генерацией идей, что должна делать функция, а реализацией занимался ChatGPT. Никогда прежде мой полёт фантазии ещё не находил путь к воплощению так быстро.

В итоге получился консольный интерактивный скрипт, который имеет меню из 6 пунктов и умеет:

  1. выводить информацию о введенном IP-адресе и его сети (копия IP-калькуляторов)

  2. (деление) дробить заданную сеть на все возможные подсети с выбранной маской

  3. (вычитание) исключать из заданной сети нужное кол-во заданных подсетей

  4. (сложение) определять суперсет заданного количества подсетей (находить 1 общую сеть, которая бы включала в себя все заданные)

  5. (умножение) тиражировать заданную подсеть с маской до выбранного количества таких же идущих друг за другом подсетей

  6. завершать работу скрипта.

Блоки кода в статье специально приводить не буду, чтобы акцентировать Zero-Coding подход, но для любопытствующих выложу исходники на GitHub, когда доберусь до этого пункта в планах развития бота (TO DO лист выложу в следующей статье).

Рис.2. Прототип моего сетевого калькулятора
Рис.2. Прототип моего сетевого калькулятора

Далее мне захотелось создать из скрипта Portable executable версию, не требующую установки дополнительного ПО, сред разработки, Python и т.д., чтобы его можно было запустить, просто открыв файл. И ChatGPT любезно предложил использовать для этих целей PyInstaller.

Рис. 3. Запросы ChatGPT для создания portable версии калькулятора
Рис. 3. Запросы ChatGPT для создания portable версии калькулятора

Впоследствии я добавил возможность скачивания ранней оффлайн-версии моего сетевого калькулятора в итоговую версию Telegram-бота. Но об этом в другой раз. В этой статье опустим подробный обзор всех имеющихся функций и сосредоточимся на процессе его создания.

Убедившись в реальности выполнения задуманного, я приступил к переносу созданного скрипта на фреймворк Telegram-бота. Изначально я закидывал в чат с ИИ готовый Python-скрипт и просил ChatGPT переделать его в формат Telegram-бота.

Когда скрипт стал больше допустимого предела для одного сообщения в чате, пришлось дробить код на несколько сообщений, предупреждая ChatGPT об этом, чтобы он ждал всю информацию и только потом начинал обрабатывать запрос.

Получалось, если честно, не очень, часть исходного кода из первых сообщений “забывалась” в процессе общения с ИИ в чате и не попадала в его ответ. К тому же он так и норовил пропустить неважные на его взгляд блоки и функции в целях сохранения краткости ответов и предлагал написать их самостоятельно. Часто он обрывал код на середине и не всегда мог правильно его продолжить после этого (в дальнейшем OpenAI это исправили).

Дополнительные сложности создавало и то, что с таким объёмом данных, если что-то не работало после многократных попыток и проб различных вариантов, невозможно было попросить ChatGPT вернуться к “исходному варианту” кода. Так как суммарный объём текста в рамках текущей беседы уже вышел за рамки хранимой истории, в контексте памяти нейросети оставались лишь несколько последних сообщений, в которых были лишь несколько нерабочих вариаций выданного им кода.

Поэтому пришлось выбрать другой подход. Для каждой функции я создал отдельный чат и еще один общий для структуры скрипта без кода каждой отдельной функции (вместо них оставил комментарии о пропуске кода).

В таком виде ChatGPT хватило размера хранимого контекста, чтобы решить задачу по каждой отдельной функции. В чате по общей структуре скрипта ИИ написал базовый фреймворк для работы Telegram чат-бота, заменил способ ввода/вывода данных с input/print на исходящие/входящие сообщения, а также предложил использовать для меню 2 вида кнопок InlineKeyboardButton и KeyboardButton.

До этого момента все работало как чёрный ящик, а все мое участие ограничивалось составлением как можно более понятного ТЗ на естественном языке и копированием и вставкой кода. Теперь же мне пришлось разобраться, как должен работать код в целом и понять его структуру, чтобы после получения результатов в каждом отдельном чате самостоятельно суметь скомпоновать все функции воедино. А после этого еще предстояло переделать каждую арифметическую функцию в формат Telegram-бота по отдельности и собрать их воедино.

К окончанию работ без использования сторонних ресурсов кроме ChatGPT я уже разобрался, как подключаются в скрипт необходимые модули, импортируются необходимые функции, задаются переменные, какие возможности есть в API Telegram, освоил работу функции main со всеми необходимыми обработчиками, понял, как и где объявляются и вызываются функции. Этих азов хватило для того, чтобы, имея рабочую основу полноценного Python-скрипта с несколькими рабочими функциями сетевого калькулятора, придумать новые функции и масштабировать моего чат-бота.

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

Хоть читабельность кода и была восстановлена, но в голову закралась мысль о необходимости разделения кода на отдельные файлы для улучшения как восприятия, так и быстродействия, что я и собираюсь сделать в будущем.

Когда уже вошел во вкус

Часть идей для новых функций я позаимствовал из рабочих процессов – когда появлялась новая рутинная задача, требующая монотонных повторяющихся действий, я сразу писал для неё Python-скрипт и после его проверки переносил в формат Telegram-бота.

Например, сетевой мультитул помог мне при реализации проекта по поэтапной миграции крупной сети, распределенной по всей России, на отечественное криптооборудование. Первым делом мы размещали перед существующим пограничным оборудованием отечественные криптошлюзы, обеспечивающие шифрование региональных каналов связи с использованием криптоалгоритмов по ГОСТ, а VPN-каналы на западных криптоалгоритмах отключались.

Далее производились необходимые перенастройки и старое зарубежное оборудование выводилось из эксплуатации. При этом как для 1-ого, так и для 2-ого этапа приходилось составлять и заполнять огромные таблицы с адресным планом, выделять подсети и назначать IP-адреса новому оборудованию, а также переносить множество групп и объектов с зарубежных межсетевых экранов FortiGate и Cisco ASA на отечественный UTM Континент 4.

Вот здесь и вступил в дело мой бот, который уже умел производить расчеты с IP-сетями. А для миграции групп и объектов с FortiGate и Cisco ASA на UTM Континент 4 я написал конвертор конфигураций сетевого оборудования. Отправляешь Telegram-боту файлом в сообщении выгрузку конфига, а в ответ он присылает файл импорта настроек в Континент 4.

На тот момент мне нужны были только сетевые объекты (IP и FQDN), так как в Континент 4.1.0 можно было импортировать только их через xml-файл в формате CSV, поэтому я реализовал конвертацию этих настроек из конфигурационных файлов с помощью самописных парсеров.

Позже, после выхода обновления Континент 4.1.7, я нашел python-скрипты на GitHub "Кода Безопасности" (https://github.com/itseccode/c4_tools) с готовыми парсерами конфигураций различных вендоров, такими как Континент 3.9.3, FortiGate 7.2.0, Cisco ASA 8.3 / 8.4 / 9.1, Check Point R77.30 / R80.20 / R81.10, позволяющими конвертировать не только сетевые объекты, но также сервисы и связанные с ними правила МЭ и NAT, и добавил их в чат-бота. Данные инструменты вкупе с ботом позволили сильно сократить время, которое бы занял ручной перенос этих правил.

А для настройки старых криптошлюзов Континент 3.9 пригодилась функция вычитания сетей из начальной заданной. Так как в Континент 3.9 нельзя туннелировать в VPN сразу весь трафик (невозможно создать защищенный объект 0.0.0.0/0 - программа управления ЦУС выдаст на такую попытку ошибку), а также недопустимо, чтобы защищенные сети пересекались с IP-адресами на интерфейсах КШ, к тому же нельзя указывать защищенные сети в виде диапазонов (можно только подсетями), то для того, чтобы решить задачу заворота всего трафика регионального филиала через VPN в центр, приходилось создавать группу состоящую из десятков-сотен узких защищенных подсетей, таким образом, чтобы в сумме они покрывали весь диапазон 0.0.0.0/0 за вычетом вышеуказанных исключений. Очевидно, что чем больше криптошлюзов, тем больше будет исключений на каждый их сетевой интерфейс. Высчитывать сотни и тысячи таких подсетей вручную на листочке довольно трудоемкое занятие, а шанс допустить ошибку возрастает с каждым новым расчетом. Мой чат-бот умеет решать задачу исключения подсетей практически моментально всего в несколько кликов (например, для исключения всех частных подсетей из сети 0.0.0.0/0 для получения списка публичных подсетей достаточно только мыши, данная функция содержит виртуальную клавиатуру с кнопками-примерами всех частных подсетей).

Многие заказчики покупают у нашей компании постпроектную сервисную поддержку, в рамках которой мы периодически проводим диагностику сетевого оборудования и пишем новые правила. Для проведения диагностики коллегам из техподдержки приходится проводить обследование сети, строить схемы связи и причесывать настройки. Часто из-за отсутствия схем требовалось по ARP-таблицам выяснить, к чему подключено оборудование. Периодически сталкиваясь с этой задачей, я решил добавить в бота определение производителя оборудования по его MAC-адресу. А для решения вопросов, связанных со страной подключения и переопределения списков доступа/блокировок, в боте появилась возможность определения страны и ASN по присланному IP-адресу.

Бывали случаи, когда нужно было проверить доступность из интернета только что опубликованных сервисов или VPN-шлюзов. По старинке проверяли через telnet на нужный порт, так как установка специализированного ПО для проверки связности занимает больше времени. Однако ноутбук с windows / linux не всегда были под рукой, что сподвигло меня дописать для бота функцию проверки открытых портов. Мобильный телефон всегда в кармане, а проверить порты (самые частые вынес в виде кнопок) через бота еще проще чем с помощью командной строки и telnet.

Я знаю, что подобные сервисы есть на разных сайтах, но, когда они собраны в одном месте с минималистичным интерфейсом без всего лишнего – на мой взгляд гораздо удобнее. Тем более результат можно сразу переслать коллеге или заказчику в рабочий чатик.

Еще одну функцию бота я написал после участия в проекте по внедрению шлюзов защиты корпоративной почты. Перед почтовым сервером в качестве MTA устанавливали дополнительный почтовый шлюз с различными механизмами защиты почтового трафика от спама, вирусов, фишинга, нежелательных вложений и т.д.

Когда наступает момент перевода системы в промышленную эксплуатацию, возникает вопрос, каким образом быстро проверить и протестировать настроенную систему. Раньше я использовал личную почту, отсылая с неё письма со «спамом», тестовыми EICAR-вирусами во вложении и т.п. Но с развитием тренда на повсеместное усиление безопасности, время на эту процедуру стало возрастать – приходилось искать способ скачать EICAR-файл, так чтобы его не заблокировал браузер/антивирус, а потом отправить его так, чтобы письмо не отбросил собственный почтовик. А большинство временных одноразовых почтовых ящиков позволяют только принимать, но не отправлять письма.

В итоге было придумано решение по интеграции бота с бесплатным почтовым доменом в Cloudflare и отправки через Mailtrap с него писем, содержащих тестовые строки, определяемые системами защиты почты как спам/вирус/фишинг. Проводить базовую проверку работы шлюзов защиты почты стало намного проще и быстрее. В планах добавить функционал оценки рейтинга письма по SPF/DKIM/DMARC по аналогии с сервисами типа https://www.mail-tester.com/.

Кроме этого, в боте появилась функция поиска всех доменов и поддоменов заданного сайта/приложения для использования их при настройки раздельного туннелирования на домашнем роутере, чтобы направлять через VPN не весь трафик, как это делается большинством VPN-провайдеров, а только трафик до выбранных сервисов. Эту задачу помогли решить 2 функции – поиск доменов и конфигуратор сетевого оборудования. Поиск доменов в ответ на введенное имя приложения/сайта присылает списком все его домены (можно так же найти и все поддомены). Информация берется с сервисов https://www.netify.ai/ и https://securitytrails.com/ . Дома я использую в качестве роутера и межсетевого экрана NGFW FortiGate 60F, поэтому автоматизировал создание copy-paste строки конфигурации, которую остается только скопировать и вставить в командную строку FortiGate, открытую по SSH для быстрого выполнения необходимых настроек. Присланный список IP-адресов или доменных имен бот обрамляет в синтаксис понятный FortiGate и тиражирует строки для повторения настроек для каждого объекта, а после собирает их в группу, которую остаётся указать в качестве destination в static routes в сторону VPN. С помощью функции конфигуратора сетевого оборудования все нужные настройки выдаются в виде 1 файла с текстовыми командами, которые можно мгновенно применить без использования графического или веб-интерфейса и длительного монотонного ручного процесса ввода.

Что получилось в итоге

Таким образом, на момент написания статьи помимо сетевого калькулятора мой бот содержит уже более 4 тысяч строк кода и оброс большим количеством возможностей.

  • Продвинутый IP-калькулятор с возможностью выполнения математических операций с IP-сетями.

  • Сетевой мульти-инструмент (швейцарский нож) – набор из 11 полезных сетевых диагностических утилит.

  • Конфигуратор сетевого оборудования – набор из конфигураторов/конверторов для 3 вендоров Cisco / FortiGate / Континент и 1 универсальный конфигуратор МЭ для ОС linux - iptables.

  • 2 вида кнопок (внутри чата в сообщениях бота и внутри клавиатуры пользователя) – в кнопки для чата я вынес пункты меню, которые полезно оставить в чате, чтобы в любой момент можно было по ним перейти в другой интересующий раздел без необходимости проходить всю цепочку с самого начала, а в клавиатурные кнопки – подсказки, необходимые лишь для одной конкретной функции.

  • Рандомизация входных значений в качестве примера. Я добавил на кнопки всплывающей клавиатуры подсказки с наиболее подходящими примерами входных значений для каждой задачи. На одной из кнопок, где это применимо, настроил рандомизатор, чтобы при каждом вызове функции предлагался новый пример.

  • Для повышения дружелюбности и интуитивности графического интерфейса, добавил к каждому пункту меню эмодзи, а также все сообщения с запросом пометил знаком “❓”, с ответом (результатом) – “❕”, а сообщения об ошибке – “⚠️”. Общаться с ботом и воспринимать сообщения стало намного приятнее.

  • Завел второго тестового бота через BotFather, чтобы тестировать сначала на нём все нововведения, не прерывая работы продуктивного бота, а после проверки перезапускать его на новом коде.

  • Во время отладки по рекомендации ChatGPT добавил в тестового бота счётчики выполнения функций и включил логирование в консоль для отладки возможных проблем.

  • В большинстве функций появилась фильтрация вводимых входных значений, чтобы игнорировать сообщения в неожидаемом формате (или выдавать ошибку).

  • В некоторых функциях (в основном в калькуляторе IP-сетей) добавил обработку ввода и его приведение к универсальному формату. К примеру, в функцию вывода информации об IP-адресе сейчас можно присылать вводные данные в любом виде:

    • 10.0.0.0/8

    • 10.0.0.0 255.0.0.0

    • 10,0,0,0 255,0,0,0

    • 10.0.0.0/255.0.0.0

    • 10.0.0.0\8

    • 10.0.0.0|8

    • И даже так – 10.  0.  0,0  \ 255. 0, 0 ,0.

Рис. 4. Как выглядит меню чат-бота сейчас
Рис. 4. Как выглядит меню чат-бота сейчас

Как я уже упоминал ранее, в последствии функции моего конвертора конфигурационных файлов обросли полным набором возможностей из инструментов коллег из "Кода Безопасности".

Рис. 5. Конвертор правил МЭ/NAT в формат Континент 4
Рис. 5. Конвертор правил МЭ/NAT в формат Континент 4

Смею предположить, что существенная часть полезности моего чат-бота для сетевых инженеров будет заключаться именно в этих инструментах, так как они выполняют наибольшее количество операций и обрабатывают наибольшие объёмы входных данных, по сравнению со всеми остальными инструментами в боте. На мой взгляд, их использование заметно сократит время, затрачиваемое на выполнение работ по миграции в рамках импортозамещения оборудования NGFW.

Более подробно обо всех доступных на сегодня возможностях бота и планах по его развитию я расскажу в своей следующей статье.

Чему я научился?

Итак, подводя итог, могу сказать, что ChatGPT действительно хорош в написании рабочего кода на Python по ТЗ на естественном (человеческом) языке. Это очень полезный и эффективный инструмент в руках оператора, который хоть и не является волшебной палочкой, как мне того хотелось бы, но значительно упрощает процесс созидания. Нейросеть помогает практически с нулевыми навыками воплощать в реальность свои самые смелые творческие идеи, а бонусом прилагается попутное изучение и освоение выбранного языка программирования. Так как приходится хотя бы бегло, но вчитываться в код, это неизбежно стимулирует понимание и запоминание его структуры и синтаксиса.

Когда ты сообщаешь об ошибке в коде в ChatGPT, он услужливо объясняет, в чем она была и как её исправить. Лайфхак: для того, чтобы получить подробное и пошаговое объяснение, а не только результат, нужно просто в конце запроса добавить текст “let’s think step by step”.

Иногда приходит осознание, что навыков уже хватает для того, чтобы некоторые блоки кода написать быстрее самостоятельно, используя в качестве шаблонов предыдущие куски кода и объяснения, полученные от нейросети, чем просить её об этом.

Ограничение на количество символов в одном сообщении и хранимого в памяти контекста беседы языковой модели ChatGPT заставляет дробить код на куски, решать определенные задачи с нуля в отдельных чатах, а потом уже самостоятельно вручную компоновать блоки кода в единую цельную структуру. Ждём релиза GPT-5, когда на вход можно будет подавать целую книгу.

Из всего вышесказанного можно сделать вывод, что ChatGPT – отличный репетитор и помощник в изучении не только программирования, но и любых других новых навыков. Конечно, возможно, с выходом новых усовершенствованных языковых моделей, использованием плагинов для различных интеграций со сторонними сервисами процесс написания кода станет ещё более простым. Программирование выйдет за уровень абстракции, когда уже больше не нужно будет не только уметь читать код и определять его синтаксис, но и не придется быть связующим звеном, обеспечивающим копирование, компиляцию и проверку кода. Результат будет выдаваться сразу в виде полностью рабочей программы.

Хотя, на мой неискушенный взгляд, ChatGPT сейчас и так достаточно хорош для того, чтобы решать поставленные задачи по созданию кода с минимальным порогом вхождения в тему. Но как говорится, совершенству нет предела!

Данный Telegram-бот стал для меня своеобразным Pet-проектом. Я делаю его в первую очередь для собственных нужд, но приоритет отдаю функциям, которые могут быть полезны широкому кругу ИТ и ИБ-специалистов. Для всех желающих самостоятельно протестировать то, что у меня получилось – ссылка на чат-бота https://t.me/STEPLOGIC_NetCalc_bot.

Welcome! И буду рад отзывам и предложениям в комментариях!

UPD: 2-ая часть статьи про моего чат-бота уже готова https://habr.com/ru/companies/step_logic/articles/778800/

Теги:
Хабы:
Всего голосов 9: ↑9 и ↓0+9
Комментарии25

Публикации

Информация

Сайт
step.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия

Истории