Показаны сообщения с ярлыком projects. Показать все сообщения
Показаны сообщения с ярлыком projects. Показать все сообщения

30 ноября 2014 г.

Guile-DSV 0.1.0

Доброго времени суток.

Потребовалась мне как-то раз GNU Guile библиотека для работы с форматом DSV (delimiter-separated values). Когда это случилось в первый раз (в awget), то готового решения найти не удалось, и я написал решение "по месту", специально для проекта. Когда подобная библиотека потребовалась во второй раз (в cadrobot), то я скопировал код готового модуля из awget. В третий раз, когда разбор DSV потребовался для внутреннего проекта в компании Элсис (где я сейчас работаю), было опять скопировано существующее решение из ранних проектов.

Один из недостатков подобного подхода в том, что при нахождении ошибки в одной из реализаций приходится вручную исправлять подобную же ошибку в других проектах. Другой недостаток в том, что если проблема разбора DSV возникнет у другого разработчика, то ему придётся копировать мою реализацию в свой проект (если, конечно, он вообще сможет найти мою реализацию). Поэтому, после третьего подобного случая копипаста у меня возникло непреодолимое желание создать свою библиотеку для работы с форматом DSV, которую уже использовать. Что я и сделал.

Сегодня выпустил релиз Guile-DSV 0.1.0 -- первую версию библиотеки. Она довольно простая, и на данный момент поддерживает только Unix-стиль формата DSV, который описан Эриком Реймондом в книге "The Art of Unix Programming".

Кроме процедур для конвертации между DSV-строками и списками, и процедурами чтения/записи DSV, Guile-DSV предоставляет процедуру guess-delimiter для автоматического определения разделителя полей, которую я подсмотрел в python-dsv.

Guile-DSV распространяется на условиях лицензии GNU GPLv3+. Для процедур, предоставляемых библиотекой, написаны тесты. Библиотека ставится "классическим" способом через ./configure && make && make install, и снабжена документацией в Info формате, которая ставится вместе с GNU Guile модулем. В документации приведены примеры использования каждой из процедур.

Надеюсь, что данная библиотека будет полезна не только мне. Буду рад конструктивным комментариям по поводу библиотеки, а ещё более буду рад отчётам об ошибках (если таковые будут) и патчам для их исправления.

Спасибо,

- Артём

6 сентября 2014 г.

Guile-SSH 0.7.0

Доброго времени суток, случайные и неслучайные читатели.

В прошлые выходные выпустил релиз Guile-SSH 0.7.0, и, следуя принципу "лучше поздно, чем никогда", решил написать об этом здесь, на русском.

Напомню, что Guile-SSH представляет собой свободную (GNU GPLv3+) библиотеку для программ GNU Guile (свободного интерпретатора Scheme, диалекта Lisp), предоставляющую API для работы с протоколом SSH. Данная библиотека является обёрткой для libssh.

Используя процедуры, предоставляемые библиотекой, можно создать как клиентское, так и серверное приложение, работать с публичными и приватными ключами (RSA, DSA, ECDSA), выполнять удалённо команды в не-интерактивном режиме и пересылать данные по защищённым каналам.

Библиотека снабжена документацией в Info-формате (на английском), и примерами использования (в каталоге examples).

Вот список изменений в версии 0.7.0:

  • Произведена миграция на libssh 0.6.3
  • Теперь требуется GNU Guile 2.0 для сборки и работы библиотеки.
  • Исправлен баг со сборкой мусора: до этого объекты вроде SSH-сессий могли быть освобождены сборщиком мусора раньше, чем их "потомки" (вроде SSH-каналов), что приводило к ошибкам.
  • Исправлены ошибки сегментации в модуле (ssh channel): Теперь, если в процедуру передан освобождённый SSH-канал, то бросается исключение.
  • Исправлен баг в процедурах public-key? и private-key?: Данные предикаты теперь возвращают #f для объектов, не являющихся ключами, вместо бросания исключения.
  • Добавлен новый модуль (ssh log), предоставляющий процедуры для управления логированием библиотеки libssh. Как следствие, Guile-SSH теперь работает лучше с Emacs Scheme REPL режимом (проверял на Geiser), благодаря умолчальной процедуре печати логов, которая комментирует сообщения лога, добавляя в начало строки ";;; ". Таким образом, логи от libssh не смешиваются с выводом от процедур.
  • Добавлены новые процедуры: userauth-public-key/try, bytevector->hex-string, session-get, channel-get-session, message-get-session.
  • Некоторые процедуры были переименованы, дабы названия были благозвучнее и понятнее (см. NEWS-файл для более подробной информации).
  • Улучшена печать Guile-SSH объектов, в результате вы можете получить полезную информацию об объектах, просто взглянув на распечатку объекта. Пара примеров:
            (display session)
            => #<session avp@localhost:22 (disconnected) 8b2fff0>
            (display key)
            => #<key rsa (private) 8b2ffe0>
        
  • Добавлены новые тесты для лучшего багоулавливания.
  • Добавлены примеры использования Guile-SSH API в Info-документацию.

