Add option to use /proc/self/fd for Tailscale connections.

This commit is contained in:
Alex Zenla 2023-03-28 20:12:30 -07:00
parent b84da6d1eb
commit 218fda5d4c
Signed by: alex
GPG Key ID: C0780728420EBFE5
4 changed files with 12 additions and 38 deletions

View File

@ -9,5 +9,6 @@ data class TailscaleConfig(
val controlUrl: String? = null,
val authKey: String? = null,
val tailscalePath: String? = null,
val ephemeral: Boolean = false
val ephemeral: Boolean = false,
val useProcSelfFd: Boolean = false
)

View File

@ -12,6 +12,7 @@ class TailscaleController(val server: Server, val config: TailscaleConfig) {
if (!config.enabled) {
return
}
tailscale.useProcSelfFd = config.useProcSelfFd
tailscale.hostname = config.hostname
if (config.controlUrl != null) {

View File

@ -1,16 +1,13 @@
package gay.pizza.foundation.tailscale
import gay.pizza.tailscale.channel.ChannelCopier
import gay.pizza.tailscale.core.Tailscale
import gay.pizza.tailscale.core.TailscaleConn
import gay.pizza.tailscale.core.TailscaleListener
import org.bukkit.Server
import java.net.InetSocketAddress
import java.net.StandardSocketOptions
import java.nio.ByteBuffer
import java.nio.channels.ClosedChannelException
import java.nio.channels.ReadableByteChannel
import java.nio.channels.SocketChannel
import java.nio.channels.WritableByteChannel
class TailscaleProxyServer(val server: Server, val tailscale: Tailscale) {
private var minecraftServerListener: TailscaleListener? = null
@ -34,38 +31,13 @@ class TailscaleProxyServer(val server: Server, val tailscale: Tailscale) {
val readChannel = conn.openReadChannel()
val writeChannel = conn.openWriteChannel()
fun closeAll() {
socketChannel.close()
readChannel.close()
writeChannel.close()
}
fun startCopyThread(name: String, from: ReadableByteChannel, to: WritableByteChannel) {
val thread = Thread {
try {
while (true) {
val buffer = ByteBuffer.allocate(2048)
val size = from.read(buffer)
if (size < 0) {
break
} else {
buffer.flip()
to.write(buffer)
}
buffer.clear()
}
} catch (_: ClosedChannelException) {
} finally {
closeAll()
}
}
thread.name = name
thread.start()
}
startCopyThread("Tailscale to Socket Pipe", readChannel, socketChannel)
startCopyThread("Socket to Tailscale Pipe", socketChannel, writeChannel)
val closeHandler = { socketChannel.close() }
val tailscaleSocketCopier = ChannelCopier(readChannel, socketChannel)
tailscaleSocketCopier.spawnCopyThread(
"Tailscale to Socket Copier", onClose = closeHandler)
val socketTailscaleCopier = ChannelCopier(socketChannel, writeChannel)
socketTailscaleCopier.spawnCopyThread(
"Socket to Tailscale Copier", onClose = closeHandler)
}
fun close() {

View File

@ -73,7 +73,7 @@ dependencyResolutionManagement {
version("postgresql", "42.5.3")
version("exposed", "0.41.1")
version("hikaricp", "5.0.1")
version("libtailscale", "0.1.4-SNAPSHOT")
version("libtailscale", "0.1.5-SNAPSHOT")
library("clikt", "com.github.ajalt.clikt", "clikt").versionRef("clikt")
library("xodus-core", "org.jetbrains.xodus", "xodus-openAPI").versionRef("xodus")