This is the first "usable" snapshot of Beowulf John (another name, someone ?)
Copyright (C) 1999 Professor Falken <prfalken@freeshell.org>

Currently, only the server is implemented, but you can emulate clients by
telneting the box running the server to the listening port.

A lot of cleanup is to be done, and there are many bugs, particularly when
removing nodes from the cluster, a line of data is emitted and no node
receives it...
Also, server termination is everything but clean, and the death of a child
server or the demux process leaves a lot of file descriptors open, and even
leaves the temporary fifos on the disk.

Here's a succint functioning aglorygram of the server:

/-------\           /-------\
| shell |           | shell |   the shell launches 'beo_server xxx'
\-------/           \-------/
    |                   |
/-------\               v
| data  |         /------------\
| gene- |         | beo_server | initial state of beo_server
| rator |         \------------/
\-------/               |
   vv                  /v beo_server forks demux process
   ||                -/ |
   ||               /   \
   ||             -<     v
   ||            /     ---------
   ||          --   ->/ listen / beo_server listens on port xxx
   ||         /     |----------
   ||         |     |     |
   || f       v     ^ ----------
   || i       |     | | accept | connection attempted from client
   || f       |     ^ ----------
   || o       v     |    |  \   beo_server forks a child server for the client,
   ||         |     --<--+   \  then returns to listening on xxx, & so on
   ||         |               \
   ||         |                \         ::
   ||         v     fifo    /---------\  : socket   /--------\ pipe/--------\ :
   ||         | /==========>| child 1 |>===========>| node 1 |>===>| john 1 | :
   ||         / ||          \---------/  :          \--------/     \--------/ :
   ||        /  ||                       ::
   ||     /-------\         /---------\  : socket   /--------\ pipe/--------\ :
   \=====>| demux |>=======>| child 2 |>===========>| node 2 |>===>| john 2 | :
          \------ /  fifo   \---------/  :          \--------/     \--------/ :
              vv                         ::
              ||  fifo      /---------\  : socket   /--------\ pipe/--------\ :
              \============>| child n |>===========>| node n |>===>| john n | :
                            \---------/  :          \--------/     \--------/ :
                                         ::
--- : execution streams                  :network
=== : data streams
 : hosts limits


And, on the clients johns's side:

::
: /--------\    :                                  :
: | john 1 |=<===>===\                             :
: \--------/    :   ||                             :
::   ||             /----------\    :
: /--------\    :   || NFS     /<=>| john.pot |    :
: | john 2 |=<===>==||==<===>=||   \----------/    :
: \--------/    :   ||        ||                   :
::   ||        ||   /-------------\ :
: /--------\    :   ||        \==<=| passwd file | :
: | john n |=<===>===/             \-------------/ :
: \--------/    :                                  :
:::

The client code is to be done, but it shouldn't be very hard to do.

Also, I intend to patch john's sources to make it reload the john.pot and
the password files each time another node has found a password.


To run, type:

    beo_server xxx

you can test by doing :

    telnet <the host running the server> xxx

where xxx is the port number you have chosen to make the server listen to.

Then, you can send data by hand to the cluster by typing:

    cat > master.node

or do any pipe output operations on this fifo.

All data entered in master.node will be distributed among all the nodes in
the cluster.


Have phun !
                    Professor Falken <prfalken@freeshell.org>

