3 Ревизии 1a26ca8973 ... 85ab0e6d4c

Автор SHA1 Съобщение Дата
  jherve 85ab0e6d4c Use container secrets to import borg passphrase преди 11 месеца
  jherve acbec026df Send secrets via podman secret преди 11 месеца
  jherve 896bb8425b Ignore data sources in git преди 11 месеца
променени са 4 файла, в които са добавени 37 реда и са изтрити 6 реда
  1. 3 1
      .gitignore
  2. 0 0
      credentials/.gitkeep
  3. 2 2
      data/borgmatic/common.yaml
  4. 32 3
      start.py

+ 3 - 1
.gitignore

@@ -1,3 +1,5 @@
 data/source/*/
 data/.bash_history
-data/credentials/*
+data_sources_*
+secret_sources_*
+credentials/*

+ 0 - 0
credentials/.gitkeep


+ 2 - 2
data/borgmatic/common.yaml

@@ -7,9 +7,9 @@ repositories:
     label: hetzner
 
 remote_path: borg-1.4
-ssh_command: ssh -i ~/.ssh/${SSH_KEY_NAME}
+ssh_command: ssh -i /var/run/secrets/${SSH_KEY_NAME}
 
-encryption_passphrase: "{credential file /credentials/borg_passphrase}"
+encryption_passphrase: "{credential container ${BORG_PASSPHRASE_NAME}}"
 compression: lz4
 
 checks:

+ 32 - 3
start.py

@@ -2,6 +2,7 @@ import os
 import subprocess
 import socket
 from pathlib import Path, PurePosixPath
+from dataclasses import dataclass
 
 is_windows = os.name == "nt"
 
@@ -13,6 +14,25 @@ def read_data_sources(hostname: str, login: str) -> list[Path]:
         return [Path(p_str.strip()).expanduser() for p_str in paths]
 
 
+@dataclass
+class Secret:
+    host_path: Path
+    name: str
+    mode: int
+
+    @classmethod
+    def from_line(cls, line: str):
+        path = Path(line).expanduser()
+        return cls(host_path=path, name=path.name, mode=0o0400)
+
+
+def read_secret_sources(hostname: str, login: str) -> list[Secret]:
+    file = Path(f"./secret_sources_{hostname}_{login}")
+    with open(file) as f:
+        lines = f.readlines()
+        return [Secret.from_line(l.strip()) for l in lines]
+
+
 def to_source_path(path: Path):
     mount_base = PurePosixPath("/mnt") / "source"
     inner_path = PurePosixPath(path)
@@ -24,20 +44,19 @@ def main():
     login = os.getlogin()
     hostname = socket.gethostname()
     data_sources = read_data_sources(hostname, login)
+    secret_sources = read_secret_sources(hostname, login)
     container_name = "borgmatic"
     ssh_auth_sock = os.getenv("SSH_AUTH_SOCK")
 
     data_path = Path.cwd() / "data"
     config_d_path = data_path / "borgmatic.d"
     config_path = data_path / "borgmatic"
-    credentials_path = data_path / "credentials"
     history_file = data_path / ".bash_history"
     history_file.touch()
     ssh_config_path = Path.home() / ".ssh"
     volumes = [
         f"{config_d_path}:/etc/borgmatic.d/",
         f"{config_path}:/etc/borgmatic/",
-        f"{credentials_path}:/credentials/",
         f"{ssh_config_path}:/root/.ssh",
         f"{history_file}:/root/.bash_history",
         "borg_config:/root/.config/borg",
@@ -52,6 +71,16 @@ def main():
     ]
 
     volume_args = [a for vol in volumes for a in ["-v", vol]]
+
+    if not secret_sources:
+        print("no secret required ?")
+
+    for s in secret_sources:
+        args = ["podman", "secret", "create", "--replace", s.name, s.host_path]
+        print(args)
+        subprocess.run(args)
+
+    secrets_args = [a for s in secret_sources for a in ["--secret", f"{s.name},mode=0{s.mode:o}"]]
     image_name = "ghcr.io/borgmatic-collective/borgmatic"
 
     args = [
@@ -71,7 +100,7 @@ def main():
         "-e",
         f"HOST_LOGIN={login}",
         "--security-opt=label=disable"
-    ] + volume_args + [image_name]
+    ] + volume_args + secrets_args + [image_name]
     print(args)
     subprocess.run(args)