Remove rattail.fablib subpackage

this logic was moved to the rattail-fabric project
This commit is contained in:
Lance Edgar 2018-02-24 16:49:03 -06:00
parent a9f4d3675e
commit fe60179ba6
31 changed files with 0 additions and 2716 deletions

View file

@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library
This subpackage contains various tasks and associated functions for use with
Fabric deployment and maintenance.
"""
from __future__ import unicode_literals, absolute_import
from .core import put, upload_template, make_deploy, mkdir, rsync
from .core import make_system_user, set_timezone, agent_sudo
from .core import get_debian_version, get_ubuntu_version
from .python import workon, cdvirtualenv

View file

@ -1,142 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for Apache web server
"""
from __future__ import unicode_literals, absolute_import
import re
from fabric.api import sudo, abort
from rattail.fablib import apt
def install():
"""
Install the Apache web service
"""
apt.install('apache2')
def get_version():
"""
Fetch the version of Apache running on the target system
"""
result = sudo('apache2 -v')
if result.succeeded:
match = re.match(r'^Server version: Apache/(\d+\.\d+)\.\d+ \(.*\)', result)
if match:
return float(match.group(1))
def install_wsgi(python_home=None, python3=False):
"""
Install the mod_wsgi Apache module, with optional ``WSGIPythonHome`` value.
"""
if python3:
apt.install('libapache2-mod-wsgi-py3')
else:
apt.install('libapache2-mod-wsgi')
if python_home:
if get_version() == 2.2:
sudo('echo WSGIPythonHome {} > /etc/apache2/conf.d/wsgi'.format(python_home))
else: # assuming 2.4
sudo('echo WSGIPythonHome {} > /etc/apache2/conf-available/wsgi.conf'.format(python_home))
enable_conf('wsgi')
def enable_conf(*names):
"""
Enable the given Apache configurations
"""
for name in names:
sudo('a2enconf {}'.format(name))
def enable_mod(*names):
"""
Enable the given Apache modules
"""
for name in names:
sudo('a2enmod {}'.format(name))
def enable_site(*names):
"""
Enable the given Apache site(s)
"""
for name in names:
sudo('a2ensite {}'.format(name))
def deploy_conf(deployer, local_path, name, enable=False):
"""
Deploy a config snippet file to Apache
"""
version = get_version()
if version == 2.2:
deployer(local_path, '/etc/apache2/conf.d/{}.conf'.format(name))
else:
deployer(local_path, '/etc/apache2/conf-available/{}.conf'.format(name))
if enable:
enable_conf(name)
def deploy_site(deployer, local_path, name, enable=False, **kwargs):
"""
Deploy a file to Apache sites-available
"""
apache_version = get_version()
if apache_version == 2.2:
path = '/etc/apache2/sites-available/{}'.format(name)
else:
path = '/etc/apache2/sites-available/{}.conf'.format(
'000-default' if name == 'default' else name)
context = kwargs.pop('context', {})
context['apache_version'] = apache_version
deployer(local_path, path, context=context, **kwargs)
if enable and name != 'default':
enable_site(name)
def restart():
"""
Restart the Apache web service
"""
sudo('service apache2 restart')
def start():
"""
Start the Apache web service
"""
sudo('service apache2 start')
def stop():
"""
Stop the Apache web service
"""
sudo('service apache2 stop')

View file

@ -1,114 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for the APT package system
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import sudo, settings
from fabric.contrib.files import append
from rattail.fablib import make_deploy, get_debian_version, get_ubuntu_version
deploy = make_deploy(__file__)
def install(*packages, **kwargs):
"""
Install one or more packages via ``apt-get install``.
"""
frontend = kwargs.get('frontend', 'noninteractive')
target = kwargs.get('target_release')
target = '--target-release={}'.format(target) if target else ''
force_yes = ' --force-yes' if kwargs.get('force_yes') else ''
sudo('DEBIAN_FRONTEND={} apt-get --assume-yes {}{} install {}'.format(
frontend, target, force_yes, ' '.join(packages)))
def purge(*packages):
"""
Uninstall and purge config for given packages
"""
sudo('apt-get --assume-yes purge {}'.format(' '.join(packages)))
def update():
"""
Perform an ``apt-get update`` operation.
"""
sudo('apt-get update')
def add_repository(repo):
"""
Add a new APT repository
"""
sudo('add-apt-repository --yes {}'.format(repo))
update()
def add_source(entry):
"""
Add a new entry to the apt/sources.list file
"""
append('/etc/apt/sources.list', entry, use_sudo=True)
update()
def dist_upgrade(frontend='noninteractive'):
"""
Perform a full ``apt-get dist-upgrade`` operation.
"""
update()
sudo('DEBIAN_FRONTEND={} apt-get --assume-yes dist-upgrade'.format(frontend))
def configure_listchanges():
"""
Configure apt listchanges to never use a frontend.
"""
deploy('apt/listchanges.conf', '/etc/apt/listchanges.conf')
def install_emacs():
"""
Install the Emacs editor
"""
with settings(warn_only=True):
result = sudo('which emacs')
if result.succeeded:
return
emacs = 'emacs-nox'
debian_version = get_debian_version()
if debian_version:
if debian_version < 8:
emacs = 'emacs23-nox'
else:
ubuntu_version = get_ubuntu_version()
if ubuntu_version and ubuntu_version < 16:
emacs = 'emacs23-nox'
install(emacs, 'emacs-goodies-el')

View file