Замечу, что данный релиз ломает обратную совместимость, так что если вы использовали Guile-SSH 0.6.0 в приложении, то вам потребуется сделать некоторые изменения, чтобы заставить приложение работать с Guile-SSH 0.7.0. В то же время, я надеюсь, что улучшения являются полезными, поэтому нарушение обратной совместимости оправдано.

Для более подробной информации о видимых измененях в новой версии см. NEWS-файл.

Пользуясь возможностью, хочу сказать спасибо Людовику Кортесу (франц. Ludovic Courtès) за патч, улучшающий работу SSH-каналов (был включён в релиз 0.6.0, о котором я здесь не писал), за баг-репорты и за полезные советы по разработке. Список авторов всегда можно посмотреть в файле AUTHORS.

Спасибо,

- Артём

5 февраля 2014 г.

Guile-SSH 0.5.0

Выпустил релиз Guile-SSH 0.5.0. Вот краткий список наиболее заметных изменений:

  • Каналы (channels) Guile-SSH теперь представлены в виде обычных портов GNU Guile, что позволяет работать с ними, используя стандартные процедуры ввода-вывода, такие как display и read-line. Данное изменение позволило убрать несколько специфичных процедур для работы с каналами, что сделало API проще и понятнее.
  • Добавлена документация в формате Texinfo. При сборке докуменация конвертируется в формат справочной системы Info, и при установке сохраняется в стандартный каталог ${prefix}/share/info.
  • Добавлена поддержка аутентификации по открытым ключам с использованием SSH-агента. Для использования нового способа аутентификации предлагается использовать новую процедуру userauth-autopubkey!
  • session-set! и server-set! теперь принимают значение опции log-verbosity в виде символа, вместо числа.
  • Удалены дубликаты некоторых опций Guile-SSH сессий и сервера: port-str (опция дублировала port, только принимала значение в виде строки), log-verbosity-str (дублировала log-verbosity, только принимала значение в виде строки). Удалена опция add-identity (полностью дублировала identity).
  • Добавлены новые процедуры: channel-set-stream!, channel-get-stream, session?, server?, message?, userauth-autopubkey!
  • Обновлены примеры программ, написанных с использованием Guile-SSH (sssh и ssshd), добавлены новые примеры (эхо-клиент и эхо-сервер).
  • Добавлены автоматические тесты.

Исходый код нового релиза можно получить под лицензией GNU GPLv3+ на GitHub:

https://github.com/artyom-poptsov/libguile-ssh/releases/tag/v0.5.0

Напомню, что Guile-SSH предоставляет доступ к протоколу SSH для программ, написанных на языке Scheme (диалекте Lisp).

- Артём

4 декабря 2013 г.

Guile-SSH 0.4.0

Доброго времени суток.

На прошлой неделе выпустил релиз Guile-SSH 0.4.0. В новой версии добавлена поддержка GNU Guile 2.0.x, добавлен SSH Server API, улучшен SSH Client API, исправлены ошибки. Также добавлены примеры программ, написанных с использованием библиотечного API -- см. каталог examples в корне репозитория.

Готовых сборок пока нет. Исходный код Guile-SSH 0.4.0 можно взять на GitHub:
https://github.com/artyom-poptsov/libguile-ssh/releases/tag/v0.4.0

