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

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

- Артём