diff --git a/app.py b/app.py new file mode 100644 index 0000000..a2d0305 --- /dev/null +++ b/app.py @@ -0,0 +1,30 @@ +from flask import Flask, request + +app = Flask(__name__) + +data = {"username":"", "password":""} + +@app.route("/") +def get_(): + return data + +@app.route("/",methods = ['POST']) +def post(): + data_json=request.get_json() + if data_json is None: + return 'Invalid JSON data', 400 + + data['username']=data_json['username'] + data['password']=data_json['password'] + print(f"Data received {data_json}") + + return [data['username'], data['password']] + +@app.route("/", methods =['PUT']) +def put(): + str = request.args.get('password') + print(f"New password received {str}") + data['password'] = str + return [data['username'], data['password']] + +app.run(host='0.0.0.0', port=5000) diff --git a/configs/instA.sh b/configs/instA.sh new file mode 100644 index 0000000..6a18cb2 --- /dev/null +++ b/configs/instA.sh @@ -0,0 +1,40 @@ +#!/bin/bash +echo "Starting configuration for instance A" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.16.10/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Routing between A and C" +ip route add 192.168.11.0/24 via 192.168.16.1 + +echo "Installation of FLASK" +pip install flask + +echo "Creating web-server" +touch app.py + +cat << EOF > app.py +from flask import Flask, request + +app = Flask(__name__) + +@app.route("/") +def get_(): + return f"Hello, world!\n" + +@app.route("/", methods = ['POST']) +def post_(): + message = request.args.get('message') + return f"Message received: {message}\n" + +@app.route("/", methods = ['PUT']) +def put_(): + res = f"{request.args.get('message')} - by PUT\n" + return res + +app.run(host='0.0.0.0', port=5000) +EOF + +echo "Run server" +python app.py \ No newline at end of file diff --git a/configs/instB.sh b/configs/instB.sh new file mode 100644 index 0000000..b1519c4 --- /dev/null +++ b/configs/instB.sh @@ -0,0 +1,12 @@ +#!/bin/bash +echo "Configuring adapter for subnet A" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.16.1/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Configuring adapter for subnet C" +ip link add macvlan2 link eth0 type macvlan mode bridge +ip address add dev macvlan2 192.168.11.1/24 +ip link set macvlan2 up +echo "Configuration ended" \ No newline at end of file diff --git a/configs/instC.sh b/configs/instC.sh new file mode 100644 index 0000000..f2ed773 --- /dev/null +++ b/configs/instC.sh @@ -0,0 +1,18 @@ +#!/bin/bash +echo "Starting configuration for instance C" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.11.100/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Routing between C and A" +ip route add 192.168.16.0/24 via 192.168.11.1 + +echo "GET-request" +curl "http://192.168.16.10:5000/" + +echo "POST-request" +curl -X POST "http://192.168.16.10:5000?message=Ensemble_Learning" + +echo "PUT-request" +curl -X PUT "http://192.168.16.10:5000?message=VirtualBOX" \ No newline at end of file diff --git a/images/scr_A_to_C.png b/images/scr_A_to_C.png new file mode 100644 index 0000000..1c10197 Binary files /dev/null and b/images/scr_A_to_C.png differ diff --git a/images/scr_AdaptA.png b/images/scr_AdaptA.png new file mode 100644 index 0000000..b3143d6 Binary files /dev/null and b/images/scr_AdaptA.png differ diff --git a/images/scr_AdaptB_1.png b/images/scr_AdaptB_1.png new file mode 100644 index 0000000..ed4987f Binary files /dev/null and b/images/scr_AdaptB_1.png differ diff --git a/images/scr_AdaptB_2.png b/images/scr_AdaptB_2.png new file mode 100644 index 0000000..abbff24 Binary files /dev/null and b/images/scr_AdaptB_2.png differ diff --git a/images/scr_AdaptC.png b/images/scr_AdaptC.png new file mode 100644 index 0000000..b755dd5 Binary files /dev/null and b/images/scr_AdaptC.png differ diff --git a/images/scr_App_run.png b/images/scr_App_run.png new file mode 100644 index 0000000..a7cc0bc Binary files /dev/null and b/images/scr_App_run.png differ diff --git a/images/scr_C_to_A.png b/images/scr_C_to_A.png new file mode 100644 index 0000000..4aafdf4 Binary files /dev/null and b/images/scr_C_to_A.png differ diff --git a/images/scr_Flask_inst.png b/images/scr_Flask_inst.png new file mode 100644 index 0000000..9405c78 Binary files /dev/null and b/images/scr_Flask_inst.png differ diff --git a/images/scr_GET.png b/images/scr_GET.png new file mode 100644 index 0000000..c6fc575 Binary files /dev/null and b/images/scr_GET.png differ diff --git a/images/scr_GET1.png b/images/scr_GET1.png new file mode 100644 index 0000000..4f9b7e5 Binary files /dev/null and b/images/scr_GET1.png differ diff --git a/images/scr_GET_log.png b/images/scr_GET_log.png new file mode 100644 index 0000000..f924dcf Binary files /dev/null and b/images/scr_GET_log.png differ diff --git a/images/scr_POST.png b/images/scr_POST.png new file mode 100644 index 0000000..253d8ed Binary files /dev/null and b/images/scr_POST.png differ diff --git a/images/scr_POST1.png b/images/scr_POST1.png new file mode 100644 index 0000000..00b1816 Binary files /dev/null and b/images/scr_POST1.png differ diff --git a/images/scr_POST_log.png b/images/scr_POST_log.png new file mode 100644 index 0000000..be469fd Binary files /dev/null and b/images/scr_POST_log.png differ diff --git a/images/scr_PUT.png b/images/scr_PUT.png new file mode 100644 index 0000000..681c85c Binary files /dev/null and b/images/scr_PUT.png differ diff --git a/images/scr_PUT1.png b/images/scr_PUT1.png new file mode 100644 index 0000000..1155e2b Binary files /dev/null and b/images/scr_PUT1.png differ diff --git a/images/scr_PUT_log.png b/images/scr_PUT_log.png new file mode 100644 index 0000000..17f4b28 Binary files /dev/null and b/images/scr_PUT_log.png differ diff --git a/images/scr_PWD.png b/images/scr_PWD.png new file mode 100644 index 0000000..976591e Binary files /dev/null and b/images/scr_PWD.png differ diff --git a/report.md b/report.md new file mode 100644 index 0000000..8a7919d --- /dev/null +++ b/report.md @@ -0,0 +1,253 @@ +# Отчет по работе с Линуксом + +## Создание контейнеров в Play-with-docker + +Работа выполнялась в Play-with-docker + +Для начала создадим три контейнера. Это можно сделать путём нажатия кнопки `ADD NEW INSTANCE`. + +Новодобавленные контейнеры в Play-with-docker выглядят вот так (см. рисунок 1) + +

