diff --git a/.gitignore b/.gitignore index 2eea525..50a19c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +venv \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 207e87f..b9dab27 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,15 @@ FROM registry.altlinux.org/alt/python:p10 RUN apt-get update && apt-get install -y \ eepm \ - wget + wget \ + apt-repo-tools \ + alien \ + pip # && rm -rf /var/lib/apt/lists/* +COPY requirements.txt . +RUN pip --no-cache-dir install -r requirements.txt + COPY ./autorepacked ./autorepacked ENV PYTHONPATH "${PYTHONPATH}:." diff --git a/autorepacked/main.py b/autorepacked/main.py index 64a7079..5739504 100644 --- a/autorepacked/main.py +++ b/autorepacked/main.py @@ -1,13 +1,19 @@ +import datetime import json import os import importlib +from contextlib import asynccontextmanager + +from fastapi import BackgroundTasks, FastAPI +import uvicorn +from fastapi_utils.tasks import repeat_every from autorepacked import utils from autorepacked.base_provider import BaseProvider from autorepacked.config import Config -def create_repo(config): +def create_repo(config: Config): utils.run([ 'epm', 'repo', @@ -16,22 +22,38 @@ def create_repo(config): ]) -def main(): - config = Config() +@asynccontextmanager +async def lifespan(app: FastAPI): + await update_repeat() + yield - create_repo(config) - providers_path = os.path.join(os.getcwd(), 'autorepacked/providers') - modules = os.listdir(providers_path) +app = FastAPI(lifespan=lifespan) +config = Config() +update_task_started = False + + +def update(): json_file_path = os.path.join(config.get('repo_path'), 'data.json') if not os.path.exists(json_file_path): with open(json_file_path, 'w') as data_file: json.dump({'versions': {}}, data_file, indent=4) - with open(json_file_path, 'r') as data_file: repo_data = json.load(data_file) + global update_task_started + + if 'last_version_check' in repo_data: + last_version_check = datetime.datetime.fromisoformat(repo_data['last_version_check']) + + if datetime.datetime.now() - datetime.timedelta(minutes=5) < last_version_check: + update_task_started = False + return + + providers_path = os.path.join(os.getcwd(), 'autorepacked/providers') + modules = os.listdir(providers_path) + versions = repo_data['versions'] need_update_index = False for module_name in modules: @@ -49,8 +71,7 @@ def main(): repo_data['versions'] = versions - with open(json_file_path, 'w') as data_file: - json.dump(repo_data, data_file, indent=4) + current_date = datetime.datetime.utcnow() if need_update_index: utils.run( @@ -61,7 +82,33 @@ def main(): config.get('repo_path'), ] ) + repo_data['last_index_update'] = current_date.isoformat() + + repo_data['last_version_check'] = current_date.isoformat() + + with open(json_file_path, 'w') as data_file: + json.dump(repo_data, data_file, indent=4) + + update_task_started = False + + +@app.post("/update") +def update_method(background_tasks: BackgroundTasks): + global update_task_started + if not update_task_started: + update_task_started = True + background_tasks.add_task(update) + return {'status': 'OK'} + + +@repeat_every(seconds=60 * 60 * 4) +def update_repeat(): + global update_task_started + if not update_task_started: + update_task_started = True + update() if __name__ == "__main__": - main() + create_repo(config) + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2b5576d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +fastapi==0.109.0 +uvicorn==0.26.0 +fastapi-utils==0.2.1 \ No newline at end of file