Вот краткий перечень изменений, взятый из NEWS-файла:

  • Добавлена поддержка новой стабильной версии GNU Guile 2.0. Сборка с GNU Guile 1.8 по-прежнему поддерживатеся.
  • Изменён API -- убран префикс "ssh:" из названий функций.
  • Добавлен базовый SSH Server API.
  • Исправлено повреждение памяти в функции channel-read.
  • Исправлено повреждение памяти при сборке неиспользуемых объектов сборщиком мусора.
  • Исправлен баг в функции session-set!, который приводил к невозможности установки корректного булева значения.
  • Добавлены новые функции: channel-write, channel-request-pty channel-request-shell, channel-set-pty-size!
  • Исправлено имя функции write-known-host! (по-ошибке была названа authenticate-server).
  • Изменена обработка ошибок в функциях: write-known-host!, channel-open-session, channel-request-exec, channel-request-env, close-channel!, server-set -- функции теперь бросают исключение при ошибке, вместо возврата #f. Возвращаемое значение теперь неопределено.
  • authenticate-server теперь так же бросает исключение при ошибке, вместо возврата #f.
  • Функция make-session переименована в %make-session.
  • Добавлена новая функция make-session, которая является обёрткой над %make-session и session-set!. Функция предоставляет удобный интерфейс, позволяя задавать опции сервера через ключевые слова.
  • connect переименована в connect!
  • Исправлена опечатка в названии символа: strcthostkeycheck переименована в stricthostkeycheck
  • Исправлена ошибка в public-key->string, приводившая к зацикливанию функции. Ошибка была обнаружена на Ubuntu GNU/Linux 10.04 LTS.
  • В репозиторий добавлены примеры программ -- см. каталог examples.
  • Улучшена распечатка SSH ключей, каналов и сообщений.

- Артём

8 августа 2013 г.

ClusterGen 2.1

Новость, связанная с моей работой в компании Мера -- на прошлой неделе мы выпустили релиз ClusterGen 2.1:
http://sourceforge.net/projects/clustergen/files/ClusterGen-2.1/

Напомню, что ClusterGen -- это проект по созданию кластерного генератора трафика, использующего возможности ядра Linux для генерации пакетов и позволяющего настроить несколько GNU/Linux хостов для одновременной генерации трафика с заданными параметрами. Подробно о проекте можно узнать в этом посте:
http://memory-heap.blogspot.ru/2012/07/clustergen.html

2.1 является bug-fix релизом. С момента выпуска 2.0 мы исправили большое количество ошибок и улучшили графический интерфейс. Вот список видимых изменений, составленный на основе NEWS-файла:

  • Исправлена загрузка конфигурационных файлов при старте.
    • Старт приложения в Advanced Mode больше не приводит к краху приложения.
    • Корректно обрабатывается попытка загрузки отсутствующего конфигурационного файла -- если файл не найден, приложение просто пропускает этот файл.
  • Приложение больше не полагается на имена файлов в определении типа файла -- теперь можно работать с конфигурационными файлами с любым расширением, или вообще без него.
  • Исправлена работа пунктов меню "Save Test Suite" и "Save Test Suite As...".
  • Исправлен подсчёт статистики, если трафик генерируется несколькими хостами одновременно.
  • Исправлена проблема с некоторыми кнопками, при которой выключенные кнопки продолжали обрабатывать клик на них.
  • Приложение больше не создаёт test suite автоматически при переключении в Advanced Mode -- test suite должен быть создан вручную через меню.
  • Настройки приложения (такие, как период обновления списка хостов и размер статистики для сбора) сохраняются между сессиями.
  • При загрузке приложения в target config прописываются умолчальные значения для параметров (значения взяты из исходного кода pktgen 2.75).
  • При удалении текущего test case больше не выбирается автоматически другой test case.
  • Теперь можно создать test suite с пустыми host config и target config в Test Case Properties Editor.
  • Исправлено отображение размера пакета на вкладке "Statistics".
  • Улучшено включение/выключение элементов интерфейса в зависимости от текущего состояния приложения.
  • Добавлена автоматическая проверка корректности введённых значений в диалогах.
  • Улучшен диалог настроек приложения.
  • Исправлены пустые заголовки у некоторых диалоговых окон.
  • Улучшены диалоги сохранения/загрузки файлов.
  • Добавлены всплывающие подсказки для кнопок.
  • Улучшено расположение элементов интерфейса.

Подробный список изменений можно посмотреть в ChangeLog'е.

Начиная с версии 2.0 в ClusterGen добавлена базовая поддержка тест сьютов и тест кейсов, однако эта часть функциональности пока ограничена -- например, в текущей реализации тест кейс хранит только информацию о конфигурации трафика, и не позволяет задать условия прохождения теста.

- Артём

15 июля 2013 г.

Guile-SSH 0.3.1

