Add ui_version field update and avoid potential race conditions

This commit is contained in:
Théophile Diot 2024-08-02 12:08:57 +01:00
parent 516b654923
commit 658bc310eb
No known key found for this signature in database
GPG key ID: FA995104A0BA376A
2 changed files with 18 additions and 2 deletions

View file

@ -506,16 +506,21 @@ class Database:
inspector = inspect(self.sql_engine)
db_version = None
db_ui_version = bunkerweb_version
has_all_tables = True
old_data = {}
if inspector and len(inspector.get_table_names()):
metadata = self.get_metadata()
db_version = metadata["version"]
db_ui_version = metadata["ui_version"]
if metadata["default"]:
db_version = "error"
if db_version != bunkerweb_version:
if db_ui_version != bunkerweb_version:
db_ui_version = db_version
self.logger.warning(f"Database version ({db_version}) is different from Bunkerweb version ({bunkerweb_version}), migrating ...")
current_time = datetime.now()
error = True
@ -1045,10 +1050,10 @@ class Database:
if table_name == "bw_metadata":
existing_row = session.query(Metadata).filter_by(id=1).first()
if not existing_row:
session.add(Metadata(**(row | {"ui_version": db_version})))
session.add(Metadata(**(row | {"ui_version": db_ui_version})))
session.commit()
continue
session.query(Metadata).filter_by(id=1).update(row | {"ui_version": db_version})
session.query(Metadata).filter_by(id=1).update(row | {"ui_version": db_ui_version})
continue
# Check if the row already exists in the table

View file

@ -15,6 +15,8 @@ from sqlalchemy import MetaData, inspect, text
from sqlalchemy.exc import IntegrityError
from Database import Database # type: ignore
from model import Metadata # type: ignore
from models import Base, Users, Roles, RolesUsers, UserRecoveryCodes, RolesPermissions, Permissions
@ -132,6 +134,15 @@ class UIDatabase(Database):
continue
self.logger.debug(e)
with self._db_session() as session:
try:
metadata = session.query(Metadata).get(1)
if metadata:
metadata.ui_version = bunkerweb_version
session.commit()
except BaseException as e:
self.logger.error(f"Error when trying to update ui_version field in metadata: {e}")
return True, ""
def get_ui_user(self, *, username: Optional[str] = None, as_dict: bool = False) -> Optional[Union[Users, dict]]: