fix addKnownHost for host with non-default port, i.e. different from 22, remove date from version.txt

This commit is contained in:
ansgarz 2024-12-18 21:37:10 +01:00
parent dc4dd03f28
commit 482ec00bdd
4 changed files with 34 additions and 6 deletions

View file

@ -240,7 +240,7 @@ publishing {
tasks.register('createVersion') { tasks.register('createVersion') {
dependsOn processResources dependsOn processResources
doLast { doLast {
def version = project.version.toString() + " (" + Instant.now().toString().split("\\.")[0] + ")" def version = project.version.toString()
def fileName = "src/main/resources/version.txt" def fileName = "src/main/resources/version.txt"
def file = new File(fileName) def file = new File(fileName)
file.write(version) file.write(version)

View file

@ -3,6 +3,7 @@ package org.domaindrivenarchitecture.provs.framework.ubuntu.keys.base
import org.domaindrivenarchitecture.provs.desktop.domain.KnownHost import org.domaindrivenarchitecture.provs.desktop.domain.KnownHost
import org.domaindrivenarchitecture.provs.framework.core.Prov import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.framework.core.ProvResult import org.domaindrivenarchitecture.provs.framework.core.ProvResult
import org.domaindrivenarchitecture.provs.framework.core.local
import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.* import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.*
import org.domaindrivenarchitecture.provs.framework.ubuntu.keys.SshKeyPair import org.domaindrivenarchitecture.provs.framework.ubuntu.keys.SshKeyPair
import java.io.File import java.io.File
@ -22,11 +23,11 @@ fun Prov.configureSshKeys(sshKeys: SshKeyPair) = task {
* Checks if the specified host (domain name or IP) and (optional) port is contained in the known_hosts file * Checks if the specified host (domain name or IP) and (optional) port is contained in the known_hosts file
*/ */
fun Prov.isKnownHost(hostOrIp: String, port: Int? = null): Boolean { fun Prov.isKnownHost(hostOrIp: String, port: Int? = null): Boolean {
val hostWithPotentialPort = port?.let { hostInKnownHostsFileFormat(hostOrIp, port) } ?: hostOrIp val hostWithPotentialPort = port?.let { formatHostForKnownHostsFile(hostOrIp, port) } ?: hostOrIp
return cmdNoEval("ssh-keygen -F $hostWithPotentialPort").out?.isNotEmpty() ?: false return cmdNoEval("ssh-keygen -F $hostWithPotentialPort").out?.isNotEmpty() ?: false
} }
fun hostInKnownHostsFileFormat(hostOrIp: String, port: Int? = null): String { fun formatHostForKnownHostsFile(hostOrIp: String, port: Int? = null): String {
return port?.let { "[$hostOrIp]:$port" } ?: hostOrIp return port?.let { "[$hostOrIp]:$port" } ?: hostOrIp
} }
@ -45,11 +46,11 @@ fun Prov.addKnownHost(knownHost: KnownHost, verifyKeys: Boolean = false) = task
with(knownHost) { with(knownHost) {
for (key in hostKeys) { for (key in hostKeys) {
if (!verifyKeys) { if (!verifyKeys) {
addTextToFile("\n$hostName $key\n", File(knownHostsFile)) addTextToFile("\n${formatHostForKnownHostsFile(hostName, port)} $key\n", File(knownHostsFile))
} else { } else {
val validKeys = findSshKeys(hostName, port) val validKeys = findSshKeys(hostName, port)
if (validKeys?.contains(key) == true) { if (validKeys?.contains(key) == true) {
val formattedHost = hostInKnownHostsFileFormat(hostName, port) val formattedHost = formatHostForKnownHostsFile(hostName, port)
addTextToFile("\n$formattedHost $key\n", File(knownHostsFile)) addTextToFile("\n$formattedHost $key\n", File(knownHostsFile))
} else { } else {
addResultToEval( addResultToEval(
@ -77,3 +78,8 @@ fun Prov.findSshKeys(host: String, port: Int? = null, keytype: String? = null):
val output = cmd("ssh-keyscan $portOption $keytypeOption $host 2>/dev/null").out?.trim() val output = cmd("ssh-keyscan $portOption $keytypeOption $host 2>/dev/null").out?.trim()
return output?.split("\n")?.filter { x -> "" != x }?.map { x -> x.substringAfter(" ") } return output?.split("\n")?.filter { x -> "" != x }?.map { x -> x.substringAfter(" ") }
} }
fun main() {
val k = local().findSshKeys("repo.prod.meissa.de", 2222)
println(k)
}

View file

@ -1 +1 @@
0.39.4-SNAPSHOT (2024-12-11T21:08:51) 0.39.4-SNAPSHOT

View file

@ -99,4 +99,26 @@ internal class SshKtTest {
assertFalse(res3.success) assertFalse(res3.success)
assertFalse(prov.fileContainsText(KNOWN_HOSTS_FILE, invalidKey)) assertFalse(prov.fileContainsText(KNOWN_HOSTS_FILE, invalidKey))
} }
@ContainerTest
fun addKnownHost_with_port_without_verifications() {
// given
val prov = defaultTestContainer()
prov.task {
aptInstall("ssh")
deleteFile(KNOWN_HOSTS_FILE)
}
// when
val res1 = prov.addKnownHost(KnownHost("myserver.org", 2222, listOf("mytype mykey")), verifyKeys = false)
// check idem-potence
val res2 = prov.addKnownHost(KnownHost("myserver.org", 2222, listOf("mytype mykey")), verifyKeys = false)
// then
assertTrue(res1.success)
assertTrue(res2.success)
val expectedContent = "[myserver.org]:2222 mytype mykey"
val actualContent = prov.fileContent(KNOWN_HOSTS_FILE)
assertTrue(actualContent?.contains(expectedContent) == true, "$expectedContent\nis not contained in:\n$actualContent")
}
} }