mirror of
https://github.com/Eugeny/tabby-web.git
synced 2025-09-12 11:24:36 +00:00
wip
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import fsspec
|
||||
import os
|
||||
import asyncio
|
||||
import random
|
||||
from django.conf import settings
|
||||
@@ -15,8 +17,9 @@ from rest_framework.serializers import ModelSerializer, Serializer
|
||||
from rest_framework_dataclasses.serializers import DataclassSerializer
|
||||
from social_django.models import UserSocialAuth
|
||||
from typing import List
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from .consumers import GatewayAdminConnection
|
||||
from .gateway import GatewayAdminConnection
|
||||
from .sponsors import check_is_sponsor, check_is_sponsor_cached
|
||||
from .models import Config, Gateway, User
|
||||
|
||||
@@ -74,19 +77,26 @@ class AppVersionViewSet(ListModelMixin, GenericViewSet):
|
||||
queryset = ''
|
||||
|
||||
def _get_versions(self):
|
||||
return [self._get_version(x) for x in settings.APP_DIST_PATH.iterdir()]
|
||||
fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme)
|
||||
return [
|
||||
self._get_version(x['name'])
|
||||
for x in fs.listdir(settings.APP_DIST_STORAGE)
|
||||
]
|
||||
|
||||
def _get_version(self, dir: Path):
|
||||
def _get_version(self, dir):
|
||||
fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme)
|
||||
plugins = [
|
||||
x.name for x in dir.iterdir()
|
||||
if x.is_dir() and x.name not in [
|
||||
os.path.basename(x['name'])
|
||||
for x in fs.listdir(dir)
|
||||
if x['type'] == 'directory' and os.path.basename(x['name'])
|
||||
not in [
|
||||
'tabby-web-container',
|
||||
'tabby-web-demo',
|
||||
]
|
||||
]
|
||||
|
||||
return AppVersion(
|
||||
version=dir.name,
|
||||
version=os.path.basename(dir),
|
||||
plugins=plugins,
|
||||
)
|
||||
|
||||
@@ -166,7 +176,7 @@ class InstanceInfoViewSet(RetrieveModelMixin, GenericViewSet):
|
||||
|
||||
class NoGatewaysError(APIException):
|
||||
status_code = status.HTTP_503_SERVICE_UNAVAILABLE
|
||||
default_detail ='No connection gateways available.'
|
||||
default_detail = 'No connection gateways available.'
|
||||
default_code = 'no_gateways'
|
||||
|
||||
|
||||
|
@@ -4,7 +4,6 @@ import os
|
||||
import secrets
|
||||
import ssl
|
||||
import websockets
|
||||
from channels.generic.websocket import AsyncWebsocketConsumer
|
||||
from django.conf import settings
|
||||
from urllib.parse import quote
|
||||
|
||||
@@ -91,35 +90,3 @@ class GatewayAdminConnection:
|
||||
async def close(self):
|
||||
await self.socket.close()
|
||||
await self.context.__aexit__(None, None, None)
|
||||
|
||||
|
||||
class TCPConsumer(AsyncWebsocketConsumer):
|
||||
async def connect(self):
|
||||
self.closed = False
|
||||
self.conn = GatewayConnection(
|
||||
self.scope['url_route']['kwargs']['host'],
|
||||
int(self.scope['url_route']['kwargs']['port']),
|
||||
)
|
||||
await self.conn.connect()
|
||||
await self.accept()
|
||||
self.reader = asyncio.get_event_loop().create_task(self.socket_reader())
|
||||
|
||||
async def disconnect(self, close_code):
|
||||
self.closed = True
|
||||
await self.conn.close()
|
||||
|
||||
async def receive(self, bytes_data):
|
||||
await self.conn.send(bytes_data)
|
||||
|
||||
async def socket_reader(self):
|
||||
while True:
|
||||
if self.closed:
|
||||
return
|
||||
try:
|
||||
data = await self.conn.recv(timeout=10)
|
||||
except asyncio.TimeoutError:
|
||||
continue
|
||||
except websockets.exceptions.ConnectionClosed:
|
||||
await self.close()
|
||||
return
|
||||
await self.send(bytes_data=data)
|
@@ -1,3 +1,4 @@
|
||||
import fsspec
|
||||
import logging
|
||||
import requests
|
||||
import shutil
|
||||
@@ -6,6 +7,7 @@ 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):
|
||||
@@ -16,7 +18,9 @@ class Command(BaseCommand):
|
||||
|
||||
def handle(self, *args, **options):
|
||||
version = options['version']
|
||||
target: Path = settings.APP_DIST_PATH / version
|
||||
target = f'{settings.APP_DIST_STORAGE}/{version}'
|
||||
|
||||
fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme)
|
||||
|
||||
plugin_list = [
|
||||
'tabby-web-container',
|
||||
@@ -51,9 +55,11 @@ class Command(BaseCommand):
|
||||
subprocess.check_call(
|
||||
['tar', '-xzf', f.name, '-C', str(extraction_tmp)]
|
||||
)
|
||||
shutil.move(Path(extraction_tmp) / 'package', plugin_final_target)
|
||||
shutil.move(
|
||||
Path(extraction_tmp) / 'package', plugin_final_target
|
||||
)
|
||||
|
||||
if target.exists():
|
||||
shutil.rmtree(target)
|
||||
shutil.copytree(tempdir, target)
|
||||
target.chmod(0o755)
|
||||
if fs.exists(target):
|
||||
fs.rm(target, recursive=True)
|
||||
fs.mkdir(target)
|
||||
fs.put(str(tempdir), target, recursive=True)
|
||||
|
@@ -2,7 +2,6 @@ from django.urls import path, re_path, include
|
||||
from rest_framework import routers
|
||||
|
||||
from . import api
|
||||
from . import consumers
|
||||
from . import views
|
||||
|
||||
|
||||
@@ -16,13 +15,9 @@ urlpatterns = [
|
||||
path('api/1/instance-info', api.InstanceInfoViewSet.as_view({'get': 'retrieve'})),
|
||||
path('api/1/gateways/choose', api.ChooseGatewayViewSet.as_view({'post': 'retrieve'})),
|
||||
|
||||
# re_path('^(|login|app)$', views.IndexView.as_view()),
|
||||
re_path('^(|login|app)$', views.IndexView.as_view()),
|
||||
path('terminal', views.TerminalView.as_view()),
|
||||
|
||||
# path('terminal', views.TerminalView.as_view()),
|
||||
path('app-dist/<version>/<path:path>', views.AppDistView.as_view()),
|
||||
path('', include(router.urls)),
|
||||
]
|
||||
|
||||
websocket_urlpatterns = [
|
||||
re_path(r'^api/1/gateway/tcp/(?P<host>[^/]+):(?P<port>\d+)$', consumers.TCPConsumer.as_asgi()),
|
||||
]
|
||||
|
@@ -1,26 +1,25 @@
|
||||
import os
|
||||
import fsspec
|
||||
from django.conf import settings
|
||||
from django.http.response import HttpResponseRedirect
|
||||
from django.views import static
|
||||
from rest_framework.views import APIView
|
||||
from urllib.parse import urlparse
|
||||
|
||||
|
||||
class IndexView(APIView):
|
||||
def get(self, request, format=None):
|
||||
return static.serve(request, 'index.html', document_root=str(settings.BASE_DIR / 'build'))
|
||||
return static.serve(request, 'index.html', document_root=str(settings.FRONTEND_BUILD_DIR))
|
||||
|
||||
|
||||
class TerminalView(APIView):
|
||||
def get(self, request, format=None):
|
||||
response = static.serve(request, 'terminal.html', document_root=str(settings.BASE_DIR / 'build'))
|
||||
response = static.serve(request, 'terminal.html', document_root=str(settings.FRONTEND_BUILD_DIR))
|
||||
response['X-Frame-Options'] = 'SAMEORIGIN'
|
||||
return response
|
||||
|
||||
|
||||
class AppDistView(APIView):
|
||||
def get(self, request, version=None, path=None, format=None):
|
||||
return static.serve(request, os.path.join(version, path), document_root=str(settings.APP_DIST_PATH))
|
||||
|
||||
|
||||
# class BuildView(APIView):
|
||||
# def get(self, request, path=None, format=None):
|
||||
# return static.serve(request, path, document_root=str(settings.BASE_DIR / 'build'))
|
||||
fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme)
|
||||
url = f'{settings.APP_DIST_STORAGE}/{version}/{path}'
|
||||
return HttpResponseRedirect(fs.url(url))
|
||||
|
Reference in New Issue
Block a user