backup-docker-to-local 1.2.0__py3-none-any.whl → 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: backup-docker-to-local
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Backup Docker volumes to local with rsync and optional DB dumps.
5
5
  Author: Kevin Veen-Birkenbach
6
6
  License: AGPL-3.0-or-later
@@ -1,11 +1,11 @@
1
- backup_docker_to_local-1.2.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
1
+ backup_docker_to_local-1.3.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
2
2
  baudolo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  baudolo/backup/__init__.py,sha256=5BfF8JBXB2j6sAptcmswtbjlajNWxOho6_CjwIamO7k,30
4
4
  baudolo/backup/__main__.py,sha256=118gZ0wij9_PAtR-jlG7LizrhrxwhHlAcAPW1eFeJtU,140
5
- baudolo/backup/app.py,sha256=dCKSbBGWi-Yw8JnrUTBUQLUyLHXxQd1Ebp_eqCD3LWA,6550
6
- baudolo/backup/cli.py,sha256=KEHgeohlyBxkACQ6yxhRqh9nTbE2B74Q5U50JBJf7SU,2477
5
+ baudolo/backup/app.py,sha256=Msx4DLi9URo9KWiT73riRD9csAQKvqZC6R2uRuEFqhk,6551
6
+ baudolo/backup/cli.py,sha256=CIckfVsU03ajZTI7zj3TB-AuvaOeJMbTB6rNCOKymXE,2473
7
7
  baudolo/backup/compose.py,sha256=dJiZnHlBZdeXTVqLR5zIbAtwR97YWxbULVn6VL16Hqg,1136
8
- baudolo/backup/db.py,sha256=A6PRcTAL5ryivpAs6Lc9udmSMIOKGpCBdDq5tI_s8mo,4486
8
+ baudolo/backup/db.py,sha256=_7_Vy8nMql1vaaL1g0kbLtRHhGx65T560DsckZFRJ-k,4462
9
9
  baudolo/backup/docker.py,sha256=6Sj9fpf1bm-CoqoeerQaq059VyDnF1Pj2ketzIt1Nkk,1364
10
10
  baudolo/backup/shell.py,sha256=guMHWcRb0Qlrz79gqFqmJLXVQK8cJEvNkhkMe5Tpgwc,738
11
11
  baudolo/backup/volume.py,sha256=DWBp_dZUo-a0MfnbwEd8jRAAHvSyN6vGdRSye0iQJbE,1485
@@ -17,9 +17,9 @@ baudolo/restore/run.py,sha256=rai5F27D6F8RRnFMyjcEGiHBAlVXtMOJoazs6zkLSC0,2302
17
17
  baudolo/restore/db/__init__.py,sha256=C4K_YAB0F9p8QhZRZIRyV2naMb54Qf_1O2cDxwwVQAI,59
18
18
  baudolo/restore/db/mariadb.py,sha256=_JEQFuF4GhTl8lKmgk2gsHYcXHcpCKrf32tigMSeTKI,2782
19
19
  baudolo/restore/db/postgres.py,sha256=_NIlcxdpcQIUZ8SNBWfWIaH1oGIkmZy9emFMgjGznhk,1446
20
- baudolo/seed/__main__.py,sha256=bw4IaWVhhqYF5toOmtziHRDWbYgTvqHqqRV4KnHKyf4,3088
21
- backup_docker_to_local-1.2.0.dist-info/METADATA,sha256=Mg-_GQiTyZG1VdS_PiwAFjAKC8V0lrHml_gC60dcN7I,7200
22
- backup_docker_to_local-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
- backup_docker_to_local-1.2.0.dist-info/entry_points.txt,sha256=92f5jPSjW__9-u5gzwmWkdiHKt4ysEFCVmwMtorQCv4,147
24
- backup_docker_to_local-1.2.0.dist-info/top_level.txt,sha256=y_5iNpF7EdLzqWWXIDfcTJpqijyy2hvrYgNiJXrN4r4,8
25
- backup_docker_to_local-1.2.0.dist-info/RECORD,,
20
+ baudolo/seed/__main__.py,sha256=BnN0Ckdjr30r6yxORq-ctrdmkT0yfeRIuXnyhKSe8Us,3430
21
+ backup_docker_to_local-1.3.0.dist-info/METADATA,sha256=-LXJPQPpZmk8IMnlfJcNzEWzMOjfr7S0yXkkPC82n8Q,7200
22
+ backup_docker_to_local-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
+ backup_docker_to_local-1.3.0.dist-info/entry_points.txt,sha256=92f5jPSjW__9-u5gzwmWkdiHKt4ysEFCVmwMtorQCv4,147
24
+ backup_docker_to_local-1.3.0.dist-info/top_level.txt,sha256=y_5iNpF7EdLzqWWXIDfcTJpqijyy2hvrYgNiJXrN4r4,8
25
+ backup_docker_to_local-1.3.0.dist-info/RECORD,,
baudolo/backup/app.py CHANGED
@@ -72,6 +72,7 @@ def requires_stop(containers: list[str], images_no_stop_required: list[str]) ->
72
72
  return True