@ -1,74 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for Let's Encrypt certbot
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import sudo, cd, abort
from fabric.contrib.files import exists
from rattail.fablib import apt, get_debian_version
def install(source=False):
"""
Install the Let's Encrypt certbot utility
"""
if source:
if not exists('/usr/local/src/certbot'):
with cd('/usr/local/src'):
sudo('git clone https://github.com/certbot/certbot')
sudo('ln --symbolic --force /usr/local/src/certbot/certbot-auto /usr/local/bin/certbot')
else:
version = get_debian_version()
# debian 7 wheezy
if 7 <= version < 8:
if not exists('/usr/local/src/certbot'):
with cd('/usr/local/src'):
sudo('git clone https://github.com/certbot/certbot')
sudo('ln --symbolic --force /usr/local/src/certbot/certbot-auto /usr/local/bin/certbot')
# debian 8 jessie
elif 8 <= version < 9:
apt.add_source('deb http://ftp.debian.org/debian jessie-backports main')
apt.install('python-certbot-apache', target_release='jessie-backports')
# debian 9 stretch, or later
elif version >= 9:
apt.install('python-certbot-apache')
# other..? will have to investigate when this comes up
else:
abort("don't know how to install certbot on debian version {}".format(version))
def certonly(*domains):
"""
Obtain SSL certificates
"""
domains = ['--domain {}'.format(domain) for domain in domains]
sudo('certbot certonly --noninteractive --apache {}'.format(' '.join(domains)))

View file

@ -1,47 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric lib for Composer (PHP dependency manager)
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import sudo
from fabric.contrib.files import exists
from rattail.fablib import make_deploy
deploy = make_deploy(__file__)
def install_composer(user=None):
"""
Install `composer.phar` in current directory
"""
if not exists('composer.phar'):
deploy('composer/install-composer.sh', 'install-composer.sh')
sudo('./install-composer.sh')
sudo('rm install-composer.sh')
if user:
sudo('chown {}: composer.phar'.format(user))

View file

