мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| poleznosti:bareos_reports [2024/09/25 06:29] – Администратор | poleznosti:bareos_reports [2024/09/25 07:20] (текущий) – [Создаем демона для reports_bareos.py] Администратор | ||
|---|---|---|---|
| Строка 3: | Строка 3: | ||
| И я решил сам сделать такой функционал т.к. смотреть через **bconsole** не очень удобно из-за привязки записанных файлов к заданию **job**\\ | И я решил сам сделать такой функционал т.к. смотреть через **bconsole** не очень удобно из-за привязки записанных файлов к заданию **job**\\ | ||
| Я изучил структуру базы данных и зависимости таблиц между собой, что бы понять какие данные мне нужно включить в отчетность и что бы ничего лишнего не попало туда. | Я изучил структуру базы данных и зависимости таблиц между собой, что бы понять какие данные мне нужно включить в отчетность и что бы ничего лишнего не попало туда. | ||
| - | |||
| ===== Кратко описываю что мне нужно извлечь из базы ===== | ===== Кратко описываю что мне нужно извлечь из базы ===== | ||
| Есть таблицы **job**, **file**, **media**\\ | Есть таблицы **job**, **file**, **media**\\ | ||
| Строка 68: | Строка 67: | ||
| Но это все сырые данные и так мы только убедились что все работает, | Но это все сырые данные и так мы только убедились что все работает, | ||
| - | |||
| ===== Создание веб интерфейса ===== | ===== Создание веб интерфейса ===== | ||
| Создаем такую структуру | Создаем такую структуру | ||
| Строка 237: | Строка 235: | ||
| } | } | ||
| </ | </ | ||
| + | ===== Создаем логику работы (backend) ===== | ||
| + | Логику будем описывать с помощью **Python** и фреймворка **Flask** | ||
| + | ==== Содержимое файла reports_bareos.py ==== | ||
| + | <code | download> | ||
| + | from flask import Flask, request, render_template | ||
| + | import psycopg2 | ||
| + | |||
| + | app = Flask(__name__) | ||
| + | |||
| + | def get_db_connection(): | ||
| + | conn = psycopg2.connect(dbname=' | ||
| + | return conn | ||
| + | |||
| + | @app.route('/' | ||
| + | def index(): | ||
| + | return render_template(' | ||
| + | |||
| + | @app.route('/ | ||
| + | def report(): | ||
| + | volumename = request.args.get(' | ||
| + | start_date = request.args.get(' | ||
| + | end_date = request.args.get(' | ||
| + | |||
| + | conn = get_db_connection() | ||
| + | cur = conn.cursor() | ||
| + | |||
| + | query = ''' | ||
| + | SELECT | ||
| + | m.volumename AS volumename, | ||
| + | f.name AS file_name, | ||
| + | j.name AS job_name, | ||
| + | j.jobid AS jobid, | ||
| + | m.mediatype AS mediatype, | ||
| + | j.starttime AS starttime, | ||
| + | j.endtime AS endtime, | ||
| + | m.poolid AS poolid | ||
| + | FROM | ||
| + | public.job j | ||
| + | JOIN | ||
| + | public.file f ON j.jobid = f.jobid | ||
| + | JOIN | ||
| + | public.media m ON m.poolid IS NOT NULL | ||
| + | WHERE | ||
| + | j.name = ' | ||
| + | m.mediatype = ' | ||
| + | m.poolid = 2 | ||
| + | ''' | ||
| + | |||
| + | if volumename: | ||
| + | query += ' AND m.volumename = %s' | ||
| + | cur.execute(query, | ||
| + | else: | ||
| + | cur.execute(query) | ||
| + | |||
| + | reports = cur.fetchall() | ||
| + | |||
| + | cur.close() | ||
| + | conn.close() | ||
| + | |||
| + | # Фильтруем строки, | ||
| + | reports = [row for row in reports if row[1]] | ||
| + | |||
| + | return render_template(' | ||
| + | |||
| + | if __name__ == ' | ||
| + | app.run(host=' | ||
| + | </ | ||
| + | ===== Тестируем ===== | ||
| + | Откройте порт 5000 в вашем firewall если это необходимо\\ | ||
| + | Далее нужно вручную запустить приложение командой | ||
| + | < | ||
| + | python / | ||
| + | </ | ||
| + | Теперь идем в браузер | ||
| + | < | ||
| + | И вы увидите вот эту форму\\ | ||
| + | {{: | ||
| + | Значит все идет как нужно. Но запускать таким образом приложение не удобно, | ||
| + | ===== Создаем демона для reports_bareos.py ===== | ||
| + | Открываем | ||
| + | < | ||
| + | nano / | ||
| + | </ | ||
| + | Содержимое будет примерно такое | ||
| + | <code | download> | ||
| + | [Unit] | ||
| + | Description=Flask Application for Reports Bareos | ||
| + | After=network.target | ||
| + | |||
| + | [Service] | ||
| + | User=bareos | ||
| + | Group=bareos | ||
| + | WorkingDirectory=/ | ||
| + | ExecStart=/ | ||
| + | Restart=always | ||
| + | RestartSec=10 | ||
| + | Environment=" | ||
| + | Environment=" | ||
| + | StandardOutput=append:/ | ||
| + | StandardError=append:/ | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | Запускаем демона и проверяем его | ||
| + | < | ||
| + | systemctl daemon-reload | ||
| + | systemctl enable reports_bareos.service | ||
| + | systemctl start reports_bareos.service | ||
| + | </ | ||
| + | < | ||
| + | systemctl status reports_bareos.service | ||
| + | </ | ||
| + | {{: | ||
| + | Теперь идем в браузер | ||
| + | < | ||
| + | И вы увидите вот эту форму\\ | ||
| + | {{: | ||
| + | Значит все получилось. | ||
| + | ===== Прикручиваем кнопку отчетов в bareos-webui ===== | ||
| + | Тут уже все индивидуально и куда вам будет удобнее, | ||
| + | Внешний вид интерфейса вот такой по умолчанию\\ | ||
| + | {{: | ||
| + | Я решил в пункте **Analytics** сделать кнопку отчетности | ||
| + | {{: | ||
| + | Открываем файл | ||
| + | < | ||
| + | nano / | ||
| + | </ | ||
| + | Ищем в нем где упоминается **Stored Data** как видно на скрине выше это такой раздел\\ | ||
| + | И туда отдельным пунктом добавляем кнопку перехода в наш созданный интерфейс | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | Визуально выглядит вот так | ||
| + | {{: | ||
| + | |||
| + | На этом все, мы проделали отличную работу по созданию интерфейса для отчетности.\\ | ||
| + | Его можно расширять если вам необходимы еще какие-то данные из базы визуализировать | ||