Added (Linux) file monitor configuration to Fabric script.

Also improved `create_user` to allow overwriting some settings.
This commit is contained in:
Lance Edgar 2013-06-02 10:44:27 -07:00
parent a732804911
commit 331f775512
4 changed files with 247 additions and 2 deletions

4
data/etc/default/rattail Normal file
View file

@ -0,0 +1,4 @@
# The following settings affect all Rattail daemons.
USER=rattail
GROUP=rattail

View file

@ -0,0 +1,19 @@
#! /bin/sh
### BEGIN INIT INFO
# Provides: %(name)s
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: %(desc)s
# Description: Manages the %(desc)s daemon.
### END INIT INFO
DESC="%(desc)s"
NAME=%(name)s
PYTHON=%(envdir)s/bin/python
RATTAIL=%(envdir)s/bin/rattail
RATTAIL_ARGS="--config=%(envdir)s/app/filemon.ini"
. /var/lib/rattail/init.d/filemon

View file

@ -0,0 +1,132 @@
#!/bin/sh
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2012 Lance Edgar
#
# This file is part of Rattail.
#
# Rattail is free software: you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
# more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
# This script is mostly based on the ``/etc/init.d/skeleton`` file from a
# Debian 6 system.
DESC=${DESC:-"Rattail File Monitor"}
NAME=${NAME:-"rattail-filemon"}
SCRIPTNAME=${SCRIPTNAME:-"/etc/init.d/$NAME"}
PIDFILE=${PIDFILE:-"/var/run/rattail/$NAME.pid"}
PYTHON=${PYTHON:-"/usr/bin/python"}
RATTAIL=${RATTAIL:-"/usr/local/bin/rattail"}
RATTAIL_ARGS=${RATTAIL_ARGS:-""}
FILEMON_ARGS=${FILEMON_ARGS:-"--pidfile=$PIDFILE"}
USER=${USER:-"rattail"}
GROUP=${GROUP:-"rattail"}
# Read configuration variable files if present.
[ -r /etc/default/rattail ] && . /etc/default/rattail
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables.
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --pidfile $PIDFILE --exec $PYTHON --user $USER --test --quiet > /dev/null \
|| return 1
start-stop-daemon --start --pidfile $PIDFILE --exec $PYTHON --startas $RATTAIL --chuid $USER --group $GROUP --quiet -- \
$RATTAIL_ARGS filemon $FILEMON_ARGS start \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
$RATTAIL $RATTAIL_ARGS filemon $FILEMON_ARGS stop > /dev/null 2>&1
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:

92
fabfile.py vendored
View file

@ -26,11 +26,41 @@ import os.path
import shutil
from fabric.api import *
from fabric.contrib.files import exists, upload_template
execfile(os.path.join(os.path.dirname(__file__), 'rattail', '_version.py'))
def get_overwrite(overwrite=None):
"""
Obtain a canonical "overwrite" directive.
"""
if overwrite in (True, False):
return overwrite
if overwrite is None:
overwrite = raw_input("Overwrite as needed? [y/N]: ")
overwrite = overwrite.strip().lower()
else:
overwrite = overwrite.lower()
return overwrite.startswith('y')
def prettify(text):
"""
Return a "prettified" version of text.
This is basically copied from ``edbob.util``.
"""
text = text.replace('_', ' ')
text = text.replace('-', ' ')
words = text.split()
return ' '.join([x.capitalize() for x in words])
@task
def release():
"""
@ -49,9 +79,69 @@ def release():
@task
def create_user():
def create_user(overwrite=None):
"""
Create the 'rattail' user account.
"""
overwrite = get_overwrite(overwrite)
with settings(warn_only=True):
result = run('id rattail')
if result.return_code: # user doesn't exist
sudo('adduser --system --home /var/lib/rattail --group rattail')
elif overwrite:
sudo('usermod --home /var/lib/rattail --move-home --shell /bin/false rattail')
@task
def configure_filemon(name=None, desc=None, envdir=None, overwrite=None):
"""
Configure a Rattail File Monitor daemon.
"""
if name is None:
default_name = 'rattail-filemon'
name = raw_input("Enter a name for the service [{0}]: ".format(default_name))
name = name.strip() or default_name
if desc is None:
default_desc = prettify(name.replace('filemon', 'file-monitor'))
desc = raw_input("Enter a description [{0}]: ".format(default_desc))
desc = desc.strip() or default_desc
if envdir is None:
default_envdir = name.replace('-filemon', '')
default_envdir = default_envdir.replace('-', '.')
default_envdir = '/srv/envs/{0}'.format(default_envdir)
envdir = raw_input("Enter a virtual environment path [{0}]: ".format(default_envdir))
envdir = envdir.strip() or default_envdir
overwrite = get_overwrite(overwrite)
if not exists('/etc/default/rattail') or overwrite:
put('data/etc/default/rattail', '/etc/default', use_sudo=True)
sudo('chown root: /etc/default/rattail')
if not exists('/var/lib/rattail'):
create_user(overwrite=True)
if not exists('/var/lib/rattail/init.d'):
sudo('mkdir /var/lib/rattail/init.d', user='rattail')
if not exists('/var/lib/rattail/init.d/filemon') or overwrite:
put('data/var/lib/rattail/init.d/filemon', '/var/lib/rattail/init.d', use_sudo=True)
sudo('chown rattail: /var/lib/rattail/init.d/filemon')
script = '/etc/init.d/{0}'.format(name)
if not exists(script) or overwrite:
upload_template('data/etc/init.d/rattail-filemon_tmpl', script,
context=locals(), use_sudo=True, mode=0755)
sudo('chown root: {0}'.format(script))
sudo('insserv {0}'.format(script))
if not exists('/var/run/rattail'):
sudo('mkdir /var/run/rattail')
sudo('chown rattail: /var/run/rattail')