run_apache2.py revision fe33f987cb61d8a5c22f207df6d47d2346828af7
174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski#!/usr/bin/python
2073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#
3073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# Copyright (C) 2010 The Android Open Source Project
4073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#
5073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# Licensed under the Apache License, Version 2.0 (the "License");
6073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# you may not use this file except in compliance with the License.
7073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# You may obtain a copy of the License at
8073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#
9073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#      http://www.apache.org/licenses/LICENSE-2.0
10073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#
11073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# Unless required by applicable law or agreed to in writing, software
12073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# distributed under the License is distributed on an "AS IS" BASIS,
13073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# See the License for the specific language governing permissions and
15073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski# limitations under the License.
16073d2c9aa96f6265bacb5c6abc609ca265f60488Maksymilian Osowski#
1774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski"""Start, stop, or restart apache2 server.
1874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
1974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  Apache2 must be installed with mod_php!
2074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
2174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  Usage:
220e4d86fddf2c9664f2fd44247e5688f077b95d5eSteve Block    run_apache2.py start|stop|restart
2374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski"""
2474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
2574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskiimport sys
2674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskiimport os
2774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskiimport subprocess
2874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskiimport logging
2974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
3074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskidef main():
3174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  if len(sys.argv) < 2:
3274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    run_cmd = ""
3374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  else:
3474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    run_cmd = sys.argv[1]
3574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
3674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Setup logging class
3774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  logging.basicConfig(level=logging.INFO, format='%(message)s')
3874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
3974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  if not run_cmd in ("start", "stop", "restart"):
4074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    logging.info("illegal argument: " + run_cmd)
410e4d86fddf2c9664f2fd44247e5688f077b95d5eSteve Block    logging.info("Usage: python run_apache2.py start|stop|restart")
4274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    return
4374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
4474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Create /tmp/WebKit if it doesn't exist. This is needed for various files used by apache2
4574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  tmp_WebKit = os.path.join("/tmp", "WebKit")
4674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  if not os.path.exists(tmp_WebKit):
4774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    os.mkdir(tmp_WebKit)
4874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
4974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Get the path to android tree root based on the script location.
5074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Basically we go 5 levels up
5174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  parent = os.pardir
5274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  script_location = os.path.abspath(os.path.dirname(sys.argv[0]))
5374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  android_tree_root = os.path.join(script_location, parent, parent, parent, parent, parent)
5474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  android_tree_root = os.path.normpath(android_tree_root)
5574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
5674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Prepare the command to set ${APACHE_RUN_USER} and ${APACHE_RUN_GROUP}
5774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  envvars_path = os.path.join("/etc", "apache2", "envvars")
5874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  export_envvars_cmd = "source " + envvars_path
5974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
6074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  error_log_path = os.path.join(tmp_WebKit, "apache2-error.log")
61fe33f987cb61d8a5c22f207df6d47d2346828af7Maksymilian Osowski  custom_log_path = os.path.join(tmp_WebKit, "apache2-access.log")
6274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
6374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Prepare the command to (re)start/stop the server with specified settings
6474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  apache2_restart_cmd = "apache2 -k " + run_cmd
6574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives  = " -c \"ServerRoot " + android_tree_root + "\""
6674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"DocumentRoot " + os.path.join("external", "webkit") + "\""
6774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
6874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #This directive is commented out in apache2-debian-httpd.conf for some reason
6974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #However, it is useful to browse through tests in the browser, so it's added here.
7074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #One thing to note is that because of problems with mod_dir and port numbers, mod_dir
7174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #is turned off. That means that there _must_ be a trailing slash at the end of URL
7274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #for auto indexes to work correctly.
7374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\""
7474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
7574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"ErrorLog " + error_log_path +"\""
76fe33f987cb61d8a5c22f207df6d47d2346828af7Maksymilian Osowski  directives += " -c \"CustomLog " + custom_log_path + " combined\""
7774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"SSLCertificateFile " + os.path.join ("external", "webkit", "LayoutTests",
7874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    "http", "conf", "webkit-httpd.pem") + "\""
7974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"User ${APACHE_RUN_USER}\""
8074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -c \"Group ${APACHE_RUN_GROUP}\""
8174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  directives += " -C \"TypesConfig " + os.path.join("/etc", "mime.types") + "\""
8274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  conf_file_cmd = " -f " + os.path.join(android_tree_root, "external", "webkit", "LayoutTests",
8374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    "http", "conf", "apache2-debian-httpd.conf")
8474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
8574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Try to execute the commands
8674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  logging.info("Will " + run_cmd + " apache2 server.")
8774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  cmd = export_envvars_cmd + " && " + apache2_restart_cmd + directives + conf_file_cmd
8874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
8974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  (out, err) = p.communicate()
9074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
9174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Output the stdout from the command to console
9274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  logging.info(out)
9374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
9474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  #Report any errors
9574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  if p.returncode != 0:
9674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    logging.info("!! ERRORS:")
9774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
9874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    if err.find(envvars_path) != -1:
9974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski      logging.info(err)
10074b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    elif err.find('command not found') != -1:
10174b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski      logging.info("apache2 is probably not installed")
10274b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    else:
10374b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski      logging.info(err)
10474b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski      logging.info("Try looking in " + error_log_path + " for details")
10574b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  else:
10674b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski    logging.info("OK")
10774b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski
10874b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowskiif __name__ == "__main__":
10974b13aecbe4116ce33da8ed99f1b5941ecda6505Maksymilian Osowski  main();
110