понедельник, 13 мая 2024 г.

Python. Использование модуля mariadb.

Для работы с Mariadb в скриптах python можно использовать модуль python mariadb.

Установку данного модуля необходимо проводить, если в системе уже установлен python3 и mariadb.

Перед установкой самого модуля нужно установить рекомендованные пакеты:
# sudo yum install pip
# sudo yum install python3-devel
# sudo yum install openssl


Затем необходимо установить репозитарий "CS Package Repository"
# wget https://r.mariadb.com/downloads/mariadb_repo_setup
# sudo ./mariadb_repo_setup


Из установленного репозитария, установить драйвер «MariaDB Connector/C»
# sudo yum install MariaDB-shared MariaDB-devel

Теперь можно наконец-то установить сам модуль mariadb:
# pip install mariadb

Скрипт установки репозитария можно удалить:
# rm -f mariadb_repo_setup


Для использования модуля mariadb файл
import mariadb
import sys


# Установка соединения:
try:
    conn = mariadb.connect(
        host="10.10.10.1",
        port=3306,
        user="user1",
        password="password1",
        database="db1")
        cur = conn.cursor()
    except mariadb.Error as e:
        print(f"Error connecting to the database: {e}")
        sys.exit(1)


# Запрос данных:
try:
    cur.execute("SELECT ids, ne_name FROM nes LIMIT 10")
except mariadb.Error as e:
    print(f"Error: {e}")


# Вывод данных:
for ids, ne_name in cur:
    print(f"ids: {ids}, ne_name: {ne_name}")

"""
Вывод будет в таком виде:
ids: 14, ne_name: SMA-UKGD-R1
ids: 15, ne_name: SMA-UKGD-S1
ids: 16, ne_name: SMA-Avr150-S1
...
"""


print(cur.fetchall())
"""
Вывод будет в таком виде:
[(14, 'SMA-UKGD-R1'), (15, 'SMA-UKGD-S1'), (16, 'SMA-Avr150-S1')...]
"""


Вывод данных в виде ассоциативного массива:
cur = conn.cursor(dictionary=True)
try:
    cur.execute("SELECT ids, ne_name FROM nes LIMIT 10")
except mariadb.Error as e:
    print(f"Error: {e}")
result = cur.fetchall()
for x in result:
    print(x)

"""
Вывод будет в таком виде:
{'ids': 14, 'ne_name': 'SMA-UKGD-R1'}
{'ids': 15, 'ne_name': 'SMA-UKGD-S1'}
{'ids': 16, 'ne_name': 'SMA-Avr150-S1'}
...
"""


# Закрытие соединения
conn.close()

среда, 24 апреля 2024 г.

Docker compose. Запуск контейнеров при старте операционной системы

Воспользуемся systemd для запуска контейнеров при старте системы.

Для этого создадим юнит systemd:
# nano /etc/systemd/system/docker-compose-app.service

Содержимое файла:
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/docker compose -f /home/korolev/app-dev/docker-compose.yml up -d
ExecStop=/usr/bin/docker compose -f /home/korolev/app-dev/docker-compose.yml down
TimeoutStartSec=0
Restart=on-failure

[Install]
WantedBy=multi-user.target


В конфигурации предполагается, что разработка идет в директории
/home/korolev/app-dev/

Рестартуем демон systemd:

# systemctl daemon-reload

И запускаем docker compose как службу:
# systemctl start docker-compose-app
# systemctl enable docker-compose-app


воскресенье, 21 апреля 2024 г.

Статические маршруты в NetworkManager. Ошибка Unable to save connection: Cannot modify a connection that has an associated rule- or rule6- file

В новых версия Linux управление сетевой конфигурацией выполняется специальной службой - NetworkManager.
Ранее в старых версиях Linux служба «network» в своей работе опиралась на конфигурационные файлы, расположенные в каталоге
/etc/sysconfig/network-scripts/
Теперь служба «NetworkManager» опирается на конфигурационные файлы в каталоге
/etc/NetworkManager/system-connections/,
а также на скрипты, расположенные в директории
/etc/NetworkManager/dispatcher.d/

Для добавления статического маршрута в NetworkManager можно воспользоваться удобной псевдографической утилитой «nmtui»
# nmtui
После запуска утилиты мы видим меню для работы с сетевыми соединениями. Выбираем «Edit a connection» и нажимаем Enter

В следующем окне выбираем сетевой интерфейс, переходим вправо и выбираем действие «Edit...» (Можно просто выбрать интерфейс и нажать Enter).

Открывается окно редактирования сетевого соединения. Переходим в раздел Routing и в пункт «Edit...»

