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 );

Tags: ,

Monday, June 29th, 2009 Uncategorized Comments Off

Мой доклад на конференции YAPC

Уже завтра (точнее, уже даже почти сегодня) я выступаю с докладом на конференции по языку программирования Perl — YAPC (”Yet Another Perl Conference”). Я выступаю в разделе блиц докладов. Блиц доклады — это выступления, где каждому человеку отводится всего 5 минут на доклад. После четвертой минуту звучит предупреждающий сингал (у нас это треугольник, на западе используется гонг), после пятой минуты нужно вставать и уходить, не важно, все ли ты рассказал или не успел.

Главный по блиц-докладам у нас в России — Алексей Капранов. Если я ничего не путаю, то впервые блицы появились в России год назад, на прошлой конференции YAPC, а после этого разошлись и по другим ИТ конференциям.

Я выступаю с докладом со страшным названием “Создание системы мониторинга инфраструктуры с помощью Test::More”. Я написал его в стиле Такахаши (опять отдельное спасибо Алексу, это он рассказал всем про этот способ писать презентации). Метод Такахаши по написанию презентаций — это когда на одном слайде всего лишь несколько слов, в идеале одно слово или один символ. Господину Такахаиши, по имени которого назван этот способ, конечно, гораздо проще пользоваться своим методом (иероглифы гораздо более компактны), но и на русском можно писать в этой стилистике.

Для моего доклада я подготовил 120 слайдов. За 5 минут презентации это получается один слайд в 2.5 секунды. На френдфиде удачно пошутили, что еще чуть-чуть и будет кино.

Tags:

Friday, May 15th, 2009 Uncategorized 2 Comments

Система мониторинга серверов и сайтов с помощью тестов 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”);

А вот несколько синшотов:

img_0001

img_0002

img_0003

img_0006

img_0007

Еще раз ссылка на эту программу.

Буду рад, если вам эта штуку пригодится, и вдвойне буду рад за любой feedback =)

Tags: , , ,

Tuesday, March 24th, 2009 Uncategorized 1 Comment

Perl процедура для обновления wiki страниц trac-а

Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):

PERL:
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use DBI;
  6.  
  7. =head2 Структура таблицы wiki в траке
  8.  
  9.  CREATE TABLE wiki (
  10.     name text,
  11.     version integer,
  12.     time integer,
  13.     author text,
  14.     ipnr text,
  15.     text text,
  16.     comment text,
  17.     readonly integer,
  18.     UNIQUE (name,version)
  19. );
  20. CREATE INDEX wiki_time_idx ON wiki ( time);
  21.  
  22. =cut
  23.  
  24. =head2 sub write_wiki_trac
  25.  Процедуре передаются параметры:
  26.  
  27.   file - файл с базой данных trac
  28.   name - название страницы
  29.   author - кто будет автором редакции страницы
  30.   text - текст, который будет размещен на странице
  31.  
  32.  Процедура создает страницу, если страницы с таким именем нет.
  33.  Время создания страницы выставляется текущее время.
  34.  Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
  35.  Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
  36.  
  37. =cut
  38.  
  39.  
  40. sub write_wiki_trac {
  41.     my ($file, $name, $author, $text) = @_;
  42.    
  43.     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;
  44.  
  45.     $dbh->{unicode} = 1;
  46.  
  47.     # Нахожу последнюю версию страницы
  48.     my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
  49.  
  50.     $sth->execute();
  51.  
  52.     my $result = $sth->fetchrow_hashref;
  53.  
  54.     # Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
  55.     my $text_db;
  56.     if ( $result->{text} ) {
  57.         $text_db = $result->{text};
  58.     } else {
  59.         $text_db = "";
  60.     }
  61.  
  62.     # Записываем только если текст отличается от того, который сейчас в бд
  63.     if ( $text_db ne $text ) {
  64.  
  65.         my $version;
  66.        
  67.         unless ( $result->{version} ) {
  68.             $version = 1;
  69.         } else {
  70.             $version = $result->{version}+1;
  71.         }
  72.  
  73.         my $time = time();
  74.         $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, '')");
  75.         $sth->execute();
  76.     }
  77.  
  78.     return 1;
  79. }
  80.  
  81.  
  82. # проверка работы процедуры:
  83. my $file = "/var/trac/test/db/trac.db";
  84. &write_wiki_trac($file, "SandBox", "tester", "New page content");

Tags: ,

Friday, December 19th, 2008 Uncategorized Comments Off

Отправка списка открытых тикетов trac-а на почту

Появилась задачка: есть система trac, в 8 часов утра нужно сбрасывать на определенную почту список активных тикетов с определенным владельцем.