@ -1,281 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2018 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Core Fabric Library
"""
from __future__ import unicode_literals, absolute_import
import os
import re
import tempfile
import six
from fabric.api import sudo, run, cd, local, env, settings, put as fab_put
from fabric.contrib.files import exists, append, upload_template as fab_upload_template, is_link
from mako.template import Template
def get_debian_version():
"""
Fetch the version of Debian running on the target system.
"""
version = run('cat /etc/debian_version')
match = re.match(r'^(\d+\.\d+)$', version)
if match:
return float(match.group(1))
def get_ubuntu_version():
"""
Fetch the version of Ubuntu running on the target system
"""
info = run('cat /etc/lsb-release')
match = re.search(r'DISTRIB_RELEASE=(\d+\.\d+)', info)
if match:
return float(match.group(1))
def mkdir(paths, owner='root:root', mode=None):
"""
Recursively make one or more directories.
"""
if isinstance(paths, six.string_types):
paths = [paths]
sudo('mkdir --parents {0}'.format(' '.join(paths)))
if owner != 'root:root':
if ':' not in owner:
owner = '{0}:{0}'.format(owner)
sudo('chown {} {}'.format(owner, ' '.join(paths)))
if mode is not None:
sudo('chmod {0} {1}'.format(mode, ' '.join(paths)))
def make_system_user(name='rattail', home='/srv/rattail', uid=None, shell=None):
"""
Make a new system user account, with the given home folder and shell path.
"""
with settings(warn_only=True):
result = sudo('getent passwd {0}'.format(name))
if result.failed:
uid = '--uid {0}'.format(uid) if uid else ''
shell = '--shell {0}'.format(shell) if shell else ''
sudo('adduser --system --home {0} --group {1} {2} {3}'.format(home, name, uid, shell))
def set_timezone(timezone):
"""
Set the system timezone to the given value, e.g. 'America/Chicago'.
"""
sudo('echo {} >/etc/timezone'.format(timezone))
if is_link('/etc/localtime'):
sudo('ln --symbolic --force /usr/share/zoneinfo/{} /etc/localtime'.format(timezone))
else:
sudo('cp /usr/share/zoneinfo/{} /etc/localtime'.format(timezone))
def agent_sudo(cmd, user=None):
"""
Run a 'sudo' command on the target server, with full agent forwarding.
"""
with settings(forward_agent=True):
sudo('SSH_AUTH_SOCK=$SSH_AUTH_SOCK {}'.format(cmd), shell=False, user=user)
def put(local_path, remote_path, owner='root:root', **kwargs):
"""
Put a file on the server, and set its ownership.
"""
if 'mode' not in kwargs:
kwargs.setdefault('mirror_local_mode', True)
kwargs['use_sudo'] = True
fab_put(local_path, remote_path, **kwargs)
sudo('chown {0} {1}'.format(owner, remote_path))
def upload_template(local_path, remote_path, owner='root:root', **kwargs):
"""
Upload a template to the server, and set its ownership.
"""
if 'mode' not in kwargs:
kwargs.setdefault('mirror_local_mode', True)
kwargs['use_sudo'] = True
fab_upload_template(local_path, remote_path, **kwargs)
sudo('chown {0} {1}'.format(owner, remote_path))
def upload_mako_template(local_path, remote_path, context={}, **kwargs):
"""
Render a local file as a Mako template, and upload the result to the server.
"""
template = Template(filename=local_path)
temp_dir = tempfile.mkdtemp(prefix='rattail.fablib.')
temp_path = os.path.join(temp_dir, os.path.basename(local_path))
with open(temp_path, 'wb') as f:
f.write(template.render(env=env, **context))
os.chmod(temp_path, os.stat(local_path).st_mode)
put(temp_path, remote_path, **kwargs)
os.remove(temp_path)
os.rmdir(temp_dir)
class Deployer(object):
def __init__(self, deploy_path, last_segment='deploy'):
if not os.path.isdir(deploy_path):
deploy_path = os.path.abspath(os.path.join(os.path.dirname(deploy_path), last_segment))
self.deploy_path = deploy_path
def __call__(self, local_path, remote_path, **kwargs):
self.deploy(local_path, remote_path, **kwargs)
def full_path(self, local_path):
return '{}/{}'.format(self.deploy_path, local_path)
def local_exists(self, local_path):
return os.path.exists(self.full_path(local_path))
def deploy(self, local_path, remote_path, **kwargs):
local_path = self.full_path(local_path)
context = kwargs.pop('context', {})
if local_path.endswith('.template'):
upload_template(local_path, remote_path, context=env, **kwargs)
elif local_path.endswith('.mako'):
upload_mako_template(local_path, remote_path, context=context, **kwargs)
else:
put(local_path, remote_path, **kwargs)
def sudoers(self, local_path, remote_path, mode='0440', **kwargs):
self.deploy(local_path, '/tmp/sudoers', mode=mode)
sudo('mv /tmp/sudoers {0}'.format(remote_path))
def apache_site(self, local_path, name, **kwargs):
from rattail.fablib.apache import deploy_site
deploy_site(self, local_path, name, **kwargs)
def apache_conf(self, local_path, name, **kwargs):
from rattail.fablib.apache import deploy_conf
deploy_conf(self, local_path, name, **kwargs)
def certbot_account(self, uuid, localdir='certbot/account'):
"""
Deploy files to establish a certbot account on target server
"""
localdir = localdir.rstrip('/')
paths = [
'/etc/letsencrypt/accounts',
'/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org',
'/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory',
]
final_path = '{}/{}'.format(paths[-1], uuid)
paths.append(final_path)
if not exists(final_path):
mkdir(paths, mode='0700')
with cd(final_path):
self.deploy('{}/private_key.json'.format(localdir), 'private_key.json', mode='0600')
self.deploy('{}/meta.json'.format(localdir), 'meta.json')
self.deploy('{}/regr.json'.format(localdir), 'regr.json')
def luigi_daemon(self, local_path, name=None, register=True, start=True, **kwargs):
if name is None:
name = local_path.split('/')[-1]
self.deploy(local_path, '/etc/init.d/{}'.format(name), **kwargs)
if register:
sudo('update-rc.d {} defaults'.format(name))
if start:
sudo('service {} restart'.format(name))
def soffice_daemon(self, local_path, name=None, register=True, start=True, **kwargs):
if name is None:
name = local_path.split('/')[-1]
self.deploy(local_path, '/etc/init.d/{}'.format(name), **kwargs)
if register:
sudo('update-rc.d {} defaults'.format(name))
if start:
sudo('service {} restart'.format(name))
def make_deploy(deploy_path, last_segment='deploy'):
"""
Make a ``deploy()`` function, for uploading files to the server.
During a deployment, one usually needs to upload certain additional files
to the server. It's also often necessary to dynamically define certain
settings etc. within these files. The :func:`upload_template()` and
:func:`put()` functions, respectively, handle uploading files which do and
do not require dynamic variable substitution.
The return value from ``make_deploy()`` is a function which will call
``put()`` or ``upload_template()`` based on whether or not the file path
ends with ``'.template'``.
To make the ``deploy()`` function even simpler for the caller, it will
assume a certain context for local file paths. This means one only need
provide a base file name when calling ``deploy()``, and it will be
interpreted as relative to the function's context path.
The ``deploy_path`` argument is used to establish the context path for the
function. If it is a folder path, it will be used as-is; otherwise it will
be constructed by joining the parent folder of ``deploy_path`` with the
value of ``last_segment``.
Typical usage then is something like::
from rattail.fablib import make_deploy
deploy = make_deploy(__file__)
deploy('rattail/init-filemon', '/etc/init.d/rattail-filemon',
mode='0755')
deploy('rattail/rattail.conf.template', '/etc/rattail.conf')
This shows what is intended to be typical, i.e. where ``__file__`` is the
only argument required for ``make_deploy()``. For the above to work will
require you to have something like this file structure, where
``fabfile.py`` is the script which contains the above code::
myproject/
|-- fabfile.py
|-- deploy/
`-- rattail/
|-- init-filemon
|-- rattail.conf.template
"""
return Deployer(deploy_path, last_segment)
def rsync(host, *paths):
"""
Runs rsync as root, for the given host and file paths.
"""
for path in paths:
assert path.startswith('/')
path = path.rstrip('/')
# escape path for rsync
path = path.replace(' ', r'\\\ ').replace("'", r"\\\'")
agent_sudo('rsync -aP --del root@{0}:{1}/ {1}'.format(host, path))

View file

@ -1,91 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for CORE-POS (IS4C)
"""
from __future__ import unicode_literals, absolute_import
import webbrowser
from fabric.api import sudo, cd, env, run
from fabric.contrib.files import exists
from rattail.fablib import apt, mysql, mkdir
def install_fannie(rootdir, branch='version-2.3', first_time=None, url=None):
"""
Install the Fannie app to the given location
"""
if first_time is None:
first_time = not exists(rootdir)
mkdir(rootdir)
with cd(rootdir):
# fannie source
if not exists('IS4C'):
sudo('git clone https://github.com/CORE-POS/IS4C.git')
with cd('IS4C'):
sudo('git checkout {}'.format(branch))
with cd('IS4C'):
sudo('git pull')
# composer
if not exists('composer.phar'):
sudo('curl -sS https://getcomposer.org/installer | php')
mkdir('/var/www/.composer', owner='www-data')
# fannie dependencies
with cd('IS4C'):
mkdir(['vendor', 'fannie/src/javascript/composer-components'], owner='www-data')
sudo('../composer.phar install', user='www-data')
# shadowread
with cd('IS4C/fannie/auth/shadowread'):
sudo('make')
sudo('make install')
# fannie config
with cd('IS4C/fannie'):
if not exists('config.php'):
sudo('cp config.php.dist config.php')
sudo('chown root:www-data config.php')
sudo('chmod 0660 config.php')
# fannie logging
with cd('IS4C/fannie/logs'):
for name in ['fannie', 'debug_fannie', 'queries', 'php-errors', 'dayend']:
sudo('touch {}.log'.format(name))
sudo('chown www-data:www-data {}.log'.format(name))
# fannie databases
mysql.create_user('is4c', host='%', password='is4c')
mysql.create_db('core_op', user="is4c@'%'")
mysql.create_db('core_trans', user="is4c@'%'")
mysql.create_db('trans_archive', user="is4c@'%'")
# fannie web installer
if first_time:
url = url or getattr(env, 'fannie_rooturl', 'http://localhost/fannie/')
webbrowser.open_new_tab('{}/install/'.format(url.rstrip('/')))

View file

@ -1,6 +0,0 @@
[apt]
frontend=none
email_address=root
confirm=0
save_seen=/var/lib/apt/listchanges.db
which=news

View file

@ -1,142 +0,0 @@
#!/bin/sh
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU 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 Email Bouncer"}
NAME=${NAME:-"rattail-bouncer"}
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:-""}
BOUNCER_ARGS=${BOUNCER_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
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
#
# 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
create_pid_dir
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 bouncer $BOUNCER_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
sudo -u $USER $RATTAIL $RATTAIL_ARGS bouncer $BOUNCER_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
:

View file

@ -1,62 +0,0 @@
#!/bin/sh
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
#
# This is a simple script which will output a single line of info, and exit
# with a return code which indicates status of a given Rattail daemon. It was
# designed for use with Shinken monitoring. Invoke like so:
#
# check-rattail-daemon NAME
#
# Where NAME refers to the service, e.g. 'rattail-datasync'. Exit code may be:
#
# * 0 = daemon is confirmed running
# * 2 = daemon is confirmed *not* running
# * 3 = unknown state
#
################################################################################
NAME="$1"
if [ "$NAME" = "" ]; then
echo "Usage: check-rattail-daemon NAME"
exit 3
fi
PIDFILE="/var/run/rattail/$NAME.pid"
if [ ! -f "$PIDFILE" ]; then
echo "PID file not found: $PIDFILE"
exit 2
fi
PID=`cat $PIDFILE`
if [ "$PID" = "" ]; then
echo "File exists but contains no PID: $PIDFILE"
exit 3
fi
ps -p $PID >/dev/null
if [ ! $? ]; then
echo "No process found for PID $PID; per file: $PIDFILE"
exit 2
fi
echo "Rattail daemon $NAME is running with PID $PID"
exit 0

View file

@ -1,17 +0,0 @@
#!/bin/sh
EXPECTED_SIGNATURE=$(wget -q -O - https://composer.github.io/installer.sig)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_SIGNATURE=$(php -r "echo hash_file('SHA384', 'composer-setup.php');")
if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
then
>&2 echo 'ERROR: Invalid installer signature'
rm composer-setup.php
exit 1
fi
php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

View file

@ -1,148 +0,0 @@
#!/bin/sh
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
#
# Generic 'init' script for all Rattail daemons. Originally based on the
# skeleton file from a Debian 6 system, but tweaked plenty since...
#
# NOTE: The "calling" script *must* define $NAME and $DESC (at least).
#
################################################################################
# Files in /etc/default and/or the "calling" init script may define any of the
# following as necessary, to override:
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:-""}
RATTAIL_SUBCMD=${RATTAIL_SUBCMD:-"${NAME##*-}"}
RATTAIL_SUBCMD_ARGS=${RATTAIL_SUBCMD_ARGS:-""}
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
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
#
# 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
create_pid_dir
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 $RATTAIL_SUBCMD --pidfile="$PIDFILE" $RATTAIL_SUBCMD_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
/usr/local/bin/check-rattail-daemon "$NAME" >/dev/null \
|| return 1
sudo -u $USER "$RATTAIL" $RATTAIL_ARGS $RATTAIL_SUBCMD --pidfile="$PIDFILE" $RATTAIL_SUBCMD_ARGS stop >/dev/null 2>&1 \
|| return 2
}
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)
/usr/local/bin/check-rattail-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
:

View file

@ -1,142 +0,0 @@
#!/bin/sh
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU 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 Data Synchronizer"}
NAME=${NAME:-"rattail-datasync"}
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:-""}
DATASYNC_ARGS=${DATASYNC_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
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
#
# 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
create_pid_dir
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 datasync $DATASYNC_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
sudo -u $USER $RATTAIL $RATTAIL_ARGS datasync $DATASYNC_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
:

View file

@ -1,142 +0,0 @@
#!/bin/sh
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU 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
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
#
# 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
create_pid_dir
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
sudo -u $USER $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
:

View file

@ -1,126 +0,0 @@
#!/bin/sh
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
#
# Generic 'init' script for Luigi central scheduler (luigid)
#
################################################################################
# "calling" init script may define any of the following as necessary:
NAME=${NAME:-"rattail-luigid"}
SCRIPTNAME=${SCRIPTNAME:-"/etc/init.d/$NAME"}
DESC=${DESC:-"Luigi Scheduler for Rattail"}
DAEMON=${DAEMON:-"/usr/local/bin/luigid"}
USER=${USER:-"rattail"}
GROUP=${GROUP:-"rattail"}
PIDFILE=${PIDFILE:-"/var/run/rattail/$NAME.pid"}
LOGDIR=${LOGDIR:-"/var/log/rattail/$NAME"}
STATEFILE=${STATEFILE:-"/var/run/rattail/$NAME.pickle"}
ADDRESS=${ADDRESS:-"0.0.0.0"}
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
do_start() {
create_pid_dir
start-stop-daemon --test --start --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 1
start-stop-daemon --start --chuid $USER --exec $DAEMON --pidfile $PIDFILE --background --quiet -- \
--background --pidfile $PIDFILE --logdir $LOGDIR --state-path $STATEFILE --address $ADDRESS \
|| return 2
}
# 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
do_stop()
{
start-stop-daemon --test --stop --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 1
start-stop-daemon --stop --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 2
}
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)
/usr/local/bin/check-rattail-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
:

View file

@ -1,4 +0,0 @@
mysql-server-5.5 mysql-server/root_password password ${password}
mysql-server-5.5 mysql-server/root_password seen true
mysql-server-5.5 mysql-server/root_password_again password ${password}
mysql-server-5.5 mysql-server/root_password_again seen true

View file

@ -1,16 +0,0 @@
[mysql]
user = root
password = ${password}
[mysqladmin]
user = root
password = ${password}
[mysqldump]
user = root
password = ${password}
[mysqlshow]
user = root
password = ${password}

View file

@ -1,5 +0,0 @@
define command{
command_name check_rattail_daemon
command_line $PLUGINSDIR$/check_by_ssh -H $HOSTADDRESS$ -C "check-rattail-daemon $ARG1$" --logname=rattail
}

View file

@ -1,5 +0,0 @@
{
"name": "rattail",
"description": "Can check various Rattail daemons to ensure they're running. Performs checks using SSH.",
"path": "software/"
}

View file

@ -1,6 +0,0 @@
define host{
name rattail
use linux
register 0
}

View file

@ -1,125 +0,0 @@
#!/bin/sh
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
#
# Generic 'init' script for headless LibreOffice Writer
#
################################################################################
# "calling" init script may define any of the following as necessary:
NAME=${NAME:-"rattail-soffice"}
SCRIPTNAME=${SCRIPTNAME:-"/etc/init.d/$NAME"}
DESC=${DESC:-"LibreOffice for Rattail"}
DAEMON=${DAEMON:-"/usr/lib/libreoffice/program/soffice.bin"}
SOFFICE=${SOFFICE:-"/usr/bin/soffice"}
USER=${USER:-"rattail"}
GROUP=${GROUP:-"rattail"}
PIDFILE=${PIDFILE:-"/var/run/rattail/$NAME.pid"}
PORT=${PORT:-"2002"}
create_pid_dir() {
PIDDIR=`dirname "$PIDFILE"`
if [ ! -d "$PIDDIR" ]; then
mkdir --parents "$PIDDIR"
fi
chown $USER:$GROUP "$PIDDIR"
}
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
do_start() {
create_pid_dir
start-stop-daemon --test --start --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 1
start-stop-daemon --start --chuid $USER --exec $DAEMON --startas $SOFFICE --pidfile $PIDFILE --background --quiet -- \
--headless --pidfile=$PIDFILE --accept="socket,host=localhost,port=$PORT;urp;" \
|| return 2
}
# 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
do_stop()
{
start-stop-daemon --test --stop --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 1
start-stop-daemon --stop --exec $DAEMON --user $USER --pidfile $PIDFILE --quiet > /dev/null \
|| return 2
}
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)
/usr/local/bin/check-rattail-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
:

View file

@ -1,4 +0,0 @@
# -*- mode: conf; -*-
# let rattail upgrade itself
rattail ALL = NOPASSWD: /srv/envs/*/app/upgrade*.sh *

View file

@ -1,208 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2018 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library for MySQL
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import sudo, hide, get, put, abort, local, run, settings
from fabric.contrib.files import sed
from rattail.fablib import apt, make_deploy
deploy = make_deploy(__file__)
def install(password):
"""
Install the MySQL database service
"""
deploy('mysql/debconf.mako', 'debconf', context={'password': password})
sudo('debconf-set-selections debconf')
sudo('rm debconf')
apt.install('mysql-server')
deploy('mysql/my.cnf.mako', '/root/.my.cnf', mode='0600', context={'password': password})
def is_mariadb():
"""
Returns boolean indicating if MySQL server is actually MariaDB.
"""
with settings(warn_only=True):
result = run('mysql --version')
if result.failed:
return False
if "MariaDB" in result:
return True
return False
def restart():
"""
Restart the MySQL database service
"""
sudo('service mysql restart')
def set_bind_address(address):
"""
Configure the 'bind-address' setting with the given value.
"""
sed('/etc/mysql/my.cnf', '^bind-address.*', 'bind-address = {}'.format(address), use_sudo=True)
def user_exists(name, host='localhost'):
"""
Determine if a given MySQL user exists.
"""
user = sql("SELECT User FROM user WHERE User = '{0}' and Host = '{1}'".format(name, host), database='mysql')
return user == name
def create_user(name, host='localhost', password=None, checkfirst=True):
"""
Create a MySQL user account.
"""
if not checkfirst or not user_exists(name, host):
sql("CREATE USER '{0}'@'{1}';".format(name, host))
if password:
with hide('running'):
sql("SET PASSWORD FOR '{0}'@'{1}' = PASSWORD('{2}');".format(
name, host, password))
def drop_user(name, host='localhost'):
"""
Drop a MySQL user account.
"""
sql("drop user '{0}'@'{1}'".format(name, host))
def db_exists(name):
"""
Determine if a given MySQL database exists.
"""
db = sql("SELECT SCHEMA_NAME FROM SCHEMATA WHERE SCHEMA_NAME = '{0}'".format(name), database='information_schema')
return db == name
def table_exists(name, database):
"""
Determine if a given table exists within the given MySQL database.
"""
table = sql("SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '{0}' AND TABLE_NAME = '{1}'".format(database, name), database='information_schema')
return table == name
def create_db(name, checkfirst=True, user=None):
"""
Create a MySQL database.
"""
if not checkfirst or not db_exists(name):
sudo('mysqladmin create {0}'.format(name))
if user:
grant_access(name, user)
def drop_db(name, checkfirst=True):
"""
Drop a MySQL database.
"""
if not checkfirst or db_exists(name):
sudo('mysqladmin drop --force {0}'.format(name))
def grant_access(dbname, username):
"""
Grant full access to the given database for the given user. Note that the
username should be given in MySQL's native format, e.g. 'myuser@localhost'.
"""
sql('grant all on `{0}`.* to {1}'.format(dbname, username))
def sql(sql, database=''):
"""
Execute some SQL.
"""
# some crazy quoting required here, see also
# http://stackoverflow.com/a/1250279
sql = sql.replace("'", "'\"'\"'")
return sudo("mysql --execute='{}' --batch --skip-column-names {}".format(sql, database))
def download_db(name, destination=None):
"""
Download a database from the "current" server.
"""
if destination is None:
destination = './{0}.sql.gz'.format(name)
sudo('mysqldump --result-file={0}.sql {0}'.format(name))
sudo('gzip --force {0}.sql'.format(name))
get('{0}.sql.gz'.format(name), destination)
sudo('rm {0}.sql.gz'.format(name))
def restore_db(name, source=None, user=None):
"""
Upload and restore a database to the current server
"""
if not source:
source = '{}.sql.gz'.format(name)
put(source, '{}.sql.gz'.format(name))
sudo('gunzip --force {}.sql.gz'.format(name))
drop_db(name)
create_db(name, user=user)
sudo('mysql --execute="source {0}.sql" {0}'.format(name))
sudo('rm {}.sql'.format(name))
def clone_db(name, download, user='rattail', force=False):
"""
Clone a MySQL database from a (presumably live) server
:param name: Name of the database.
:param force: Whether the target database should be forcibly dropped, if it
exists already.
"""
if db_exists(name):
if force:
drop_db(name, checkfirst=False)
else:
abort("Database '{}' already exists! (pass force=true to override)".format(name))
create_db(name, checkfirst=False)
# obtain database dump from live server
download('{}.sql.gz'.format(name), user=user)
# upload database dump to target server
put('{}.sql.gz'.format(name))
local('rm {}.sql.gz'.format(name))
# restore database on target server
run('gunzip --force {}.sql.gz'.format(name))
sudo('mysql {0} < {0}.sql'.format(name))
run('rm {}.sql'.format(name))

View file

@ -1,49 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library for Product Open Data (POD)
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from fabric.api import sudo, cd, env
from fabric.contrib.files import exists
from rattail.fablib import mkdir
from rattail.fablib import apt
def install_pod(path='/srv/pod'):
"""
Install the Product Open Data (POD) files to the given path.
"""
apt.install('unzip')
mkdir(path)
with cd(path):
if not exists('pod_pictures_gtin.zip'):
url = getattr(env, 'setting_pod_download_url',
'http://www.product-open-data.com/docs/pod_pictures_gtin_2013.08.29_01.zip')
sudo('wget --output-document=pod_pictures_gtin.zip {0}'.format(url))
if not exists('pictures/gtin'):
sudo('unzip pod_pictures_gtin.zip -d pictures')

View file

@ -1,97 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for Postfix
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import sudo
from fabric.contrib.files import sed, append
from rattail.fablib import apt
def install():
"""
Install the Postfix mail service
"""
apt.install('postfix')
apt.purge('exim4', 'exim4-base', 'exim4-config', 'exim4-daemon-light')
def alias(name, alias_to, path='/etc/aliases'):
"""
Set a mail alias for Postfix
"""
# replace setting if already exists; then add in case it didn't
entry = '{}: {}'.format(name, alias_to)
sed(path, r'^{}: .*$'.format(name), entry, use_sudo=True)
append(path, entry, use_sudo=True)
sudo('newaliases')
def restart():
"""
Restart the Postfix mail service
"""
sudo('service postfix restart')
def set_config(setting, value, path='/etc/postfix/main.cf'):
"""
Configure the given setting with the given value.
"""
# replace setting if already exists; then add in case it didn't
entry = '{} = {}'.format(setting, value)
sed(path, r'^{} = .*$'.format(setting), entry, use_sudo=True)
append(path, entry, use_sudo=True)
def set_myhostname(hostname):
"""
Configure the 'myhostname' setting with the given string.
"""
set_config('myhostname', hostname)
def set_mydestination(*destinations):
"""
Configure the 'mydestinations' setting with the given strings.
"""
set_config('mydestination', ', '.join(destinations))
def set_mynetworks(*networks):
"""
Configure the 'mynetworks' setting with the given strings.
"""
set_config('mynetworks', ' '.join(networks))
def set_relayhost(relayhost):
"""
Configure the 'relayhost' setting with the given string
"""
set_config('relayhost', relayhost)

View file

@ -1,190 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library for PostgreSQL
"""
from __future__ import unicode_literals, absolute_import
import os
import re
from fabric.api import sudo, run, get, hide, abort, put, local
from rattail.fablib import apt
def install():
"""
Install the PostgreSQL database service
"""
apt.install('postgresql')
def get_version():
"""
Fetch the version of PostgreSQL running on the target system
"""
result = sudo('psql --version')
if result.succeeded:
match = re.match(r'^psql \(PostgreSQL\) (\d+\.\d+)\.\d+', result)
if match:
return float(match.group(1))
def sql(sql, database='', port=None):
"""
Execute some SQL as the 'postgres' user.
"""
cmd = 'sudo -u postgres psql {port} --tuples-only --no-align --command="{sql}" {database}'.format(
port='--port={}'.format(port) if port else '',
sql=sql, database=database)
return sudo(cmd, shell=False)
def script(path, database='', user=None, password=None):
"""
Execute a SQL script. By default this will run as 'postgres' user, but can
use PGPASSWORD authentication if necessary.
"""
if user and password:
with hide('running'):
return sudo(" PGPASSWORD='{}' psql --host=localhost --username='{}' --file='{}' {}".format(
password, user, path, database))
else: # run as postgres
return sudo("sudo -u postgres psql --file='{}' {}".format(path, database), shell=False)
def user_exists(name, port=None):
"""
Determine if a given PostgreSQL user exists.
"""
user = sql("SELECT rolname FROM pg_roles WHERE rolname = '{0}'".format(name), port=port)
return bool(user)
def create_user(name, password=None, port=None, checkfirst=True, createdb=False):
"""
Create a PostgreSQL user account.
"""
if not checkfirst or not user_exists(name, port=port):
sudo('sudo -u postgres createuser {port} {createdb} --no-createrole --no-superuser {name}'.format(
port='--port={}'.format(port) if port else '',
createdb='--{}createdb'.format('' if createdb else 'no-'),
name=name))
if password:
set_user_password(name, password, port=port)
def set_user_password(name, password, port=None):
"""
Set the password for a PostgreSQL user account
"""
with hide('running'):
sql("ALTER USER \\\"{}\\\" PASSWORD '{}';".format(name, password), port=port)
def db_exists(name, port=None):
"""
Determine if a given PostgreSQL database exists.
"""
db = sql("SELECT datname FROM pg_database WHERE datname = '{0}'".format(name), port=port)
return db == name
def create_db(name, owner=None, port=None, checkfirst=True):
"""
Create a PostgreSQL database.
"""
if not checkfirst or not db_exists(name, port=port):
cmd = 'sudo -u postgres createdb {port} {owner} {name}'.format(
port='--port={}'.format(port) if port else '',
owner='--owner={}'.format(owner) if owner else '',
name=name)
sudo(cmd, shell=False)
def create_schema(name, dbname, owner='rattail', port=None):
"""
Create a schema within a PostgreSQL database.
"""
sql_ = "create schema if not exists {} authorization {}".format(name, owner)
sql(sql_, database=dbname, port=port)
def drop_db(name, checkfirst=True):
"""
Drop a PostgreSQL database.
"""
if not checkfirst or db_exists(name):
sudo('sudo -u postgres dropdb {0}'.format(name), shell=False)
def download_db(name, destination=None):
"""
Download a database from the "current" server.
"""
if destination is None:
destination = './{0}.sql.gz'.format(name)
run('touch {0}.sql'.format(name))
run('chmod 0666 {0}.sql'.format(name))
sudo('sudo -u postgres pg_dump --file={0}.sql {0}'.format(name), shell=False)
run('gzip --force {0}.sql'.format(name))
get('{0}.sql.gz'.format(name), destination)
run('rm {0}.sql.gz'.format(name))
def clone_db(name, owner, download, user='rattail', force=False, workdir=None):
"""
Clone a database from a (presumably live) server
:param name: Name of the database.
:param owner: Username of the user who is to own the database.
:param force: Whether the target database should be forcibly dropped, if it
exists already.
"""
if db_exists(name):
if force:
drop_db(name, checkfirst=False)
else:
abort("Database '{}' already exists!".format(name))
create_db(name, owner=owner, checkfirst=False)
# upload database dump to target server
if workdir:
curdir = os.getcwd()
os.chdir(workdir)
download('{}.sql.gz'.format(name), user=user)
put('{}.sql.gz'.format(name))
local('rm {}.sql.gz'.format(name))
if workdir:
os.chdir(curdir)
# restore database on target server
run('gunzip --force {}.sql.gz'.format(name))
sudo('sudo -u postgres psql --file={0}.sql {0}'.format(name), shell=False)
run('rm {}.sql'.format(name))

View file

@ -1,140 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2018 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library for Python
"""
from __future__ import unicode_literals, absolute_import
from contextlib import contextmanager
import six
from fabric.api import sudo, run, prefix, cd, settings, env
from fabric.contrib.files import exists, append
from rattail.fablib import mkdir
from rattail.fablib import apt
def install_pip(use_apt=False):
"""
Install/upgrade the Pip installer for Python.
"""
if use_apt:
apt.install('python-pip')
else:
apt.install('build-essential', 'python-dev', 'libssl-dev', 'libffi-dev')
with settings(warn_only=True):
result = sudo('which pip')
if result.failed:
apt.install('python-pkg-resources', 'python-setuptools')
sudo('easy_install pip')
sudo('apt-get --assume-yes purge python-setuptools')
pip('setuptools')
pip('pip', 'wheel', 'ndg-httpsclient')
def pip(*packages):
"""
Install one or more packages via ``pip install``.
"""
packages = ["'{0}'".format(p) for p in packages]
sudo('pip install --upgrade {0}'.format(' '.join(packages)))
def install_virtualenvwrapper(workon_home=None, user='root', use_apt=False):
"""
Install the `virtualenvwrapper`_ system, with the given ``workon`` home,
owned by the given user.
"""
workon_home = workon_home or getattr(env, 'python_workon_home', '/srv/envs')
mkdir(workon_home, owner=user)
if use_apt:
apt.install('virtualenvwrapper')
else:
pip('virtualenvwrapper')
configure_virtualenvwrapper('root', workon_home)
if user != 'root':
configure_virtualenvwrapper(user, workon_home)
configure_virtualenvwrapper(env.user, workon_home)
def configure_virtualenvwrapper(user, workon_home=None, wrapper='/usr/local/bin/virtualenvwrapper.sh'):
"""
Configure virtualenvwrapper for the given user account.
"""
workon_home = workon_home or getattr(env, 'python_workon_home', '/srv/envs')
home = sudo('echo $HOME', user=user)
home = home.rstrip('/')
def update(script):
script = '{}/{}'.format(home, script)
if not exists(script):
sudo('touch {}'.format(script))
sudo('chown {}: {}'.format(user, script))
append(script, 'export WORKON_HOME={}'.format(workon_home), use_sudo=True)
append(script, 'source {}'.format(wrapper), use_sudo=True)
update('.profile')
update('.bashrc')
def mkvirtualenv(name, python=None, user=None, workon_home=None, upgrade_pip=True):
"""
Make a new Python virtual environment.
"""
workon_home = workon_home or getattr(env, 'python_workon_home', '/srv/envs')
sudo('mkvirtualenv {} {}'.format('--python={}'.format(python) if python else '', name))
if upgrade_pip:
with workon(name):
pip('six')
pip('pip', 'setuptools', 'wheel', 'ndg-httpsclient')
if user:
with cdvirtualenv(name, workon_home=workon_home):
mkdir('app/log', owner='{0}:{0}'.format(user))
@contextmanager
def workon(name):
"""
Context manager to prefix your command(s) with the ``workon`` command.
"""
with prefix('workon {0}'.format(name)):
yield
@contextmanager
def cdvirtualenv(name, subdirs=[], workon_home=None):
"""
Context manager to prefix your command(s) with the ``cdvirtualenv`` command.
"""
workon_home = workon_home or getattr(env, 'python_workon_home', '/srv/envs')
if isinstance(subdirs, six.string_types):
subdirs = [subdirs]
path = '{0}/{1}'.format(workon_home, name)
if subdirs:
path = '{0}/{1}'.format(path, '/'.join(subdirs))
with workon(name):
with cd(path):
yield

View file

@ -1,80 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2018 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for Rattail itself
"""
from __future__ import unicode_literals
from __future__ import absolute_import
from fabric.api import sudo, env, cd
from rattail.fablib import make_deploy, make_system_user, mkdir
deploy = make_deploy(__file__)
def bootstrap_rattail(home='/var/lib/rattail', uid=None, shell='/bin/bash'):
"""
Bootstrap a basic Rattail software environment.
"""
make_system_user('rattail', home=home, uid=uid, shell=shell)
sudo('adduser {} rattail'.format(env.user))
with cd(home):
mkdir('.ssh', owner='rattail:', mode='0700')
mkdir('/etc/rattail')
mkdir('/srv/rattail')
mkdir('/var/log/rattail', owner='rattail:rattail', mode='0775')
mkdir('/srv/rattail/init')
deploy('daemon', '/srv/rattail/init/daemon')
deploy('check-rattail-daemon', '/usr/local/bin/check-rattail-daemon')
deploy('luigid', '/srv/rattail/init/luigid')
deploy('soffice', '/srv/rattail/init/soffice')
# TODO: deprecate / remove these
deploy('bouncer', '/srv/rattail/init/bouncer')
deploy('datasync', '/srv/rattail/init/datasync')
deploy('filemon', '/srv/rattail/init/filemon')
def upgrade_rattail_db(envname=None, envpath=None, config=None, user='rattail'):
"""
Upgrade a Rattail database in the "default" supported way
"""
if not (envname or envpath):
raise ValueError("Must specify value for either 'envname' or 'envpath'")
if not envpath:
envpath = '/srv/envs/{}'.format(envname)
if not config:
config = 'app/rattail.conf'
with cd(envpath):
sudo('bin/alembic --config {} upgrade heads'.format(config), user=user)
def deploy_rattail_sudoers(remote_path='/etc/sudoers.d/rattail'):
"""
Deploy the common sudoers file for rattail.
"""
deploy.sudoers('sudoers', remote_path)

View file

@ -1,73 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric tools for Shinken
"""
from __future__ import unicode_literals, absolute_import
from fabric.api import cd, hide, sudo
from fabric.contrib.files import sed
from rattail.fablib import apt, make_deploy, mkdir
deploy = make_deploy(__file__)
def install():
"""
Install the Shinken monitoring service
"""
apt.install('shinken')
def restart():
"""
Restart the Shinken monitoring service
"""
sudo('service shinken restart')
def install_rattail_pack(dest='/etc/shinken/packs'):
"""
Install the 'rattail' pack for use with a Shinken system.
"""
with cd(dest):
mkdir('software/rattail')
deploy('shinken/rattail.pack', 'software/rattail/rattail.pack')
deploy('shinken/templates.cfg', 'software/rattail/templates.cfg')
deploy('shinken/commands.cfg', 'software/rattail/commands.cfg')
# mkdir('software/rattail/services')
# deploy('shinken/services/datasync.cfg', 'software/rattail/services/datasync.cfg')
# TODO: deprecate / remove this
install_shinken_pack = install_rattail_pack
def set_auth_secret(value, path='/etc/shinken/modules/webui.cfg'):
"""
Set the 'auth_secret' config value for Shinken
"""
with hide('running'):
sed(path, r'^ *auth_secret .*$', ' auth_secret {}'.format(value), use_sudo=True)

View file

@ -1,37 +0,0 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric library for LibreOffice (etc.)
"""
from __future__ import unicode_literals, absolute_import
from rattail.fablib import apt
def install_headless_writer():
"""
Install packages for headless LibreOffice Writer
"""
apt.install('openjdk-8-jdk', 'libreoffice-common',
'libreoffice-writer', 'libreoffice-calc')

View file

@ -1,107 +0,0 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2017 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Fabric Library for SSH
"""
from __future__ import unicode_literals, absolute_import
import warnings
from fabric.api import sudo, cd, settings
from fabric.contrib.files import exists, sed, append
from rattail.fablib import mkdir, agent_sudo
from rattail.fablib.python import cdvirtualenv
def cache_host_key(host, for_user='root', with_agent=False, warn_only=True, identity=''):
"""
Cache the SSH host key for the given host, for the given user.
"""
user = None if for_user == 'root' else for_user
_sudo = agent_sudo if with_agent else sudo
if identity:
identity = '-i {}'.format(identity)
cmd = 'ssh {} -o StrictHostKeyChecking=no {} echo'.format(identity, host)
if warn_only:
with settings(warn_only=True):
_sudo(cmd, user=user)
else:
_sudo(cmd, user=user)
def uncache_host_key(host, for_user='root'):
"""
Remove the cached SSH host key for the given host, for the given user.
"""
user = None if for_user == 'root' else for_user
sudo('ssh-keygen -R {}'.format(host), user=user)
def restart():
"""
Restart the OpenSSH service
"""
sudo('service ssh restart')
def configure(allow_root=False):
"""
Configure the OpenSSH service
"""
path = '/etc/ssh/sshd_config'
value = 'without-password' if allow_root else 'no'
sed(path, r'^PermitRootLogin\s+.*', 'PermitRootLogin {}'.format(value), use_sudo=True)
entry = 'PasswordAuthentication no'
sed(path, r'^PasswordAuthentication\s+.*', entry, use_sudo=True)
append(path, entry, use_sudo=True)
restart()
def configure_ssh(restrict_root=True):
warnings.warn("Function `ssh.configure_ssh()` is deprecated, please "
"use `ssh.configure()` instead.", DeprecationWarning)
return configure(allow_root=not restrict_root)
def establish_identity(envname, comment, user='rattail', home='/var/lib/rattail'):
"""
Generate a SSH key pair and configure it for local use.
"""
home = home.rstrip('/')
sshdir = '{0}/.ssh'.format(home)
owner='{0}:{0}'.format(user)
mkdir(sshdir, owner=owner, mode='0700')
with cd(sshdir):
if not exists('authorized_keys'):
sudo('touch authorized_keys')
sudo('chown {0} authorized_keys'.format(owner))
sudo('chmod 0600 authorized_keys')
with cdvirtualenv(envname, 'app'):
mkdir('ssh', owner=owner, mode='0700')
with cdvirtualenv(envname, 'app/ssh'):
if not exists('id_rsa', use_sudo=True):
sudo("ssh-keygen -C '{0}' -P '' -f id_rsa".format(comment))
sudo('cat id_rsa.pub >> {0}/authorized_keys'.format(sshdir))
sudo('chown {0} id_rsa*'.format(owner))