mapm/src/main/kotlin/Main.kt

92 lines
3.5 KiB
Kotlin
Raw Normal View History

2024-08-28 13:29:10 +10:00
package xyz.maxwellj.mapm
import fuel.Fuel
import fuel.get
import java.io.File
import java.math.BigInteger
import java.security.MessageDigest
import kotlin.system.exitProcess
import org.tukaani.xz.XZInputStream
import java.io.*
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream
import java.io.BufferedInputStream
import java.io.FileInputStream
import java.nio.file.Files
import java.nio.file.Paths
fun uncompressXZFile(inputFile: String, outputFile: String) {
XZInputStream(FileInputStream(inputFile)).use { input ->
FileOutputStream(outputFile).use { output ->
input.copyTo(output)
}
}
}
fun unarchiveTarFile(tarFilePath: String, outputDirectoryPath: String) {
val tarFile = File(tarFilePath)
val outputDir = File(outputDirectoryPath)
if (!outputDir.exists()) {
outputDir.mkdirs()
}
TarArchiveInputStream(BufferedInputStream(FileInputStream(tarFile))).use { tarIn ->
var entry = tarIn.nextTarEntry
while (entry != null) {
val outputFile = File(outputDir, entry.name)
if (entry.isDirectory) {
outputFile.mkdirs()
} else {
outputFile.parentFile.mkdirs()
Files.copy(tarIn, Paths.get(outputFile.absolutePath))
}
entry = tarIn.nextTarEntry
}
}
}
// hurrah for https://stackoverflow.com/questions/64171624/how-to-generate-an-md5-hash-in-kotlin!
fun md5(input:String): String {
val md = MessageDigest.getInstance("MD5")
return BigInteger(1, md.digest(input.toByteArray())).toString(16).padStart(32, '0')
}
2024-08-28 13:29:10 +10:00
suspend fun main() {
println("Welcome to Mapm! What would you like to do? Type help for some help.")
2024-08-28 13:29:10 +10:00
val userInput = readln()
if (userInput == "grab") {
println("What would you like to grab?")
val userInput = readln()
val linkToUse = "https://git.maxwellj.xyz/mapm/stable/raw/branch/main/$userInput"
2024-08-28 13:29:10 +10:00
val dingus = Fuel.get(linkToUse).body.string()
println(dingus)
val file = File("/usr/mapm/tmp/$userInput.tar.xz")
// file.writeBytes((Fuel.get(dingus).body.string()).toByteArray())
val fileBytes = Fuel.get(dingus).body.bytes()
file.writeBytes(fileBytes)
val fileChecksum = Fuel.get("https://git.maxwellj.xyz/mapm/stable/raw/branch/main/$userInput.hash").body.string()
if (fileChecksum == md5(file.readText())) {
println("Checksum matches!")
uncompressXZFile(inputFile = "/usr/mapm/tmp/${userInput}.tar.xz", outputFile = "/usr/mapm/tmp/${userInput}.tar")
unarchiveTarFile(tarFilePath = "/usr/mapm/tmp/${userInput}.tar", outputDirectoryPath = "/usr/mapm/")
Runtime.getRuntime().exec("chmod +x /usr/mapm/${userInput}")
println("Finished!")
exitProcess(0)
} else {
println("Checksum doesn't match! Aborting...")
println("Please tell Max or your app's developer to use mapm to generate a new checksum. If the checksum is right, check your internet connection security.")
exitProcess(1)
}
2024-08-28 13:29:10 +10:00
} else if (userInput == "delete") {
println("What would you like to delete?")
val userInput = readln()
} else if (userInput == "checksum") {
println("What file would you like to generate a checksum of? Type the whole path")
val userInput = readln()
val file = File(userInput)
println("Checksum of that file is ${md5(file.readText())}")
2024-08-28 13:29:10 +10:00
}
}