Запись с тегами: python

Linux backup time machine на базе Python + Rsync + Mysql

в корпоративном чате:
xxx: я очень наделся, что в этом проекте не скажу этих слов, но обстоятельства заставляют.
xxx: господа.
xxx: а бэкапы кто-то делал?

Очередной велосипед для резервного копирования для систем на базе Linux, был собран из Python-а и Rsync-а, когда существующие решения оказались либо слишком сложными, либо не обладающими достаточным функционалом.
Особенности и плюсы Linux Time Machine:

  • Работа по принципу TimeMachine из MacOs, а именно — создание инкрементальных копий в отдельных папках с возможностью быстро восстановить или как-то ещё использовать файлы за произвольную дату
  • Инкрементальные копии, основанные на Hard-Link’ах, то есть в каждой папке находится «как-бы» полная копия, однако не изменившиеся файлы являются Hard-link’ами на свои предыдущие версии в папках за старые даты
  • Лёгкое прореживание инкрементальных копий, так как Hard-link’и позволят не терять сами файлы при удалении одной из их версий
  • Моментальный доступ к файлам за счёт того что они хранятся в чистом виде (в отличии от rdiff-backup и других)
  • Встроенный функционал для создания инкрементальных SQL-дампов баз данных MySql (чтобы можно было бэкапить также и mysql-таблицы в виде файлов)
  • Автоматическое возобновление резервного копирования с того места, на котором оно остановилось, если было прервано
  • Резервное копирование может быть запущено с сервера, на котором хранятся исходные данные, с сервера, на котором находятся резервные копии, а также с любого другого сервера, имеющего доступ к двум предыдущим по ssh (Прямо сейчас эта функция сломана, копировать можно либо с локального сервера, либо на локальный (на котором запускается скрипт) 🙁 )
  • Можно ограничивать частоту резервного копирования (копировать не чаще определённого), и, таким образом, оставить информацию о частоте копирования в конфигурации, не вынося её в crontab.
  • С помощью API систему можно легко и быстро расширить, например, добавить копирование на несколько серверов-хранилищ
  • Копирование как всей файловой системы так и произвольных папок
  • Возможность исключения папок, файлов и масок файлов (например *.log)
  • Возможность автоматической очистки старых копий по гибким правилам
  • Можно настроить отправку уведомлений об ошибках в систему getSentry(веб-интерфейс собирающий и отображающий информацию по ошибкам)

Есть и минусы:

  • Данные хранятся в чистом виде, без сжатия, поэтому могут занимать в несколько раз больше оригинала (в несколько — потому что копий несколько)
  • Для копирования на каждом из «концов» должен быть установлен Rsync
  • Без доступа по ssh резервное копирование работать не будет
  • Доступ по ssh работает только по ключу
  • При вычисления занятого резервными копиями места, один и тот же файл за счёт жестких ссылок учитывается по нескольку раз, так что занятое место может вычисляться неверно (однако, консольная команда du вычисляет занятое место верно)

Читать далее


Простой запуск и контроль фоновых процессов в PHP и Python

Часто бывает так, что на сервере нужно выполнить длительный процесс, имея возможность отслеживать состояние его выполнения сторонними скриптами.

  • Процесс граббинга сторонних Интернет-ресурсов
  • Импорт некоего большого файла
  • Архивация файлов в файловой системе (например, если вы пишете веб-панель управления файлами)
  • Синхронизация с удалённой базой данных (например, 1С)
  • Обработка большого количества файлов (пересжатие картинок)
  • Конвертация базы данных в новый формат

для всего этого можно без проблем написать консольные скрипты, работающие на любом языке программирования. Но когда нужно запускать эти скрипты из вашей программы, веб-приложения, или другого скрипта, возникают некоторые проблемы:

1) Как запустить долгоживущий процесс независимо от главного, чтобы по завершении главного процесса (того кто запускает), дочерний продолжил работу?
2) Как получать от запущенного долгоживущего процесса информацию о его прогрессе (если таковая имеет смысл), а также прочие данные о состоянии, из других процессов?
3) Как передавать эту информацию изнутри долгоживущего процесса?
4) Как быть точно уверенным, что процесс всё ещё работает, или наоборот, что он уже завершился?
5) Как при этом не терять информацию о процессах которые уже завершены?
6) Как добиться того, чтобы долгоиграющие процессы запускались от имени не того пользователя, кто их запускает, а от другого?

У данных проблем есть решения как средствами Unix (файлы pid, команды ps, screen, nohup, sudo в связке с bash, sed, awk), так и специализированными мощными инструментами, позволяющими запускать тысячи процессов, распараллеливать по ним задачи, балансировать с их помощью нагрузку на сервера и так далее.

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

Читать далее


Заметки о ньюансах разработки с использованием Qt и PyQt

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке приложений с использованием Qt, а также PyQt.
Эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Читать далее


Автоматический переводчик gettext po-файлов

Наиболее распространённый способ переводов программного обеспечения и веб-сайтов на разные языки — с помощью библиотеки gettext.
Для тех, кто не в курсе, поясню как она работает:

  1. В коде программы/сайта, везде где вам нужно выводить некий текст, меняющийся в зависимости от языка, вы пишете не просто строковые константы, типа «Да» и «Нет», а используете некую специальную функцию вроде _(«Да»), _(«Нет»), или t(«Да»), t(«Нет»), или даже [`Да`], [`Нет`].
  2. Вы запускаете специальный скрипт, который сканирует весь ваш исходный код, находит такие вот специфические вызовы функции, и составляет из них *.po — файл.
  3. Вы с помощью некоего редактора, например poedit добавляете в файл *.po переводы всех строк которые там есть на некий язык, и сохраняете файл как, например, en_US.po, после чего генерируете соответствующий *.mo-файл, в данном случае en_US.mo.
  4. Вы указываете вашей программе/сайту путь к файлу перевода (например, берёте из сессии или из данных браузера язык, который выбран у пользователя, и исходя из этого, выбираете ru_RU.mo или en_US.mo
  5. Программа/сайт автоматически заменяет ваши t(«Да») и t(«Нет») на слова написанные на том языке, который был выбран.

Как же перевести po-файл автоматически, если качество перевода для вас не важно, но нужно чтобы сайт/приложение начало выглядеть как многоязычное для вашего заказчика?

Читать далее


Электронные весы Arduino + HX711 + Python

Мало купить Arduino и написать для него десяток программ, которые мигают светодиодами, реагируют на нажатие кнопок, и измеряют температуру воздуха терморезистором.
Рано или поздно нужно сделать своё первое законченное устройство, от которого будет польза.
Для меня таким устройством стал аппаратно-программный комплекс для снятия данных с датчика силы.

Читать далее