+ +Рисунок 1 - Контейнеры в Play-With-Docker +

+ +Далее настроим сеть при помощи ipvlan. Добавим по одному адаптеру на каждый из контейнеров А и С: + +* Параметры контейнера A - IP 192.168.16.10 с маской 255.255.255.0 (см. рисунок 2) + +

+ +Рисунок 2 - Адаптер контейнер A +

+ +* Параметры контейнера C - 192.168.11.100 с маской 255.255.255.0 (см. рисунок 3) + +

+ +Рисунок 3 - Адаптер контейнер С +

+ + +Также добавляем 2 адаптера контейнеру B (см. рисунок 4 и 5): + +* 192.168.16.1 с маской 255.255.255.0 +* 192.168.11.1 с маской 255.255.255.0 + +

+ +Рисунок 4 - Адаптер контейнер B +

+ +

+ +Рисунок 5 - Адаптер контейнер B +

+ +## Маршрутизация + +Теперь настроим маршруты. +Укажем на контейнере A отсылать пакеты на контейнер C через адаптер `macvlan1` на контейнере B. + +* Контейнер A: `ip route add 192.168.11.0/24 via 192.168.16.1` + +Проверим маршрут, пропинговав с А в С (см. рисунок 6) + +

+ +Рисунок 6 - Пинг с контейнера А в С +

