суббота, 16 апреля 2011 г.

Удаленное выполнение команд через SSH в Ерланге

While designing my monitoring tool, and working and treregex, I found the ssh documentation and realize that it can be very useful for my tool.

A simple question needed to be answered, is the ssh module able to easily spawn a remote process for me ?
To verify, I tried to build a remote tail module called ssh_tail :)

-module(ssh_tail).
        
-export([tail/3]).
-define(TIMEOUT, 5000). 

tail(Host, User, Pass) ->
 case ssh_cm:connect(Host, 22, [{user_dir, "/var/tmp/ssh"}, {user, User}, {password, Pass}]) of
  {ok, CM} ->
   session(CM, fun(X) -> io:format("-ssh: ~p~n", [X]) end);

  Error ->
   Error
 end.

From the ssh documentation user_dir let you decide where you want to store keys, from my experience it's better to use a separate directory from the ~/.ssh.
It happens that latest version of ssh add meta information to their files that the ssh module can't handle. (more on this in another post).

For the test I wanted to do a "tail -f" on a specific file ie "/var/log/syslog".
session(CM, Callback) ->
 case ssh_cm:session_open(CM, ?TIMEOUT) of
  {ok, Channel} ->
   case ssh_cm:shell(CM, Channel) of 
    ok ->
     ssh_cm:send(CM, Channel, "tail --follow=name /var/log/syslog\n"),
     ssh_loop(CM, Channel, Callback);

    Error ->
     error_logger:error_msg("Error: ~p~n", [Error])
   end;
  Error ->
   error_logger:error_msg("Session Error: ~p~n", [Error])
 end.

ssh_cm is responsible for starting a shell, and sending commands to the remote shell process. I send
tail --follow=name /var/log/syslog\n

Don't forget the final '\n' character, since you won't get any results if you don't send it :p
(I didn't think of that while testing for the first time and think that the code didn't work at all...)
ssh_loop(CM, Channel, Callback) ->
 receive
  stop ->
   % Closing channel
   % ssh_cm:detach(CM, ?TIMEOUT),
   ssh_cm:close(CM, Channel);

  {ssh_cm, CM, {data, _Channel, 0, Data}} ->
   Callback(Data), 
   ssh_loop(CM, Channel, Callback);

  {ssh_cm, CM, {data, Channel, Type, Data}} ->
   io:format("extended (~p): ~p~n", [Type, Data]),
   ssh_loop(CM, Channel, Callback);

  {ssh_cm, CM, {closed, _Channel}} ->
   ssh_cm:detach(CM, ?TIMEOUT);
   
  E ->
   error_logger:info_msg("[~p] Received: ~p~n", [?MODULE, E]),
   ssh_loop(CM, Channel, Callback) 
 end.

ssh_cm sends various message to the calling process, more important tuples are
{ssh_cm, CM, {data, _Channel, 0, Data}}

Data holds what you want, and in our case a line sent by the tail process...
The callback defined at the beginning is then executed:
tail(Host, User, Pass) ->
 case ssh_cm:connect(Host, 22, [{user_dir, "/var/tmp/ssh"}, {user, User}, {password, Pass}]) of
  {ok, CM} ->
   session(CM, 
    fun(X) ->  % Our Callback 
     io:format("-ssh: ~p~n", [X]) % simple display...
    end);

  Error ->
   Error
 end.


To conclude this simple module is able to spawn a remote "tail -f" using a ssh connection and using a callback function on every data received.

The code was designed from the ssh_ssh module that you can find in the ssh module source code, because the ssh documentation is really sparse for now...
Оригинал

воскресенье, 10 апреля 2011 г.

Работающий Riak

В компании, которой я работаю запущен Riak а это веб интерфейс к нему

Nitrogen and Riak

Как использовать Riak в качестве БД для веб-приложений на пример в вебфреймворке Nitrogen.
SlideBlast

О королях и капусте

Блокнот в интернете

yaws


yaws

Yaws is a HTTP high perfomance 1.1 webserver particularly well suited for dynamic-content web applications. Two separate modes of operations are supported:
  • Standalone mode where Yaws runs as a regular webserver daemon. This is the default mode.
  • Embedded mode where Yaws runs as an embedded webserver in another Erlang application.
Yaws is entirely written in Erlang, and furthermore it is a multithreaded webserver where one Erlang lightweight process is used to handle each client.
The main advantages of Yaws compared to other Web technologies are performance and elegance. The performance comes from the underlying Erlang system and its ability to handle concurrent processes in an efficent way. Its elegance comes from Erlang as well. Web applications don't have to be written in ugly ad hoc languages.

Haxe что это?

http://haxe.org/doc/intro

Введение

haXe (произносится как хэкс) - язык программирования с открытым исходным кодом
В отличие от большинства других современных языков, привязанных к своей платформе (как Java к JVM, C# к .Net, ActionScript к Flash Player), haXe - мультиплатформенный язык.
В терминологии haXe доступные языку платформы называются целевыми платформами, или просто целями - targets.
Сейчас haXe позволяет создавать программы для следующих платформ:
  • Javascript : Можно скомпилировать программу на haXe в отдельный .js-файл. Доступно строготипизированное браузерное DOM API с поддержкой автодополнения, все зависимости разрешаются при компиляции.
  • Flash : Можно скомпилировать программу на haXe в .swf-файл. haXe совместим с версиями Flash Players с 6ой по 10ую, либо со "старым" Flash 8 API, либо с современным AS3/Flash9+ API. haXe позволяет увеличить производительность и использовать нестандартные особенности языка при разработке Flash содержимого.
  • NekoVM : Можно скомпилировать программу на haXe в байткод виртуальной машины Neko - как для server-side программирования, такого как динамические вебстраницы (используяmod_neko для Apache), так и для command-line или desktop приложений, поскольку NekoVM может быть встроена (embedded) и дополнена сторонними DLL.
  • PHP : Можно скомпилировать программу на haXe в .php-файл. Это позволяем использовать строготипизированный высокоуровневый язык, каким является haXe, сохранив полную совместимость с существующей серверной платформой и библиотеками.
  • C++ : Можно сгенерировать код на C++ из кода на haXe, включая Makefile. Это очень полезно для native приложений, например для разработки под iPhone.
  • C# и Java цели скоро будут доступны! (from @cwaneck)
Основа идеологии haXe - дать возможность разработчику выбрать лучшую платформу для его задачи. В общем случае, это не так просто, поскольку у каждой платформы собственные языки программирования. haXe обеспечит вас:
  • стандартизированным языком со множеством возможностей
  • стандартной библиотекой (включая DateXmlMath...), с одинаковым поведением на любой из целевых платформ
  • платформенно-зависимой библиотекой : полное API выбранной платформы доступно в haXe
haXe может быть полезен из-за множества причин. Надеемся, вам будет интересно узнать каких
Хотите знать всё о haXe ? Прочтите документацию.