Upgrader: Inject build type into request

This commit is contained in:
deajan 2024-11-26 13:39:12 +01:00
parent 5852dbb5dd
commit 1537e0500a
7 changed files with 46 additions and 16 deletions

View file

@ -16,4 +16,5 @@ if __name__ == "__main__":
if "--run-as-cli" in sys.argv: if "--run-as-cli" in sys.argv:
# Drop --run-as-cli argument since cli doesn't know about it # Drop --run-as-cli argument since cli doesn't know about it
sys.argv.pop(sys.argv.index("--run-as-cli")) sys.argv.pop(sys.argv.index("--run-as-cli"))
os.environ["NPBACKUP_BUILD_TYPE"] = "cli"
main() main()

View file

@ -17,6 +17,8 @@ if __name__ == "__main__":
if "--run-as-cli" in sys.argv: if "--run-as-cli" in sys.argv:
# Drop --run-as-cli argument since cli doesn't know about it # Drop --run-as-cli argument since cli doesn't know about it
sys.argv.pop(sys.argv.index("--run-as-cli")) sys.argv.pop(sys.argv.index("--run-as-cli"))
os.environ["NPBACKUP_BUILD_TYPE"] = "cli"
main() main()
else: else:
os.environ["NPBACKUP_BUILD_TYPE"] = "gui"
main_gui() main_gui()

View file

@ -13,4 +13,5 @@ from npbackup.gui.__main__ import main_gui
del sys.path[0] del sys.path[0]
if __name__ == "__main__": if __name__ == "__main__":
os.environ["NPBACKUP_BUILD_TYPE"] = "viewer"
main_gui(viewer_mode=True) main_gui(viewer_mode=True)

View file