Выпустил релиз Guile-SSH 0.3.1. Начиная с релиза 0.2 (который был первым релизом), внёс в библиотеку достаточно много изменений. Вот некоторые, наиболее значимые, из них:

  • Исправлены ошибки сегментации при освобождении неиспользуемых SSH-объектов сборщиком мусора. Ошибка проявлялась, если после удаления сессии сборщик мусора пытался удалить канал, связанный с этой сессией.
  • Библиотека теперь может безопасно использоваться в многопоточных приложениях (при использовании Guile-SSH нужно руководствоваться рекомендациями в инструкции по созданию многопоточных приложений с использованием libssh)
  • Улучшена работа с SSH-ключами. Дело в том, что libssh работает с ключами трёх видов: публичные ключи, приватные ключи и просто ключи. Так вот, публичные ключи могут представлять собой как объект типа ssh_public_key, так и ssh_string с бинарным содержимым. Это выглядит довольно странно, так что я постарался скрыть эти особенности библиотеки, и все виды ключей предстают программисту в Scheme, как единый тип <ssh:key>
  • Исправлена работа функции ssh:public-key-from-file
  • Добавлены новые функции: ssh:get-key-type, ssh:userauth-get-list, ssh:free-channel!
  • Исправлены ошибки в функциях ssh:private-key-from-file, ssh:channel-read, ssh:blocking-flush!, ssh:session-set!

Полный список изменений, видимых пользователю, можно найти в NEWS-файле, в корне репозитория. Подробный лог изменений находится в файле ChangeLog, там же.

Пример приложения, использующего Guile-SSH:
https://gist.github.com/artyom-poptsov/5650840

Готовых бинарных сборок пока нет. Инструкции по сборке Guile-SSH из исходных кодов можно найти на GitHub Wiki:
https://github.com/artyom-poptsov/libguile-ssh/wiki/Building-and-installation

- Артём

5 июня 2013 г.

Слайды презентаций с InstallFest'а

Доброго времени суток.

Вот слайды моих презетаций с InstallFest'а:

  • LazyCat -- система управления конфигурациями: odp pdf
  • Guile-SSH -- доступ к протоколу SSH из программ на Scheme: odp pdf

Презетации распространяются под лицензией CC-BY-SA 3.0.

Если вы были на InstallFest'е и присутствовали на этих презентациях -- прошу меня простить за плохое выступление. Я должен был лучше подготовиться.

- Артём

28 октября 2012 г.

Object oriented Lazy GTK Cat

Загрузил в репозиторий LazyCat на GitHub последние изменения, являющиеся результатом почти месяца работы. Суть изменений заключается в том, что Lazy GTK Cat (текущий и пока единственный GUI для LazyCat) переведён на объектно-ориентированную модель.

Это сделано по той причине, что по мере развития проекта кода на Scheme становится всё больше, и в том состоянии, в котором он был до этого -- с ним было сложно работать. Я имею ввиду, что код был плохо структуирован и при добавлении новой функциональности был высок риск поломать что-нибудь старое и работающее.

Поскольку решаемая мной задача (GUI и некоторая высокоуровневая логика) хорошо поддаётся на разбиение на ясно определённые объекты, перевод на объектно-ориентированную модель позволил упростить код, сделать его ясным и удобным для понимания. А значит, дальнейшее добавление необходимых возможностей в GUI будет проще.

Я изучаю Scheme и GNU Guile по ходу работы над проектом и по мере решения возникающих проблем. И в этот раз много времени ушло на чтение документации и эксперименты с GNU Guile -- чтобы понять, как же реализовать объекты в языке. Сначала попробовал создавать объекты с помощью closures -- механизм, который "из коробки" присутствует в Scheme.

Вариант с closures оказался простым и достаточно удобным. Но я на этом не остановился и решил попробовать сделать то же самое с использованием Guile Object Oriented Programming System (GOOPS) -- модуля, который приносит объектно-ориентированность в язык. После того, как переписал готовые объекты с использованием GOOPS, я продолжил разделение того большого куска кода, которым являлся Lazy GTK Cat, на небольшие и относительно простые объекты. Стало ясно, что GOOPS является более мощным и удобным механизмом для создания объектов в языке.

Работу методов для некоторых объектов я проверил по отдельности, через написание скриптов на GNU Guile (одна из возможностей этого интерпретатора -- использование вместо shell-интерпретатора для написания скриптов на Scheme, которые можно выполнить прямо из консоли). После тестирования нужно было собрать всё воедино и заставить работать. Далее -- тестирование Lazy GTK Cat и дописывание оставшихся частей основного класса приложения. Всё это было сделано за несколько дней.

В коде много комментариев, в том числе, в последнем коммите я добавил "TODO" заметки -- напоминания, подсказки и идеи, как можно улучшить тот или иной кусок кода, что неплохо бы сделать в дальнейшем.

Я по-прежнему ищу разработчиков для проекта. Важна не только помощь, но и интересен опыт совместной работы над проектом через GitHub. Если вам интересен проект -- go ahead, буду рад помощи.