73
73
  return False
74
74
 
75
+
75
76
  def backup_mariadb_or_postgres(
76
77
  *,
77
78
  container: str,
baudolo/backup/cli.py CHANGED
@@ -68,7 +68,7 @@ def parse_args() -> argparse.Namespace:
68
68
  action="store_true",
69
69
  help="Do not restart containers after backup",
70
70
  )
71
-
71
+
72
72
  p.add_argument(
73
73
  "--dump-only-sql",
74
74
  action="store_true",
baudolo/backup/db.py CHANGED
@@ -52,7 +52,9 @@ def _atomic_write_cmd(cmd: str, out_file: str) -> None:
52
52
  execute_shell_command(f"mv {tmp} {out_file}")
53
53
 
54
54
 
55
- def fallback_pg_dumpall(container: str, username: str, password: str, out_file: str) -> None:
55
+ def fallback_pg_dumpall(
56
+ container: str, username: str, password: str, out_file: str
57
+ ) -> None:
56
58
  """
57
59
  Perform a full Postgres cluster dump using pg_dumpall.
58
60
  """
@@ -103,9 +105,7 @@ def backup_database(
103
105
  "'*' is currently only supported for Postgres."
104
106
  )
105
107
 
106
- cluster_file = os.path.join(
107
- out_dir, f"{instance_name}.cluster.backup.sql"
108
- )
108
+ cluster_file = os.path.join(out_dir, f"{instance_name}.cluster.backup.sql")
109
109
  fallback_pg_dumpall(container, user, password, cluster_file)
110
110
  produced = True
111
111
  continue
baudolo/seed/__main__.py CHANGED
@@ -7,10 +7,11 @@ import re
7
7
  import sys
8
8
  import pandas as pd
9
9
  from typing import Optional
10
-
10
+ from pandas.errors import EmptyDataError
11
11
 
12
12
  DB_NAME_RE = re.compile(r"^[a-zA-Z0-9_][a-zA-Z0-9_-]*$")
13
13
 
14
+
14
15
  def _validate_database_value(value: Optional[str], *, instance: str) -> str:
15
16
  v = (value or "").strip()
16
17
  if v == "":
@@ -31,6 +32,11 @@ def _validate_database_value(value: Optional[str], *, instance: str) -> str:
31
32
  )
32
33
  return v
33
34
 
35
+
36
+ def _empty_df() -> pd.DataFrame:
37
+ return pd.DataFrame(columns=["instance", "database", "username", "password"])
38
+
39
+
34
40
  def check_and_add_entry(
35
41
  file_path: str,
36
42
  instance: str,
@@ -48,17 +54,21 @@ def check_and_add_entry(
48
54
  database = _validate_database_value(database, instance=instance)
49
55
 
50
56
  if os.path.exists(file_path):
51
- df = pd.read_csv(
52
- file_path,
53
- sep=";",
54
- dtype=str,
55
- keep_default_na=False,
56
- )
57
+ try:
58
+ df = pd.read_csv(
59
+ file_path,
60
+ sep=";",
61
+ dtype=str,
62
+ keep_default_na=False,
63
+ )
64
+ except EmptyDataError:
65
+ print(
66
+ f"WARNING: databases.csv exists but is empty: {file_path}. Creating header columns.",
67
+ file=sys.stderr,
68
+ )
69
+ df = _empty_df()
57
70
  else:
58
- df = pd.DataFrame(
59
- columns=["instance", "database", "username", "password"]
60
- )
61
-
71
+ df = _empty_df()
62
72
  mask = (df["instance"] == instance) & (df["database"] == database)
63
73
 
64
74
  if mask.any():