blob: c7d69f2ea7f20f2ee24f4509e8fe408ae19b37f6 [file] [log] [blame]
Sean Daguee263c822014-12-05 14:25:28 -05001#!/bin/bash
2#
zhang-hared98a5d02013-06-21 18:18:02 +08003# lib/apache
4# Functions to control configuration and operation of apache web server
5
6# Dependencies:
Adam Spiers6a5aa7c2013-10-24 11:27:02 +01007#
8# - ``functions`` file
Dean Troyerd8864fe2014-02-17 11:00:42 -06009# - ``STACK_USER`` must be defined
10#
Stephan Renatuse578eff2013-11-19 13:31:04 +010011# lib/apache exports the following functions:
12#
Adam Spiers6a5aa7c2013-10-24 11:27:02 +010013# - install_apache_wsgi
14# - config_apache_wsgi
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +000015# - apache_site_config_for
Adam Spiers6a5aa7c2013-10-24 11:27:02 +010016# - enable_apache_site
17# - disable_apache_site
18# - start_apache_server
19# - stop_apache_server
20# - restart_apache_server
zhang-hared98a5d02013-06-21 18:18:02 +080021
22# Save trace setting
23XTRACE=$(set +o | grep xtrace)
24set +o xtrace
25
26# Allow overriding the default Apache user and group, default to
27# current user and his default group.
Stephan Renatuse578eff2013-11-19 13:31:04 +010028APACHE_USER=${APACHE_USER:-$STACK_USER}
zhang-hared98a5d02013-06-21 18:18:02 +080029APACHE_GROUP=${APACHE_GROUP:-$(id -gn $APACHE_USER)}
30
31
32# Set up apache name and configuration directory
33if is_ubuntu; then
34 APACHE_NAME=apache2
Dean Troyer444a8d52014-06-06 16:36:52 -050035 APACHE_CONF_DIR=${APACHE_CONF_DIR:-/etc/$APACHE_NAME/sites-available}
zhang-hared98a5d02013-06-21 18:18:02 +080036elif is_fedora; then
37 APACHE_NAME=httpd
Dean Troyer444a8d52014-06-06 16:36:52 -050038 APACHE_CONF_DIR=${APACHE_CONF_DIR:-/etc/$APACHE_NAME/conf.d}
zhang-hared98a5d02013-06-21 18:18:02 +080039elif is_suse; then
40 APACHE_NAME=apache2
Dean Troyer444a8d52014-06-06 16:36:52 -050041 APACHE_CONF_DIR=${APACHE_CONF_DIR:-/etc/$APACHE_NAME/vhosts.d}
zhang-hared98a5d02013-06-21 18:18:02 +080042fi
43
44# Functions
45# ---------
zhang-hared98a5d02013-06-21 18:18:02 +080046# install_apache_wsgi() - Install Apache server and wsgi module
Ian Wienandaee18c72014-02-21 15:35:08 +110047function install_apache_wsgi {
zhang-hared98a5d02013-06-21 18:18:02 +080048 # Apache installation, because we mark it NOPRIME
49 if is_ubuntu; then
50 # Install apache2, which is NOPRIME'd
51 install_package apache2 libapache2-mod-wsgi
Jamie Lennox54707012013-09-17 12:07:48 +100052 # WSGI isn't enabled by default, enable it
53 sudo a2enmod wsgi
zhang-hared98a5d02013-06-21 18:18:02 +080054 elif is_fedora; then
55 sudo rm -f /etc/httpd/conf.d/000-*
56 install_package httpd mod_wsgi
57 elif is_suse; then
58 install_package apache2 apache2-mod_wsgi
Jamie Lennox54707012013-09-17 12:07:48 +100059 # WSGI isn't enabled by default, enable it
60 sudo a2enmod wsgi
zhang-hared98a5d02013-06-21 18:18:02 +080061 else
62 exit_distro_not_supported "apache installation"
63 fi
Noboru Iwamatsub4495eb2014-07-02 18:31:31 +090064
65 # ensure mod_version enabled for <IfVersion ...>. This is
66 # built-in statically on anything recent, but precise (2.2)
67 # doesn't have it enabled
68 sudo a2enmod version || true
zhang-hared98a5d02013-06-21 18:18:02 +080069}
70
Morgan Fainbergd074dc72014-06-24 21:33:39 -070071# get_apache_version() - return the version of Apache installed
72# This function is used to determine the Apache version installed. There are
73# various differences between Apache 2.2 and 2.4 that warrant special handling.
74function get_apache_version {
75 if is_ubuntu; then
76 local version_str=$(sudo /usr/sbin/apache2ctl -v | awk '/Server version/ {print $3}' | cut -f2 -d/)
77 elif is_fedora; then
78 local version_str=$(rpm -qa --queryformat '%{VERSION}' httpd)
79 elif is_suse; then
80 local version_str=$(rpm -qa --queryformat '%{VERSION}' apache2)
81 else
82 exit_distro_not_supported "cannot determine apache version"
83 fi
84 if [[ "$version_str" =~ ^2\.2\. ]]; then
85 echo "2.2"
86 elif [[ "$version_str" =~ ^2\.4\. ]]; then
87 echo "2.4"
88 else
89 exit_distro_not_supported "apache version not supported"
90 fi
91}
92
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +000093# apache_site_config_for() - The filename of the site's configuration file.
94# This function uses the global variables APACHE_NAME and APACHE_CONF_DIR.
95#
96# On Ubuntu 14.04, the site configuration file must have a .conf suffix for a2ensite and a2dissite to
97# recognise it. a2ensite and a2dissite ignore the .conf suffix used as parameter. The default sites'
98# files are 000-default.conf and default-ssl.conf.
99#
100# On Ubuntu 12.04, the site configuration file may have any format, as long as it is in
101# /etc/apache2/sites-available/. a2ensite and a2dissite need the entire file name to work. The default
102# sites' files are default and default-ssl.
103#
Ralf Haferkamp633a1292014-06-16 14:10:05 +0200104# On Fedora and openSUSE, any file in /etc/httpd/conf.d/ whose name ends with .conf is enabled.
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000105#
106# On RHEL and CentOS, things should hopefully work as in Fedora.
107#
108# The table below summarizes what should happen on each distribution:
109# +----------------------+--------------------+--------------------------+--------------------------+
110# | Distribution | File name | Site enabling command | Site disabling command |
111# +----------------------+--------------------+--------------------------+--------------------------+
112# | Ubuntu 12.04 | site | a2ensite site | a2dissite site |
113# | Ubuntu 14.04 | site.conf | a2ensite site | a2dissite site |
114# | Fedora, RHEL, CentOS | site.conf.disabled | mv site.conf{.disabled,} | mv site.conf{,.disabled} |
115# +----------------------+--------------------+--------------------------+--------------------------+
116function apache_site_config_for {
117 local site=$@
118 if is_ubuntu; then
Morgan Fainbergd074dc72014-06-24 21:33:39 -0700119 local apache_version=$(get_apache_version)
120 if [[ "$apache_version" == "2.2" ]]; then
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000121 # Ubuntu 12.04 - Apache 2.2
Dean Troyer444a8d52014-06-06 16:36:52 -0500122 echo $APACHE_CONF_DIR/${site}
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000123 else
124 # Ubuntu 14.04 - Apache 2.4
Dean Troyer444a8d52014-06-06 16:36:52 -0500125 echo $APACHE_CONF_DIR/${site}.conf
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000126 fi
Ralf Haferkamp633a1292014-06-16 14:10:05 +0200127 elif is_fedora || is_suse; then
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000128 # fedora conf.d is only imported if it ends with .conf so this is approx the same
Dean Troyer444a8d52014-06-06 16:36:52 -0500129 local enabled_site_file="$APACHE_CONF_DIR/${site}.conf"
Gabriel Assis Bezerraa688bc62014-05-27 20:58:22 +0000130 if [ -f $enabled_site_file ]; then
131 echo ${enabled_site_file}
132 else
133 echo ${enabled_site_file}.disabled
134 fi
135 fi
136}
137
Jamie Lennox54707012013-09-17 12:07:48 +1000138# enable_apache_site() - Enable a particular apache site
Ian Wienandaee18c72014-02-21 15:35:08 +1100139function enable_apache_site {
Jamie Lennox54707012013-09-17 12:07:48 +1000140 local site=$@
141 if is_ubuntu; then
142 sudo a2ensite ${site}
Ralf Haferkamp633a1292014-06-16 14:10:05 +0200143 elif is_fedora || is_suse; then
Dean Troyer444a8d52014-06-06 16:36:52 -0500144 local enabled_site_file="$APACHE_CONF_DIR/${site}.conf"
145 # Do nothing if site already enabled or no site config exists
146 if [[ -f ${enabled_site_file}.disabled ]] && [[ ! -f ${enabled_site_file} ]]; then
147 sudo mv ${enabled_site_file}.disabled ${enabled_site_file}
148 fi
Jamie Lennox54707012013-09-17 12:07:48 +1000149 fi
150}
151
152# disable_apache_site() - Disable a particular apache site
Ian Wienandaee18c72014-02-21 15:35:08 +1100153function disable_apache_site {
Jamie Lennox54707012013-09-17 12:07:48 +1000154 local site=$@
155 if is_ubuntu; then
156 sudo a2dissite ${site}
Ralf Haferkamp633a1292014-06-16 14:10:05 +0200157 elif is_fedora || is_suse; then
Dean Troyer444a8d52014-06-06 16:36:52 -0500158 local enabled_site_file="$APACHE_CONF_DIR/${site}.conf"
159 # Do nothing if no site config exists
160 if [[ -f ${enabled_site_file} ]]; then
161 sudo mv ${enabled_site_file} ${enabled_site_file}.disabled
162 fi
Jamie Lennox54707012013-09-17 12:07:48 +1000163 fi
164}
165
zhang-hared98a5d02013-06-21 18:18:02 +0800166# start_apache_server() - Start running apache server
Ian Wienandaee18c72014-02-21 15:35:08 +1100167function start_apache_server {
zhang-hared98a5d02013-06-21 18:18:02 +0800168 start_service $APACHE_NAME
169}
170
171# stop_apache_server() - Stop running apache server
Ian Wienandaee18c72014-02-21 15:35:08 +1100172function stop_apache_server {
zhang-hared98a5d02013-06-21 18:18:02 +0800173 if [ -n "$APACHE_NAME" ]; then
174 stop_service $APACHE_NAME
175 else
176 exit_distro_not_supported "apache configuration"
177 fi
178}
179
180# restart_apache_server
Ian Wienandaee18c72014-02-21 15:35:08 +1100181function restart_apache_server {
Morgan Fainberg2df00462014-07-15 11:06:36 -0700182 # Apache can be slow to stop, doing an explicit stop, sleep, start helps
183 # to mitigate issues where apache will claim a port it's listening on is
184 # still in use and fail to start.
185 stop_service $APACHE_NAME
186 sleep 3
187 start_service $APACHE_NAME
zhang-hared98a5d02013-06-21 18:18:02 +0800188}
189
190# Restore xtrace
191$XTRACE
192
Adam Spiers6a5aa7c2013-10-24 11:27:02 +0100193# Tell emacs to use shell-script-mode
194## Local variables:
195## mode: shell-script
196## End: