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

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 ключей, каналов и сообщений.

- Артём

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

- Артём