From 744437c4d6ec78c73fd4db06cc50e9df85899901 Mon Sep 17 00:00:00 2001 From: dannc Date: Mon, 11 Apr 2022 10:33:47 +0700 Subject: [PATCH] homework 4.2: add question 4 --- src/homework/04-script/4.2/.gitignore | 1 + src/homework/04-script/4.2/q4.py | 40 ++++++++++++ src/homework/04-script/4.2/readme.md | 89 +++++++++++++++++++-------- 3 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 src/homework/04-script/4.2/.gitignore create mode 100755 src/homework/04-script/4.2/q4.py diff --git a/src/homework/04-script/4.2/.gitignore b/src/homework/04-script/4.2/.gitignore new file mode 100644 index 0000000..383feec --- /dev/null +++ b/src/homework/04-script/4.2/.gitignore @@ -0,0 +1 @@ +hosts.json \ No newline at end of file diff --git a/src/homework/04-script/4.2/q4.py b/src/homework/04-script/4.2/q4.py new file mode 100755 index 0000000..6a132d7 --- /dev/null +++ b/src/homework/04-script/4.2/q4.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +import json +import io +import socket + +filename = 'hosts.json' + +hostsList = { + "drive.google.com", + "mail.google.com", + "google.com" +} + +with open(filename, 'r+') as file: + jsonStr = file.read() + try: + jsonObj = json.load(io.StringIO(jsonStr)) + except BaseException as err: + jsonObj = dict({}) + print('error {}'.format(err)) + exit(1) + + file.truncate(0) + file.seek(0) + + for hostname in hostsList: + ipAddr = socket.gethostbyname(hostname) + prevIpAddr = jsonObj.get(hostname) + + if prevIpAddr is None or prevIpAddr == '': + prevIpAddr = ipAddr + + print('{} - {}'.format(hostname, ipAddr)) + if ipAddr != prevIpAddr: + print('[ERROR] {} IP mismatch: {} {}'.format(hostname, ipAddr, prevIpAddr)) + + jsonObj[hostname] = ipAddr + + file.write(json.dumps(jsonObj)) diff --git a/src/homework/04-script/4.2/readme.md b/src/homework/04-script/4.2/readme.md index 731fa0c..7d3c454 100644 --- a/src/homework/04-script/4.2/readme.md +++ b/src/homework/04-script/4.2/readme.md @@ -128,38 +128,79 @@ for result in result_os.split('\n'): ``` ### Обязательная задача 4 -1. Наша команда разрабатывает несколько веб-сервисов, доступных по http. Мы точно знаем, что на их стенде нет никакой балансировки, кластеризации, за DNS прячется конкретный IP сервера, где установлен сервис. Проблема в том, что отдел, занимающийся нашей инфраструктурой очень часто меняет нам сервера, поэтому IP меняются примерно раз в неделю, при этом сервисы сохраняют за собой DNS имена. Это бы совсем никого не беспокоило, если бы несколько раз сервера не уезжали в такой сегмент сети нашей компании, который недоступен для разработчиков. Мы хотим написать скрипт, который опрашивает веб-сервисы, получает их IP, выводит информацию в стандартный вывод в виде: - <его IP>. Также, должна быть реализована возможность проверки текущего IP сервиса c его IP из предыдущей проверки. Если проверка будет провалена - оповестить об этом в стандартный вывод сообщением: [ERROR] IP mismatch: <старый IP> <Новый IP>. Будем считать, что наша разработка реализовала сервисы: `drive.google.com`, `mail.google.com`, `google.com`. +Наша команда разрабатывает несколько веб-сервисов, доступных по http. +Мы точно знаем, что на их стенде нет никакой балансировки, кластеризации, за DNS прячется конкретный IP сервера, +где установлен сервис. Проблема в том, что отдел, занимающийся нашей инфраструктурой очень часто меняет нам сервера, +поэтому IP меняются примерно раз в неделю, при этом сервисы сохраняют за собой DNS имена. +Это бы совсем никого не беспокоило, если бы несколько раз сервера не уезжали в такой сегмент сети нашей компании, +который недоступен для разработчиков. Мы хотим написать скрипт, который опрашивает веб-сервисы, получает их IP, +выводит информацию в стандартный вывод в виде: - <его IP>. +Также, должна быть реализована возможность проверки текущего IP сервиса c его IP из предыдущей проверки. +Если проверка будет провалена - оповестить об этом в стандартный вывод сообщением: [ERROR] IP mismatch: <старый IP> <Новый IP>. +Будем считать, что наша разработка реализовала сервисы: `drive.google.com`, `mail.google.com`, `google.com`. #### Ваш скрипт: + +[script](./q4.py) + ```python -??? +#!/usr/bin/env python3 + +import json +import io +import socket + +filename = 'hosts.json' + +hostsList = { + "drive.google.com", + "mail.google.com", + "google.com" +} + +with open(filename, 'r+') as file: + jsonStr = file.read() + try: + jsonObj = json.load(io.StringIO(jsonStr)) + except BaseException as err: + jsonObj = dict({}) + print('error {}'.format(err)) + exit(1) + + file.truncate(0) + file.seek(0) + + for hostname in hostsList: + ipAddr = socket.gethostbyname(hostname) + prevIpAddr = jsonObj.get(hostname) + + if prevIpAddr is None or prevIpAddr == '': + prevIpAddr = ipAddr + + print('{} - {}'.format(hostname, ipAddr)) + if ipAddr != prevIpAddr: + print('[ERROR] {} IP mismatch: {} {}'.format(hostname, ipAddr, prevIpAddr)) + + jsonObj[hostname] = ipAddr + + file.write(json.dumps(jsonObj)) ``` #### Вывод скрипта при запуске при тестировании: -``` -??? + +Предположим, что в какой-то момент времени были следующие значения ip-адресов серверов: + +```json +{"drive.google.com": "173.194.221.194", "mail.google.com": "142.251.1.18", "google.com": "64.233.162.139"} ``` -### Дополнительное задание (со звездочкой*) - необязательно к выполнению +Тогда запуск команды будет выглядеть следующим образом: -Так получилось, что мы очень часто вносим правки в конфигурацию своей системы прямо на сервере. -Но так как вся наша команда разработки держит файлы конфигурации в github и пользуется gitflow, -то нам приходится каждый раз переносить архив с нашими изменениями с сервера на наш локальный компьютер, -формировать новую ветку, коммитить в неё изменения, создавать pull request (PR) и только после выполнения Merge мы наконец можем официально подтвердить, -что новая конфигурация применена. Мы хотим максимально автоматизировать всю цепочку действий. -Для этого нам нужно написать скрипт, который будет в директории с локальным репозиторием обращаться по API к github, -создавать PR для вливания текущей выбранной ветки в master с сообщением, которое мы вписываем в первый параметр при обращении к py-файлу (сообщение не может быть пустым). -При желании, можно добавить к указанному функционалу создание новой ветки, commit и push в неё изменений конфигурации. -С директорией локального репозитория можно делать всё, что угодно. -Также, принимаем во внимание, что Merge Conflict у нас отсутствуют и их точно не будет при push, как в свою ветку, так и при слиянии в master. -Важно получить конечный результат с созданным PR, в котором применяются наши изменения. - -#### Ваш скрипт: -```python -??? ``` - -#### Вывод скрипта при запуске при тестировании: +./q4.py +mail.google.com - 173.194.221.17 +[ERROR] mail.google.com IP mismatch: 173.194.221.17 142.251.1.18 +google.com - 64.233.162.100 +[ERROR] google.com IP mismatch: 64.233.162.100 64.233.162.139 +drive.google.com - 173.194.221.194 ``` -??? -``` \ No newline at end of file