Initial commit
This commit is contained in:
@@ -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 <base_url> [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 <input_dir> [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
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
|
||||
BASE_URL="${1}"
|
||||
OUTPUT_DIR="${2:-.}"
|
||||
|
||||
if [ -z "$BASE_URL" ]; then
|
||||
echo "Usage: $0 <base_url> [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."
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
|
||||
INPUT_DIR="${1:-.}"
|
||||
OUTPUT_DIR="${2:-.}"
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <input_dir> [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
|
||||
Reference in New Issue
Block a user