Скрипт для резервного копирования

Всем привет, обновил скрипт для резервного копирования с учётом того, что я вообще-то программист, а не просто айтишник! Он стал более интеллектуально определять и удалять старые файлы, учитывать ограничение в 4.5Gb (на FTP для бекапа доступно 5Gb) и успешность операций, добавлены сообщения об ошибках. И бонусом сообщения раскрашены в разные цвета, нейтральные выделены жирным, хорошие зелёным, а плохие красным цветом — красота! Скрипт проверен на сайте ShellCheck, который я настоятельно рекомендую к использованию. Если найдёте ошибку или вам есть что добавить, смело пишите комментарий.

#!/usr/local/bin/bash
 
# Основная папка для архивов
BACKUP_ROOT=/var/backups/manual/
# Папка, куда непоредственно пишем файлы, выглядит как BACKUP_ROOT/ГОД/МЕСЯЦ/ДЕНЬ
BACKUP_DIR="$BACKUP_ROOT"$(date +"%Y/%m/%d")
# Время запуска скрипта. Все файлы имеют вид имя_файла_%ЧАС%%МИНУТА%.tag.bz2
TIME=$(date +"%H%M")
# Ограничение хранилища в килобайтах для проверки
LIMIT=$(echo "4096*2^10"|bc)
# Ограничение хранилища в мегабайтах для вывода в сообщениях
HLIMIT=$(echo "$LIMIT/1024"|bc)"Mb"
 
# Функция выход в случае ошибки
exit_on_error() {
    # Получаем код ошибки
    exit_code=$?
    # Входное сообщение
    message=$1
    if [ $exit_code -ne 0 ]; then
        # Выводим сообщение в stderr
        >&2 echo -e "\e[31m${message}\e[0m"
        # Выходим к кодом exit_code
        exit $exit_code
    fi
}
 
# Если папки нет
if [ ! -d "$BACKUP_DIR" ]; then
    # Создаём папку со всеми промежуточными подпапками
    mkdir -p "$BACKUP_DIR"
fi
 
printf "\e[1mSearching space for backup\e[0m .. "
# Цикл от 100 дней до нуля
for days in $(seq 100 -1 0)
do
    SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
    HSZ=$(echo "$SIZE/1024"|bc)"Mb"
    # Если размер хранилища не превышает лимита
    if [[ $SIZE -le $LIMIT ]]; then
        # Выводим сообщение и прерываем цикл
        printf "[%s/%s] .. " "$HSZ" "$HLIMIT"
        break
    fi
    # Если нет ни одного файла старше $days дней
    if [[ -z "$(find $BACKUP_ROOT -type f -mtime +"$days")" ]]; then
        # Продолжаем цикл
        continue
    fi
    printf "\e[31m%s/%s]\e[0m .. " "$HSZ" "$HLIMIT"
    # Удаление файлов старше $days прошло успешно
    if find $BACKUP_ROOT -type f -mtime +"$days"d -delete > /dev/null; then
        # Выводим сообщение 
        printf "CLEAN (older than %s days) .. " "$days"
    else
        # Выходим с сообщением FAIL
        exit_on_error "FAIL"
    fi
    # Удаляем пустые папки, чтоб не мусорить
    find $BACKUP_ROOT -empty -type d -delete
done
echo -e "\e[32mOK\e[0m"
 
printf "\e[1mBackuping etc files\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/etc_"$TIME".tar.bz2 /etc /usr/local/etc /home /var/db/ports /var/named/etc/namedb /root/scripts > /dev/null 2>&1 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping www folder\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/www_"$TIME".tar.bz2 /usr/local/www > /dev/null && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping SQL databases\e[0m .. "
/usr/local/bin/mysqldump --login-path=backup --opt --all-databases --triggers --routines --events | bzip2 -c > "$BACKUP_DIR"/sql_"$TIME".sql.bz2 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

Откровенно говоря, не до конца понимаю, в каких единицах считает занятое место команда du. Предполагаю, что в килобайтах.

P.S. Для того, чтобы получить вывод без цвета, использую утилиту textproc/ansifilter:

script.sh | ansifilter --text
Добавил меню

Всем привет! Вам конечно всё равно, но я добавил меню. Теперь у меня есть навигация не только по меткам, но и по рубрикам. Можно посмотреть все Путешествия или рубрику Программирование включая подрубрики C++, Python, Java и так далее. Всё добавлено вручную, никакой автоматизации.

