~s - скрипты-утилиты — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
м
Строка 3: Строка 3:
  
 
На данной странице описаны наиболее применимые из них, остальные можно увидеть по [{{SVN|vitalif/trunk/scripts/}} ссылке].
 
На данной странице описаны наиболее применимые из них, остальные можно увидеть по [{{SVN|vitalif/trunk/scripts/}} ссылке].
 +
 +
= Демоны =
 +
 +
[[rupedia:Daemon|Демоны]] и около-демонические скрипты.
  
 
== [{{SVN|vitalif/trunk/scripts/logautocommit.pl|co}} logautocommit.pl] ==
 
== [{{SVN|vitalif/trunk/scripts/logautocommit.pl|co}} logautocommit.pl] ==
Строка 80: Строка 84:
  
 
Ещё может оказаться полезным версионировать схемы всех баз данных, но это уже частично относится к разработке.
 
Ещё может оказаться полезным версионировать схемы всех баз данных, но это уже частично относится к разработке.
 
== [{{SVN|vitalif/trunk/scripts/cpshift.c|co}} 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 — максимальный размер копируемой области.
 
 
== [{{SVN|vitalif/trunk/scripts/GoogleSrchUIMod.js|co}} GoogleSrchUIMod.js] ==
 
 
[http://www.opera.com/docs/userjs/ User JS] для Opera, направленный на возвращение Гугла к прежнему (старому) виду:
 
* '''без грёбаной панельки''' слева — она показывается свёрнутой, её можно развернуть
 
* без рекламы справа
 
* без javascript’ов, которые:
 
** подменяют ссылки на сайты ссылками на редиректы так, что их не скопипастишь
 
** '''противодействуют User JS’ам!'''
 
** ставят какие-то таймеры, замеряют времена выполнения и делают ещё фиг знает что троянистое
 
* с результатами поиска, выровненными по левому краю, а не по центру — удобно для широких мониторов
 
* со ссылочкой «Только на русском» под строкой поиска
 
 
Основан на [http://shirish.thekamathfamily.com/pages/hack-opera-userjs-to-get-back-the-old-google-search-ui/ Opera UserJS To Get Back The Good Ol’ Google Search UI].
 
 
Устанавливать следующим образом — скачать по [{{SVN|vitalif/trunk/scripts/GoogleSrchUIMod.js|co}} ссылке], создать любую папочку под свои юзер-скрипты, положить туда скачанный файл, прописать её в <tt>Preferences &rarr; Advanced &rarr; Content &rarr; JavaScript options &rarr; User JavaScript folder</tt>. Наслаждаться.
 
  
 
== FastPerl ==
 
== FastPerl ==
Строка 143: Строка 120:
  
 
* {{SVN|vitalif/trunk/scripts/gcauthcd.pl|markup}}
 
* {{SVN|vitalif/trunk/scripts/gcauthcd.pl|markup}}
 +
 +
== gamin.pl ==
 +
 +
'''Пригодный для автоматизации''' скрипт для мониторинга изменений файлов и директорий с помощью модуля {{CPAN|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» означает «мониторить нерекурсивно».
 +
 +
* {{SVN|vitalif/trunk/scripts/gamin.pl|markup}}
 +
 +
== bind9-forwarders-resolvconf ==
 +
 +
Скрипт для обновления [http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.ch06.html#id2557350 forwarder’ов DNS-сервера bind] при DHCP-обновлении набора доступных DNS. То есть, это скрипт для установки на машину-роутер, потому что, предположительно, только машина-роутер может иметь и внешний интерфейс, на котором работает DHCP, получающий обновления DNS провайдера, и bind, которому нужны корректные forwarder’ы.
 +
 +
Скрипт сильно похож на стандартный дебиановский [[DebianMagicResolvConfBind|/etc/resolvconf/update.d/bind]] и тоже предназначен для установки в /etc/resolvconf/update.d/, отличается от стандартного следующим:
 +
* Написан на perl &rArr; не использует «особую уличную магию» с кучей вызовов <tt>sed</tt> и посему не глючит
 +
* Берёт /etc/bind/named.conf.options.in, заменяет в нём $FORWARDERS на список обнаруженных DNS, разделённых точками с запятой (но без; в конце, то есть надо писать forwarders { $FORWARDERS; }) и записывает в <tt>/etc/bind/named.conf.options</tt>.
 +
* Не дёргает без надобности (когда конфиги не менялись) rndc reconfig.
 +
 +
* {{SVN|vitalif/trunk/scripts/bind9-forwarders-resolvconf|markup}}
 +
 +
= Команды =
 +
 +
Простые полезные консольные команды, которых часто не хватает в UNIX-окружении.
  
 
== fromto ==
 
== fromto ==
Строка 162: Строка 170:
  
 
* {{SVN|vitalif/trunk/scripts/whichpm|markup}}
 
* {{SVN|vitalif/trunk/scripts/whichpm|markup}}
 
== mc.color ==
 
 
Настройки цветов для Midnight Commander.
 
 
* [{{SVN|vitalif/trunk/scripts/mc.color|markup}} Чёрный фон].
 
* [{{SVN|vitalif/trunk/scripts/mc-for-production.color|markup}} Чёрный фон, красные менюшки] — использую на боевых серверах, чтобы сразу понимать, где находишься.
 
  
 
== unzip.pl ==
 
== unzip.pl ==
Строка 176: Строка 177:
 
* {{SVN|vitalif/trunk/scripts/unzip.pl|markup}}
 
* {{SVN|vitalif/trunk/scripts/unzip.pl|markup}}
  
== Syntax ==
+
== [{{SVN|vitalif/trunk/scripts/cpshift.c|co}} cpshift.c] ==
  
Описания синтаксиса для Midnight Commander.
+
Простая C-программка для копирования кусков файлов. Возможно, велосипед, но с первого взгляда я такой стандартной unix-тулы не нашёл. Есть, конечно, dd, но он работает в ПИЦОТ раз медленнее, потому что приходится говорить bs=1 (чтение и запись по 1 байту).
  
* [{{SVN|vitalif/trunk/scripts/Syntax}} Syntax]
+
Компилировать и использовать тривиально:
* [{{SVN|vitalif/trunk/scripts/tt.syntax}} tt.syntax] — синтаксис шаблонов {{CPAN|Template::Toolkit}}.
+
* [{{SVN|vitalif/trunk/scripts/tpl.syntax}} tpl.syntax] — синтаксис шаблонов [[Шаблонизатор VMX::Template|VMX::Template]].
+
* [{{SVN|vitalif/trunk/scripts/perl.syntax.patch}} патч для perl.syntax] — исправленный синтаксис для Perl кода.
+
  
== pgraph-dot ==
+
gcc -o cpshift cpshift.c
 +
./cpshift --skip SKIP_BYTES --size SIZE_BYTES infile outfile
  
Скрипт для вывода графов зависимостей с использованием [http://www.graphviz.org/ Graphviz] веток патчей для расширения системы контроля версий [http://arrenbrecht.ch/mercurial/pbranch/ Mercurial pbranch], служащего для автоматизированного управления множеством веток патчей.
+
SKIP_BYTES — смещение от начала входного файла, SIZE_BYTES — максимальный размер копируемой области.
  
Использовать в каталоге Mercurial-репозитория следующим образом: <tt>pgraph-dot имяфайла.формат</tt>, где формат — один из поддерживаемых Graphviz форматов вывода (png, svg, dot и т. п.)
+
== convert-filenames ==
  
* [{{SVN|vitalif/trunk/scripts/pgraph-dot|markup}} pgraph-dot]
+
Скрипт для перекодирования имён файлов в каталоге из одной кодировки в другую. Сама ничего не выполняет, только выводит на STDOUT список команд mv A B. Пример использования:
  
Пример такого графа:
+
./convert-filenames /path/ cp1251 koi8-r | sh
  
'''[[Файл:PgraphDotExample.svg|400px]]'''
+
* {{SVN|vitalif/trunk/scripts/convert-filenames|markup}}
  
== sgold-note.pl ==
+
== timestamp ==
  
Небольшой скрипт для извлечения заметок из файлов базы данных (<tt>0:/system/apo/note/</tt>) платформ Siemens <tt>SGold</tt> (x65/x75 кроме S75/SL75) и <tt>NewSGold</tt> (S75/SL75).
+
Простая утилита преобразования дат для тех, кто привык к коду MediaWiki ([[mediawikiwiki:Manual:WfTimestamp|wfTimestamp()]]).
  
По умолчанию запускается для <tt>SGold</tt>. Чтобы запустить для <tt>NewSGold</tt>, нужно раскомментировать строчку <tt>#my $h = 4; # for NewSGold</tt> (убрать # в начале). Использовать, просто натравливая его на эти самые файлы — не на каталоги, а на сами файлы, ибо рекурсивно каталоги скрипт не обходит.
+
./timestamp <желаемый_формат_даты> <дата>
  
* [http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/sgold-note.pl?revision=748&view=markup sgold-note.pl]
+
На входе дата в любом из желаемых форматов. Единственное замечание — чтобы корректно парсить даты в формате TS_MW, нужно передавать их с пробелом в начале, типа <tt>./timestamp TS_UNIX ' 20100101000000'</tt>, чтобы «сплошное число» можно было отличить от UNIX времени.
  
== bind9-forwarders-resolvconf ==
+
Форматы даты/времени поддерживаются следующие:
 +
;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-DD'''T'''HH: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.
  
Скрипт для обновления [http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.ch06.html#id2557350 forwarder’ов DNS-сервера bind] при DHCP-обновлении набора доступных DNS. То есть, это скрипт для установки на машину-роутер, потому что, предположительно, только машина-роутер может иметь и внешний интерфейс, на котором работает DHCP, получающий обновления DNS провайдера, и bind, которому нужны корректные forwarder’ы.
+
== convert-many ==
  
Скрипт сильно похож на стандартный дебиановский [[DebianMagicResolvConfBind|/etc/resolvconf/update.d/bind]] и тоже предназначен для установки в /etc/resolvconf/update.d/, отличается от стандартного следующим:
+
Скрипт для перекодирования множества изображений из одного формата в другой с помощью [http://www.graphicsmagick.org/ GraphicsMagick] или [http://www.imagemagick.org/ ImageMagick], возможно, в несколько потоков. Пример использования:
* Написан на perl &rArr; не использует «особую уличную магию» с кучей вызовов <tt>sed</tt> и посему не глючит
+
* Берёт /etc/bind/named.conf.options.in, заменяет в нём $FORWARDERS на список обнаруженных DNS, разделённых точками с запятой (но без; в конце, то есть надо писать forwarders { $FORWARDERS; }) и записывает в <tt>/etc/bind/named.conf.options</tt>.
+
* Не дёргает без надобности (когда конфиги не менялись) rndc reconfig.
+
  
* {{SVN|vitalif/trunk/scripts/bind9-forwarders-resolvconf|markup}}
+
find /path/ -name *.png | xargs ./convert-many png jpg 2 | sh
  
== convert-filenames ==
+
* {{SVN|vitalif/trunk/scripts/convert-many|markup}}
  
Скрипт для перекодирования имён файлов в каталоге из одной кодировки в другую. Сама ничего не выполняет, только выводит на STDOUT список команд mv A B. Пример использования:
+
== bashrc.any ==
  
./convert-filenames /path/ cp1251 koi8-r | sh
+
Команды для переключения кодировок koi8, utf8, cp1251 в Konsole из консоли, не прибегая к помощи менюшек. Версии для KDE [{{SVN|vitalif/trunk/scripts/bashrc.any?revision=706&view=markup}} 4.x] и [{{SVN|vitalif/trunk/scripts/bashrc.any?revision=704&view=markup}} 3.x].
  
* {{SVN|vitalif/trunk/scripts/convert-filenames|markup}}
+
А команда yc вам не нужна, удаляйте её. :)
  
== gamin.pl ==
+
= Патчи и настройки =
  
'''Пригодный для автоматизации''' скрипт для мониторинга изменений файлов и директорий с помощью модуля {{CPAN|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» = «путь удалён, отменяю мониторинг каталога»
+
  
Соответственно, скрипт можно использовать в каких-нибудь скриптах (шелл или не очень) как монитор ФС, читать и парсить его вывод, и действовать по ситуации.
+
== [{{SVN|vitalif/trunk/scripts/GoogleSrchUIMod.js|co}} GoogleSrchUIMod.js] ==
  
Синтаксис вызова:
+
[http://www.opera.com/docs/userjs/ User JS] для Opera, направленный на возвращение Гугла к прежнему (старому) виду:
./gamin.pl [-n] /directory1 /directory/2 some.file
+
* '''без грёбаной панельки''' слева — она показывается свёрнутой, её можно развернуть
 +
* без рекламы справа
 +
* без javascript’ов, которые:
 +
** подменяют ссылки на сайты ссылками на редиректы так, что их не скопипастишь
 +
** '''противодействуют User JS’ам!'''
 +
** ставят какие-то таймеры, замеряют времена выполнения и делают ещё фиг знает что троянистое
 +
* с результатами поиска, выровненными по левому краю, а не по центру — удобно для широких мониторов
 +
* со ссылочкой «Только на русском» под строкой поиска
  
Опция «-n» означает «мониторить нерекурсивно».
+
Основан на [http://shirish.thekamathfamily.com/pages/hack-opera-userjs-to-get-back-the-old-google-search-ui/ Opera UserJS To Get Back The Good Ol’ Google Search UI].
  
* {{SVN|vitalif/trunk/scripts/gamin.pl|markup}}
+
Устанавливать следующим образом — скачать по [{{SVN|vitalif/trunk/scripts/GoogleSrchUIMod.js|co}} ссылке], создать любую папочку под свои юзер-скрипты, положить туда скачанный файл, прописать её в <tt>Preferences &rarr; Advanced &rarr; Content &rarr; JavaScript options &rarr; User JavaScript folder</tt>. Наслаждаться.
  
== timestamp ==
+
== mc.color ==
  
Простая утилита преобразования дат для тех, кто привык к коду MediaWiki ([[mediawikiwiki:Manual:WfTimestamp|wfTimestamp()]]).
+
Настройки цветов для Midnight Commander.
  
./timestamp <желаемый_формат_даты> <дата>
+
* [{{SVN|vitalif/trunk/scripts/mc.color|markup}} Чёрный фон].
 +
* [{{SVN|vitalif/trunk/scripts/mc-for-production.color|markup}} Чёрный фон, красные менюшки] — использую на боевых серверах, чтобы сразу понимать, где находишься.
  
На входе дата в любом из желаемых форматов. Единственное замечание — чтобы корректно парсить даты в формате TS_MW, нужно передавать их с пробелом в начале, типа <tt>./timestamp TS_UNIX ' 20100101000000'</tt>, чтобы «сплошное число» можно было отличить от UNIX времени.
+
== Syntax ==
  
Форматы даты/времени поддерживаются следующие:
+
Описания синтаксиса для Midnight Commander.
;TS_UNIX: UNIX время (число секунд с 01.01.1970).
+
 
;TS_DB: YYYY-MM-DD HH:MM:SS.
+
* [{{SVN|vitalif/trunk/scripts/Syntax}} Syntax]
;TS_DB_DATE: YYYY-MM-DD.
+
* [{{SVN|vitalif/trunk/scripts/tt.syntax}} tt.syntax] — синтаксис шаблонов {{CPAN|Template::Toolkit}}.
;TS_MW: YYYYMMDDHHMMSS.
+
* [{{SVN|vitalif/trunk/scripts/tpl.syntax}} tpl.syntax] — синтаксис шаблонов [[Шаблонизатор VMX::Template|VMX::Template]].
;TS_ISO_8601: YYYY-MM-DD'''T'''HH:MM:SS.
+
* [{{SVN|vitalif/trunk/scripts/perl.syntax.patch}} патч для perl.syntax] — исправленный синтаксис для Perl кода.
;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.
+
  
 
== gamin2.pl и патч Sys::Gamin ==
 
== gamin2.pl и патч Sys::Gamin ==
  
Похож на gamin.pl, но а) рассчитан на [{{SVN|vitalif/trunk/scripts/Sys-Gamin-0.1-userData.diff}} патченую] версию Sys::Gamin 0.2, с поддержкой userData, и б) сильно менее полезен.
+
Похож на [[#gamin.pl|gamin.pl]], но а) рассчитан на [{{SVN|vitalif/trunk/scripts/Sys-Gamin-0.1-userData.diff}} патченую] версию Sys::Gamin 0.2, с поддержкой userData, и б) сильно менее полезен.
  
 
  ./gamin2.pl /directory1 /directory/2 -u UserData2 some.file
 
  ./gamin2.pl /directory1 /directory/2 -u UserData2 some.file
Строка 275: Строка 281:
 
* [{{SVN|vitalif/trunk/scripts/apache1-configure|markup}} apache1-configure]
 
* [{{SVN|vitalif/trunk/scripts/apache1-configure|markup}} apache1-configure]
  
== bashrc.any ==
+
== fglrx_30.diff ==
  
Команды для переключения кодировок koi8, utf8, cp1251 в Konsole из консоли, не прибегая к помощи менюшек. Версии для KDE [{{SVN|vitalif/trunk/scripts/bashrc.any?revision=706&view=markup}} 4.x] и [{{SVN|vitalif/trunk/scripts/bashrc.any?revision=704&view=markup}} 3.x].
+
Патч для компиляции модуля ядра <tt>fglrx</tt> Linux-версии проприетарного драйвера [http://ati.amd.com/products/catalyst/index.html ATi Catalyst] для версий 9-6 и 9-7 и версии Linux ядра 2.6.30. Для более новых версий драйвера <tt>fglrx</tt> патч не требуется.
  
А команда yc вам не нужна, удаляйте её. :)
+
* [http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/fglrx_30.diff?view=log fglrx_30.diff]
  
== convert-many ==
+
= Инструменты =
  
Скрипт для перекодирования множества изображений из одного формата в другой с помощью [http://www.graphicsmagick.org/ GraphicsMagick] или [http://www.imagemagick.org/ ImageMagick], возможно, в несколько потоков. Пример использования:
+
== pgraph-dot ==
  
find /path/ -name *.png | xargs ./convert-many png jpg 2 | sh
+
Скрипт для вывода графов зависимостей с использованием [http://www.graphviz.org/ Graphviz] веток патчей для расширения системы контроля версий [http://arrenbrecht.ch/mercurial/pbranch/ Mercurial pbranch], служащего для автоматизированного управления множеством веток патчей.
  
* {{SVN|vitalif/trunk/scripts/convert-many|markup}}
+
Использовать в каталоге Mercurial-репозитория следующим образом: <tt>pgraph-dot имяфайла.формат</tt>, где формат — один из поддерживаемых Graphviz форматов вывода (png, svg, dot и т. п.)
  
== fglrx_30.diff ==
+
* [{{SVN|vitalif/trunk/scripts/pgraph-dot|markup}} pgraph-dot]
  
Патч для компиляции модуля ядра <tt>fglrx</tt> Linux-версии проприетарного драйвера [http://ati.amd.com/products/catalyst/index.html ATi Catalyst] для версий 9-6 и 9-7 и версии Linux ядра 2.6.30. Для более новых версий драйвера <tt>fglrx</tt> патч не требуется.
+
Пример такого графа:
  
* [http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/fglrx_30.diff?view=log fglrx_30.diff]
+
'''[[Файл:PgraphDotExample.svg|400px]]'''
 +
 
 +
== sgold-note.pl ==
 +
 
 +
Небольшой скрипт для извлечения заметок из файлов базы данных (<tt>0:/system/apo/note/</tt>) платформ Siemens <tt>SGold</tt> (x65/x75 кроме S75/SL75) и <tt>NewSGold</tt> (S75/SL75).
 +
 
 +
По умолчанию запускается для <tt>SGold</tt>. Чтобы запустить для <tt>NewSGold</tt>, нужно раскомментировать строчку <tt>#my $h = 4; # for NewSGold</tt> (убрать # в начале). Использовать, просто натравливая его на эти самые файлы — не на каталоги, а на сами файлы, ибо рекурсивно каталоги скрипт не обходит.
 +
 
 +
* [http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/sgold-note.pl?revision=748&view=markup sgold-note.pl]
  
 
== find-alisska.pl ==
 
== find-alisska.pl ==

Версия 02:12, 3 марта 2011

По адресу ~/s я поддерживаю некоторое количество простеньких полезных скриптов для решения различных задачек.

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

Демоны

Демоны и около-демонические скрипты.

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 XXXlog=XXX Путь к логу auditd/var/log/audit/audit.log
-d XXXetcdir=XXXПуть к версионируемой директории/etc
-w XXXworkdir=XXXПуть к рабочей копии/root/svn-etc
-e XXXexclude=XXXИсключить изменения файлов с именами, подпадающими под регулярное выражение XXX^/etc/(alternatives|rc\d?\.d)|(^|/)(\.#|mtab|ld\.so\.cache|adjtime|motd$)|\.dpkg-(new|dist)$|\.default$|/\.svn/
-x XXXexclude_exe=XXXИсключить изменения, сделанные приложения с именами образа, подпадающими под регулярное выражение XXX(^|/)dpkg$
-l XXXlog_config=XXXИспользовать файл XXX как конфиг для логгера Log::Log4perl/etc/logautocommit-log4perl.conf
-c XXXchktime=XXXПроверять изменения файлов через XXX секунд60
-m XXXcomtime=XXX Коммитить не чаще, чем в XXX секунд300
-p XXXpolltime=XXXИнтервал спячки после прерванного блокировующего чтения 0.5
-bbackground=1Уйти в фоновый режим после запускаДа
-fbackground=0Не уходить в фоновый режим, полезно для отладкиНет

FIXME: проверить, как скрипт работает с символическими ссылками.

Кроме содержимого /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.

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 — максимальный размер копируемой области.

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.

convert-many

Скрипт для перекодирования множества изображений из одного формата в другой с помощью GraphicsMagick или ImageMagick, возможно, в несколько потоков. Пример использования:

find /path/ -name *.png | xargs ./convert-many png jpg 2 | sh

bashrc.any

Команды для переключения кодировок koi8, utf8, cp1251 в Konsole из консоли, не прибегая к помощи менюшек. Версии для KDE 4.x и 3.x.

А команда yc вам не нужна, удаляйте её. :)

Патчи и настройки

Патчи, модификации, файлы настроек, юзер-скрипты.

GoogleSrchUIMod.js

User JS для Opera, направленный на возвращение Гугла к прежнему (старому) виду:

  • без грёбаной панельки слева — она показывается свёрнутой, её можно развернуть
  • без рекламы справа
  • без javascript’ов, которые:
    • подменяют ссылки на сайты ссылками на редиректы так, что их не скопипастишь
    • противодействуют User JS’ам!
    • ставят какие-то таймеры, замеряют времена выполнения и делают ещё фиг знает что троянистое
  • с результатами поиска, выровненными по левому краю, а не по центру — удобно для широких мониторов
  • со ссылочкой «Только на русском» под строкой поиска

Основан на Opera UserJS To Get Back The Good Ol’ Google Search UI.

Устанавливать следующим образом — скачать по ссылке, создать любую папочку под свои юзер-скрипты, положить туда скачанный файл, прописать её в Preferences → Advanced → Content → JavaScript options → User JavaScript folder. Наслаждаться.

mc.color

Настройки цветов для Midnight Commander.

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.

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 патч не требуется.

Инструменты

pgraph-dot

Скрипт для вывода графов зависимостей с использованием Graphviz веток патчей для расширения системы контроля версий Mercurial pbranch, служащего для автоматизированного управления множеством веток патчей.

Использовать в каталоге Mercurial-репозитория следующим образом: pgraph-dot имяфайла.формат, где формат — один из поддерживаемых Graphviz форматов вывода (png, svg, dot и т. п.)

Пример такого графа:

PgraphDotExample.svg

sgold-note.pl

Небольшой скрипт для извлечения заметок из файлов базы данных (0:/system/apo/note/) платформ Siemens SGold (x65/x75 кроме S75/SL75) и NewSGold (S75/SL75).

По умолчанию запускается для SGold. Чтобы запустить для NewSGold, нужно раскомментировать строчку #my $h = 4; # for NewSGold (убрать # в начале). Использовать, просто натравливая его на эти самые файлы — не на каталоги, а на сами файлы, ибо рекурсивно каталоги скрипт не обходит.

find-alisska.pl

Простейший carving-инструмент, написанный на Perl’е, для извлечения нефрагментированных JPEG-изображений из образов файлов. Data Carving — термин, перевода которого на русский я не нашёл, но означает он поиск и восстановление данных откуда-нибудь на основе некоторых эвристик. Alisska означает, что инструмент был написан для восстановления Ljuser.gifАлискиных фотографий с жёсткого диска, полностью похеренного вирусом :-)

Вообще-то это велосипед — есть куча инструментов, а по области восстановления-добычи данных есть целая Forensics Wiki.