~s - скрипты-утилиты
По адресу ~/s я поддерживаю некоторое количество простеньких полезных скриптов для решения различных задачек.
На данной странице описаны наиболее применимые из них, остальные можно увидеть по ссылке.
Содержание
Демоны
Демоны и около-демонические скрипты.
rsync-timemachine.pl
Инкрементальные (на файловом уровне) бэкапы (типа «Time Machine») на основе rupedia:Rsync, для любой unix-машины :) с небольшой дополнительной плюшкой — на Debian/Ubuntu дистрибутивах дампит и бэкапит MySQL-базы данных.
По месту назначения создаёт папочки с именами вида YYYY-MM-DD, названные в честь даты очередного бэкапа (текущей на момент запуска скрипта), и туда rsync’ом заливаются заданные директории.
А теперь Killer-Feature: используется опция --link-dest относительно последнего бэкапа, и они становятся инкрементальными! С этой опцией rsync сравнивает файл с предыдущей версией, и если он не менялся, создаёт жёсткую ссылку на неё. Таким образом дублирование файлов убирается на уровне ФС.
Чрезмерно старые бэкапы скрипт тоже удаляет сам — для этого ему нужно задать максимальный возраст бэкапа в днях. Всё, что старее, будет удаляться. Директории с именами, не равными дате в формате YYYY-MM-DD, скрипт не трогает, правда, если YYYY-MM-DD нет вообще, то бэкап будет сделан относительно не-YYYY-MM-DD-каталога.
На регулярность бэкапов скрипту пофигу — когда вызовешь, тогда и будет сделан очередной бэкап. Соответственно, задаётся регулярность просто включением скрипта в cron с нужным интервалом. Двойного одновременного запуска можно не бояться — скрипт отслеживает и его, с помощью pid-файла.
Синтаксис запуска: perl rsync-timemachine.pl -s МЕСТО_НАЗНАЧЕНИЯ [-A 'ОПЦИИ_RSYNC'] [-k ВОЗРАСТ] [-p PID-ФАЙЛ] ДИРЕКТОРИИ...
- МЕСТО_НАЗНАЧЕНИЯ в rsync’овском синтаксисе.
- ОПЦИИ_RSYNC — опции, которые нужно передавать во все вызовы rsync (например, --password-file=/etc/rsync.secret).
- ВОЗРАСТ — максимальный возраст бэкапа в днях. Если опцию не передавать — скрипт ничего не удаляет.
- PID-ФАЙЛ — даёт возможность (не шибко нужную, но мало ли) переопределить расположение pid-файла, равное по умолчанию /var/run/timemachine.pid.
- ДИРЕКТОРИИ — собственно, что бэкапим. Бэкапятся без полного пути, то есть например /var/backups/mysql попадёт по адресу МЕСТО_НАЗНАЧЕНИЯ/YYYY-MM-DD/mysql.
http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/rsync-timemachine.pl?view=markup
logautocommit.pl
Идея скрипта: простой автоматический версионный контроль конфигурации сервера. Большая часть конфигурации в UNIX-системах, как известно, находится в /etc, поэтому в первую очередь нужно версионировать содержимое /etc. Причём, не так важно, куда коммитить изменения — скорее всего, подойдёт локальный репозиторий любой системы управления версиями (скажем, Subversion), но важно, чтобы:
- Изменения записывались автоматически.
- Записывалось, кем внесено изменение — очень желательно сохранять IP-адрес удалённой сессии, потому что системным пользователем почти наверняка будет root.
- Файлы коммитились не сразу, а через промежуток времени, чтобы в процессе редактирования каждое нажатие F2 (сохранение) не добавляло по коммиту.
- Изменения, вносимые менеджером пакетов, не учитывались.
Итак, встречаем скрипт. Он использует auditd для отслеживания изменений файлов в /etc — это наиболее оптимально в терминах производительности. Посему первый шаг — установить и настроить auditd:
apt-get install auditd echo -w /etc/ -p wa >> /etc/audit/audit.rule # логгируем запись в /etc/ /etc/init.d/auditd reload
Второй шаг — создать файл /etc/logautocommit-log4perl.conf со следующим содержимым:
log4perl.logger.ConfAutoCommit = INFO, ConfAutoCommit log4perl.appender.ConfAutoCommit = Log::Log4perl::Appender::File log4perl.appender.ConfAutoCommit.filename = /var/log/audit/autocommit.log log4perl.appender.ConfAutoCommit.layout = PatternLayout log4perl.appender.ConfAutoCommit.layout.ConversionPattern = %d %5p %C:%L %m %n log4perl.appender.ConfAutoCommit.create_at_logtime = 1
Здесь /var/log/audit/autocommit.log — путь к логу самой коммитилки.
Третий шаг: создать репозиторий и рабочую копию, добавить в них конфиги, которые уже лежат в /etc, и которые уже менялись (по вкусу).
svnadmin create /root/svn-etc-repo svn co file:///root/svn-etc-repo /root/svn-etc # cp /etc/… /root/svn-etc svn add /root/svn-etc/* svn ci -m 'initial configs'
И, наконец, запустить logautocommit.pl и прописать его запуск в /etc/rc.local, с нужными аргументами.
Использование:
./logautocommit.pl [ОПЦИИ]
или
./logautocommit.pl /etc/logautocommit.conf
Здесь /etc/logautocommit.conf — конфиг скрипта, может содержать те же [ОПЦИИ], по одной на строку.
Опции:
Формат 1 | Формат 2 | Описание | По умолчанию |
---|---|---|---|
-a XXX | log=XXX | Путь к логу auditd | /var/log/audit/audit.log |
-d XXX | etcdir=XXX | Путь к версионируемой директории | /etc |
-w XXX | workdir=XXX | Путь к рабочей копии | /root/svn-etc |
-e XXX | exclude=XXX | Исключить изменения файлов с именами, подпадающими под регулярное выражение XXX | ^/etc/(alternatives|rc\d?\.d)|(^|/)(\.#|mtab|ld\.so\.cache|adjtime|motd$)|\.dpkg-(new|dist)$|\.default$|/\.svn/ |
-x XXX | exclude_exe=XXX | Исключить изменения, сделанные приложения с именами образа, подпадающими под регулярное выражение XXX | (^|/)dpkg$ |
-l XXX | log_config=XXX | Использовать файл XXX как конфиг для логгера Log::Log4perl | /etc/logautocommit-log4perl.conf |
-c XXX | chktime=XXX | Проверять изменения файлов через XXX секунд | 60 |
-m XXX | comtime=XXX | Коммитить не чаще, чем в XXX секунд | 300 |
-p XXX | polltime=XXX | Интервал спячки после прерванного блокировующего чтения | 0.5 |
-b | background=1 | Уйти в фоновый режим после запуска | Да |
-f | background=0 | Не уходить в фоновый режим, полезно для отладки | Нет |
- FIXME: проверить, как скрипт работает с символическими ссылками.
- FIXME: проверка того, что изменение сделано через dpkg, работает не до конца корректно и иногда коммитятся лишние файлы, не менявшиеся руками
Кроме содержимого /etc, полезно также версионировать списки установленных пакетов системного менеджера пакетов и скриптовых языков типа Perl, PHP, Python, Ruby — это проще всего сделать, добавив в крон скрипт со следующим содержимым:
COLUMNS=3000 dpkg -l > /etc/packages-status-debian perl -MCPAN -e "CPAN::Shell->r" > /etc/packages-status-perl pear list > /etc/packages-status-php gem list > /etc/packages-status-ruby
Для Python аналогично простой команды нет, но можно воспользоваться скриптом pkgsearch.py с данной страницы:
python pkgsearch.py > /etc/packages-status-python
Ещё может оказаться полезным версионировать схемы всех баз данных, но это уже частично относится к разработке.
FastPerl
Простой однопоточный FastCGI демон для запуска CGI-скриптов в FastCGI-среде без перекомпиляции и дополнительных телодвижений. Хорошо подходит, например, для запуска awstats.
Опции запуска:
- -h
- вывод справки;
- --verbose
- подробный вывод;
- --pid=PIDFILE
- установка пути в pid-файлу;
- -l=LOGFILE
- установка пути к файлу журнала;
- -S=UNIXSOCKET
- установка пути к UNIX-сокету, на котором оно будет слушать;
- -P=UNIXPORT
- установка TCP/IP-порта, на котором оно будет слушать и биндиться к 0.0.0.0 (ко всем интерфейсам);
- -r=REGEXP
- установка ограничений на SCRIPT_FILENAME. Если оно не удовлетворит регулярному выражению REGEXP, будет отдан ответ HTTP 403 Forbidden.
Init-скрипт прилагается, по умолчанию выполняется под пользователем www-data и группой www-data, логи в /var/log/fastperl.log, сокет в /var/run/fastperl.socket, PID-файл в /var/run/fastperl.pid, без ограничения. Init-скрипт понимает /etc/default/fastperl с переменными:
- USER=user: group
- LOGFILE=
- SOCKET=
- PIDFILE=
- RESTRICTION=
Для работы init-скрипта сам демон нужно класть как файл /usr/sbin/fastperl.
- fastperl.pl — сам демон.
- fastperl.init — /etc/init.d-скрипт для запуска FastPerl в Debian/Ubuntu системах.
- Основан на http://wiki.codemongers.com/NginxSimpleCGI.
gcauthcd.pl
Клиент для МиГ-Телекомовской авторизации (Gagarin-Club AUTHentication Client Daemon), переписанный на Perl’е. Исходников реального gcauthcd я не видел, данный сделан чисто исходя из тривиального реверс-инжиниринга. Сам его и использую использовал, по причине того, что SSL-сертификаты у них давно протухли, виндовый gcauthcd это не парит, а реальный линуксовый работать отказывается, а хакнуть и заставить его не получается по причине статической линковки.
Логин-пароль берёт либо из /etc/gcauth.passwd, либо из файла указанного ./gcauthcd.pl -c /path/to/password.file
, в формате «LOGIN:PASSWORD». Опция --fg даёт возможность не сворачивать его в background, --force — запускать при неработающей авторизации, время от времени открыть доступ он тогда всё равно будет пытаться.
gamin.pl
Пригодный для автоматизации скрипт для мониторинга изменений файлов и директорий с помощью модуля Sys::Gamin (использующего реализацию FAM’а (File Alternation Monitor) «libgamin») версии 0.1. События выводятся на STDOUT в две колонки, скрипт живёт, пока не прибьют сигналом. Первая — имя события (одно из: change, delete, start_exec, stop_exec, create, move, ack, exist, end_exist), вторая — имя файла. К имени события может быть дописаны суффиксы:
- «|D» = «путь является каталогом и запрошен нерекурсивный режим»
- «|M» = «запрошен рекурсивный режим, запускаю мониторинг каталога»
- «|C» = «путь удалён, отменяю мониторинг каталога»
Соответственно, скрипт можно использовать в каких-нибудь скриптах (шелл или не очень) как монитор ФС, читать и парсить его вывод, и действовать по ситуации.
Синтаксис вызова:
./gamin.pl [-n] /directory1 /directory/2 some.file
Опция «-n» означает «мониторить нерекурсивно».
bind9-forwarders-resolvconf
Скрипт для обновления forwarder’ов DNS-сервера bind при DHCP-обновлении набора доступных DNS. То есть, это скрипт для установки на машину-роутер, потому что, предположительно, только машина-роутер может иметь и внешний интерфейс, на котором работает DHCP, получающий обновления DNS провайдера, и bind, которому нужны корректные forwarder’ы.
Скрипт сильно похож на стандартный дебиановский /etc/resolvconf/update.d/bind и тоже предназначен для установки в /etc/resolvconf/update.d/, отличается от стандартного следующим:
- Написан на perl ⇒ не использует «особую уличную магию» с кучей вызовов sed и посему не глючит
- Берёт /etc/bind/named.conf.options.in, заменяет в нём $FORWARDERS на список обнаруженных DNS, разделённых точками с запятой (но без; в конце, то есть надо писать forwarders { $FORWARDERS; }) и записывает в /etc/bind/named.conf.options.
- Не дёргает без надобности (когда конфиги не менялись) rndc reconfig.
Команды
Простые полезные консольные команды, которых часто не хватает в UNIX-окружении.
fromto
Скрипт для перекодирования файлов из одной кодировки в другую. Использовать очень просто:
~/s/fromto cp1251 utf-8 файл1 файл2 ...
Поддерживает все кодировки, понимаемые Perl модулем Encode.
whichpm
Аналог which для Perl-модулей — говорит, где лежит тот или иной модуль.
$ ~/s/whichpm Encode /usr/lib/perl/5.10/Encode.pm
unzip.pl
Используйте вместо стандартного unzip — после разархивации перекодирует кривые имена файлов, бывших русскими внутри архива.
cpshift.c
Простая C-программка для копирования кусков файлов. Возможно, велосипед, но с первого взгляда я такой стандартной unix-тулы не нашёл. Есть, конечно, dd, но он работает в ПИЦОТ раз медленнее, потому что приходится говорить bs=1 (чтение и запись по 1 байту).
Компилировать и использовать тривиально:
gcc -o cpshift cpshift.c ./cpshift --skip SKIP_BYTES --size SIZE_BYTES infile outfile
SKIP_BYTES — смещение от начала входного файла, SIZE_BYTES — максимальный размер копируемой области. Оба могут быть как десятичными, так и восьмеричными (если начинается с 0), и шестнадцатеричными (если начинается с 0x).
convert-filenames
Скрипт для перекодирования имён файлов в каталоге из одной кодировки в другую. Сам ничего не выполняет, только выводит на STDOUT список команд mv A B. Пример использования:
./convert-filenames /path/ cp1251 koi8-r | sh
timestamp
Простая утилита преобразования дат для тех, кто привык к коду MediaWiki (wfTimestamp()).
./timestamp <желаемый_формат_даты> <дата>
На входе дата в любом из желаемых форматов. Единственное замечание — чтобы корректно парсить даты в формате TS_MW, нужно передавать их с пробелом в начале, типа ./timestamp TS_UNIX ' 20100101000000', чтобы «сплошное число» можно было отличить от UNIX времени.
Форматы даты/времени поддерживаются следующие:
- TS_UNIX
- UNIX время (число секунд с 01.01.1970).
- TS_DB
- YYYY-MM-DD HH:MM:SS.
- TS_DB_DATE
- YYYY-MM-DD.
- TS_MW
- YYYYMMDDHHMMSS.
- TS_ISO_8601
- YYYY-MM-DDTHH:MM:SS.
- TS_EXIF
- YYYY:MM:DD HH:MM:SS.
- TS_RFC822
- Wday, DD Mon YYYY HH:MM:SS +ZZZZ. Wday — 3-буквенная латинская аббревиатура дня недели, Mon — 3-буквенная латинская аббревиатура месяца, ZZZZ — зона, смещение от GMT в формате HHMM (часы, минуты).
- TS_ORACLE
- DD-Mon-YYYY HH.MM.SS AM|PM.
pkgsearch.py
Выводит список установленных модулей Python. На данный момент, похоже, имеет баг, рандомно запускает некоторые скрипты.
convert-many
Скрипт для перекодирования множества изображений из одного формата в другой с помощью GraphicsMagick или ImageMagick, возможно, в несколько потоков. Пример использования:
find /path/ -name *.png | xargs ./convert-many png jpg 2 | sh
bashrc.any
Команды для переключения кодировок koi8, utf8, cp1251 в KDE Konsole из консоли, не прибегая к помощи менюшек. Версии для KDE 4.x и 3.x.
А команда yc вам не нужна, удаляйте её. :)
Инструменты
Инструменты, слишком большие для того, чтобы называть их просто консольной командой.
pgraph-dot
Скрипт для вывода графов зависимостей с использованием Graphviz веток патчей для расширения системы контроля версий Mercurial pbranch, служащего для автоматизированного управления множеством веток патчей.
Использовать в каталоге Mercurial-репозитория следующим образом: pgraph-dot имяфайла.формат, где формат — один из поддерживаемых Graphviz форматов вывода (png, svg, dot и т. п.)
Пример такого графа:
sgold-note.pl
Небольшой скрипт для извлечения заметок из файлов базы данных (0:/system/apo/note/) платформ Siemens SGold (x65/x75 кроме S75/SL75) и NewSGold (S75/SL75).
По умолчанию запускается для SGold. Чтобы запустить для NewSGold, нужно раскомментировать строчку #my $h = 4; # for NewSGold (убрать # в начале). Использовать, просто натравливая его на эти самые файлы — не на каталоги, а на сами файлы, ибо рекурсивно каталоги скрипт не обходит.
Патчи и настройки
Патчи, модификации, файлы настроек, юзер-скрипты.
googletracking-b-gone.user.js
«Google Tracking B Gone» — скрипт отключает дебильные гугловские редиректы при кликах по ссылкам. То есть в поиске будут реальные ссылки на страницы, а не ссылки на гугловский URL, перенаправляющий на реальную страницу только после записи информации о вашем клике и мешающий копировать ссылки по правой кнопкею
Данная версия поддерживает как Firefox (Greasemonkey), так и Chrome с Opera, и постоянно используется мною в этих браузерах. Так что отсутствие глюков гарантировано.
В Opera для установки юзерскрипта надо создать любую папочку под свои юзер-скрипты, положить туда скачанный файл и прописать её в Preferences → Advanced → Content → JavaScript options → User JavaScript folder.
В Chrome — просто кликнуть «Скачать» и согласиться с установкой.
В Firefox — сначала поставить Greasemonkey, потом так же кликнуть «Скачать» и согласиться с установкой.
googlefocus.user.js
Ещё один пользовательский скрипт для гуглового поиска — на этот раз для тех, кого, как и меня, бесит то, что по умолчанию гугл при каждом нажатии любой буквенно-цифровой клавиши на клавиатуре автоматически фокусирует поле ввода. Данный скрипт отключает это поведение и, как и предыдущий, поддерживает Firefox/Chrome/Opera.
GoogleSrchUIMod.js
Немного устаревший User JS для Opera, направленный на возвращение Гугла к прежнему (старому) виду.
Устаревший потому, что:
- То, что бесило больше всего — выравнивание гуглового поиска по центру страницы — как добавили, так и убрали очень быстро.
- Скрипт поддерживает только браузер Opera.
- Скрипт частично уже не работает, например, не работает подмена ссылок, так что рекомендуется использовать #googletracking-b-gone.user.js.
Конкретно:
- без грёбаной панельки слева — она показывается свёрнутой, её можно развернуть
- без рекламы справа
- без javascript’ов, которые:
-
подменяют ссылки на сайты ссылками на редиректы так, что их не скопипастишьне работает, используйте #googletracking-b-gone.user.js - противодействуют User JS’ам!
- ставят какие-то таймеры, замеряют времена выполнения и делают ещё фиг знает что троянистое
-
- с результатами поиска, выровненными по левому краю, а не по центру — удобно для широких мониторов
- со ссылочкой «Только на русском» под строкой поиска
Основан на Opera UserJS To Get Back The Good Ol’ Google Search UI.
mc.color
Две цветовые схемы Midnight Commander: одна на чёрном фоне, вторая на чёрном фоне с красными менюшками, я её использую, чтобы сразу отличать боевые сервера от локальной машины.
MC >= 4.7.0, копировать в /usr/share/mc/skins, а в mc.ini прописывать skin=имя:
MC < 4.7.0, прописывать в mc.ini:
Syntax
Описания синтаксиса для Midnight Commander.
- Syntax
- tt.syntax — синтаксис шаблонов Template::Toolkit.
- tpl.syntax — синтаксис шаблонов Template|VMX::Template“Template|VMX::Template” не может быть использован как заголовок статьи на данном сайте..
- патч для perl.syntax — исправленный синтаксис для Perl кода.
gamin2.pl и патч Sys::Gamin
Похож на gamin.pl, но а) рассчитан на патченую версию Sys::Gamin 0.2, с поддержкой userData, и б) сильно менее полезен.
./gamin2.pl /directory1 /directory/2 -u UserData2 some.file
Со всеми событиями от /directory/2 вы будете получать свои данные UserData2.
- Патч к Sys::Gamin 0.1, добавляющий поддержку userData
- gamin2.pl
apache1-configure
./configure с параметрами для установки Apache 1.x в /usr/local/apache1.
fglrx_30.diff
Патч для компиляции модуля ядра fglrx Linux-версии проприетарного драйвера ATi Catalyst для версий 9-6 и 9-7 и версии Linux ядра 2.6.30. Для более новых версий драйвера fglrx патч не требуется.