Compare commits

..

No commits in common. "657c424bf1ef69b48707342d369b6963e59b930b" and "250fe07bf0d1b00ecbd50ae334ab5de4e2715966" have entirely different histories.

7 changed files with 41 additions and 165 deletions

View File

@ -1 +0,0 @@
REPO_PATH=

1
.gitignore vendored
View File

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

View File

@ -2,15 +2,9 @@ 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,17 +1,15 @@
import os import os
import shutil import shutil
import subprocess
import tempfile import tempfile
import re import re
from autorepacked import utils
def _get_file(directory): def _get_file(directory):
files_and_dirs = os.listdir(directory) files_and_dirs = os.listdir(directory)
files = [f for f in files_and_dirs if os.path.isfile(os.path.join(directory, f))] files = [f for f in files_and_dirs if os.path.isfile(os.path.join(directory, f))]
return os.path.join(directory, files[0]) if files else None return os.path.join(directory, files[0]) if files else None
class BaseProvider: class BaseProvider:
def __init__(self, config): def __init__(self, config):
self.config = config self.config = config
@ -23,14 +21,14 @@ class BaseProvider:
return self._name return self._name
def get_version(self): def get_version(self):
url = utils.run([ url = subprocess.run([
'epm', 'epm',
'--silent', '--silent',
'tool', 'tool',
'eget', 'eget',
'--get-real-url', '--get-real-url',
self.get_download_url(), self.get_download_url(),
]) ], stdout=subprocess.PIPE).stdout.decode('utf-8')
pattern = r'\d+\.\d+\.\d+' pattern = r'\d+\.\d+\.\d+'
match = re.search(pattern, url) match = re.search(pattern, url)
@ -46,36 +44,48 @@ class BaseProvider:
download_directory = tempfile.mkdtemp() download_directory = tempfile.mkdtemp()
repacked_directory = tempfile.mkdtemp() repacked_directory = tempfile.mkdtemp()
utils.run([ subprocess.run(
'epm', args=[
'--silent', 'epm',
'tool', '--silent',
'eget', 'tool',
'-q', 'eget',
self.get_download_url(), '-q',
], cwd=download_directory) self.get_download_url(),
],
stdout=subprocess.PIPE,
cwd=download_directory,
).stdout.decode('utf-8')
file = _get_file(download_directory) file = _get_file(download_directory)
utils.run([ subprocess.run(
'epm', args=[
'--silent', 'epm',
'-y', '--silent',
'repack', '-y',
file, 'repack',
], cwd=repacked_directory) file,
],
stdout=subprocess.PIPE,
cwd=repacked_directory,
).stdout.decode('utf-8')
shutil.rmtree(download_directory) shutil.rmtree(download_directory)
file = _get_file(repacked_directory) file = _get_file(repacked_directory)
utils.run([ subprocess.run(
'epm', args=[
'--silent', 'epm',
'repo', '--silent',
'pkgadd', 'repo',
self.config.get('repo_path'), 'pkgadd',
file, self.config.get('repo_path'),
], cwd=repacked_directory) file,
],
stdout=subprocess.PIPE,
cwd=repacked_directory,
).stdout.decode('utf-8')
shutil.rmtree(repacked_directory) shutil.rmtree(repacked_directory)

View File

@ -1,114 +0,0 @@
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: Config):
utils.run([
'epm',
'repo',
'create',
config.get('repo_path')
])
@asynccontextmanager
async def lifespan(app: FastAPI):
await update_repeat()
yield
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:
module = importlib.import_module(f'providers.{module_name}')
if hasattr(module, 'get_provider'):
provider = module.get_provider(config) # type: BaseProvider
name = provider.get_name()
print(f"request version of {name}")
version = provider.get_version()
if name not in versions or versions[name] != version:
print(f'{name} has new version {version}')
versions[name] = version
provider.download()
need_update_index = True
repo_data['versions'] = versions
current_date = datetime.datetime.utcnow()
if need_update_index:
utils.run(
args=[
'epm',
'repo',
'index',
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__":
create_repo(config)
uvicorn.run(app, host="0.0.0.0", port=8000)

View File

@ -1,9 +0,0 @@
import subprocess
def run(args, cwd=None):
return subprocess.run(
args=args,
cwd=cwd,
stdout=subprocess.PIPE,
).stdout.decode('utf-8')

View File

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