Поддержка меню в WordPress встроена изначально, все пункты и подменю добавляются в админке, но поскольку тема у меня самописная, пришлось попотеть с CSS и немного с JavaScript. Что-то натырено со сторонних сайтов, что-то взято из видео ниже.

Добавить меню хотел очень давно, но не хватало стимула и знаний. Спасибо каналу хлопца Евгения. После просмотра его видео про адаптивное меню решил сменить профессию сделать похожее на своём сайте.

Дайте знать, если плашка с рубрикой нужна к каждой статье. Хотя кого я спрашиваю, ходит на сайт два с половиной человека. Один из них гуглбот, а второй — это я.

UPD: В мобильной версии сайта добавил меню с помощью плагина WP Mobile Menu.

Последние новости сайта

SSL Сертификат

В связи с событиями на Украине контора Sectigo объявила санкции и перестала выпускать ssl сертификаты для .ru и .рф доменов. За выпуск оного я платил 820 рублей в год.

Благодаря сcанкциям, я перешёл на использование бесплатного сертификата от Let’s Encrypt (с помощью certbot — он есть в портах FreeBSD). Поначалу certbot капризничал и не хотел работать без AAAA DNS записи, но это вылечилось, когда я прописал www как CNAME основного домена. Так что теперь я использую сертификат от Let’s Encrypt, а конторе Sectigo вместе с Comodo могу сказать следующее:

Fuck you asshole!

Кстати, в связи с подобными запретами Минцифры РФ подсуетилось и начало выпускать отечественные SSL сертификаты через госуслуги, которые никем не признаны, доступны только юридическим лицам и принесут больше проблем, чем пользы. Досадно, что настройкой чебурнета занимаются кретины.

IPv6

Решая проблемы с certbot, неожиданно вспомнил, что хостер выдал мне сеть /64 IPv6 адресов. Я не сильно в этом разбираюсь, но судя по калькулятору, могу выдать каждому жителю планеты Земля по два миллиарда адресов в моём личном адресном пространстве. Мне много не надо, поэтому взял циферку один и теперь у моего сайта есть AAAA DNS запись и он открывается по IPv6 адресу.

A-A-Arduino Uno и базовый набор

Уже лет десять периодически слышу про Arduino и Raspberry Pi. Первое — программируемый контроллер, второе — мини-компьютер с ОС Linux.

И, если мини-компьютер мне совершенно не интересен, поскольку с компьютерами общаюсь уже лет двадцать, то контроллер очень даже интересная штука. Запах канифоли, нагретый паяльник связанный должник, припой ПОС-61 — вот это всё будоражит воображение и радует глаз. Плюс к этому контроллер Arduino программируемый на некоем подобии C++.

С детства мечтал соединить опыт программирования с железом. Последнее и единственное, что сотворил такого рода — коробка с двумя кнопками, которая подключалась к COM порту компьютера, где специальная программа отслеживала нажатия кнопок и выполняла некоторый функционал: включала немедленный автодозвон до BBS, отключала/включала модем. Славные были деньки в коммуналке, мать их.

Arduino Uno + Базовый набор

Так что, насмотревшись в интернете разных уроков по Arduino, купил базовый набор для обучения. В набор входят:

  • резисторы 10 кОм
  • резисторы 220 Ом
  • потенциометр (по-нашему, крутилка)
  • фоторезистор (определяет освещенность)
  • датчик температуры
  • светодиоды синие, красные и зелёные
  • светодиод RGB (может светиться любым цветом)
  • кнопочки
  • проводочки
  • макетная плата (для пробы своих задумок перед пайкой)
  • плата Arduino Uno с проводом USB для подключения к компьютеру
  • книга с экспериментами для самых маленьких (7 экспериментов), как я
  • книга с основами и экспериментами для детей постарше

Arduino Uno + Базовый набор

Плата работает с частотой 16MHz и это охренительно круто! С такой скоростью мне работать ещё не приходилось. Каких-то жалких 16 миллионов операций в секунду, оперативная память в 2048 байт, медленная работа с плавающей запятой, тормозные тригонометрические функции — это прекрасно, если вы понимаете о чём я.

