This commit is contained in:
Drapersniper
2020-10-06 10:11:48 +01:00
parent b59e3a835c
commit 449da2c463
5 changed files with 103 additions and 19 deletions

View File

@@ -13,7 +13,6 @@ import time
from typing import ClassVar, Final, List, Optional, Pattern, Tuple
# Cog Dependencies
import aiohttp
from redbot.core import data_manager
@@ -61,6 +60,7 @@ class ServerManager:
_jvm: ClassVar[Optional[str]] = None
_lavalink_branch: ClassVar[Optional[str]] = None
_buildtime: ClassVar[Optional[str]] = None
_java_exc: ClassVar[str] = "java"
def __init__(self) -> None:
self.ready: asyncio.Event = asyncio.Event()
@@ -69,6 +69,10 @@ class ServerManager:
self._monitor_task: Optional[asyncio.Task] = None
self._shutdown: bool = False
@property
def path(self) -> Optional[str]:
return self._java_exc
@property
def jvm(self) -> Optional[str]:
return self._jvm
@@ -89,8 +93,9 @@ class ServerManager:
def build_time(self) -> Optional[str]:
return self._buildtime
async def start(self) -> None:
async def start(self, java_path: str) -> None:
arch_name = platform.machine()
self._java_exc = java_path
if arch_name in self._blacklisted_archs:
raise asyncio.CancelledError(
"You are attempting to run Lavalink audio on an unsupported machine architecture."
@@ -133,27 +138,37 @@ class ServerManager:
if not java_available:
raise RuntimeError("You must install Java 11 for Lavalink to run.")
return ["java", "-Djdk.tls.client.protocols=TLSv1.2", "-jar", str(LAVALINK_JAR_FILE)]
return [
self._java_exc,
"-Djdk.tls.client.protocols=TLSv1.2",
"-jar",
str(LAVALINK_JAR_FILE),
]
async def _has_java(self) -> Tuple[bool, Optional[Tuple[int, int]]]:
if self._java_available is not None:
# Return cached value if we've checked this before
return self._java_available, self._java_version
java_available = shutil.which("java") is not None
java_exec = shutil.which(self._java_exc)
java_available = java_exec is not None
if not java_available:
self.java_available = False
self.java_version = None
self._java_exc = "java"
else:
self._java_version = version = await self._get_java_version()
self._java_available = (11, 0) <= version < (12, 0)
self._java_exc = java_exec
return self._java_available, self._java_version
@staticmethod
async def _get_java_version() -> Tuple[int, int]:
async def _get_java_version(self) -> Tuple[int, int]:
"""This assumes we've already checked that java exists."""
_proc: asyncio.subprocess.Process = (
await asyncio.create_subprocess_exec( # pylint:disable=no-member
"java", "-version", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
self._java_exc,
"-version",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
)
# java -version outputs to stderr
@@ -176,10 +191,7 @@ class ServerManager:
elif short_match:
return int(short_match["major"]), 0
raise RuntimeError(
"The output of `java -version` was unexpected. Please report this issue on Red's "
"issue tracker."
)
raise RuntimeError(f"The output of `{self._java_exc} -version` was unexpected.")
async def _wait_for_launcher(self) -> None:
log.debug("Waiting for Lavalink server to be ready")
@@ -207,7 +219,7 @@ class ServerManager:
log.info("Internal Lavalink jar shutdown unexpectedly")
if not self._has_java_error():
log.info("Restarting internal Lavalink server")
await self.start()
await self.start(self._java_exc)
else:
log.critical(
"Your Java is borked. Please find the hs_err_pid%d.log file"