restic-compose-backup/restic_compose_backup/containers_db.py

145 lines
4.4 KiB
Python
Raw Normal View History

2019-12-03 08:40:02 +00:00
from restic_compose_backup.containers import Container
from restic_compose_backup.config import Config
from restic_compose_backup import (
commands,
restic,
)
2019-12-03 08:40:02 +00:00
from restic_compose_backup import utils
2019-12-03 00:29:41 +00:00
class MariadbContainer(Container):
container_type = 'mariadb'
def get_credentials(self) -> dict:
"""dict: get credentials for the service"""
return {
'host': self.hostname,
'username': self.get_config_env('MYSQL_USER'),
'password': self.get_config_env('MYSQL_PASSWORD'),
'port': "3306",
}
def ping(self) -> bool:
"""Check the availability of the service"""
2019-12-03 00:47:15 +00:00
creds = self.get_credentials()
return commands.ping_mysql(
creds['host'],
creds['port'],
creds['username'],
creds['password'],
)
2019-12-03 00:29:41 +00:00
def dump_command(self) -> list:
"""list: create a dump command restic and use to send data through stdin"""
creds = self.get_credentials()
return [
"mysqldump",
f"--host={creds['host']}",
f"--port={creds['port']}",
f"--user={creds['username']}",
"--all-databases",
]
def backup(self):
2019-12-03 04:00:47 +00:00
config = Config()
2019-12-04 23:27:56 +00:00
creds = self.get_credentials()
with utils.environment('MYSQL_PWD', creds['password']):
return restic.backup_from_stdin(
config.repository,
f'/databases/{self.service_name}/all_databases.sql',
self.dump_command(),
)
2019-12-03 00:29:41 +00:00
class MysqlContainer(Container):
container_type = 'mysql'
def get_credentials(self) -> dict:
"""dict: get credentials for the service"""
return {
'host': self.hostname,
'username': self.get_config_env('MYSQL_USER'),
'password': self.get_config_env('MYSQL_PASSWORD'),
'port': "3306",
}
def ping(self) -> bool:
"""Check the availability of the service"""
2019-12-03 00:47:15 +00:00
creds = self.get_credentials()
return commands.ping_mysql(
creds['host'],
creds['port'],
creds['username'],
creds['password'],
)
2019-12-03 00:29:41 +00:00
def dump_command(self) -> list:
"""list: create a dump command restic and use to send data through stdin"""
2019-12-03 04:11:24 +00:00
creds = self.get_credentials()
return [
"mysqldump",
f"--host={creds['host']}",
f"--port={creds['port']}",
f"--user={creds['username']}",
"--all-databases",
]
2019-12-03 00:29:41 +00:00
def backup(self):
2019-12-03 04:11:24 +00:00
config = Config()
2019-12-04 23:27:56 +00:00
creds = self.get_credentials()
with utils.environment('MYSQL_PWD', creds['password']):
return restic.backup_from_stdin(
config.repository,
f'/databases/{self.service_name}/all_databases.sql',
self.dump_command(),
)
2019-12-03 00:29:41 +00:00
class PostgresContainer(Container):
container_type = 'postgres'
def get_credentials(self) -> dict:
"""dict: get credentials for the service"""
return {
'host': self.hostname,
'username': self.get_config_env('POSTGRES_USER'),
'password': self.get_config_env('POSTGRES_PASSWORD'),
'port': "5432",
2019-12-03 05:24:05 +00:00
'database': self.get_config_env('POSTGRES_DB'),
2019-12-03 00:29:41 +00:00
}
def ping(self) -> bool:
"""Check the availability of the service"""
2019-12-03 02:00:17 +00:00
creds = self.get_credentials()
return commands.ping_postgres(
creds['host'],
creds['port'],
creds['username'],
creds['password'],
)
2019-12-03 00:29:41 +00:00
def dump_command(self) -> list:
"""list: create a dump command restic and use to send data through stdin"""
2019-12-03 05:24:05 +00:00
# NOTE: Backs up a single database from POSTGRES_DB env var
creds = self.get_credentials()
return [
"pg_dump",
f"--host={creds['host']}",
f"--port={creds['port']}",
f"--username={creds['username']}",
creds['database'],
]
def backup(self):
2019-12-03 05:24:05 +00:00
config = Config()
creds = self.get_credentials()
with utils.environment('PGPASSWORD', creds['password']):
return restic.backup_from_stdin(
config.repository,
2019-12-04 21:17:42 +00:00
f"/databases/{self.service_name}/{creds['database']}.sql",
2019-12-03 05:24:05 +00:00
self.dump_command(),
)