Serval DNA Utilities
====================
[Serval Project][], February 2013

This directory contains utilities that accompany [Serval DNA][]:

 * [`rhizome_mirrord`][] is a [Python 2.7][] script that continuously extracts
   Rhizome bundles from a local Rhizome store into a mirror directory, and
   optionally unpacks Zip and Tar payloads into a separate directory.

 * [`serval_maps_push.sh`][] is a Shell script designed to be invoked by
   [`rhizome_mirrord`][] whenever in unpacks a Zip or Tar bundle.  It copies the
   newly unpacked contents to the [Serval Maps testing server][] using
   [rsync(1)][], then prods the testing server to process them by making an
   HTTP request to a particular URL using [curl(1)][].

These two scripts were originally created to inject Rhizome traffic from New
Zealand Red Cross's KiwiEx 2013 field trial exercise into the Serval Maps
visualisation server, as a demonstration of how Rhizome can be used to transmit
situational awareness field reports back to base.

The [`rhizome_mirrord`][] script has been designed in a general fashion, and is
suitable for use in other deployments that require a similar mirror of Rhizome
content.

Instructions for use
--------------------

 1. The Rhizome mirror script must be executed on a server that is running as a
    [Serval DNA][] node that receives Rhizome bundles for visualisation in
    Serval Maps.  This server must be running a modern installation of Linux
    and must have continuous Internet access in order to communicate directly
    with the [Serval Maps testing server][].

 2. Ensure that [Git][], [Python 2.7][], [rsync][] and [curl][] are installed
    on the server.

 3. Download a copy of the [Serval DNA][] source code onto the server, for
    example by fetching a read-only clone of the Git repository from GitHub
    and checking out the *development* branch:

        git clone git://github.com/servalproject/serval-dna.git
        cd serval-dna
        git checkout development

 4. Build the [Serval DNA][] `servald` executable by following the [Serval DNA
    build instructions][].

 6. Create a directory to use as the Serval DNA instance directory:

        mkdir /var/local/serval-node
        export SERVALINSTANCE_PATH=/var/local/serval-node

 7. [Configure Serval DNA][] to use the proper network interfaces, to log
    to a suitable log file, etc.

 8. Create directories to hold the Rhizome mirror and the unpacked Zip
    files:

        mkdir /var/local/rhizome-mirror
        mkdir /var/local/rhizome-unpacked

 9. Edit the [`serval_maps_push.sh`][] script to use the suitable Serval Maps
    visualisation page, by changing its `TARGET` variable from `testing` to,
    for example, `kiwiex-2013`.

 9. Start the [Serval DNA][] daemon process:

        ./servald start

 10. Start the Rhizome mirror daemon to update the mirror every minute:

        ./utilities/rhizome_mirrord \
            --interval 60 \
            --servald ./servald \
            --instance /var/local/serval-node \
            --mirror-dir /var/local/rhizome-mirror \
            --unpack-dir /var/local/rhizome-unpacked \
            --filter-name 'nz_redcross_*.xml.instance.sam.serval' \
            --exec-on-unpack ./utilities/serval_maps_push.sh \
            --log-to-stdout

   This command will only extract bundles with names matching the
   `--filter-name` glob pattern, so adjust that pattern to match the names of
   the files produced by the application being visualised.

   The `--log-to-stdout` option produces a log of activity on standard output,
   which may be redirected to a file if desired.

   The daemon reports errors on standard output and continues execution, so
   standard output may also be redirected to a file if desired, possibly the
   same as standard error.

   The daemon is relatively untested, and may terminate if there is a code
   error.  It must be watched and restarted if necessary.


[Serval Project]: http://www.servalproject.org/
[Serval DNA]: https://github.com/servalproject/serval-dna
[`rhizome_mirrord`]: ./rhizome_mirrord
[`serval_maps_push.sh`]: ./serval_maps_push.sh
[Serval Maps testing server]: http://maps.servalproject.org/testing/
[Serval DNA build instructions]: ../INSTALL.md
[Configure Serval DNA]: ../doc/Servald-Configuration.md
[Git]:http://git-scm.com/
[Python 2.7]: http://www.python.org/download/releases/2.7/
[rsync]: http://rsync.samba.org/
[rsync(1)]: http://rsync.samba.org/ftp/rsync/rsync.html
[curl]: http://curl.haxx.se/
[curl(1)]: http://curl.haxx.se/docs/manpage.html
