commit e424b0ed36a595f66eb3374151b8521a75f583ef Author: wn6 Date: Sun May 31 13:41:47 2026 +0700 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..f02535a --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# Bitrix Backup Download & Extract + +Утилиты для скачивания и извлечения резервных копий Bitrix, разбитых на части на HTTP-сервере. + +## Описание + +Резервные копии Bitrix иногда хранятся на веб-сервере в виде одного файла (или набора `.tar.gz`-архивов), разбитого на части с числовыми суффиксами: + +``` +backup.tar.gz +backup.tar.gz.1 +backup.tar.gz.2 +... +``` + +Этот репозиторий содержит два скрипта: + +- **download_backup.sh** — скачивает базовый файл и все его части с сервера +- **extract_backup.sh** — собирает части в один файл и распаковывает архив + +## Требования + +- `bash` +- `curl` +- `tar` + +## Использование + +### 1. Скачивание + +```bash +./download_backup.sh [output_dir] +``` + +**Параметры:** + +- `base_url` — полный URL до базового файла (без числового суффикса) +- `output_dir` — директория для сохранения (по умолчанию: текущая) + +**Пример:** + +```bash +./download_backup.sh https://example.com/backup.tar.gz ./downloads +``` + +Скрипт скачает `backup.tar.gz`, затем проверит наличие `backup.tar.gz.1`, `backup.tar.gz.2` и т.д. пока сервер не вернёт код, отличный от 200. + +### 2. Распаковка + +```bash +./extract_backup.sh [output_dir] +``` + +**Параметры:** + +- `input_dir` — директория с частями `.tar.gz` +- `output_dir` — директория для извлечения (по умолчанию: текущая) + +**Пример:** + +```bash +./extract_backup.sh ./downloads ./restored +``` + +Скрипт: +1. Определяет префикс файла (например, `backup.tar.gz`) по первому найденному `.tar.gz` файлу +2. Собирает части в правильном порядке во временный файл +3. Распаковывает архив через `tar -xzf` +4. Удаляет временный файл при успешном завершении + +## Лицензия + +MIT diff --git a/download_backup.sh b/download_backup.sh new file mode 100755 index 0000000..81f2fb0 --- /dev/null +++ b/download_backup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +BASE_URL="${1}" +OUTPUT_DIR="${2:-.}" + +if [ -z "$BASE_URL" ]; then + echo "Usage: $0 [output_dir]" + exit 1 +fi + +# Скачиваем базовый файл +echo "Downloading base file..." +curl -L -f -o "${OUTPUT_DIR}/$(basename "$BASE_URL")" "$BASE_URL" + +if [ $? -ne 0 ]; then + echo "Failed to download base file." + exit 1 +fi + +# Скачиваем части, пока они существуют +i=1 +while true; do + PART_URL="${BASE_URL}.${i}" + + # Проверяем существование файла через HEAD-запрос + HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" -I "$PART_URL") + + if [ "$HTTP_CODE" -ne 200 ]; then + echo "No more parts found (last checked: ${PART_URL}). Download complete." + break + fi + + OUTPUT_FILE="${OUTPUT_DIR}/$(basename "$PART_URL")" + echo "Downloading part ${i}: ${PART_URL}..." + curl -L -f -o "$OUTPUT_FILE" "$PART_URL" + + if [ $? -ne 0 ]; then + echo "Failed to download part ${i}: ${PART_URL}" + exit 1 + fi + + i=$((i + 1)) +done + +echo "All files downloaded successfully." diff --git a/extract_backup.sh b/extract_backup.sh new file mode 100755 index 0000000..a907b0b --- /dev/null +++ b/extract_backup.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +INPUT_DIR="${1:-.}" +OUTPUT_DIR="${2:-.}" + +if [ -z "$1" ]; then + echo "Usage: $0 [output_dir]" + echo "Concatenates all .tar.gz parts and extracts them" + exit 1 +fi + +PREFIX="" +for f in "${INPUT_DIR}"/**.tar.gz; do + if [ -f "$f" ]; then + BASE=$(basename "$f") + # Убираем числовой суффикс для определения префикса + PREFIX=$(echo "$BASE" | sed -E 's/\.[0-9]+$//') + if [ -n "$PREFIX" ]; then + break + fi + fi +done + +COMBINED="/tmp/${PREFIX}_combined.tar.gz" + +echo "Combining parts into ${COMBINED}..." +# Собираем в правильном порядке: сначала базовый файл (без суффикса), затем части по порядку +cat "${INPUT_DIR}/${PREFIX}" > "$COMBINED" 2>/dev/null +for f in $(ls -v "${INPUT_DIR}/${PREFIX}".* 2>/dev/null); do + BASE=$(basename "$f") + if [[ "$BASE" =~ \.[0-9]+$ ]]; then + echo "Appending ${BASE}..." + cat "$f" >> "$COMBINED" + fi +done + +echo "Extracting ${COMBINED} to ${OUTPUT_DIR}..." +tar -xzf "$COMBINED" -C "$OUTPUT_DIR" + +if [ $? -eq 0 ]; then + echo "Extraction complete." + rm -f "$COMBINED" +else + echo "Extraction failed. Combined file kept at ${COMBINED}" + exit 1 +fi