Изменения

Перейти к: навигация, поиск

~s - скрипты-утилиты

7108 байтов добавлено, 23:01, 2 марта 2011
м
Нет описания правки
На данной странице описаны наиболее применимые из них, остальные можно увидеть по [{{SVN|vitalif/trunk/scripts/}} ссылке].
 
== [{{SVN|vitalif/trunk/scripts/logautocommit.pl|co}} logautocommit.pl] ==
 
Идея скрипта: простой автоматический версионный контроль конфигурации сервера. Большая часть конфигурации в UNIX-системах, как известно, находится в /etc, поэтому в первую очередь нужно версионировать содержимое /etc. Причём, не так важно, куда коммитить изменения — скорее всего, подойдёт локальный репозиторий любой системы управления версиями (скажем, Subversion), но важно, чтобы:
* Изменения записывались автоматически.
* Записывалось, кем внесено изменение — очень желательно сохранять IP-адрес удалённой сессии, потому что системным пользователем почти наверняка будет root.
* Файлы коммитились не сразу, а через промежуток времени, чтобы в процессе редактирования каждое нажатие F2 (сохранение) не добавляло по коммиту.
* Изменения, вносимые менеджером пакетов, не учитывались.
 
Итак, встречаем скрипт. Он использует [http://linux.die.net/man/8/auditd auditd] для отслеживания изменений файлов в /etc — это наиболее оптимально в терминах производительности. Посему первый шаг — установить и настроить auditd:
 
<code-bash>
apt-get install auditd
echo -w /etc/ -p wa >> /etc/audit/audit.rule # логгируем запись в /etc/
/etc/init.d/auditd reload
</code-bash>
 
Второй шаг — создать файл /etc/logautocommit-log4perl.conf со следующим содержимым:
<pre>
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
</pre>
 
Здесь /var/log/audit/autocommit.log — путь к логу самой коммитилки.
 
Третий шаг: создать репозиторий и рабочую копию, добавить в них конфиги, которые уже лежат в /etc, и которые уже менялись (по вкусу).
<source lang="bash">
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'
</source>
 
И, наконец, запустить logautocommit.pl и прописать его запуск в /etc/rc.local, с нужными аргументами.
 
Использование:
./logautocommit.pl [ОПЦИИ]
или
./logautocommit.pl /etc/logautocommit.conf
Здесь /etc/logautocommit.conf — конфиг скрипта, может содержать те же [ОПЦИИ], по одной на строку.
 
Опции:
<tab sep="tab" class="wikitable" head="top">
Формат 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 как конфиг для логгера {{CPAN|Log::Log4perl}} /etc/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 Не уходить в фоновый режим, полезно для отладки Нет
</tab>
FIXME: проверить, как скрипт работает с символическими ссылками.
 
Кроме содержимого /etc, полезно также версионировать списки установленных пакетов системного менеджера пакетов и скриптовых языков типа Perl, PHP, Python, Ruby — это проще всего сделать, добавив в крон скрипт со следующим содержимым:
 
<source lang="bash">
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
</source>
 
Для Python аналогично простой команды нет, но можно воспользоваться скриптом [[#pkgsearch.py|pkgsearch.py]] с данной страницы:
 
python [[#pkgsearch.py|pkgsearch.py]] > /etc/packages-status-python
 
Ещё может оказаться полезным версионировать схемы всех баз данных, но это уже частично относится к разработке.
 
== [{{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] ==

Навигация