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