This commit is contained in:
Maxim Slipenko 2024-01-16 22:46:39 +03:00
parent 233c11efec
commit 657c424bf1
4 changed files with 69 additions and 12 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
.env .env
venv

View File

@ -2,9 +2,15 @@ FROM registry.altlinux.org/alt/python:p10
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
eepm \ eepm \
wget wget \
apt-repo-tools \
alien \
pip
# && rm -rf /var/lib/apt/lists/* # && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip --no-cache-dir install -r requirements.txt
COPY ./autorepacked ./autorepacked COPY ./autorepacked ./autorepacked
ENV PYTHONPATH "${PYTHONPATH}:." ENV PYTHONPATH "${PYTHONPATH}:."

View File

@ -1,13 +1,19 @@
import datetime
import json import json
import os import os
import importlib 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 import utils
from autorepacked.base_provider import BaseProvider from autorepacked.base_provider import BaseProvider
from autorepacked.config import Config from autorepacked.config import Config
def create_repo(config): def create_repo(config: Config):
utils.run([ utils.run([
'epm', 'epm',
'repo', 'repo',
@ -16,22 +22,38 @@ def create_repo(config):
]) ])
def main(): @asynccontextmanager
config = Config() async def lifespan(app: FastAPI):
await update_repeat()
yield
create_repo(config)
providers_path = os.path.join(os.getcwd(), 'autorepacked/providers') app = FastAPI(lifespan=lifespan)
modules = os.listdir(providers_path) config = Config()
update_task_started = False
def update():
json_file_path = os.path.join(config.get('repo_path'), 'data.json') json_file_path = os.path.join(config.get('repo_path'), 'data.json')
if not os.path.exists(json_file_path): if not os.path.exists(json_file_path):
with open(json_file_path, 'w') as data_file: with open(json_file_path, 'w') as data_file:
json.dump({'versions': {}}, data_file, indent=4) json.dump({'versions': {}}, data_file, indent=4)
with open(json_file_path, 'r') as data_file: with open(json_file_path, 'r') as data_file:
repo_data = json.load(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'] versions = repo_data['versions']
need_update_index = False need_update_index = False
for module_name in modules: for module_name in modules:
@ -49,8 +71,7 @@ def main():
repo_data['versions'] = versions repo_data['versions'] = versions
with open(json_file_path, 'w') as data_file: current_date = datetime.datetime.utcnow()
json.dump(repo_data, data_file, indent=4)
if need_update_index: if need_update_index:
utils.run( utils.run(
@ -61,7 +82,33 @@ def main():
config.get('repo_path'), 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__": if __name__ == "__main__":
main() create_repo(config)
uvicorn.run(app, host="0.0.0.0", port=8000)

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
fastapi==0.109.0
uvicorn==0.26.0
fastapi-utils==0.2.1