Remove rattail.fablib subpackage
				
					
				
			this logic was moved to the rattail-fabric project
This commit is contained in:
		
							parent
							
								
									a9f4d3675e
								
							
						
					
					
						commit
						fe60179ba6
					
				
					 31 changed files with 0 additions and 2716 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			@ -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)))
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			@ -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('/')))
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +0,0 @@
 | 
			
		|||
[apt]
 | 
			
		||||
frontend=none
 | 
			
		||||
email_address=root
 | 
			
		||||
confirm=0
 | 
			
		||||
save_seen=/var/lib/apt/listchanges.db
 | 
			
		||||
which=news
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -1,16 +0,0 @@
 | 
			
		|||
 | 
			
		||||
[mysql]
 | 
			
		||||
user = root
 | 
			
		||||
password = ${password}
 | 
			
		||||
 | 
			
		||||
[mysqladmin]
 | 
			
		||||
user = root
 | 
			
		||||
password = ${password}
 | 
			
		||||
 | 
			
		||||
[mysqldump]
 | 
			
		||||
user = root
 | 
			
		||||
password = ${password}
 | 
			
		||||
 | 
			
		||||
[mysqlshow]
 | 
			
		||||
user = root
 | 
			
		||||
password = ${password}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
    "name": "rattail",
 | 
			
		||||
    "description": "Can check various Rattail daemons to ensure they're running.  Performs checks using SSH.",
 | 
			
		||||
    "path": "software/"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +0,0 @@
 | 
			
		|||
 | 
			
		||||
define host{
 | 
			
		||||
        name                    rattail
 | 
			
		||||
        use                     linux
 | 
			
		||||
        register                0
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
# -*- mode: conf; -*-
 | 
			
		||||
 | 
			
		||||
# let rattail upgrade itself
 | 
			
		||||
rattail ALL = NOPASSWD: /srv/envs/*/app/upgrade*.sh *
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue