perl
Записать файл в шару с помощью perl
Возникла у меня задача: необходимо из perl скрипта, который работает на linux машине создать файл в windows шаре. Нет никаких проблема заранее примонтировать шару к файловой системе, а потом уже просто записывать файл.
В моем случае, мне необходимо писать в большое количество разных сетевых папок, заранее не зная в какую. В этом случае я счел нецелесообразным монтировать все эти шары и стал искать средство попроще.
Я практически сразу получил ответ на свой вопрос в списке рассылке moscow.pm — нужно использовать Filesys::SmbClient (Андрей Костенко, большое спасибо).
Мне далеко не сразу удалось справится с инсталляцией этого пакета, но в конце-концов все получилось. Чтобы не забыть, как я это делал, я отписываю этот пост.
Итак, есть сервер с debian 5.0. Нужно поставить на него perl модуль Filesys::SmbClient.
В самом начале проверяем, что есть все необходимое для сборки модуля:
sudo apt-get install libc6-dev g++ gcc
Для установки модуля необходимо поставить некоторые библиотеки:
sudo apt-get install libsmbclient-dev
Дальше, в теории, нужно вот так ставить модуль:
sudo cpan -i Filesys::SmbClient
Но у меня так не получилось =( Поставил вручную.
Для начала скачиваю:
wget http://search.cpan.org/CPAN/authors/id/A/AL/ALIAN/Filesys-SmbClient-3.1.tar.gz
Разархивирую:
tar xvfz Filesys-SmbClient-3.1.tar.gz
Дальше:
perl Makefile.PL
На вопрос “где можно найти libsmbclient.h” отвечаю дефолтным ответом: /usr/include
На вопрос “где можно найти libsmbclient.so” так же отвечаю дефолтным ответом: /usr/lib
Тесты пройти у меня не получилось, но сам модуль работает, поэтому на вопрос Do you want make tests? нужно ответить no. Вопрос “Compile module with trace to STDERR ?” оставляем по дефолту в no.
Дальше делаем make, после этого делаем sudo make install (Вообще, обычно между make и sudo make install делается еще и make test, но у меня тесты этого модуля совсем не проходились).
Итак, после выполнения этих действий можно работать.
Вот скрипт, который позволяет сохранить файл в шару, в том случае если доступ к шаре осуществляется без необходимости указывать имя/пароль:
#! /usr/bin/perl
use POSIX;
use Filesys::SmbClient;
my $smb = new Filesys::SmbClient( debug => 0 );
# Write a file
my $fd = $smb->open(”>smb://192.168.1.1/share/test.txt”, 0666)
or die “Can’t create file:”, $!, “\n”;
$smb->write($fd, “A test of write call\n”)
or die $!,”\n”;
$smb->close($fd);
В том случае, если нужно вводить имя пользователя, то говорим вот так:
my $smb = new Filesys::SmbClient( username => "user", password =>"password", debug => 0 );
Мой доклад на конференции YAPC
Уже завтра (точнее, уже даже почти сегодня) я выступаю с докладом на конференции по языку программирования Perl — YAPC (”Yet Another Perl Conference”). Я выступаю в разделе блиц докладов. Блиц доклады — это выступления, где каждому человеку отводится всего 5 минут на доклад. После четвертой минуту звучит предупреждающий сингал (у нас это треугольник, на западе используется гонг), после пятой минуты нужно вставать и уходить, не важно, все ли ты рассказал или не успел.
Главный по блиц-докладам у нас в России — Алексей Капранов. Если я ничего не путаю, то впервые блицы появились в России год назад, на прошлой конференции YAPC, а после этого разошлись и по другим ИТ конференциям.
Я выступаю с докладом со страшным названием “Создание системы мониторинга инфраструктуры с помощью Test::More”. Я написал его в стиле Такахаши (опять отдельное спасибо Алексу, это он рассказал всем про этот способ писать презентации). Метод Такахаши по написанию презентаций — это когда на одном слайде всего лишь несколько слов, в идеале одно слово или один символ. Господину Такахаиши, по имени которого назван этот способ, конечно, гораздо проще пользоваться своим методом (иероглифы гораздо более компактны), но и на русском можно писать в этой стилистике.
Для моего доклада я подготовил 120 слайдов. За 5 минут презентации это получается один слайд в 2.5 секунды. На френдфиде удачно пошутили, что еще чуть-чуть и будет кино.
Система мониторинга серверов и сайтов с помощью тестов perl на iPhone
Есть такие мега штуки, как возможность написе unit тестов на perl, а так же не фреймворк iui, коорый позволяет делать html страницы с нативным интерфейсом айфона. К сожалению, про эти вещи я узнал не так давно, как бы мне хотелось (посыпаю голову пеплом). Я некоторое время думал, где-то применить их и тут подвернулась подходящая задачка (Кроме этого есть еще и чудестный бесплатный набор иконок, котороый я тоже тут заиспользовал).
У меня достаточно большая сетевая инфраструктура на работае + есть несколько машин дома. Я бы хотел иметь возможность, находясь где-то в пути проверить, что сейчас работает, а что нет. У меня есть всякие системы системы мониторинга, .но для их нормального использования мне нужно сидеть за компьютером. Я хотел сделать нечно простое, что просто показывает, что on, а что off. У меня есть iPhone и я решил, что вполне логично сделать нечно для него.
Таким образом родился крохотный проект — bmon — bessarabov’s monitoring system.
Эта штукенция состоит из 2-х частей:
- система мониторинга — запускатеся по crontab выполняет все perl тесты, определяет, что не работает и записывает в файл
- система отображения — perl cgi-bin скрипт, который на основе файлов с результатами работоты тестов формирует html страницу
Не отходя от кассы, вот ссылка на bmon.zip.
В архиве есть дока, там я понятно (я старался) написано, как запускать эту штуку + весь код (там всего ничего) так же достаточно подробно закомментирован.
Хочу подчеркнуть, что это не идеальное творение, но для моих целей подходит идеально =)
Вот пример, как я исползую perl тесты, для проверки:
# Если гугл не пигуется, значит интернет сломался
ok (ping(host => “google.com”, count => 3, size => 1024, timeout => 3 ), “internet is down”);
# Проверяем, работает ли сайт (в случае, если все нормально должен получить статус 200)
$mech->get( “http://example.com” );
is($mech->status(), 200, “example.com is down”);
А вот несколько синшотов:
Еще раз ссылка на эту программу.
Буду рад, если вам эта штуку пригодится, и вдвойне буду рад за любой feedback =)
Perl процедура для обновления wiki страниц trac-а
Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
use DBI;
-
-
=head2 Структура таблицы wiki в траке
-
-
CREATE TABLE wiki (
-
name text,
-
version integer,
-
time integer,
-
author text,
-
ipnr text,
-
text text,
-
comment text,
-
readonly integer,
-
UNIQUE (name,version)
-
);
-
-
=cut
-
-
=head2 sub write_wiki_trac
-
Процедуре передаются параметры:
-
-
file - файл с базой данных trac
-
name - название страницы
-
author - кто будет автором редакции страницы
-
text - текст, который будет размещен на странице
-
-
Процедура создает страницу, если страницы с таким именем нет.
-
Время создания страницы выставляется текущее время.
-
Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
-
Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
-
-
=cut
-
-
-
sub write_wiki_trac {
-
my ($file, $name, $author, $text) = @_;
-
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Нахожу последнюю версию страницы
-
my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
-
-
$sth->execute();
-
-
my $result = $sth->fetchrow_hashref;
-
-
# Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
-
my $text_db;
-
if ( $result->{text} ) {
-
$text_db = $result->{text};
-
} else {
-
$text_db = "";
-
}
-
-
# Записываем только если текст отличается от того, который сейчас в бд
-
if ( $text_db ne $text ) {
-
-
my $version;
-
-
unless ( $result->{version} ) {
-
$version = 1;
-
} else {
-
$version = $result->{version}+1;
-
}
-
-
$sth = $dbh->prepare("INSERT INTO wiki (name, version, time, author, text, ipnr, readonly, comment) VALUES ('$name', '$version', $time, '$author', '$text', '127.0.0.1', 0, '')");
-
$sth->execute();
-
}
-
-
return 1;
-
}
-
-
-
# проверка работы процедуры:
-
my $file = "/var/trac/test/db/trac.db";
-
&write_wiki_trac($file, "SandBox", "tester", "New page content");
Отправка списка открытых тикетов trac-а на почту
Появилась задачка: есть система trac, в 8 часов утра нужно сбрасывать на определенную почту список активных тикетов с определенным владельцем.
Решил все это дело написанием скрипта на perl, который засовывается в кронтаб.
Решение не идеальное, но свою задачу решает:
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
-
use DBI;
-
-
###
-
### Start - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
-
-
# Путь к базе трака
-
my $file = "/var/trac/test/db/trac.db";
-
-
# Кто должен быть владельцем тикета
-
my $owner = "bessarabov";
-
-
# Мыло на которое нужно отсылать полученные данные
-
my $email = "ivan\@bessarabov.ru";
-
-
### End - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
-
###
-
-
-
# Подключаюсь к базе данных трака
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Запрос, который выдает список всех активных тикетов для указанного пользователя
-
my $sth = $dbh->prepare("
-
SELECT id, summary
-
FROM ticket
-
WHERE
-
status IN ('new', 'assigned', 'reopened')
-
AND owner = '$owner'
-
ORDER BY id");
-
-
$sth->execute();
-
-
# Переменная в которую я собираю всю необходимую мне инфу
-
my $content;
-
-
while (my $result = $sth->fetchrow_hashref) {
-
$content .= "#" . $result->{id} . " - ". $result->{summary} . "\n";
-
}
-
-
# Если есть хоть один тикет
-
if ($content) {
-
-
# тогда дописываю шапку
-
$content = "All active tickets for user $owner\n\n" . $content;
-
-
# и отправляю письмо
-
binmode MAIL, ":utf8";
-
print MAIL $content;
-
}
-
-
$sth->finish;
YAPC::Russia 2008 «May Perl»
Вчера и сегодня (17-ого и 18-ого мая 2008) проходила коференция по языку программирования Perl. Конференция называлась YAPC::Russia 2008 «May Perl». YAPC расшифровывается, как Yet another perl conference, а читается по русски "япси" (ударение на «я»).
Это первая концеренция YAPC, которая проводилась в России (до этого было лишь несколько воркшопов), так что это значительное событие.
Оба дня я присутствовал на конференции.
Хорошоее в организации
Самое хорошее в этой конференции — это сам факт ее проведения. Собрать столько умныйх людей, найти помещение, договорится о спонсорстве, etc — это очень большое дело, так что мега респект организаторам.
Было много докладов (большинство из которых были действительно интересными), + конкурс по программированию с призами.
Вот еще несколько вкусностей этой конференции:
- Участивие в было бесплатное
- Высокотехнологичная регистрация — всем зерегистрированным участникам по почте выслали страницу со штрихкодом, которую нужно было напечатать. Соответственно, наличие этой старницы ускорило регистрацию.
- Бесплатные чай-кофе-бутерброды-булочки во время кофе брейка (я конечно, не считал, но бутебродов 12-16 я точно захомячил =)
- Бесплатыне майки
При регистрации всем выдавали бейджи, вот фотография моего:

Плохое в организации
К сожалению, не все прошло гладно, вот несколько вещей, которые мне не понравились:
- В первый день почти на час задержалось одно выступление (да и во второй день, на полчаса позже все началось)
- Ни у кого (кроме Ивана Сережкина) не получалось нормально подключать линуховые ноуты к проектору. Было бы гораздо лучше, если бы вообще все презентации находились бы на одной машине и не нужно было бы ничего переподключать.
- Организаторы узнавали о том, что доклада не будет от знакомых докладчиков из зала, а не от самих докладчиков
Но, несмотря, на все эти недостатки, конференция была действительно здоровской. =)
Доклады
Было много докладов, особенно хочу отметить несколько:
- Eludia.pm: практичный MVC для корпоративных Intranet-систем
- Сайт на Jifty за пару часов — jifty это молодой MVC framework. Имхо пока все-таки лучше использовать каталист, так как ее поддерживает достаточно больше комьюнити. Посмотрим. что будет дальше.
- Мастеркласс. POE в повседневной жизни. — к сожалению на этом мероприятии я не присутствовал (был на jifty), с нетерпением жду записи (Иван Блинков очень вкусно рассказал, что там творилось).
- Построение совместимых Perl/mod_perl систем с веб-интерфейсом
- Perl и Web 2.0 — очень хороший и приятный доклад, Александр Котов (автор доклада) получил приз за лучший доклад. Поздравляю! =)
— действительно, так оно и есть, очень интересный фреймворк. Он позволяет быстро создать некоторое колчиество таблиц с данными, а так же прописать для них логику. Проблемы в том, что он создан по несколько устарешвшим техлогиями. Код открыт, есть вики, так что вполне стоит смотреть в эту сторону (правда вики рускоязычная, что уменшает количество потенциальных разработчиков). Для некоторых задач — отличное решение
Во второй день были блиц доклады. Докладчику давалось пять минут, чтобы что-то рассказать. Получилась очень динамично — супер!
- На блиц докладах отжог Дмитрий Карасик со докладом "Секретные операторы";
- после доклада Андрея Шитова "Кратко о Rakudo", мне хоть стало немного понятно, что такое perl6;
- Валерий Студенников очень хорошо рассказал про необходимость написания стандартизованного кода, а так же немного рассказал, как этого можно достичь.
- Алексей Капранов очень и очень интересно рассказал про xul презентации, а так же рассказал интересную историю о повышении производительности шаблонов.
Кроме блиц докладов во второй день было так же 4 доклада:
- Иван Сережкин залез в такие дебри, что я перестал понимать его через несколько минут после начала доклада (хотя было очень итересно)
- Ярослав-Александр Литот рассказал про способы управления виртуальными машинами, интересно
- Владимир Перепелица рассказал про проблемы и их решения использования utf-8 (по этой же тематике есть очень хорошая дока) — полезно нужно и интересно
- а Илья Обшадко рассказал, как работает сайт trave.ru (тоже очень и очень интересно)
Резюме
Ребята, было супер! С нетерпением жду следуюущего япси и воркшопов!
Огромное спасибо всем организаторам и участникам!
Автоматическая отправка логов apache за вчера на почту.
Иногда бывает необходимо, отправлять на почту логи веб сервера apache за вчерашний день. Для решения этой задачи, я написал совершенно элементарный скрипт на Perl
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « Jun | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||




