Added (Linux) file monitor configuration to Fabric script.
Also improved `create_user` to allow overwriting some settings.
This commit is contained in:
		
							parent
							
								
									a732804911
								
							
						
					
					
						commit
						331f775512
					
				
					 4 changed files with 247 additions and 2 deletions
				
			
		
							
								
								
									
										4
									
								
								data/etc/default/rattail
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								data/etc/default/rattail
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | # The following settings affect all Rattail daemons. | ||||||
|  | 
 | ||||||
|  | USER=rattail | ||||||
|  | GROUP=rattail | ||||||
							
								
								
									
										19
									
								
								data/etc/init.d/rattail-filemon_tmpl
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								data/etc/init.d/rattail-filemon_tmpl
									
										
									
									
									
										Executable 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 | ||||||
							
								
								
									
										132
									
								
								data/var/lib/rattail/init.d/filemon
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								data/var/lib/rattail/init.d/filemon
									
										
									
									
									
										Normal 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 | ||||||
|  | 
 | ||||||
|  | : | ||||||
							
								
								
									
										94
									
								
								fabfile.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								fabfile.py
									
										
									
									
										vendored
									
									
								
							|  | @ -26,11 +26,41 @@ import os.path | ||||||
| import shutil | import shutil | ||||||
| 
 | 
 | ||||||
| from fabric.api import * | from fabric.api import * | ||||||
|  | from fabric.contrib.files import exists, upload_template | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| execfile(os.path.join(os.path.dirname(__file__), 'rattail', '_version.py')) | 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 | @task | ||||||
| def release(): | def release(): | ||||||
|     """ |     """ | ||||||
|  | @ -49,9 +79,69 @@ def release(): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @task | @task | ||||||
| def create_user(): | def create_user(overwrite=None): | ||||||
|     """ |     """ | ||||||
|     Create the 'rattail' user account. |     Create the 'rattail' user account. | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     sudo('adduser --system --home /var/lib/rattail --group rattail') |     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') | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar