Getting Started

Supported distros

Bonsai is packaged for Alpine Linux:

$ doas apk add bonsai

Manual installation

Bonsai depends on the Hare toolsuite: hare, hare-json, hare-ev

$ git clone https://git.sr.ht/~stacyharper/bonsai
$ doas make install -C bonsai

Commands

The service is a daemon that maintain the state, and receive events and context changes from the client.

$ bonsaid -t my/bonsaid/tree.json -D

The clients connect to the service using a Unix socket.

$ bonsaictl -e my_event_name # trigger event
$ bonsaictl -c foo=bar toto=titi # change context

Source file

Definitions

Bonsai is a Finite State Machine structured as a tree. It has been designed to trigger commands when successive events and/or a precise context is accepted.

There is 4 kind of transition with specific acceptance rules :

  • event transition: The received event name match the transition one

  • context transition: The state context match the transition one

  • exec transition: The transition command is run and succeed

  • delay transition: The state wait for the delay transition duration. No other accepted event is received while waiting

The state will transition following every accepted transition. If there is no more available transition, the state goes back to the initial position.

Events aren’t recursives

Event input can trigger one or zero event transition. The state will then follow every accepted execs, contexts or delays transitions.

Exec transitions

Exec transition commands are run synchronously. If you don’t care about the command status or if you use the command as final trigger, and don’t want to hold the bonsai daemon, you should use [“setsid”, “-f”, …].

Hole transitions

Context transitions can be used as “holes” if you don’t specify context values, because it will always match. This is particulary usefull just after exec transition that can fail.

How delay are cancelled

If the state machine is waiting while receiving an event or a context update, it check if there is a accepting event or context transition available. Otherwise it continue to wait.