diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 14746e7..7f9f8e7 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -8,6 +8,8 @@ diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 254a1fc..3efb2d8 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7060359..867fb6d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin("jvm") version "2.2.10" + kotlin("plugin.serialization") version "2.2.20" } group = "moe.rosa" @@ -11,6 +12,7 @@ repositories { dependencies { testImplementation(kotlin("test")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0") } tasks.test { diff --git a/settings.gradle.kts b/settings.gradle.kts index 83ad6b3..13d8c79 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,6 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -rootProject.name = "planterette" \ No newline at end of file +rootProject.name = "planterette" +include("definition") +include("host") \ No newline at end of file diff --git a/src/main/kotlin/moe/rosa/planterette/Main.kt b/src/main/kotlin/moe/rosa/planterette/Main.kt index 709234e..aba9c1a 100644 --- a/src/main/kotlin/moe/rosa/planterette/Main.kt +++ b/src/main/kotlin/moe/rosa/planterette/Main.kt @@ -1,5 +1,2 @@ package moe.rosa.planterette -fun main() { - -} \ No newline at end of file diff --git a/src/main/kotlin/moe/rosa/planterette/hakurei/Filesystem.kt b/src/main/kotlin/moe/rosa/planterette/hakurei/Filesystem.kt new file mode 100644 index 0000000..1959218 --- /dev/null +++ b/src/main/kotlin/moe/rosa/planterette/hakurei/Filesystem.kt @@ -0,0 +1,62 @@ +package moe.rosa.planterette.hakurei + +import kotlinx.serialization.Serializable + +@Serializable +data class AbsolutePath(private val path: String) { + override fun toString(): String { + return path + } +} + +interface FSType { + val type: String +} +data class ApplyState(val autoEtcPrefix: String) + +@Serializable +data class FSBind( + val target: AbsolutePath, + val source: AbsolutePath, + val write: Boolean, + val device: Boolean, + val ensure: Boolean, + val optional: Boolean, + val special: Boolean, + + override val type: String = "bind", +) : FSType + +@Serializable +data class FSEphemeral( + val target: AbsolutePath, + val write: Boolean, + val size: Int, + val perm: Int, + + override val type: String = "ephemeral" +) : FSType + +@Serializable +data class FSLink( + val target: AbsolutePath, + val linkname: String, + val dereference: Boolean, + + override val type: String = "link" +) : FSType + +@Serializable +data class FSOverlay( + val target: AbsolutePath, + val lower: List, + val upper: AbsolutePath, + val work: AbsolutePath, + + override val type: String = "overlay" +) : FSType + +@Serializable +data class FilesystemConfig( + val config: FSType +) \ No newline at end of file diff --git a/src/main/kotlin/moe/rosa/planterette/hakurei/Hakurei.kt b/src/main/kotlin/moe/rosa/planterette/hakurei/Hakurei.kt new file mode 100644 index 0000000..5c78e9e --- /dev/null +++ b/src/main/kotlin/moe/rosa/planterette/hakurei/Hakurei.kt @@ -0,0 +1,93 @@ +package moe.rosa.planterette.hakurei + +import kotlinx.serialization.Serializable + +@Serializable +data class HakureiConfig( + val id: String, + val path: AbsolutePath, + val args: List, + val enablements: Enablements, + val sessionBus: DBusConfig, + val systemBus: DBusConfig, + val directWayland: Boolean, + val username: String, + val shell: AbsolutePath, + val home: AbsolutePath, + + val extraPerms: ExtraPermsConfig, + val identity: Int, + val groups: List, + + val container: ContainerConfig, +) + +@Serializable +data class DBusConfig( + val see: List, + val talk: List, + val own: List, + val call: Map, + val broadcast: Map, + val log: Boolean, + val filter: Boolean, +) + +@Serializable +data class Enablements( + val wayland: Boolean, + val x11: Boolean, + val dbus: Boolean, + val pulse: Boolean, +) + +@Serializable +data class ContainerConfig( + val hostname: String, + val waitDelay: Long, + val seccompFlags: Int, + val seccompPresets: Int, + val seccompCompat: Boolean, + val devel: Boolean, + val userns: Boolean, + val hostNet: Boolean, + val hostAbstract: Boolean, + val tty: Boolean, + val multiarch: Boolean, + + val env: Map, + + val mapRealUid: Boolean, + val device: Boolean, + + val filesystem: List, +) +@Serializable +data class ExtraPermsConfig( + val ensure: Boolean, + val path: AbsolutePath, + val read: Boolean, + val write: Boolean, + val execute: Boolean, +) { + override fun toString(): String { + val buffer = StringBuffer(5 + path.toString().length) + buffer.append("---") + if(ensure) { + buffer.append("+") + } + buffer.append(":") + buffer.append(path.toString()) + if(read) { + buffer.setCharAt(0, 'r') + } + if(write) { + buffer.setCharAt(1, 'w') + } + if(execute) { + buffer.setCharAt(2, 'x') + } + return buffer.toString() + } +} + diff --git a/src/test/resources/ChromiumExample.kts b/src/test/resources/ChromiumExample.kts new file mode 100644 index 0000000..e69de29