#applications #health-check #process #group #container #configuration #system

bin+lib riffol

Riffol is a supervising process that can run as a traditional daemon on Unix-like systems or as an init system for containers

5 unstable releases

Uses old Rust 2015

0.3.0 Oct 19, 2018
0.2.1 Oct 18, 2018
0.2.0 Oct 11, 2018
0.1.2 Oct 5, 2018
0.1.1 Oct 2, 2018

#514 in Configuration

BSD-2-Clause

80KB
1.5K SLoC

Riffol

Riffol is a supervising process that can run as a traditional daemon on Unix-like systems or as an init system for containers (such as tini).

Riffol can be configured by creating application groups that consist of applications and health checks.

[source]

   +--------+
   | Riffol |
   +----+---+
        |
        |
        |
 +------v------+
 | Application |
 |    Group    +-------+-------------+
 +------+------+       |             |
        |              |             |
        |              |             |
        |              |             |
 +------v------+   +---v----+   +----v-----+
 | Application |   | Health |   | Resource |
 +-------------+   | Check  |   |  Limits  |
                   +--------+   +----------+

Riffol uses the unified configuration model from https://github.com/riboseinc/event-configuration-models for its configuration syntax definition, startup configuration and also runtime configuration.

Riffol is implemented in Rust.

Building From Source

Make sure there is a Rust environment installed. Otherwise follow the Rust installation guide.

[source,shell]

cargo install --git https:/github.com/riboseinc/riffol

This command will build a riffol binary and store it in the bin directory under $CARGO_HOME - usually ~/.cargo/bin/riffol.

Usage

riffol [-f config-file]

Riffol requires a configuration file. The default location of this file is /etc/riffol.conf.

This location can be specified either via the RIFFOL_CONFIG environment variable or by using the -f command line flag.

Configuration

Init

The main configuration to create application groups:

[source]

init name {
  application_groups [
    applicationgroup.name
  ]
}

E.g.:

[source]

init web {
    application_groups ["applicationgroup.webstack"]
}

Application Group

[source]

application_group name {
  applications [
    "application.name"
  ]
}

E.g.:

[source]

application_group webstack {
  applications [
    "application.db"
    "application.www"
  ]
}

Application

[source]

application "name" {
  mode application_mode
  requires [other applications]
  start [executable start args]
  stop [executable stop args]
  pidfile file
  dir working_directory
  env {
    new var1 value
    new var2 value
    pass oldname newname
  }
  env_file env_filename
  stdout stream_destination
  stderr stream_destination
  uid int
  gid int
  healthchecks [
    "healthcheck.name"
  ]
}

application_mode can be one of oneshot, simple or forking

Applications are started with a clean environment. Environment variables can be added with env and env_file fields.

env values can take two forms. env new <name> <value> creates a new variable with the supplied value. env pass <oldname> <newname> creates a new variable named newname with the value taken from Riffol's environment variable oldname.

[source]

env {
    new {
        VAR1 value1
        VAR2 value2
    }
    pass {
        ENV1 VAR3
        ENV2 VAR4
    }
}

This creates two new environment variables, VAR1 and VAR2 with values value1 and value2 respectively. It also passes the variables ENV1 and ENV2 into new variables VAR3 nad VAR4 respectively.

env_file <filename> reads a file of environment variables, one per line in the following format:

[source]

VAR1=value1
VAR2=value2
VAR3
VAR4=

VAR1 and VAR2 are set to value1 and value2 respectively. VAR3 and VAR4 are set to the empty value "".

The env_file field is processed before the env field so variables set up using env will override those read from env_file.

stream_destination can be one of: [source]

file [
    filename
]

[source]

syslog {
    socket unix_sock_address
    facility syslog_facility
    severity syslog_severity
}

[source]

rsyslog {
    address remote_inet_address
    local local_inet_address
    facility syslog_facility
    severity syslog_severity
}

syslog_facility is one of kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0, local1, local2, local3, local4, local5, local6 or local7. (default daemon)

syslog_severity is one of emerg, alert, crit, err, warning, notice, info or debug (default debug)

healthcheckfail can be one of start, restart or stop. E.g.:

[source]

application www {
  exec "/etc/init.d/http"
  dir "/var/www"
  env {
    new var1key var1value
    new var2key var2value
    pass oldname newname
  }
  env_file "/etc/httpd/morevars"
  start start
  stop stop
  restart restart
  stdout file "/var/log/riffol_www.log"
  stderr syslog {
  }
  uid 0
  gid 0
  healthchecks [
    "healthcheck.www"
  ]
  healthcheckfail restart
}

Health Check

[source]

healthcheck name {
  checks [
    "class://value"
  ]
  interval int
  timeout int
}

There are several checks classes:

. df, disk free space . proc, process name . tcp, TCP connection . udp, UDP connection . http, establish a http connection . https, establish a https connection

Parameters:

. interval, the interval of the check defined in seconds . timeout, the timeout of network connections defined in seconds

E.g.:

[source]

healthcheck db {
  checks [
    "df:///var/lib/mysql:512"
    "proc://mysqld",
    "tcp://127.0.0.1:3306"
  ]
  interval 60
  timeout 10
}

Resource Limits

[source]

limits name {
  max_procs int
  max_mem int
}

e.g.:

[source]

limits db {
  max_procs 4
  max_mem 1024
}

... Riffol?

https://en.wikipedia.org/wiki/Salmon_run#The_spawning

The eggs of a female salmon are called her roe. To lay her roe, the female salmon builds a spawning nest, called a redd, in a riffle with gravel as its streambed. A riffle is a relatively shallow length of stream where the water is turbulent and flows faster.

By spelling "riffol" with an O, we are putting the chemical symbol for oxygen in the word: we are oxidising Riffol. Which makes sense, since Riffol is in Rust.

Dependencies

~12–22MB
~312K SLoC