Решил все это дело написанием скрипта на perl, который засовывается в кронтаб.

Решение не идеальное, но свою задачу решает:

PERL:
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use DBI;
  7.  
  8. ###
  9. ### Start - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
  10.  
  11. # Путь к базе трака
  12. my $file = "/var/trac/test/db/trac.db";
  13.  
  14. # Кто должен быть владельцем тикета
  15. my $owner = "bessarabov";
  16.  
  17. # Мыло на которое нужно отсылать полученные данные
  18. my $email = "ivan\@bessarabov.ru";
  19.  
  20. ### End - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
  21. ###
  22.  
  23.  
  24. # Подключаюсь к базе данных трака
  25. 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;
  26.  
  27. $dbh->{unicode} = 1;
  28.  
  29. # Запрос, который выдает список всех активных тикетов для указанного пользователя
  30. my $sth = $dbh->prepare("
  31. SELECT id, summary
  32. FROM ticket
  33. WHERE
  34.   status IN ('new', 'assigned', 'reopened')
  35.   AND owner = '$owner'
  36. ORDER BY id");
  37.  
  38. $sth->execute();
  39.  
  40. # Переменная в которую я собираю всю необходимую мне инфу
  41. my $content;
  42.  
  43. while (my $result = $sth->fetchrow_hashref) {
  44.     $content .= "#" . $result->{id} . " - ". $result->{summary} . "\n";
  45. }
  46.  
  47. # Если есть хоть один тикет
  48. if ($content) {
  49.  
  50.     # тогда дописываю шапку
  51.     $content = "All active tickets for user $owner\n\n" . $content;
  52.  
  53.     # и отправляю письмо
  54.     open(MAIL, "|mail $email -s 'All active tickets for user $owner'") or die "Cannot open mail: $!";
  55.     binmode MAIL, ":utf8";
  56.     print MAIL $content;
  57.     close(MAIL);
  58. }
  59.  
  60. $sth->finish;

Tags: ,

Wednesday, July 23rd, 2008 Uncategorized Comments Off

YAPC::Russia 2008 «May Perl»

Вчера и сегодня (17-ого и 18-ого мая 2008) проходила коференция по языку программирования Perl. Конференция называлась YAPC::Russia 2008 «May Perl». YAPC расшифровывается, как Yet another perl conference, а читается по русски "япси" (ударение на «я»).

Это первая концеренция YAPC, которая проводилась в России (до этого было лишь несколько воркшопов), так что это значительное событие.

Оба дня я присутствовал на конференции.

Хорошоее в организации

Самое хорошее в этой конференции — это сам факт ее проведения. Собрать столько умныйх людей, найти помещение, договорится о спонсорстве, etc — это очень большое дело, так что мега респект организаторам.
Было много докладов (большинство из которых были действительно интересными), + конкурс по программированию с призами.

Вот еще несколько вкусностей этой конференции:

  • Участивие в было бесплатное
  • Высокотехнологичная регистрация — всем зерегистрированным участникам по почте выслали страницу со штрихкодом, которую нужно было напечатать. Соответственно, наличие этой старницы ускорило регистрацию.
  • Бесплатные чай-кофе-бутерброды-булочки во время кофе брейка (я конечно, не считал, но бутебродов 12-16 я точно захомячил =)
  • Бесплатыне майки

При регистрации всем выдавали бейджи, вот фотография моего:

YAPC::Russia May 2008

Плохое в организации

К сожалению, не все прошло гладно, вот несколько вещей, которые мне не понравились:

  • В первый день почти на час задержалось одно выступление (да и во второй день, на полчаса позже все началось)
  • Ни у кого (кроме Ивана Сережкина) не получалось нормально подключать линуховые ноуты к проектору. Было бы гораздо лучше, если бы вообще все презентации находились бы на одной машине и не нужно было бы ничего переподключать.
  • Организаторы узнавали о том, что доклада не будет от знакомых докладчиков из зала, а не от самих докладчиков

Но, несмотря, на все эти недостатки, конференция была действительно здоровской. =)

Доклады

Было много докладов, особенно хочу отметить несколько:

  • 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 (тоже очень и очень интересно)

Резюме

Ребята, было супер! С нетерпением жду следуюущего япси и воркшопов!

Огромное спасибо всем организаторам и участникам!

Tags: , ,

Sunday, May 18th, 2008 Uncategorized 1 Comment

Автоматическая отправка логов apache за вчера на почту.

Иногда бывает необходимо, отправлять на почту логи веб сервера apache за вчерашний день. Для решения этой задачи, я написал совершенно элементарный скрипт на Perl

Посмотреть на скрипт

Tags: ,

Friday, April 18th, 2008 Uncategorized Comments Off