Архів мітки: Perl

Заміна IP адреси у файлах зон BIND

Є такі люди, що люблять подорожувати. Іноді сайти та сервіси теж зриваються з насидженого місця та вирушають у дорогу. Така міграція – справжній головний біль для системного адміністратора. Коли мова йде про 1-2 сервіси, це не проблема, а от коли переїжджає цілий хостінг.

Задача: є сервер імен BIND в якому треба поміняти всі записи зі старим IP на новий. Справу ускладнює те, що не всі зони треба міняти (оновлювати serial). Зміни мають зачепити лише ті файли зон, в яких дійсно змінюється IP. Як правило, я роблю такі зміни за допомогою Perl сценарію, але сьогодні спробував вичавити по максимуму командний рядок Лінукс.

У каталозі /etc/bing/db були зібрані файли зон, але були вкладені каталоги та символічні посилання. Тому на першому етапі відбираємо лише файли з каталогу та не чіпаємо підкаталоги:

find /etc/bind/db -maxdepth 1 -type f

Через xargs направляємо файл до grep

grep -H -m 1 '75.147.252.194'

Аргумент -H обов’язково додасть ім’я файлу до виводу, а -m 1 – покаже лише перше згадування старої IP-адреси.

Тепер залишаємо лише ім’я потрібного файлу зони (перший стовпець):

cut -d: -f1

Цю конструкцію я додав до Perl сценарію і на виході мав перелік файлів, в яких потрібно було зробити заміну IP та serial номер зони:

my $db_dir = "/etc/bind/db";
my $old_ip = '75.147.252.194';

my @files = `find $db_dir -maxdepth 1 -type f |
 xargs grep -H -m 1 '$old_ip' |
 cut -d: -f1`;

mysqldump – кожен запис окремим рядком

Утиліта mysqldump при збереженні даних таблиць об’єднує усі записи у одну команду INSERT. Виглядає це приблизно так:

INSERT INTO `таблиця` VALUES (запис1),(запис2), ..., (останній запис);

Коли таблиця має багато записів, то команда INSERT перетворюється у довжелезний рядок. Це зручно для машини, але людині читати такий файл складно.

Одне з рішень – замість однієї команди INSERT використовувати окремі команди для кожного запису:

mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

Тоді файл матиме вигляд:

INSERT INTO `таблиця` (опис полів) VALUES (запис1);
INSERT INTO `таблиця` (опис полів) VALUES (запис2);
INSERT INTO `таблиця` (опис полів) VALUES (...);
INSERT INTO `таблиця` (опис полів) VALUES (останній запис);

Але є краще рішення. Для цього достатньо пропустити результат mysqldump –extended-insert крізь регулярний вираз у інтерпретаторі Perl:

mysqldump --extended-insert ... | perl  -pane "s{),(}{),n(}smg" > дамп_файл.sql

Після цього сприймати зміст дампу стає значно простіше:

INSERT INTO `таблиця` (опис полів) VALUES (запис1),
(запис2),
(запис3),
...,
(останній запис);

Встановлення модулів Perl в Debian

Коли мені потрібен якийсь модуль Perl, я спочатку перевіряю його наявність у пакунках – http://www.debian.org/distrib/packages#search_contents

Це дуже просто, достатньо знати якого файлу не вистачає. Наприклад, ми отримали таке повідомлення про помилку:

Can't locate LWP/UserAgent.pm in @INC ...

Воно означає, що потрібен модуль LWP::UserAgent, але насправді це файл UserAgent.pm у каталозі LWP. Тому шукаємо саме так, як вказано у повідомленні про помилку: LWP/UserAgent.pm (режим “paths ending with the keyword”).

Пошук повертає 3 пакунки:

/usr/share/perl/5.10.1/CPAN/LWP/UserAgent.pm perl-modules
/usr/share/perl5/LWP/UserAgent.pm libwww-perl
/usr/share/perl5/Test/Mock/LWP/UserAgent.pm libtest-mock-lwp-perl

Нам потрібен libwww-perl, бо пакунок, що у назві містить test призначений для тестування, а perl-modules – це щось зовсім загальне.

Та іноді буває, що модуль Perl не дуже поширений і тому не потрапляє до пакунку у дистрибутиві Лінукс. У таких випадках слід встановлювати його зі CPAN – http://www.cpan.org/

На CPAN можна знайти майже будь-який модуль, скачати його і встановити вручну, але це довго. Простіше запустити утиліту cpan і встановити через неї.

Наприклад, Perl сценарій видав таку помилку:

Can't locate Geography/Countries.pm in @INC ...
Compilation failed in require at ...

Запускаємо cpan і по назві файлу Geography/Countries.pm ми вже знаємо ім’я пакету – Geography::Countries.

# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

cpan[2]> install Geography::Countries 
Running install for module 'Geography::Countries'
CPAN: Data::Dumper loaded ok (v2.124)
...

І через декілька секунд модуль все успішно встановлений.

Підсвічування синтаксису при передачі кода через e-mail, ICQ чи Skype

Якщо Вам треба показати комусь шмат коду, а ви спілкуєтесь через e-mail, ICQ чи skype, то у пригоді стане сервіс http://pastie.org/. Адже без підсвічування синтаксису в деяких мовах програмування досить важко розібратися.

Користуватись цим сервісом дуже просто. Копіюєте текст, обираєте для нього правильну мову для підсвічування синтаксису і короткий URL для передачі готов.

Наприклад, код Perl с попереднього повідомлення виглядає так:

http://pastie.org/1754095