Откроется дополнительное окно редактирования статических маршрутов. Выбираем «Add...»

Пример заполнения данных о статическом маршруте:

После применения изменений по кнопке «OK», окно редактирования маршрутов должно закрыться и мы должны попасть обратно в панель редактирования настроек интерфейса. Перемещаемся по этому окну до кнопки «OK», нажимаем Enter. Затем в разделе меню выбора интерфейса перемещаемся на кнопку «Back...» и выходим в в основное меню утилиты nmtui. Тут выбираем раздел «Quit» и выходим в консоль.

Для применения настроек нужно выполнить перезапуск службы NetworkManager
# systemctl restart NetworkManager
Статический маршрут пропишется в файл
/etc/NetworkManager/system-connections/<ИМЯ_ИНТЕРФЕЙСА>.nmconnection
Проcмотр правил маршрутизации:
# ip route
default via 10.10.49.254 dev ens18 proto static metric 100
10.10.49.0/24 dev ens18 proto kernel scope link src 10.10.49.166 metric 100
10.200.5.216 via 10.10.49.254 dev ens18 proto static metric 100


Для удаления статического маршрута, нужно опять запустить псевдографический интерфейс nmtui, зайти в раздел конфигурации нужного интерфейса, перейти в раздел «Routing», выбрать не нужный маршрут и применить команду «Remove». После этого выйти из программы nmtuui и перезапустить NetworkManager
# systemctl restart NetworkManager
Из файла /etc/NetworkManager/system-connections/<ИМЯ_ИНТЕРФЕЙСА>.nmconnection
статический маршрут пропадет, но команда ip route по прежнему будет отображать этот удаленный маршрут.
Для того что бы удалить маршрут окончательно нужно или применить команду удаления
# ip route del 10.10.49.0/24 dev ens18
Или перезапустить сетевой интерфейс вот так, чтобы не потерять управление:
# nmcli connection down enp0s3 && nmcli connection up enp0s3
В данном случае enp0s3 – это имя интерфейса.
Ну или можно просто перезагрузиться.

Если в Linux работает старая версия службы управления сетью «network», которая использует скрипты в директории /etc/sysconfig/network-scripts/, в случае добавления статического маршрута через nmtui мы получим ошибку «Unable to save connection: Cannot modify a connection that has an associated ‘rule-’ or ‘rule6-’ file». Это говорит о том, что NetworkManager не может выполнить изменение информации в файлах, лежащих в директории /etc/sysconfig/network-scripts/, а в этих директориях как раз есть что-то нужное для маршрутизации (например, правила маршрутизации в файле /etc/sysconfig/network-scripts/rule-eth1). Данное поведение не считается ошибкой (см https://bugzilla.redhat.com/show_bug.cgi?id=1384799), а говорит о том, что изменение файлов /etc/sysconfig/network-scripts/rule-* и /etc/sysconfig/network-scripts/route-* не поддерживается функционалом NetworkManager.

В этом случае можно пойти следующими путями:

1) Добавлять статические маршруты через редактирование файла
/etc/sysconfig/network-scripts/route-<ИМЯ_ИНТЕРФЕЙСА>
Пример записи в файле:
default via 10.11.90.54 table eth0
10.11.0.0/24 via 10.11.90.16

После изменения файла нужно перезагрузить службу «network»
# systemctl restart network

2) Отказаться от службы «network» и перейти на NetworkManager полностью.
# systemctl stop network
# systemctl disable network
# systemctl enable NetworkManager

В этом случае (в случае использования полностью NetworkManager) так же рекомендуется использовать службу NetworkManager-dispatcher, которая предназначена для отлова событий в системе, таких как падение или поднятие интерфейса. После наступления подобного события, связанного с сетью, благодаря службе NetworkManager-dispatcher будет запускаться скрипт из директории /etc/NetworkManager/dispatcher.d/, связанный с этим событием. Например, после поднятия интерфейса eth2, будет автоматически монтироваться шара по NFC.
Запуск службы NetworkManager-dispatcher:
# systemctl start NetworkManager-dispatcher
# systemctl enable NetworkManager-dispatcher

У NetworkManager-dispatcher есть расширение NetworkManager-dispatcher-routing-rules, которое может использовать в скриптах диспетчера старые правила описанные в файлах
/etc/sysconfig/network-scripts/route-*
/etc/sysconfig/network-scripts/rule-*
и прописывать маршруты на основе этих правил при событиях up и down интерфейсов
Установка этого расширения:
# yum makecache
# yum -y install NetworkManager-dispatcher-routing-rules