Если не понимаете, то ваш мобильник, к примеру, работает с частотой около двух миллиардов операций в секунду на четырёх ядрах с поддержкой быстрой работы с плавающей запятой и оперативной памятью в 32 миллиарда байт. Даже не зная математики, можно почувствовать разницу. И вы используете эту мощь, чтобы в Инстаграм улыбальник фильтрами поправлять. Человечество стремительно тупеет.

Сама по себе плата умеет немного: принимать напряжение 5 вольт, выдавать это напряжение и, в принципе, всё. Выдавать напряжение может в цифровом виде: нет напряжения, есть напряжение и в аналоговом: выдать напряжение от нуля до пяти вольт. Читать умеет тоже в цифровом и аналоговом виде.

Цифровых разъёмов 13 штук, аналоговых 6 штук. Плюс разъёмы питания 3.3 и 5 вольт и земля GND.

Казалось бы — ерунда, а нет! На некоторых разъёмах плата умеет выдавать ШИМ сигнал. Это скачки цифрового сигнала много-много раз в секунду. Этим сигналом управляются двигатели, насколько я понял. Ещё можно динамик подключить и пиликать в него.

Энтузиасты сотворили мини-игровую консоль с экраном, называется Arduboy.

В общем, полёт фантазии не ограничен.

Мой полёт пока остановился на мигании RGB светодиодом и это отлично хотя бы потому, что я не спалил плату, как однажды спалил жёсткий диск, подключив питание вверх ногами, хотя разъем специально сделан такой формы, чтобы нельзя воткнуть его иначе. Но хитрость, сила и глупость всегда побеждают в борьбе с разумом и интеллектом.

Arduino Uno, макетная плата, RGB светодиод

Пока не понял — зачем повсюду втыкать резисторы: для кнопки и светодиода, но со временем до меня дойдёт.

Зато понял, что цифровые порты без значка тильды «~» не поддерживают комманду analogWrite(), как положено.

Кстати, сразу вопрос: почему все порты не сделаны, как цифровые с поддержкой analogRead() и analogWrite()? Это сильно упростило бы работу с платой на мой непрофессиональный взгляд.

Плата может брать питание из трёх мест: по разьёму USB, с отдельного входа, с двух штырьков. Подключать все три входа одновременно, наверно, плохая идея.

Программируется через USB заливкой прошивки с помощью Arduino IDE.

Прошивка содержит две функции:

  • setup() выполняется один раз при включении платы или после reset
  • loop() бесконечный цикл во время работы

В первой функции устанавливаем режим работы пинов: вход или выход, вешаем прерывания, открываем порт для отладки, во второй читаем данные и пишем.

Отдельно хочу обратить внимание на прерывания: они позволяют задействовать режим энергосбережения, что полезно при работе от батареек. Прерывание срабатывает по определённым событиям: появился сигнал, исчез сигнал. При наступлении этого события происходит вызов вашей функции, а выполнение loop() приостанавливается. В режиме энергосбережения плата может прожить шесть лет на батарейках без учёта саморазряда.

Эту информацию и всё вышенаписанное я подчерпнул с канала AlexGyver, за что ему огромное спасибо! Чувак, мой тебе респект, ты молодец, я теперь твой фанат.

А ещё я потрогал резистор щупом мультиметра и обнаружил сопротивление в 220 Ом, как и ожидалось. Здорово, правда?

Функционал Arduino бесконечный, потому что она управляющая, а остальное делают различные внешние платы, например, реле, которое может управлять контактом, через который проходит 220 Вольт. По сигналу с Arduino реле замыкает или размыкает эту цепь.

Теперь самое интересное: цены.

Свой набор Arduino Uno с двумя книжками и прочим барахлишком я купил в магазине КЕЙ за 2790 рублей. Просто потому, что хотел всё, сразу и сейчас. Отдельно плата Arduino Uno в Чип&Дип стоит 2270 рублей. У китайцев аналог этой платы стоит от 200 рублей. Оригинальная версия от создателей обойдется вам в €28. Чувствуете некоторый разброс цен?

На мой дилетанский взгляд, покупать Arduino нужно у создателей, а разные реле и платы у китайцев. Просто потому, что создатели этого заслуживают.

Когда внезапно разбогатею (как раз после выплаты ипотеки), то планирую купить набор у создателей в районе 10-15 тысяч рублей, просто в качестве благодарности за их труд.

Блог Евгения Жирнова