mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-18 15:30:15 +00:00
* Do not use `tar_file.add` to recursively add backup folder As the folders might contain files which are being removed temporarily (e.g. shared memory file of sqlite database), relying on `tar_file.add` becomes problematic as it crashes the whole backup process if a file does not exist anymore. This becomes annoying, if the file which causes the error should be excluded by the filter. To workaround this issue, we manually iterating over the files/directories and apply filters before passing the file or directory to the `tar_file.add` method. As per [documentation](https://docs.python.org/3/library/pathlib.html#pure-paths), pure path does not access the file system. Fixes #779 Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Remove unused import Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Applied code review suggestions Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Applied codestyle Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Remove `pathlib` util and move `is_excluded_by_filter` into `tar` utils Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Rename method Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Rename `origin_dir` to `origin_path` and apply `Path` typehint Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Codestyle Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Add comment why we add the directory even if we are iterating over all its items Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Use `atomic_contents_add` from tar utils to archive addon data Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Remove unused function `exclude_filter` Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Remove unsecure default list value Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Some more codestyle Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Lowercase method name `Path.joinpath` Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Fix codestyle and use proper variable Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Add test for `_is_excluded_by_filter` Signed-off-by: Maximilian Bösing <2189546+boesing@users.noreply.github.com> * Update addon.py Co-authored-by: Pascal Vizeli <pascal.vizeli@syshack.ch>
63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
"""Test Tarfile functions."""
|
|
|
|
import attr
|
|
|
|
from pathlib import PurePath
|
|
from supervisor.utils.tar import secure_path, _is_excluded_by_filter
|
|
|
|
|
|
@attr.s
|
|
class TarInfo:
|
|
"""Fake TarInfo."""
|
|
|
|
name: str = attr.ib()
|
|
|
|
|
|
def test_secure_path():
|
|
"""Test Secure Path."""
|
|
test_list = [
|
|
TarInfo("test.txt"),
|
|
TarInfo("data/xy.blob"),
|
|
TarInfo("bla/blu/ble"),
|
|
TarInfo("data/../xy.blob"),
|
|
]
|
|
assert test_list == list(secure_path(test_list))
|
|
|
|
|
|
def test_not_secure_path():
|
|
"""Test Not secure path."""
|
|
test_list = [
|
|
TarInfo("/test.txt"),
|
|
TarInfo("data/../../xy.blob"),
|
|
TarInfo("/bla/blu/ble"),
|
|
]
|
|
assert [] == list(secure_path(test_list))
|
|
|
|
|
|
def test_is_excluded_by_filter_good():
|
|
"""Test exclude filter."""
|
|
filter_list = ["not/match", "/dev/xy"]
|
|
test_list = [
|
|
PurePath("test.txt"),
|
|
PurePath("data/xy.blob"),
|
|
PurePath("bla/blu/ble"),
|
|
PurePath("data/../xy.blob"),
|
|
]
|
|
|
|
for path_object in test_list:
|
|
assert _is_excluded_by_filter(path_object, filter_list) is False
|
|
|
|
|
|
def test_is_exclude_by_filter_bad():
|
|
"""Test exclude filter."""
|
|
filter_list = ["*.txt", "data/*", "bla/blu/ble"]
|
|
test_list = [
|
|
PurePath("test.txt"),
|
|
PurePath("data/xy.blob"),
|
|
PurePath("bla/blu/ble"),
|
|
PurePath("data/test_files/kk.txt"),
|
|
]
|
|
|
|
for path_object in test_list:
|
|
assert _is_excluded_by_filter(path_object, filter_list) is True
|