Steve Block 0e1d6876f9 Fix a bug in DumpRenderTree2's run_apache2.py script
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
2010-09-22 15:33:05 +01:00

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);