Skip to main content
Glama
Unpacker.kt2.26 kB
package maestro.cli.util import org.apache.commons.codec.digest.DigestUtils import java.io.File import java.net.URL import java.nio.file.FileSystems import java.nio.file.Files import java.nio.file.Paths import java.nio.file.attribute.PosixFilePermission /** * Unpacks files from jar resources. */ object Unpacker { fun unpack( jarPath: String, target: File, ) { Unpacker::class.java.classLoader.getResource(jarPath)?.let { resource -> if (target.exists()) { if (sameContents(resource, target)) { return } } target.writeBytes(resource.readBytes()) } } private fun sameContents(resource: URL, target: File): Boolean { return DigestUtils.sha1Hex(resource.openStream()) == DigestUtils.sha1Hex(target.inputStream()) } fun binaryDependency(name: String): File { return Paths .get( System.getProperty("user.home"), ".maestro", "deps", name ) .toAbsolutePath() .toFile() .also { file -> createParentDirectories(file) createFileIfDoesNotExist(file) grantBinaryPermissions(file) } } private fun createParentDirectories(file: File) { file.parentFile?.let { parent -> if (!parent.exists()) { parent.mkdirs() } } } private fun createFileIfDoesNotExist(file: File) { if (!file.exists()) { if (!file.createNewFile()) { error("Unable to create file $file") } } } private fun grantBinaryPermissions(file: File) { if (isPosixFilesystem()) { Files.setPosixFilePermissions( file.toPath(), setOf( PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE, ) ) } } private fun isPosixFilesystem() = FileSystems.getDefault() .supportedFileAttributeViews() .contains("posix") }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mobile-dev-inc/Maestro'

If you have feedback or need assistance with the MCP directory API, please join our Discord server