glop 0.2.5

Glue Language for OPerations
Documentation
// This agent installs and operates Seafile (https://www.seafile.com)

// Init message is always sent on initial agent startup.
// Install seafile.

when (message init) #!/bin/bash
set -e

apt-get update
apt-get install -y --no-install-recommends wget python2.7 python-setuptools python-imaging sqlite3

cd
wget -O seafile-server.tar.gz https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_6.0.8_x86-64.tar.gz
tar xzf seafile-server.tar.gz
~/seafile-server-6.0.8/setup-seafile.sh auto

# Default settings
glop var set seafile.port 8082

glop var set installed true
!#

// Start seafile if installed and not running.

when (message start, is_set installed, is_unset running) #!/bin/bash
set -e
~/seafile-server-latest/seafile.sh start
glop var set running true
!#

// Not starting seafile if already running (needs simplification).

when (message start, is_set running) #!/bin/bash
set -e
echo "already started"
!#

// Stop seafile if installed and running.

when (message stop, is_set installed, is_set running) #!/bin/bash
set -e
~/seafile-server-latest/seafile.sh stop
glop var unset running
!#

// Not stopping seafile if not running (needs simplification).

when (message stop, is_unset running) #!/bin/bash
set -e
echo "already stopped"
!#

/*********************************************************************

// Future plans

// Detect unexpected server stop (crash, manually stopped, etc.)
// Why? This could be used to trigger an agent that operates seafile for us!

when (elapsed 15s, is_set running) #!/bin/bash
set -e
PID=$(cat ~/pids/seaf-server.pid)
if [ ! -e /proc/${PID}/exe ]; then
	echo "seafile no longer running"
	glop var unset running
fi
PROC_EXE=$(basename $(readlink /proc/${PID}/exe))
if [ "$PROC_EXE" != "seaf-server" ]; then
	echo "seafile no longer running; stale pidfile detected"
	glop var unset running
fi
!#

// Detect unexpected server start (crash, manually stopped, etc.)
// Why? This could be used to trigger an agent that operates seafile for us!

when (elapsed 15s, is_unset running) #!/bin/bash
set -e
PID=$(cat ~/pids/seaf-server.pid)
if [ ! -e /proc/${PID}/exe ]; then
	exit 0
fi
PROC_EXE=$(basename $(readlink /proc/${PID}/exe))
if [ "$PROC_EXE" != "seaf-server" ]; then
    exit 0
	glop var unset running
fi
echo "seafile is actually running"
glop var set running true
!#

// Introductions are a way for agents to discover each other and work together.
// Here we introduce seafile to a frontend reverse proxy as a backend. seafile
// sends its address and port, so that the frontend may route requests to it.

when (message intro,
      intro.self.role == backend,
      intro.peer.role == frontend) #!/bin/bash
set -e
peer=$(glop msg get intro.peer.name)
myip= # magic!
glop var set frontend ${peer}
glop msg send ${peer} backend addr=${myip} port=${glop var get seafile.port}
!#

// Configuring seafile.
// A config message can trigger operations and mutate state. This could be done
// by the user agent (glop agent send seafile config ...) or an orchestrating
// autonomous agent introduced to seafile.

when (message config) #!/bin/bash
set -e

glop var set seafile config.seafile

# update actual config file here
# restart the service

glop msg send self configured
!#

// No frontend; nothing to do (this needs simplification)

when (message configured, is_unset frontend) #!/bin/bash
set -e
!#

// Update frontend when relevant information has changed

when (message configured, is_set frontend) #!/bin/bash
set -e
peer=$(glop msg get intro.peer.name)
myip= # magic!
glop msg send ${peer} backend addr=${myip} port=${glop var get seafile.port}
!#

*********************************************************************/