package org.pacien.tincapp.commands import java8.util.concurrent.CompletableFuture import org.pacien.tincapp.context.AppPaths /** * @author pacien */ object Tinc { private fun newCommand(netName: String): Command = Command(AppPaths.tinc().absolutePath) .withOption("config", AppPaths.confDir(netName).absolutePath) .withOption("pidfile", AppPaths.pidFile(netName).absolutePath) fun stop(netName: String): CompletableFuture = Executor.call(newCommand(netName).withArguments("stop")) .thenApply { } fun pid(netName: String): CompletableFuture = Executor.call(newCommand(netName).withArguments("pid")) .thenApply { Integer.parseInt(it.first()) } fun dumpNodes(netName: String, reachable: Boolean = false): CompletableFuture> = Executor.call( if (reachable) newCommand(netName).withArguments("dump", "reachable", "nodes") else newCommand(netName).withArguments("dump", "nodes")) fun info(netName: String, node: String): CompletableFuture = Executor.call(newCommand(netName).withArguments("info", node)) .thenApply { it.joinToString("\n") } fun init(netName: String, nodeName: String): CompletableFuture = if (netName.isBlank()) CompletableFuture.failedFuture(IllegalArgumentException("Network name cannot be blank.")) else Executor.call(Command(AppPaths.tinc().absolutePath) .withOption("config", AppPaths.confDir(netName).absolutePath) .withArguments("init", nodeName)) .thenApply { it.joinToString("\n") } fun join(netName: String, invitationUrl: String): CompletableFuture = if (netName.isBlank()) CompletableFuture.failedFuture(IllegalArgumentException("Network name cannot be blank.")) else Executor.call(Command(AppPaths.tinc().absolutePath) .withOption("config", AppPaths.confDir(netName).absolutePath) .withArguments("join", invitationUrl)) .thenApply { it.joinToString("\n") } fun log(netName: String, level: Int? = null): Process = Executor.run(newCommand(netName) .withArguments("log") .apply { if (level != null) withArguments(level.toString()) }) }