- Артём

27 сентября 2012 г.

Проект LazyCat

Есть один проект, над которым я работаю уже достаточно давно. Проект называется LazyCat. Моей целью в рамках этого проекта является создание системы для администрирования множества (множества в математическом и в обычном смысле) компьютеров, объединённых в сеть.

Идея, которая стоит за данным проектом достаточно проста - если у вас есть много компьютеров, то иногда возникает потребность выполнить какие-то однотипные действия на всех ваших ПК. Или же бывает полезно получить "общую картину" происходящего. Это достаточно просто, когда у вас есть доступ к компьютерам (физический и/или сетевой), и когда компьютеров не много. С ростом количества компьютеров такая задача, как развёртывание программного дистрибутива, становится нетривиальной.

Возьмём наглядный пример.

Университет. Пятница. Вечер. Системный администратор по имени Боб допивает свой кофе и готовится уйти домой. И в тот момент, когда он уже накинул сумку на плечо и собрался уходить, к нему прибегает преподаватель и просит сегодня же установить на все компьютеры в классе номер 21 пакеты Inkscape и Gimp, так как только что стало известно, что в субботу будут проходить курсы по компьютерной графике.

Предположим, в классе 30 компьютеров. На каждый нужно установить необходимые программы и (возможно) произвести некоторую настройку - например, добавить учётные записи для новых пользователей. Итого - требуется выполнить порядка 60 одинаковых действий. Что в такой ситуации может сделать Боб? Он может, во-первых, пойти в класс номер 21 и поставить программы на каждый компьютер в отдельности. Но, поскольку за плечами Боба - годы системного администрирования, то он знает пару полезных трюков. Например, он может со своей машины зайти по SSH на каждый из компьютеров и выполнить установку. Но ему по-прежнему нужно залогиниться на каждый компьютер, выполнить установку и настройку вручную. Лучше, чем бегать от компьютера к компьютеру, но всё ещё не слишком удобно.

Было бы гораздо удобнее, если бы Боб мог отправить команду установки сразу всем компьютерам в классе 21, и получить обратно отчёт, если что-то пошло не так - например, если пакет уже был установлен в системе, или же во время установки произошла ошибка.

Есть достаточно большое количество программного обеспечения, которое решает подобную задачу (в Википедии есть обширный список) - например, Ansible и Puppet.

LazyCat - один из таких инструментов. Он написан на языке C и на Scheme (диалекте Lisp) с использованием Guile. На языке C написано ядро проекта и прокси-сервисы. Под прокси в данном контексте я понимаю процессы, которые непосредственно пересылают сообщение по сети конечному хосту. Графический интерфейс пользователя и высокоуровневая логика написаны на Scheme.

По сути, базовая часть LazyCat является интерпретатором Scheme с дополнительным API. Благодаря использованию Scheme, LazyCat можно легко расширить - например, написать другой интерфейс, добавить функциональность или же использовать его в автоматическом режиме.

Проект находится в разработке и пока не может похвастать большим количеством возможностей. Вот, что сделано на данный момент:

  • Графический интерфейс пользователя на GTK.
  • Выполнение команд на хостах через TCP- и SSH-подключения.
  • Базовый режим "Raw", в котором lazycat отправляет команду на все хосты из списка и отображает необработанный вывод команд.
  • Режим "Diff", при котором результат выполнения команды с каждого хоста сравнивается с результатом выполнения этой же команды с эталонного хоста.
  • Группировка хостов в списке (пока имеет чисто эстетический характер).
  • Сохранение и восстановление списка хостов между сессиями.

В ближайших планах:

  • Отладка.
  • Возможность выбора эталонного хоста перед отправкой команды в Diff-режиме (сейчас выбирается первый хост из списка).
  • Возможность изменять информацию о хосте из графического интерфейса (пока реализовано только API для этого).
  • Возможность отправки сообщений только выбранным хостам из списка, или же группе хостов.
  • Организация списка хостов по типу контакт-листа IM-клиента (за образец думаю взять Pidgin) - статусы, состояния (online/offline) и т.п.
  • Периодический опрос состояния хостов (для отображения их статусов в списке).

Сейчас над проектом работаю я один, just for fun, в свободное от работы время. В связи с этим прогресс идёт достаточно медленно, и проекту не хватает тестирования. Если вас заинтересовал LazyCat и вы можете и хотите поучаствовать в разработке - то вот страница проекта на GitHub, откуда вы можете получить исходный код (под GPLv3) и дополнительную информацию о проекте:

https://github.com/artyom-poptsov/lazycat

- Артём