switchos support
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import requests
|
||||
@@ -41,7 +40,55 @@ class SwosBetaService:
|
||||
server=response.headers.get('server'),
|
||||
save_backup_visible='save backup' in html.lower(),
|
||||
backup_endpoint_ok=backup_ok,
|
||||
note='Moduł działa osobno i nie zapisuje kopii do głównego repozytorium.'
|
||||
note='SwitchOS jest obsługiwany bezpośrednio w liście urządzeń.'
|
||||
)
|
||||
|
||||
def probe_router(self, router, global_settings) -> dict:
|
||||
payload = self.credentials_from_router(router, global_settings)
|
||||
tested_at = datetime.utcnow()
|
||||
try:
|
||||
result = self.probe(payload)
|
||||
return {
|
||||
'success': result.success,
|
||||
'tested_at': tested_at,
|
||||
'model': 'SwitchOS',
|
||||
'uptime': f'HTTP {result.status_code}',
|
||||
'hostname': result.page_title or router.name,
|
||||
'version': None,
|
||||
'error': None,
|
||||
'transport': 'http',
|
||||
'server': result.server,
|
||||
'auth_mode': result.auth_mode,
|
||||
'http_status': str(result.status_code),
|
||||
'backup_available': result.backup_endpoint_ok,
|
||||
}
|
||||
except Exception as exc:
|
||||
return {
|
||||
'success': False,
|
||||
'tested_at': tested_at,
|
||||
'model': 'SwitchOS',
|
||||
'uptime': 'HTTP',
|
||||
'hostname': router.name,
|
||||
'version': None,
|
||||
'error': str(exc),
|
||||
'transport': 'http',
|
||||
'server': None,
|
||||
'auth_mode': None,
|
||||
'http_status': None,
|
||||
'backup_available': None,
|
||||
}
|
||||
|
||||
def credentials_from_router(self, router, global_settings) -> SwosBetaCredentials:
|
||||
username = (getattr(router, 'ssh_user', None) or '').strip() or (getattr(global_settings, 'default_switchos_username', None) or '').strip()
|
||||
password = (getattr(router, 'ssh_password', None) or '').strip() or (getattr(global_settings, 'default_switchos_password', None) or '').strip()
|
||||
if not username:
|
||||
raise ValueError('Brak użytkownika SwitchOS. Ustaw dane w urządzeniu albo w ustawieniach globalnych.')
|
||||
return SwosBetaCredentials(
|
||||
host=router.host,
|
||||
port=router.port or 80,
|
||||
username=username,
|
||||
password=password,
|
||||
label=router.name,
|
||||
)
|
||||
|
||||
def download_backup(self, payload: SwosBetaCredentials) -> DownloadedSwosBackup:
|
||||
@@ -62,6 +109,9 @@ class SwosBetaService:
|
||||
base_url=base_url,
|
||||
)
|
||||
|
||||
def download_backup_for_router(self, router, global_settings) -> DownloadedSwosBackup:
|
||||
return self.download_backup(self.credentials_from_router(router, global_settings))
|
||||
|
||||
def _request_with_fallback(self, method: str, url: str, payload: SwosBetaCredentials, allow_text_fallback: bool = True):
|
||||
attempts = []
|
||||
auth_variants = [
|
||||
@@ -89,8 +139,8 @@ class SwosBetaService:
|
||||
attempts.append(f'{label}:{exc.__class__.__name__}')
|
||||
|
||||
if last_response is not None:
|
||||
raise ValueError(f'Nie udało się połączyć ze SwOS ({", ".join(attempts)}).')
|
||||
raise ValueError('Nie udało się połączyć ze SwOS.')
|
||||
raise ValueError(f'Nie udało się połączyć ze SwitchOS ({", ".join(attempts)}).')
|
||||
raise ValueError('Nie udało się połączyć ze SwitchOS.')
|
||||
|
||||
def _build_base_url(self, host: str, port: int) -> str:
|
||||
raw = host.strip()
|
||||
@@ -118,7 +168,7 @@ class SwosBetaService:
|
||||
label = payload.label or payload.host
|
||||
safe = re.sub(r'[^A-Za-z0-9._-]+', '-', label).strip('-') or 'switchos'
|
||||
timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')
|
||||
return f'{safe}-swos-{timestamp}.swb'
|
||||
return f'{safe}-switchos-{timestamp}.swb'
|
||||
|
||||
|
||||
swos_beta_service = SwosBetaService()
|
||||
|
||||
Reference in New Issue
Block a user