+ +Теперь укажем на контейнере С отсылать пакеты на контейнер А через адаптер `macvlan2` на контейнере B. + +* Машина C: `ip route add 192.168.16.0/24 via 192.168.11.1` + +Опять пропингуем(см. рисунок 7): + +

+ +Рисунок 7 - Пинг с контейнера С в А +

+ +## Создание и запуск сервера + +На контейнере A развернем сервер на Flask. +Для начала установим `Flask` через `pip`: +``` +pip install Flask +``` + +

+ +Рисунок 8 - Установка Flask +

+ +Напишем сервер на Python: + +```python +from flask import Flask, request + +app = Flask(__name__) + +@app.route("/") +def get_(): + return f"Hello, world!\n" + +@app.route("/", methods = ['POST']) +def post_(): + message = request.args.get('message') + return f"Message received: {message}\n" + +@app.route("/", methods = ['PUT']) +def put_(): + res = f"{request.args.get('message')} - by PUT\n" + return res + +app.run(host='0.0.0.0', port=5000) +``` + +Теперь запустим его (см. рисунок 9) + +

+ +Рисунок 9 - Запуск Flask сервера +

+ +Теперь проверим работу GET, POST, PUT запросов. +С контейнера C выполним `/get` запрос через `curl` (см. рисунок 10): +``` +curl 192.168.16.10:5000 +``` + +

+ +Рисунок 10 - Проверка работы GET запроса +

+ +Посмотрим также логи запроса на сервере (см. рисунок 11). + +

+ +Рисунок 11 - Логи GET запроса +

+ +С контейнера C выполним `/post` и '/put' запросы через `curl` (см. рисунок 12): +``` +curl -X POST http://192.168.16.10:5000?sent=modern +``` + +

+ +Рисунок 12 - Проверка работы POST запроса +

+ +Посмотрим также логи запросов на сервере (см. рисунок 13). + +

+ +Рисунок 13 - Логи POST запроса +

+ +``` +curl -X PUT http://192.168.16.10:5000?sent=modern +``` + +

+ +Рисунок 14 - Проверка работы PUT запроса +

+ +

+ +Рисунок 15 - Логи PUT запроса +

+ +## Скрипты + +Для автоматического выполнения предыдущих этапов напишем скрипты конфигурации для каждого из контейнеров: + +Скрипт для контейнера A + +```sh +#!/bin/bash +echo "Starting configuration for instance A" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.16.10/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Routing between A and C" +ip route add 192.168.11.0/24 via 192.168.16.1 + +echo "Installation of FLASK" +pip install flask + +echo "Creating web-server" +touch app.py + +cat << EOF > app.py +from flask import Flask, request + +app = Flask(__name__) + +@app.route("/") +def get_(): + return f"Hello, world!\n" + +@app.route("/", methods = ['POST']) +def post_(): + message = request.args.get('message') + return f"Message received: {message}\n" + +@app.route("/", methods = ['PUT']) +def put_(): + res = f"{request.args.get('message')} - by PUT\n" + return res + +app.run(host='0.0.0.0', port=5000) +EOF + +echo "Run server" +python app.py +``` + +Скрипт для контейнера B + +```sh +#!/bin/bash +echo "Configuring adapter for subnet A" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.16.1/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Configuring adapter for subnet C" +ip link add macvlan2 link eth0 type macvlan mode bridge +ip address add dev macvlan2 192.168.11.1/24 +ip link set macvlan2 up +echo "Configuration ended" +``` + +Скрипт для контейнера C + +```sh +#!/bin/bash +echo "Starting configuration for instance C" +ip link add macvlan1 link eth0 type macvlan mode bridge +ip address add dev macvlan1 192.168.11.100/24 +ip link set macvlan1 up +echo "Configuration ended" + +echo "Routing between C and A" +ip route add 192.168.16.0/24 via 192.168.11.1 + +echo "GET-request" +curl "http://192.168.16.10:5000/" + +echo "POST-request" +curl -X POST "http://192.168.16.10:5000?message=Ensemble_Learning" + +echo "PUT-request" +curl -X PUT "http://192.168.16.10:5000?message=VirtualBOX" +```