Source code for fabtools.tomcat

"""
Tomcat
=======

This module provides tools for installing `Tomcat`_.

.. _Tomcat: http://tomcat.apache.org/

"""

import os
import re

from fabric.api import cd, hide, run, settings
from fabric.operations import put

from fabtools.files import is_file, is_link, is_dir
from fabtools.utils import run_as_root


# Default parameters
DEFAULT_VERSION = '7.0.47'
DEFAULT_INSTALLATION_PATH = "/usr/share/tomcat"
DEFAULT_MIRROR = "http://archive.apache.org"


[docs]def install_from_source(path=DEFAULT_INSTALLATION_PATH, version=DEFAULT_VERSION, mirror=DEFAULT_MIRROR, overwrite=False): """ Install Tomcat from source. :: import fabtools # Install Tomcat fabtools.tomcat.install_from_source(version='6.0.36') """ from fabtools.require import file as require_file from fabtools.require.files import directory as require_directory # Tokenize version into parts version_tokens = version.split('.') version_major = version_tokens[0] # Parse the filename and folder file_name = 'apache-tomcat-%s.tar.gz' % version folder_name = 'apache-tomcat-%s' % version # Build the distribution in /tmp with cd('/tmp'): # Make sure we have the tarball downloaded. if not is_file(os.path.join('/tmp/', file_name)): # Otherwise, download the tarball based on our mirror and version. tomcat_url = '%s/dist/tomcat/tomcat-%s/v%s/bin/%s' % (mirror, version_major, version, file_name) # Ensure the file has been downloaded require_file(url=tomcat_url) # Extract the file run('tar -xzf %s' % file_name) # Handle possibility of existing path if is_dir(path): if overwrite is False: # Raise exception as we don't want to overwrite raise OSError("Path %s already exists and overwrite not set." % path) else: # Otherwise, backup the tomcat path backup_installation_path = path + ".backup" if is_dir(backup_installation_path): run_as_root("rm -rf %s" % backup_installation_path) run_as_root("mv %s %s" % (path, backup_installation_path)) """ After all that, let's ensure we have the installation path setup properly and place the install. """ require_directory(path, mode='755', use_sudo=True) run_as_root('mv %s/* %s' % (folder_name, path)) # Now cleanup temp. run("rm -rf %s*" % file_name) # Finally, configure and start Tomcat configure_tomcat(path, overwrite=overwrite) start_tomcat()
def configure_tomcat(path, overwrite=False): from fabric.contrib.files import append startup_script = """ #!/bin/sh ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $local_fs $remote_fs $network $syslog $named # Required-Stop: $local_fs $remote_fs $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # X-Interactive: true # Short-Description: Tomcat # Description: Start Tomcat ### END INIT INFO case $1 in start) sh %(path)s/bin/startup.sh ;; stop) sh %(path)s/bin/shutdown.sh ;; restart) sh %(path)s/bin/shutdown.sh sh %(path)s/bin/startup.sh ;; esac exit 0""" % {'path': path} # Check for existing files and overwrite. if is_file('/etc/init.d/tomcat'): if overwrite is False: raise OSError("/etc/init.d/tomcat already exists and not overwriting.") else: run_as_root("rm -f /etc/init.d/tomcat") # Now create the file and symlinks. append('/etc/init.d/tomcat', startup_script, use_sudo=True) run_as_root('chmod 755 /etc/init.d/tomcat') if not is_link('/etc/rc1.d/K99tomcat'): run_as_root('ln -s /etc/init.d/tomcat /etc/rc1.d/K99tomcat') if not is_link('/etc/rc2.d/S99tomcat'): run_as_root('ln -s /etc/init.d/tomcat /etc/rc2.d/S99tomcat')
[docs]def start_tomcat(): """ Start the Tomcat service. """ run_as_root('/etc/init.d/tomcat start')
[docs]def stop_tomcat(): """ Stop the Tomcat service. """ run_as_root('/etc/init.d/tomcat stop')
[docs]def version(path): """ Get the version of currently installed tomcat. Returns ``None`` if it is not installed. """ with settings(hide('running', 'stdout', 'warnings'), warn_only=True): res = run(os.path.join(path, 'bin/version.sh')) if res.failed: return None else: return _extract_tomcat_version(res)
def _extract_tomcat_version(tomcat_version_out): """ Extracts tomcat version in format like '7.0.42' from 'tomcat/bin/version.sh' command output. """ match = re.search(r'Server version: (.*)', tomcat_version_out) if match is None: return None match_version = match.group(1).split('/')[1].strip() return match_version
[docs]def deploy_application(war_file, webapp_path=None): """ Deploy an application into the webapp path for a Tomcat installation. """ # If no webapp path specified, used default installation. if not webapp_path: webapp_path = os.path.join(DEFAULT_INSTALLATION_PATH, 'webapps') # Now copy our WAR into the webapp path. put(local_path=war_file, remote_path=os.path.join(webapp_path, war_file), use_sudo=True)