@ -7,7 +7,7 @@ __intname__ = "npbackup.upgrade_client.upgrader"
__author__ = "Orsiris de Jong" __author__ = "Orsiris de Jong"
__copyright__ = "Copyright (C) 2023-2024 NetInvent" __copyright__ = "Copyright (C) 2023-2024 NetInvent"
__license__ = "BSD-3-Clause" __license__ = "BSD-3-Clause"
__build__ = "2024091701" __build__ = "2024112601"
import os import os
@ -145,20 +145,24 @@ def auto_upgrader(
requestor.create_session(authenticated=True) requestor.create_session(authenticated=True)
# We'll check python_arch instead of os_arch since we build 32 bit python executables for compat reasons # We'll check python_arch instead of os_arch since we build 32 bit python executables for compat reasons
platform_and_arch = "{}/{}".format(get_os(), python_arch()).lower() arch = python_arch() if not IS_LEGACY else f"{python_arch()}-legacy"
if IS_LEGACY: build_type = os.environ.get("NPBACKUP_BUILD_TYPE", None)
platform_and_arch += "-legacy" if not build_type:
logger.critical("Cannot determine build type for upgrade processs")
return False
target = "{}/{}/{}".format(get_os(), arch, build_type).lower()
try: try:
host_id = "{}/{}/{}".format(auto_upgrade_host_identity, npbackup_version, group) host_id = "{}/{}/{}".format(auto_upgrade_host_identity, npbackup_version, group)
id_record = "{}/{}".format(platform_and_arch, host_id) id_record = "{}/{}".format(target, host_id)
except TypeError: except TypeError:
id_record = platform_and_arch id_record = target
file_info = requestor.data_model("upgrades", id_record=id_record) file_info = requestor.data_model("upgrades", id_record=id_record)
try: try:
sha256sum = file_info["sha256sum"] sha256sum = file_info["sha256sum"]
except (KeyError, TypeError): except (KeyError, TypeError):
logger.error("Cannot get file description") logger.error("Cannot get file description")
logger.debug("Trace", exc_info=True)
return False return False
if sha256sum is None: if sha256sum is None:
logger.info("No upgrade file found has been found for me :/") logger.info("No upgrade file found has been found for me :/")

View file

@ -18,7 +18,7 @@ from argparse import ArgumentParser
from fastapi import FastAPI, HTTPException, Response, Depends, status, Request, Header from fastapi import FastAPI, HTTPException, Response, Depends, status, Request, Header
from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.security import HTTPBasic, HTTPBasicCredentials
from fastapi_offline import FastAPIOffline from fastapi_offline import FastAPIOffline
from upgrade_server.models.files import FileGet, FileSend, Platform, Arch from upgrade_server.models.files import FileGet, FileSend, Platform, Arch, BuildType
from upgrade_server.models.oper import CurrentVersion from upgrade_server.models.oper import CurrentVersion
import upgrade_server.crud as crud import upgrade_server.crud as crud
import upgrade_server.configuration as configuration import upgrade_server.configuration as configuration
@ -125,20 +125,20 @@ async def current_version(
@app.get( @app.get(
"/upgrades/{platform}/{arch}", response_model=Union[FileSend, dict], status_code=200 "/upgrades/{platform}/{arch}/{build_type}", response_model=Union[FileSend, dict], status_code=200
) )
@app.get( @app.get(
"/upgrades/{platform}/{arch}/{auto_upgrade_host_identity}", "/upgrades/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}",
response_model=Union[FileSend, dict], response_model=Union[FileSend, dict],
status_code=200, status_code=200,
) )
@app.get( @app.get(
"/upgrades/{platform}/{arch}/{auto_upgrade_host_identity}/{installed_version}", "/upgrades/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}/{installed_version}",
response_model=Union[FileSend, dict], response_model=Union[FileSend, dict],
status_code=200, status_code=200,
) )
@app.get( @app.get(
"/upgrades/{platform}/{arch}/{auto_upgrade_host_identity}/{installed_version}/{group}", "/upgrades/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}/{installed_version}/{group}",
response_model=Union[FileSend, dict], response_model=Union[FileSend, dict],
status_code=200, status_code=200,
) )
@ -146,6 +146,7 @@ async def upgrades(
request: Request, request: Request,
platform: Platform, platform: Platform,
arch: Arch, arch: Arch,
build_type: BuildType,
auto_upgrade_host_identity: str = None, auto_upgrade_host_identity: str = None,
installed_version: str = None, installed_version: str = None,
group: str = None, group: str = None,
@ -176,7 +177,7 @@ async def upgrades(
# TODO: # TODO:
# This can be amended by adding specific rules for host identity or groups or installed # This can be amended by adding specific rules for host identity or groups or installed
file = FileGet(platform=platform, arch=arch) file = FileGet(platform=platform, arch=arch, build_type=build_type)
try: try:
result = crud.get_file(file) result = crud.get_file(file)
if not result: if not result:
@ -193,7 +194,20 @@ async def upgrades(
@app.get( @app.get(
"/download/{platform}/{arch}/{auto_upgrade_host_identity}/{installed_version}/{group}", "/download/{platform}/{arch}/{build_type}", response_model=FileSend, status_code=200
)
@app.get(
"/download/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}",
response_model=FileSend,
status_code=200,
)
@app.get(
"/download/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}/{installed_version}",
response_model=FileSend,
status_code=200,
)
@app.get(
"/download/{platform}/{arch}/{build_type}/{auto_upgrade_host_identity}/{installed_version}/{group}",
response_model=FileSend, response_model=FileSend,
status_code=200, status_code=200,
) )
@ -201,6 +215,7 @@ async def download(
request: Request, request: Request,
platform: Platform, platform: Platform,
arch: Arch, arch: Arch,
built_type: BuildType,
auto_upgrade_host_identity: str = None, auto_upgrade_host_identity: str = None,
installed_version: str = None, installed_version: str = None,
group: str = None, group: str = None,
@ -228,7 +243,7 @@ async def download(
crud.store_host_info(config_dict["upgrades"]["statistics_file"], host_id=data) crud.store_host_info(config_dict["upgrades"]["statistics_file"], host_id=data)
except KeyError: except KeyError:
logger.error("No statistics file set.") logger.error("No statistics file set.")
file = FileGet(platform=platform, arch=arch) file = FileGet(platform=platform, arch=arch, build_type=build_type)
try: try:
result = crud.get_file(file, content=True) result = crud.get_file(file, content=True)
if not result: if not result:

View file

@ -7,7 +7,7 @@ __intname__ = "npbackup.upgrade_server.crud"
__author__ = "Orsiris de Jong" __author__ = "Orsiris de Jong"
__copyright__ = "Copyright (C) 2023-2024 NetInvent" __copyright__ = "Copyright (C) 2023-2024 NetInvent"
__license__ = "GPL-3.0-only" __license__ = "GPL-3.0-only"
__build__ = "2024091701" __build__ = "2024112601"
import os import os
@ -89,7 +89,7 @@ def get_current_version() -> Optional[CurrentVersion]:
def get_file( def get_file(
file: FileGet, content: bool = False file: FileGet, content: bool = False
) -> Optional[Union[FileSend, bytes, dict]]: ) -> Optional[Union[FileSend, bytes, dict]]:
possible_filename = "npbackup.zip" possible_filename = f"npbackup-{file.build_type.value}.zip"
path = os.path.join( path = os.path.join(
config_dict["upgrades"]["data_root"], config_dict["upgrades"]["data_root"],
file.platform.value, file.platform.value,
@ -102,6 +102,7 @@ def get_file(
return { return {
"arch": file.arch.value, "arch": file.arch.value,
"platform": file.platform.value, "platform": file.platform.value,
"build_type": file.build_type.value,
"sha256sum": None, "sha256sum": None,
"filename": None, "filename": None,
"file_length": 0, "file_length": 0,
@ -116,6 +117,7 @@ def get_file(
file_send = FileSend( file_send = FileSend(
arch=file.arch.value, arch=file.arch.value,
platform=file.platform.value, platform=file.platform.value,
build_type=file.build_type.value,
sha256sum=sha256, sha256sum=sha256,
filename=possible_filename, filename=possible_filename,
file_length=length, file_length=length,

View file

@ -23,10 +23,15 @@ class Arch(Enum):
x86 = "x86" x86 = "x86"
x64 = "x64" x64 = "x64"
class BuildType(Enum):
gui = "gui"
cli = "cli"
class FileBase(BaseModel): class FileBase(BaseModel):
arch: Arch arch: Arch
platform: Platform platform: Platform
build_type: BuildType
class FileGet(FileBase): class FileGet(FileBase):