98 lines
3.3 KiB
Swift
98 lines
3.3 KiB
Swift
import Dependencies
|
|
import Foundation
|
|
import ShellClient
|
|
|
|
/// Represents the configuration.
|
|
public struct Configuration: Codable, Sendable {
|
|
|
|
public let playbookDir: String?
|
|
public let inventoryPath: String?
|
|
public let templateRepo: String?
|
|
public let templateRepoVersion: String?
|
|
public let templateDir: String?
|
|
public let defaultPlaybookArgs: [String]?
|
|
public let defaultVaultArgs: [String]?
|
|
public let defaultVaultEncryptId: String?
|
|
|
|
fileprivate enum CodingKeys: String, CodingKey {
|
|
case playbookDir = "HPA_PLAYBOOK_DIR"
|
|
case inventoryPath = "HPA_DEFAULT_INVENTORY"
|
|
case templateRepo = "HPA_TEMPLATE_REPO"
|
|
case templateRepoVersion = "HPA_TEMPLATE_VERSION"
|
|
case templateDir = "HPA_TEMPLATE_DIR"
|
|
case defaultPlaybookArgs = "HPA_DEFAULT_PLAYBOOK_ARGS"
|
|
case defaultVaultArgs = "HPA_DEFAULT_VAULT_ARGS"
|
|
case defaultVaultEncryptId = "HPA_DEFAULT_VAULT_ENCRYPT_ID"
|
|
}
|
|
|
|
public static func fromEnv(
|
|
_ env: [String: String]
|
|
) throws -> Self {
|
|
@Dependency(\.logger) var logger
|
|
|
|
logger.trace("Creating configuration from env...")
|
|
|
|
let hpaValues: [String: String] = env.filter { $0.key.contains("HPA") }
|
|
logger.debug("HPA env vars: \(hpaValues)")
|
|
|
|
return Configuration(
|
|
playbookDir: hpaValues.value(for: .playbookDir),
|
|
inventoryPath: hpaValues.value(for: .inventoryPath),
|
|
templateRepo: hpaValues.value(for: .templateRepo),
|
|
templateRepoVersion: hpaValues.value(for: .templateRepoVersion),
|
|
templateDir: hpaValues.value(for: .templateDir),
|
|
defaultPlaybookArgs: hpaValues.array(for: .defaultPlaybookArgs),
|
|
defaultVaultArgs: hpaValues.array(for: .defaultVaultArgs),
|
|
defaultVaultEncryptId: hpaValues.value(for: .defaultVaultEncryptId)
|
|
)
|
|
}
|
|
|
|
static var mock: Self {
|
|
.init(
|
|
playbookDir: "/path/to/playbook",
|
|
inventoryPath: "/path/to/inventory.ini",
|
|
templateRepo: "https://git.example.com/consult-template.git",
|
|
templateRepoVersion: "main",
|
|
templateDir: "/path/to/local/template",
|
|
defaultPlaybookArgs: ["--tags", "debug"],
|
|
defaultVaultArgs: ["--vault-id=myId@$SCRIPTS/vault-gopass-client"],
|
|
defaultVaultEncryptId: "myId"
|
|
)
|
|
}
|
|
|
|
static var fileTemplate: String {
|
|
"""
|
|
# vi: ft=sh
|
|
|
|
# Example configuration, uncomment the lines and set the values appropriate for your
|
|
# usage.
|
|
|
|
# Set this to the location of the ansible-hpa-playbook on your local machine.
|
|
#HPA_PLAYBOOK_DIR="/path/to/ansible-hpa-playbook"
|
|
|
|
# Set this to the location of a template repository, which is used to create new assessment projects.
|
|
#HPA_TEMPLATE_REPO="https://git.example.com/your/template.git"
|
|
|
|
# Specify a branch, version, or sha of the template repository.
|
|
#HPA_TEMPLATE_VERSION="main" # branch, version, or sha
|
|
|
|
# Set this to a location of a template directory to use to create new projects.
|
|
#HPA_TEMPLATE_DIR="/path/to/local/template"
|
|
|
|
# Extra arguments that get passed directly to the ansible-playbook command.
|
|
#HPA_DEFAULT_PLAYBOOK_ARGS="--vault-id=consults@$SCRIPTS/vault-gopass-client"
|
|
|
|
"""
|
|
}
|
|
}
|
|
|
|
extension [String: String] {
|
|
fileprivate func value(for codingKey: Configuration.CodingKeys) -> String? {
|
|
self[codingKey.rawValue]
|
|
}
|
|
|
|
fileprivate func array(for codingKey: Configuration.CodingKeys) -> [String]? {
|
|
value(for: codingKey).flatMap { $0.split(separator: ",").map(String.init) }
|
|
}
|
|
}
|