version: sunnypilot v2025.003.000 (dev) date: 2026-02-09T02:04:38 master commit: 254f55ac15a40343d7255f2f098de3442e0c4a6f
59 lines
1.3 KiB
Python
59 lines
1.3 KiB
Python
import os
|
|
import io
|
|
import posixpath
|
|
import socket
|
|
from functools import cache
|
|
from openpilot.common.utils import retry
|
|
from urllib.parse import urlparse
|
|
|
|
from openpilot.tools.lib.url_file import URLFile
|
|
|
|
DATA_ENDPOINT = os.getenv("DATA_ENDPOINT", "http://data-raw.comma.internal/")
|
|
|
|
|
|
@cache
|
|
@retry(delay=0.0)
|
|
def internal_source_available(url: str) -> bool:
|
|
if os.path.isdir(url):
|
|
return True
|
|
|
|
try:
|
|
hostname = urlparse(url).hostname
|
|
port = urlparse(url).port or 80
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.settimeout(0.5)
|
|
s.connect((hostname, port))
|
|
return True
|
|
except (socket.gaierror, ConnectionRefusedError):
|
|
pass
|
|
return False
|
|
|
|
|
|
def resolve_name(fn):
|
|
if fn.startswith("cd:/"):
|
|
return posixpath.join(DATA_ENDPOINT, fn[4:])
|
|
return fn
|
|
|
|
|
|
@cache
|
|
def file_exists(fn):
|
|
fn = resolve_name(fn)
|
|
if fn.startswith(("http://", "https://")):
|
|
return URLFile(fn).get_length_online() != -1
|
|
return os.path.exists(fn)
|
|
|
|
class DiskFile(io.BufferedReader):
|
|
def get_multi_range(self, ranges: list[tuple[int, int]]) -> list[bytes]:
|
|
parts = []
|
|
for r in ranges:
|
|
self.seek(r[0])
|
|
parts.append(self.read(r[1] - r[0]))
|
|
return parts
|
|
|
|
def FileReader(fn):
|
|
fn = resolve_name(fn)
|
|
if fn.startswith(("http://", "https://")):
|
|
return URLFile(fn)
|
|
else:
|
|
return DiskFile(open(fn, "rb"))
|