вот тут описано, как изменить стандартное обновление раз в шесть часов,
сделав его, допустим, раз в сутки ночью
понятно, что как минимум раз в сутки репо точно обновляется, но
если представить гипотетически, что это раз в сутки, то все огромные списки будут перекачиваться заново
теоретически, я не претендую на правильность, можно сделать так:
правим
lxc exec antizapret-vpn -- nano /root/antizapret/doall.sh
#!/bin/bash
set -e
# Устанавливаем текущий каталог как рабочий
HERE="$(dirname "$(readlink -f "${0}")")"
cd "$HERE"
# URL RSS-канала
RSS_URL="https://github.com/zapret-info/z-i/commits/master.atom"
# Файл для хранения последнего хэша коммита (с относительным путём)
LAST_COMMIT_FILE="./last_commit.txt"
LOG_FILE="./doall.log"
# Функция для выполнения скриптов с комментариями
run_scripts() {
if ./update.sh; then
echo ">>> update.sh выполнен успешно."
else
echo ">>> Ошибка в update.sh"
exit 1
fi
if ./parse.sh; then
echo ">>> parse.sh выполнен успешно."
else
echo ">>> Ошибка в parse.sh"
exit 1
fi
if ./process.sh; then
echo ">>> process.sh выполнен успешно."
else
echo ">>> Ошибка в process.sh"
exit 1
fi
}
# Проверка на существование файла с хэшем
if [ ! -f "$LAST_COMMIT_FILE" ]; then
echo "Файл $LAST_COMMIT_FILE отсутствует. Выполняем начальную инициализацию..."
LATEST_COMMIT=$(curl -s "$RSS_URL" | grep -oPm1 "(?<=Grit::Commit/)[a-f0-9]{40}")
echo "Последний коммит: $LATEST_COMMIT"
# Выполняем начальную инициализацию
if run_scripts; then
echo "$LATEST_COMMIT" > "$LAST_COMMIT_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') Обновление завершено успешно. Коммит: $LATEST_COMMIT" > "$LOG_FILE"
echo "Инициализация завершена успешно."
else
echo "Ошибка при выполнении инициализации."
exit 1
fi
exit 0
fi
# Получаем текущий последний коммит из RSS
LATEST_COMMIT=$(curl -s "$RSS_URL" | grep -oPm1 "(?<=Grit::Commit/)[a-f0-9]{40}")
# Сравниваем с сохраненным коммитом
SAVED_COMMIT=$(cat "$LAST_COMMIT_FILE")
if [ "$LATEST_COMMIT" != "$SAVED_COMMIT" ]; then
echo "Обнаружен новый коммит: $LATEST_COMMIT"
# Выполняем обновление
if run_scripts; then
echo "$LATEST_COMMIT" > "$LAST_COMMIT_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') Обновление завершено успешно. Коммит: $LATEST_COMMIT" >> "$LOG_FILE"
# Ограничиваем файл лога последними 15 записями
tail -n 15 "$LOG_FILE" > "/tmp/$(basename "$LOG_FILE").tmp" && mv "/tmp/$(basename "$LOG_FILE").tmp" "$LOG_FILE"
echo "Обновление завершено успешно."
else
echo "Ошибка при выполнении обновления."
exit 1
fi
else
echo "Новых коммитов нет."
fi
далее правим
lxc exec antizapret-vpn -- nano /root/antizapret/update.sh
#!/bin/bash
set -e
HERE="$(dirname "$(readlink -f "${0}")")"
cd "$HERE"
# Базовые ссылки для скачивания
BASELINK='https://raw.githubusercontent.com/zapret-info/z-i/master/'
NXDOMAINLINK='https://raw.githubusercontent.com/zapret-info/z-i/master/nxdomain.txt'
# Очистка временных файлов
rm -rf temp
mkdir -p temp
# Скачивание всех частей dump-*.csv
i=0
while true; do
PARTNAME="dump-$(printf "%02d" "$i").csv"
PARTLINK="${BASELINK}${PARTNAME}"
PARTFILE="temp/${PARTNAME}"
# Пытаемся скачать текущую часть
if ! curl -f --fail-early --compressed -o "$PARTFILE" "$PARTLINK" 2>/dev/null; then
# Если файл отсутствует, выходим из цикла
break
fi
echo "Скачан $PARTLINK"
# Проверка размера файла
EXPECTED_SIZE=$(curl -sI "$PARTLINK" | awk 'BEGIN {IGNORECASE=1;} /content-length/ {sub(/[ \t\r\n]+$/, "", $2); print $2}')
ACTUAL_SIZE=$(stat -c '%s' "$PARTFILE")
if [[ "$EXPECTED_SIZE" != "$ACTUAL_SIZE" ]]; then
echo "Ошибка: размер файла $PARTNAME отличается (ожидалось: $EXPECTED_SIZE, фактически: $ACTUAL_SIZE)"
exit 2
fi
echo "Размер файла $PARTNAME совпадает (размер: $ACTUAL_SIZE байт)"
i=$((i + 1))
done
# Проверяем, были ли скачаны файлы
if [[ $i -eq 0 ]]; then
echo "Не удалось скачать ни одного файла dump-*.csv"
exit 1
fi
echo "Всего скачано частей: $i"
# Объединение всех частей в один файл
cat temp/dump-*.csv > temp/list_orig.csv
echo "Объединены все части dump-*.csv в temp/list_orig.csv"
# Преобразование кодировки dump.csv
iconv -f cp1251 -t utf8 temp/list_orig.csv > temp/list.csv
echo "Файл temp/list_orig.csv преобразован в UTF-8 и сохранён как temp/list.csv"
# Скачивание nxdomain.txt
curl -f --fail-early --compressed -o temp/nxdomain.txt "$NXDOMAINLINK" 2>/dev/null || exit 1
echo "Файл nxdomain.txt успешно скачан в temp/nxdomain.txt"
# Проверка размера nxdomain.txt
EXPECTED_SIZE=$(curl -sI "$NXDOMAINLINK" | awk 'BEGIN {IGNORECASE=1;} /content-length/ {sub(/[ \t\r\n]+$/, "", $2); print $2}')
ACTUAL_SIZE=$(stat -c '%s' temp/nxdomain.txt)
if [[ "$EXPECTED_SIZE" != "$ACTUAL_SIZE" ]]; then
echo "Ошибка: размер файла nxdomain.txt отличается (ожидалось: $EXPECTED_SIZE, фактически: $ACTUAL_SIZE)"
exit 2
fi
echo "Размер файла nxdomain.txt совпадает (размер: $ACTUAL_SIZE байт)"
echo "Скрипт update.sh завершён успешно"
exit 0
и таймер
lxc exec antizapret-vpn -- nano /etc/systemd/system/antizapret-update.timer
[Unit]
Description=Run antizapret-vpn update every 30 minutes
[Timer]
# Запускать задачу каждые 30 минут с момента последнего запуска
OnUnitActiveSec=30m
# Сохранить пропущенные запуски, если система была выключена
Persistent=true
[Install]
WantedBy=timers.target
по итогу таймер будет проверять раз в тридцать минут (по желанию) последний комит, и при несовпадении – уже скачивать
как обычно проверяем запуск
lxc exec antizapret-vpn -- sh -c "LANG=C.UTF-8 /root/antizapret/doall.sh"
lxc exec antizapret-vpn -- sh -c "echo 'cache.clear()' | socat - /run/knot-resolver/control/1"
и для контроля
lxc exec antizapret-vpn -- cat /root/antizapret/doall.log
lxc exec antizapret-vpn -- systemctl list-timers --all | awk 'NR==1 || /antizapret-update.timer/'