v8.2: Update service settings, backup models, and DB schema

Added support for managing Docker settings and improved the handling of service-specific configurations. Updated various backup methods and database columns to ensure consistency and clarity. Included new database migration scripts to handle renamed columns.
pull/399/head v8.1
Aidaho 2024-10-12 08:43:32 +03:00
parent 1677f49b4a
commit 3a9c18392b
7 changed files with 132 additions and 23 deletions

View File

@ -635,6 +635,7 @@ def update_db_v_8_1():
else:
print("An error occurred:", e)
def update_db_v_8_1_0_1():
try:
migrate(
@ -649,6 +650,34 @@ def update_db_v_8_1_0_1():
print("An error occurred:", e)
def update_db_v_8_1_0_2():
try:
migrate(
migrator.rename_column('backups', 'rhost', 'rserver')
)
except Exception as e:
if e.args[0] == 'no such column: "rhost"' or str(e) == '(1060, no such column: "rhost")':
print("Updating... DB has been updated to version 8.2")
elif e.args[0] == "'bool' object has no attribute 'sql'":
print("Updating... DB has been updated to version 8.2")
else:
print("An error occurred:", e)
def update_db_v_8_1_0_3():
try:
migrate(
migrator.rename_column('git_setting', 'period', 'time')
)
except Exception as e:
if e.args[0] == 'no such column: "period"' or str(e) == '(1060, no such column: "period")':
print("Updating... DB has been updated to version 8.2")
elif e.args[0] == "'bool' object has no attribute 'sql'":
print("Updating... DB has been updated to version 8.2")
else:
print("An error occurred:", e)
def update_ver():
try:
Version.update(version='8.1.0').execute()
@ -679,4 +708,6 @@ def update_all():
update_db_v_8_0_2_1()
update_db_v_8_1()
update_db_v_8_1_0_1()
update_db_v_8_1_0_2()
update_db_v_8_1_0_3()
update_ver()

View File

@ -12,7 +12,7 @@ models = {
def insert_backup_job(server_id, rserver, rpath, backup_type, time, cred, description):
try:
return Backup.insert(
server_id=server_id, rhost=rserver, rpath=rpath, type=backup_type, time=time,
server_id=server_id, rserver=rserver, rpath=rpath, type=backup_type, time=time,
cred_id=cred, description=description
).execute()
except Exception as e:
@ -26,21 +26,12 @@ def insert_s3_backup_job(**kwargs):
out_error(e)
def update_s3_backup_job(backup_id: int, model: str, **kwargs):
def update_backup_job(backup_id: int, model: str, **kwargs):
model = models[model]
try:
return model.update(**kwargs).where(model.id == backup_id).execute()
except Exception as e:
out_error(e)
def update_backup(server_id, rserver, rpath, backup_type, time, cred, description, backup_id):
backup_update = Backup.update(
server_id=server_id, rhost=rserver, rpath=rpath, type=backup_type, time=time,
cred_id=cred, description=description
).where(Backup.id == backup_id)
try:
backup_update.execute()
model.update(**kwargs).where(model.id == backup_id).execute()
except model.DoesNotExist:
raise RoxywiResourceNotFound
except Exception as e:
out_error(e)
@ -53,10 +44,10 @@ def delete_backup(backup_id: int, model: str) -> None:
out_error(e)
def insert_new_git(server_id, service_id, repo, branch, period, cred, description) -> int:
def insert_new_git(server_id, service_id, repo, branch, time, cred, description) -> int:
try:
return GitSetting.insert(
server_id=server_id, service_id=service_id, repo=repo, branch=branch, period=period,
server_id=server_id, service_id=service_id, repo=repo, branch=branch, time=time,
cred_id=cred, description=description
).execute()
except Exception as e:
@ -93,7 +84,7 @@ def select_backups(**kwargs):
def select_s3_backups(**kwargs):
if kwargs.get("server") is not None and kwargs.get("bucket") is not None:
query = S3Backup.select().where(
(S3Backup.server == kwargs.get("server")) &
(S3Backup.server_id == kwargs.get("server")) &
(S3Backup.s3_server == kwargs.get("s3_server")) &
(S3Backup.bucket == kwargs.get("bucket"))
)

View File

@ -211,7 +211,7 @@ class Cred(BaseModel):
class Backup(BaseModel):
id = AutoField()
server_id = CharField()
rhost = CharField()
rserver = CharField()
rpath = CharField()
type = CharField(column_name='type')
time = CharField()
@ -514,7 +514,7 @@ class GitSetting(BaseModel):
id = AutoField()
server_id = ForeignKeyField(Server, on_delete='Cascade')
service_id = IntegerField()
period = CharField()
time = CharField()
repo = CharField(null=True)
branch = CharField(null=True)
cred_id = IntegerField()

View File

@ -105,8 +105,7 @@ def delete_backup(json_data: BackupRequest, backup_id: int) -> tuple:
def update_backup(json_data: BackupRequest, backup_id: int) -> tuple:
create_backup_inv(json_data)
backup_sql.update_backup(json_data.server_id, json_data.rserver, json_data.rpath, json_data.type,
json_data.time, json_data.cred_id, json_data.description, backup_id)
backup_sql.update_backup_job(backup_id, 'fs', **json_data.model_dump(mode='json'))
roxywi_common.logging('backup ', f'A backup job for server {json_data.server_id} has been updated', roxywi=1, login=1)
return BaseResponse().model_dump(mode='json'), 201
@ -151,7 +150,7 @@ def create_git_backup(data: GitBackupRequest, is_api: bool) -> tuple:
raise Exception(e)
try:
last_id = backup_sql.insert_new_git(server_id=data.server_id, service_id=data.service_id, repo=data.repo, branch=data.branch, period=data.time,
last_id = backup_sql.insert_new_git(server_id=data.server_id, service_id=data.service_id, repo=data.repo, branch=data.branch, time=data.time,
cred=data.cred_id, description=data.description)
roxywi_common.logging(server_ip, 'A new git job has been created', roxywi=1, login=1, keep_history=1,
service=service_name)

View File

@ -190,6 +190,7 @@ class InstallView(MethodView):
"""
try:
service_sql.update_hapwi_server(server_id, body.checker, body.metrics, body.auto_start, service)
service_sql.insert_or_update_service_setting(server_id, service, 'dockerized', int(body.docker))
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, f'Cannot update Tools settings for {service.title()}')
return IdStrResponse(id=f'{server_id}-{service}').model_dump(mode='json'), 201

View File

@ -5,6 +5,8 @@ from playhouse.shortcuts import model_to_dict
from flask_jwt_extended import jwt_required
import app.modules.db.backup as backup_sql
import app.modules.db.server as server_sql
import app.modules.db.service as service_sql
import app.modules.service.backup as backup_mod
import app.modules.roxywi.common as roxywi_common
from app.middleware import get_user_params, page_for_admin, check_group
@ -66,6 +68,8 @@ class BackupView(MethodView):
"""
try:
backup = backup_sql.get_backup(backup_id, 'fs')
backup.server_id = int(backup.server_id)
backup.description = str(backup.description).replace("'", "")
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
@ -287,6 +291,8 @@ class S3BackupView(MethodView):
"""
try:
backup = backup_sql.get_backup(backup_id, 's3')
backup.server_id = int(backup.server_id)
backup.description = str(backup.description).replace("'", "")
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
@ -404,7 +410,7 @@ class S3BackupView(MethodView):
"""
try:
backup_mod.create_s3_backup_inv(body, 'add')
backup_sql.update_s3_backup_job(backup_id, 's3')
backup_sql.update_backup_job(backup_id, 's3', **body.model_dump(mode='json'))
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot update S3 backup')
@ -569,6 +575,72 @@ class GitBackupView(MethodView):
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot create GIT backup')
@validate(body=GitBackupRequest)
def put(self, backup_id: int, body: GitBackupRequest):
"""
Update a new Git backup.
---
tags:
- Git Backup
parameters:
- name: config
in: body
required: true
description: The configuration for Git backup service
schema:
type: 'object'
required:
- cred_id
- server_id
- service_id
- init
- repo
- branch
- time
properties:
server_id:
type: 'integer'
description: 'The ID of the server to backed up'
service_id:
type: 'integer'
description: 'Service ID: 1: HAProxy, 2: NGINX, 3: Keepalived, 4: Apache'
example: 1
init:
type: 'integer'
description: 'Indicates whether to initialize the repository'
repo:
type: 'string'
description: 'The repository from where to fetch the data for backup'
example: git@github.com:Example/haproxy_configs
branch:
type: 'string'
description: 'The branch to pull for backup'
example: 'master'
time:
type: 'string'
description: 'The timing for the Git backup task'
enum: [hourly, daily, weekly, monthly]
cred_id:
type: 'integer'
description: 'The ID of the credentials to be used for backup'
description:
type: 'string'
description: 'Description for the Git backup configuration'
responses:
201:
description: Successful operation
default:
description: Unexpected error
"""
try:
server = server_sql.get_server_by_id(body.server_id)
service_name = service_sql.select_service_name_by_id(body.service_id).lower()
backup_mod.create_git_backup_inv(body, server.ip, service_name)
backup_sql.update_backup_job(backup_id, 'git', **body.model_dump(mode='json', exclude={'init'}))
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot update GIT backup')
return BaseResponse().model_dump(mode='json'), 201
@validate(body=GitBackupRequest)
def delete(self, backup_id: int, body: GitBackupRequest):
"""

View File

@ -103,6 +103,10 @@ class ServiceView(MethodView):
data = ErrorResponse(error='Cannot get information').model_dump(mode='json')
else:
data['Status'] = self._service_status(data['Process'])
data['auto_start'] = int(server.haproxy_active)
data['checker'] = int(server.haproxy_alert)
data['metrics'] = int(server.haproxy_metrics)
data['docker'] = int(service_sql.select_service_setting(server_id, service, 'dockerized'))
elif service == 'nginx':
is_dockerized = service_sql.select_service_setting(server_id, service, 'dockerized')
if is_dockerized == '1':
@ -141,6 +145,10 @@ class ServiceView(MethodView):
return ErrorResponse(error='NGINX service not found').model_dump(mode='json'), 404
except Exception as e:
data = ErrorResponse(error=str(e)).model_dump(mode='json')
data['auto_start'] = int(server.nginx_active)
data['checker'] = int(server.nginx_alert)
data['metrics'] = int(server.nginx_metrics)
data['docker'] = int(is_dockerized)
elif service == 'apache':
apache_stats_user = sql.get_setting('apache_stats_user')
apache_stats_password = sql.get_setting('apache_stats_password')
@ -169,6 +177,11 @@ class ServiceView(MethodView):
}
except Exception as e:
data = ErrorResponse(error=str(e)).model_dump(mode='json')
data['auto_start'] = int(server.apache_active)
data['checker'] = int(server.apache_alert)
data['metrics'] = int(server.apache_metrics)
data['docker'] = int(service_sql.select_service_setting(server_id, service, 'dockerized'))
elif service == 'keepalived':
cmd = ("sudo /usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && sudo systemctl status keepalived |grep -e 'Active'"
"|awk '{print $2, $9$10$11$12$13}' && ps ax |grep 'keepalived '|grep -v udp|grep -v grep |wc -l")
@ -182,6 +195,8 @@ class ServiceView(MethodView):
return ErrorResponse(error='Keepalived service not found').model_dump(mode='json'), 404
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot get version')
data['service'] = service
data['server_id'] = server_id
data['id'] = f'{server_id}-{service}'
return jsonify(data)