change cli to new format
parent
4c6d3ba3c3
commit
478f058fd7
@ -1,29 +1,64 @@
|
|||||||
package org.domaindrivenarchitecture.provs.configuration.domain
|
package org.domaindrivenarchitecture.provs.configuration.domain
|
||||||
|
|
||||||
|
import org.domaindrivenarchitecture.provs.framework.core.Secret
|
||||||
|
import org.domaindrivenarchitecture.provs.framework.ubuntu.secret.secretSources.PlainSecretSource
|
||||||
|
import org.domaindrivenarchitecture.provs.framework.ubuntu.secret.secretSources.PromptSecretSource
|
||||||
|
|
||||||
|
|
||||||
|
private const val USER_HOST_DELIMITER = "@"
|
||||||
|
private const val USER_PW_DELIMITER = ":"
|
||||||
|
|
||||||
|
|
||||||
class TargetCliCommand(
|
class TargetCliCommand(
|
||||||
val localHost: Boolean?,
|
val target: String,
|
||||||
val remoteHost: String?,
|
val passwordInteractive: Boolean = false
|
||||||
val userName: String?,
|
|
||||||
val sshWithPasswordPrompt: Boolean,
|
|
||||||
val sshWithGopassPath: String?,
|
|
||||||
val sshWithKey: Boolean
|
|
||||||
) {
|
) {
|
||||||
fun isValidLocalhost(): Boolean {
|
private var remoteTarget: RemoteTarget? = null
|
||||||
return (localHost ?: false) && remoteHost == null && userName == null && sshWithGopassPath == null &&
|
|
||||||
!sshWithPasswordPrompt && !sshWithKey
|
init {
|
||||||
|
remoteTarget = parseRemoteTarget()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun hasValidPasswordOption(): Boolean {
|
fun isValidLocalhost(): Boolean {
|
||||||
return (sshWithGopassPath != null) xor sshWithPasswordPrompt xor sshWithKey
|
return target == "local"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isValidRemote(): Boolean {
|
fun isValidRemote(): Boolean {
|
||||||
return remoteHost != null && userName != null && hasValidPasswordOption()
|
return (remoteTarget != null)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isValid(): Boolean {
|
fun isValid(): Boolean {
|
||||||
return (isValidLocalhost() || isValidRemote())
|
return (isValidLocalhost() || isValidRemote())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun parseRemoteTarget(): RemoteTarget? {
|
||||||
|
val user: String?
|
||||||
|
val host: String?
|
||||||
|
var password: Secret? = null
|
||||||
|
|
||||||
|
if (!target.contains(USER_HOST_DELIMITER)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
host = target.substringAfter(USER_HOST_DELIMITER)
|
||||||
|
|
||||||
|
val userPw = target.substringBefore(USER_HOST_DELIMITER)
|
||||||
|
if (!userPw.contains(USER_PW_DELIMITER)) {
|
||||||
|
user = userPw
|
||||||
|
} else {
|
||||||
|
user = userPw.substringBefore(USER_PW_DELIMITER)
|
||||||
|
password = PlainSecretSource(userPw.substringAfter(USER_PW_DELIMITER)).secret()
|
||||||
|
}
|
||||||
|
if (passwordInteractive) {
|
||||||
|
password = PromptSecretSource("Password for $user on $host").secretNullable()
|
||||||
|
}
|
||||||
|
return RemoteTarget(user, host, password)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun remoteTarget(): RemoteTarget? {
|
||||||
|
return remoteTarget
|
||||||
|
}
|
||||||
|
|
||||||
|
class RemoteTarget(val user: String, val host: String, val password: Secret?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,64 +1,47 @@
|
|||||||
package org.domaindrivenarchitecture.provs.configuration.application
|
package org.domaindrivenarchitecture.provs.configuration.application
|
||||||
|
|
||||||
import org.junit.jupiter.api.Assertions.*
|
import org.junit.jupiter.api.Assertions.*
|
||||||
|
import org.junit.jupiter.api.Disabled
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
internal class CliTargetParserTest {
|
internal class CliTargetParserTest {
|
||||||
|
|
||||||
@Test
|
|
||||||
fun parse_localhost_with_default() {
|
|
||||||
val parseCli = parseTarget(args = emptyArray())
|
|
||||||
|
|
||||||
assertFalse(parseCli.isValidLocalhost())
|
|
||||||
assertFalse(parseCli.isValidRemote())
|
|
||||||
assertFalse(parseCli.isValid())
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun parse_localhost() {
|
fun parse_localhost() {
|
||||||
val parseCli = parseTarget(args = arrayOf("-l"))
|
val cliCommand = parseTarget(args = arrayOf("local"))
|
||||||
assertTrue(parseCli.isValidLocalhost())
|
assertTrue(cliCommand.isValidLocalhost())
|
||||||
assertFalse(parseCli.isValidRemote())
|
assertFalse(cliCommand.isValidRemote())
|
||||||
assertTrue(parseCli.isValid())
|
assertTrue(cliCommand.isValid())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun parse_remote_with_missing_passwordoption() {
|
fun parse_remote_with_given_pasword() {
|
||||||
val parseCli = parseTarget(args = arrayOf("-r", "1.2.3.4", "-u", "user"))
|
val cliCommand = parseTarget(args = arrayOf("user:mypassword@1.2.3.4"))
|
||||||
|
|
||||||
assertFalse(parseCli.isValidLocalhost())
|
assertFalse(cliCommand.isValidLocalhost())
|
||||||
assertEquals("1.2.3.4", parseCli.remoteHost)
|
assertEquals("1.2.3.4", cliCommand.remoteTarget()?.host)
|
||||||
assertEquals("user", parseCli.userName)
|
assertEquals("user", cliCommand.remoteTarget()?.user)
|
||||||
assertFalse(parseCli.isValidRemote())
|
assertEquals("mypassword", cliCommand.remoteTarget()?.password?.plain())
|
||||||
assertFalse(parseCli.isValid())
|
assertTrue(cliCommand.isValid())
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun parse_remote_with_remote_key() {
|
|
||||||
val parseCli = parseTarget(args = arrayOf("-r", "1.2.3.4", "-u", "user", "-k"))
|
|
||||||
|
|
||||||
assertFalse(parseCli.isValidLocalhost())
|
|
||||||
assertEquals("1.2.3.4", parseCli.remoteHost)
|
|
||||||
assertEquals("user", parseCli.userName)
|
|
||||||
assertTrue(parseCli.isValid())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun parse_remote_with_remote_password_prompt() {
|
fun parse_remote_with_ssh_key() {
|
||||||
val parseCli = parseTarget(args = arrayOf("-r", "1.2.3.4", "-u", "user", "-i"))
|
val cliCommand = parseTarget(args = arrayOf("user@1.2.3.4"))
|
||||||
|
|
||||||
assertEquals("1.2.3.4", parseCli.remoteHost)
|
assertFalse(cliCommand.isValidLocalhost())
|
||||||
assertEquals("user", parseCli.userName)
|
assertEquals("1.2.3.4", cliCommand.remoteTarget()?.host)
|
||||||
assertTrue(parseCli.isValid())
|
assertEquals("user", cliCommand.remoteTarget()?.user)
|
||||||
|
assertTrue(cliCommand.isValid())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun parse_remote_with_remote_password_gopass_path() {
|
@Disabled // enable to enter manually the password when prompted
|
||||||
val parseCli = parseTarget(args = arrayOf("-r", "1.2.3.4", "-u", "user", "-p", "gopass/path"))
|
fun parse_remote_with_password_prompt() {
|
||||||
|
val cliCommand = parseTarget(args = arrayOf("user@1.2.3.4", "-p"))
|
||||||
|
|
||||||
assertEquals("1.2.3.4", parseCli.remoteHost)
|
assertEquals("1.2.3.4", cliCommand.remoteTarget()?.host)
|
||||||
assertEquals("user", parseCli.userName)
|
assertEquals("user", cliCommand.remoteTarget()?.user)
|
||||||
assertEquals("gopass/path", parseCli.sshWithGopassPath)
|
assertTrue(cliCommand.isValid())
|
||||||
assertTrue(parseCli.isValid())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue