We use a printf style approach when setting the run command in the command string to be executed. When doing so, the printf must be applied to only the relevant part of the string. This avoids problems in the case that other parts of the string contain special character sequences, such as '%s' in a custom log directive. Change-Id: I87df773a2872320386a34cb6a5041a9e0ba6f31e
151 lines
6.2 KiB
Python
Executable File
151 lines
6.2 KiB
Python
Executable File
#!/usr/bin/python
|
|
#
|
|
# Copyright (C) 2010 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
"""Start, stop, or restart apache2 server.
|
|
|
|
Apache2 must be installed with mod_php!
|
|
|
|
Usage:
|
|
run_apache2.py start|stop|restart
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
import logging
|
|
import optparse
|
|
import time
|
|
|
|
def main(options, args):
|
|
if len(args) < 1:
|
|
run_cmd = ""
|
|
else:
|
|
run_cmd = args[0]
|
|
|
|
# Setup logging class
|
|
logging.basicConfig(level=logging.INFO, format='%(message)s')
|
|
|
|
if not run_cmd in ("start", "stop", "restart"):
|
|
logging.info("illegal argument: " + run_cmd)
|
|
logging.info("Usage: python run_apache2.py start|stop|restart")
|
|
return
|
|
|
|
# Create /tmp/WebKit if it doesn't exist. This is needed for various files used by apache2
|
|
tmp_WebKit = os.path.join("/tmp", "WebKit")
|
|
if not os.path.exists(tmp_WebKit):
|
|
os.mkdir(tmp_WebKit)
|
|
|
|
# Get the path to android tree root based on the script location.
|
|
# Basically we go 5 levels up
|
|
parent = os.pardir
|
|
script_location = os.path.abspath(os.path.dirname(sys.argv[0]))
|
|
android_tree_root = os.path.join(script_location, parent, parent, parent, parent, parent)
|
|
android_tree_root = os.path.normpath(android_tree_root)
|
|
|
|
# If any of these is relative, then it's relative to ServerRoot (in our case android_tree_root)
|
|
webkit_path = os.path.join("external", "webkit")
|
|
if (options.tests_root_directory != None):
|
|
# if options.tests_root_directory is absolute, os.getcwd() is discarded!
|
|
layout_tests_path = os.path.normpath(os.path.join(os.getcwd(), options.tests_root_directory))
|
|
else:
|
|
layout_tests_path = os.path.join(webkit_path, "LayoutTests")
|
|
http_conf_path = os.path.join(layout_tests_path, "http", "conf")
|
|
|
|
# Prepare the command to set ${APACHE_RUN_USER} and ${APACHE_RUN_GROUP}
|
|
envvars_path = os.path.join("/etc", "apache2", "envvars")
|
|
export_envvars_cmd = "source " + envvars_path
|
|
|
|
error_log_path = os.path.join(tmp_WebKit, "apache2-error.log")
|
|
custom_log_path = os.path.join(tmp_WebKit, "apache2-access.log")
|
|
|
|
# Prepare the command to (re)start/stop the server with specified settings
|
|
apache2_restart_template = "apache2 -k %s"
|
|
directives = " -c \"ServerRoot " + android_tree_root + "\""
|
|
|
|
# The default config in apache2-debian-httpd.conf listens on ports 8080 and
|
|
# 8443. We also need to listen on port 8000 for HTTP tests.
|
|
directives += " -c \"Listen 8000\""
|
|
|
|
# We use http/tests as the document root as the HTTP tests use hardcoded
|
|
# resources at the server root. We then use aliases to make available the
|
|
# complete set of tests and the required scripts.
|
|
directives += " -c \"DocumentRoot " + os.path.join(layout_tests_path, "http", "tests/") + "\""
|
|
directives += " -c \"Alias /LayoutTests " + layout_tests_path + "\""
|
|
directives += " -c \"Alias /WebKitTools/DumpRenderTree/android " + \
|
|
os.path.join(webkit_path, "WebKitTools", "DumpRenderTree", "android") + "\""
|
|
directives += " -c \"Alias /ThirdPartyProject.prop " + \
|
|
os.path.join(webkit_path, "ThirdPartyProject.prop") + "\""
|
|
|
|
# This directive is commented out in apache2-debian-httpd.conf for some reason
|
|
# However, it is useful to browse through tests in the browser, so it's added here.
|
|
# One thing to note is that because of problems with mod_dir and port numbers, mod_dir
|
|
# is turned off. That means that there _must_ be a trailing slash at the end of URL
|
|
# for auto indexes to work correctly.
|
|
directives += " -c \"LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\""
|
|
|
|
directives += " -c \"ErrorLog " + error_log_path +"\""
|
|
directives += " -c \"CustomLog " + custom_log_path + " combined\""
|
|
directives += " -c \"SSLCertificateFile " + os.path.join(http_conf_path, "webkit-httpd.pem") + \
|
|
"\""
|
|
directives += " -c \"User ${APACHE_RUN_USER}\""
|
|
directives += " -c \"Group ${APACHE_RUN_GROUP}\""
|
|
directives += " -C \"TypesConfig " + \
|
|
os.path.join(android_tree_root, http_conf_path, "mime.types") + "\""
|
|
conf_file_cmd = " -f " + \
|
|
os.path.join(android_tree_root, http_conf_path, "apache2-debian-httpd.conf")
|
|
|
|
# Try to execute the commands
|
|
logging.info("Will " + run_cmd + " apache2 server.")
|
|
|
|
# It is worth noting here that if the configuration file with which we restart the server points
|
|
# to a different PidFile it will not work and will result in a second apache2 instance.
|
|
if (run_cmd == 'restart'):
|
|
logging.info("First will stop...")
|
|
execute_cmd(export_envvars_cmd + " && " + (apache2_restart_template % ('stop')) + directives + conf_file_cmd)
|
|
logging.info("Stopped. Will start now...")
|
|
# We need to sleep breifly to avoid errors with apache being stopped and started too quickly
|
|
time.sleep(0.5)
|
|
|
|
execute_cmd(export_envvars_cmd + " && " + (apache2_restart_template % (run_cmd)) + directives + conf_file_cmd)
|
|
|
|
def execute_cmd(cmd):
|
|
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
(out, err) = p.communicate()
|
|
|
|
# Output the stdout from the command to console
|
|
logging.info(out)
|
|
|
|
# Report any errors
|
|
if p.returncode != 0:
|
|
logging.info("!! ERRORS:")
|
|
|
|
if err.find(envvars_path) != -1:
|
|
logging.info(err)
|
|
elif err.find('command not found') != -1:
|
|
logging.info("apache2 is probably not installed")
|
|
else:
|
|
logging.info(err)
|
|
logging.info("Try looking in " + error_log_path + " for details")
|
|
else:
|
|
logging.info("OK")
|
|
|
|
if __name__ == "__main__":
|
|
option_parser = optparse.OptionParser(usage="Usage: %prog [options] start|stop|restart")
|
|
option_parser.add_option("", "--tests-root-directory",
|
|
help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
|
|
options, args = option_parser.parse_args();
|
|
main(options, args);
|