67 lines
2.2 KiB
Python

import fsspec
import logging
import requests
import shutil
import subprocess
import tempfile
from django.core.management.base import BaseCommand
from django.conf import settings
from pathlib import Path
from urllib.parse import urlparse
class Command(BaseCommand):
help = "Downloads a new app version"
def add_arguments(self, parser):
parser.add_argument("version", type=str)
def handle(self, *args, **options):
version = options["version"]
target = f"{settings.APP_DIST_STORAGE}/{version}"
fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme)
plugin_list = [
"tabby-web-container",
"tabby-core",
"tabby-settings",
"tabby-terminal",
"tabby-ssh",
"tabby-community-color-schemes",
"tabby-serial",
"tabby-telnet",
"tabby-web",
"tabby-web-demo",
]
with tempfile.TemporaryDirectory() as tempdir:
tempdir = Path(tempdir)
for plugin in plugin_list:
logging.info(f"Resolving {plugin}@{version}")
response = requests.get(f"{settings.NPM_REGISTRY}/{plugin}/{version}")
response.raise_for_status()
info = response.json()
url = info["dist"]["tarball"]
logging.info(f"Downloading {plugin}@{version} from {url}")
response = requests.get(url)
with tempfile.NamedTemporaryFile("wb") as f:
f.write(response.content)
f.flush()
plugin_final_target = Path(tempdir) / plugin
with tempfile.TemporaryDirectory() as extraction_tmp:
subprocess.check_call(
["tar", "-xzf", f.name, "-C", str(extraction_tmp)]
)
shutil.move(
Path(extraction_tmp) / "package", plugin_final_target
)
if fs.exists(target):
fs.rm(target, recursive=True)
fs.mkdir(target)
fs.put(str(tempdir), target, recursive=True)