💂♂️ Adds executor service
This commit is contained in:
parent
2fa523b814
commit
beb37d92f6
@ -1,5 +1,6 @@
|
|||||||
package dev.svitan.plugins
|
package dev.svitan.plugins
|
||||||
|
|
||||||
|
import dev.svitan.routes.ExecutorService
|
||||||
import dev.svitan.schemas.ActionService
|
import dev.svitan.schemas.ActionService
|
||||||
import dev.svitan.schemas.AuthService
|
import dev.svitan.schemas.AuthService
|
||||||
import io.github.cdimascio.dotenv.Dotenv
|
import io.github.cdimascio.dotenv.Dotenv
|
||||||
@ -20,6 +21,7 @@ fun Application.configureDatabases(dotenv: Dotenv) {
|
|||||||
password = dbPassword
|
password = dbPassword
|
||||||
)
|
)
|
||||||
|
|
||||||
ActionService.init()
|
|
||||||
AuthService.init()
|
AuthService.init()
|
||||||
|
ActionService.init()
|
||||||
|
ExecutorService.init(dotenv)
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import dev.svitan.schemas.ActionService
|
|||||||
import dev.svitan.schemas.AuthService
|
import dev.svitan.schemas.AuthService
|
||||||
import dev.svitan.schemas.NewActionDTO
|
import dev.svitan.schemas.NewActionDTO
|
||||||
import dev.svitan.schemas.RunActionDTO
|
import dev.svitan.schemas.RunActionDTO
|
||||||
import dev.svitan.schemas.sha256
|
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.server.application.*
|
import io.ktor.server.application.*
|
||||||
import io.ktor.server.auth.*
|
import io.ktor.server.auth.*
|
||||||
@ -22,7 +21,7 @@ fun Application.routeAction() {
|
|||||||
call.respond(ActionService.readAll())
|
call.respond(ActionService.readAll())
|
||||||
}
|
}
|
||||||
|
|
||||||
post("/action") {
|
put("/action") {
|
||||||
val action = call.receive<NewActionDTO>()
|
val action = call.receive<NewActionDTO>()
|
||||||
call.respond(HttpStatusCode.Created, ActionService.create(action))
|
call.respond(HttpStatusCode.Created, ActionService.create(action))
|
||||||
}
|
}
|
||||||
@ -37,11 +36,6 @@ fun Application.routeAction() {
|
|||||||
post("/action/{id}") {
|
post("/action/{id}") {
|
||||||
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
||||||
val id = UUID.fromString(idRaw)
|
val id = UUID.fromString(idRaw)
|
||||||
}
|
|
||||||
|
|
||||||
put("/action/{id}") {
|
|
||||||
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
|
||||||
val id = UUID.fromString(idRaw)
|
|
||||||
|
|
||||||
val action = ActionService.read(id) ?: throw NotFoundException()
|
val action = ActionService.read(id) ?: throw NotFoundException()
|
||||||
val run = call.receive<RunActionDTO>()
|
val run = call.receive<RunActionDTO>()
|
||||||
@ -56,6 +50,13 @@ fun Application.routeAction() {
|
|||||||
call.respond(HttpStatusCode.NoContent)
|
call.respond(HttpStatusCode.NoContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
patch("/action/{id}") {
|
||||||
|
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
||||||
|
val id = UUID.fromString(idRaw)
|
||||||
|
val action = call.receive<NewActionDTO>()
|
||||||
|
call.respond(ActionService.update(id, action))
|
||||||
|
}
|
||||||
|
|
||||||
delete("/action/{id}") {
|
delete("/action/{id}") {
|
||||||
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
val idRaw = call.parameters["id"] ?: throw BadRequestException("Invalid id")
|
||||||
val id = UUID.fromString(idRaw)
|
val id = UUID.fromString(idRaw)
|
||||||
|
@ -19,7 +19,7 @@ fun Application.routeAuth() {
|
|||||||
call.respond(AuthService.readAll())
|
call.respond(AuthService.readAll())
|
||||||
}
|
}
|
||||||
|
|
||||||
post("/auth") {
|
put("/auth") {
|
||||||
val auth = call.receive<NewAuthDTO>()
|
val auth = call.receive<NewAuthDTO>()
|
||||||
call.respond(HttpStatusCode.Created, AuthService.create(auth))
|
call.respond(HttpStatusCode.Created, AuthService.create(auth))
|
||||||
}
|
}
|
||||||
|
71
backend/src/main/kotlin/routes/Executor.kt
Normal file
71
backend/src/main/kotlin/routes/Executor.kt
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package dev.svitan.routes
|
||||||
|
|
||||||
|
import io.github.cdimascio.dotenv.Dotenv
|
||||||
|
import java.io.File
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
import java.util.UUID
|
||||||
|
|
||||||
|
class ExecutorService {
|
||||||
|
companion object {
|
||||||
|
var dir: File? = null
|
||||||
|
|
||||||
|
fun init(dotenv: Dotenv) {
|
||||||
|
val path = dotenv["DATA_DIR"] ?: throw Exception("DATA_DIR not found")
|
||||||
|
dir = File(path)
|
||||||
|
|
||||||
|
if (!dir!!.exists()) {
|
||||||
|
val created = dir!!.mkdirs()
|
||||||
|
if (!created) throw Exception("Unable to create data directory")
|
||||||
|
} else if (dir!!.isFile) {
|
||||||
|
throw Exception("DATA_DIR must be a directory")
|
||||||
|
} else if (!dir!!.canRead() || !dir!!.canWrite() || !dir!!.canExecute()) {
|
||||||
|
throw Exception("DATA_DIR must be readable, writable, and executable")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun writeFile(uuid: UUID, content: String) {
|
||||||
|
if (dir == null) throw Exception("FilesystemService not initialized")
|
||||||
|
|
||||||
|
val file = File(dir, "$uuid.sh")
|
||||||
|
file.writeText(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deleteFile(uuid: UUID) {
|
||||||
|
if (dir == null) throw Exception("FilesystemService not initialized")
|
||||||
|
|
||||||
|
val file = File(dir, "$uuid.sh")
|
||||||
|
if (!file.exists()) throw Exception("File not found")
|
||||||
|
|
||||||
|
val deleted = file.delete()
|
||||||
|
if (!deleted) throw Exception("Unable to delete file")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun executeFile(uuid: UUID) {
|
||||||
|
if (dir == null) throw Exception("FilesystemService not initialized")
|
||||||
|
|
||||||
|
val file = File(dir, "$uuid.sh")
|
||||||
|
if (!file.exists() || !file.canExecute()) throw Exception("File not found or not executable")
|
||||||
|
|
||||||
|
val now = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||||
|
val stdout = File(dir, "$uuid-$now-stdout")
|
||||||
|
val stderr = File(dir, "$uuid-$now-stderr")
|
||||||
|
ProcessBuilder("bash", file.absolutePath)
|
||||||
|
.redirectOutput(ProcessBuilder.Redirect.to(stdout))
|
||||||
|
.redirectError(ProcessBuilder.Redirect.to(stderr))
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun executeSource(uuid: UUID, source: String) {
|
||||||
|
if (dir == null) throw Exception("FilesystemService not initialized")
|
||||||
|
|
||||||
|
val now = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||||
|
val stdout = File(dir, "$uuid-$now-stdout")
|
||||||
|
val stderr = File(dir, "$uuid-$now-stderr")
|
||||||
|
ProcessBuilder("bash", "-c", source)
|
||||||
|
.redirectOutput(ProcessBuilder.Redirect.to(stdout))
|
||||||
|
.redirectError(ProcessBuilder.Redirect.to(stderr))
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user