Index: tools/python/google/platform_utils_linux.py |
diff --git a/tools/python/google/platform_utils_linux.py b/tools/python/google/platform_utils_linux.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a735111c575402a9800df5bf0b347bd53004b56a |
--- /dev/null |
+++ b/tools/python/google/platform_utils_linux.py |
@@ -0,0 +1,137 @@ |
+#!/usr/bin/python |
+# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Platform-specific utility methods shared by several scripts.""" |
+ |
+import os |
+import subprocess |
+ |
+import google.path_utils |
+ |
+ |
+class PlatformUtility(object): |
+ def __init__(self, base_dir): |
+ """Args: |
+ base_dir: the base dir for running tests. |
+ """ |
+ self._base_dir = base_dir |
+ self._httpd_cmd_string = None # used for starting/stopping httpd |
+ self._bash = "/bin/bash" |
+ |
+ def _UnixRoot(self): |
+ """Returns the path to root.""" |
+ return "/" |
+ |
+ def GetFilesystemRoot(self): |
+ """Returns the root directory of the file system.""" |
+ return self._UnixRoot() |
+ |
+ def GetTempDirectory(self): |
+ """Returns the file system temp directory |
+ |
+ Note that this does not use a random subdirectory, so it's not |
+ intrinsically secure. If you need a secure subdir, use the tempfile |
+ package. |
+ """ |
+ return os.getenv("TMPDIR", "/tmp") |
+ |
+ def FilenameToUri(self, path, use_http=False, use_ssl=False, port=8000): |
+ """Convert a filesystem path to a URI. |
+ |
+ Args: |
+ path: For an http URI, the path relative to the httpd server's |
+ DocumentRoot; for a file URI, the full path to the file. |
+ use_http: if True, returns a URI of the form http://127.0.0.1:8000/. |
+ If False, returns a file:/// URI. |
+ use_ssl: if True, returns HTTPS URL (https://127.0.0.1:8000/). |
+ This parameter is ignored if use_http=False. |
+ port: The port number to append when returning an HTTP URI |
+ """ |
+ if use_http: |
+ protocol = 'http' |
+ if use_ssl: |
+ protocol = 'https' |
+ return "%s://127.0.0.1:%d/%s" % (protocol, port, path) |
+ return "file://" + path |
+ |
+ def GetStartHttpdCommand(self, output_dir, |
+ httpd_conf_path, mime_types_path, |
+ document_root=None, apache2=False): |
+ """Prepares the config file and output directory to start an httpd server. |
+ Returns a list of strings containing the server's command line+args. |
+ |
+ Args: |
+ output_dir: the path to the server's output directory, for log files. |
+ It will be created if necessary. |
+ httpd_conf_path: full path to the httpd.conf file to be used. |
+ mime_types_path: full path to the mime.types file to be used. |
+ document_root: full path to the DocumentRoot. If None, the DocumentRoot |
+ from the httpd.conf file will be used. Note that the httpd.conf |
+ file alongside this script does not specify any DocumentRoot, so if |
+ you're using that one, be sure to specify a document_root here. |
+ apache2: boolean if true will cause this function to return start |
+ command for Apache 2.x as opposed to Apache 1.3.x. This flag |
+ is ignored on Linux (but preserved here for compatibility in |
+ function signature with win), where apache2 is used always |
+ """ |
+ |
+ exe_name = "apache2" |
+ cert_file = google.path_utils.FindUpward(self._base_dir, 'tools', |
+ 'python', 'google', |
+ 'httpd_config', 'httpd2.pem') |
+ httpd_vars = { |
+ "httpd_executable_path": |
+ os.path.join(self._UnixRoot(), "usr", "sbin", exe_name), |
+ "httpd_conf_path": httpd_conf_path, |
+ "ssl_certificate_file": cert_file, |
+ "document_root" : document_root, |
+ "server_root": os.path.join(self._UnixRoot(), "usr"), |
+ "mime_types_path": mime_types_path, |
+ "output_dir": output_dir, |
+ "user": os.environ.get("USER", "#%d" % os.geteuid()), |
+ "lock_file": os.path.join(output_dir, "accept.lock"), |
+ } |
+ |
+ google.path_utils.MaybeMakeDirectory(output_dir) |
+ |
+ # We have to wrap the command in bash |
+ # -C: process directive before reading config files |
+ # -c: process directive after reading config files |
+ # Apache wouldn't run CGIs with permissions==700 unless we add |
+ # -c User "<username>" |
+ httpd_cmd_string = ( |
+ '%(httpd_executable_path)s' |
+ ' -f %(httpd_conf_path)s' |
+ ' -c \'TypesConfig "%(mime_types_path)s"\'' |
+ ' -c \'CustomLog "%(output_dir)s/access_log.txt" common\'' |
+ ' -c \'ErrorLog "%(output_dir)s/error_log.txt"\'' |
+ ' -c \'PidFile "%(output_dir)s/httpd.pid"\'' |
+ ' -C \'User "%(user)s"\'' |
+ ' -C \'ServerRoot "%(server_root)s"\'' |
+ ' -c \'LockFile "%(lock_file)s"\'' |
+ ' -c \'SSLCertificateFile "%(ssl_certificate_file)s"\'' |
+ ) |
+ |
+ if document_root: |
+ httpd_cmd_string += ' -C \'DocumentRoot "%(document_root)s"\'' |
+ # Save a copy of httpd_cmd_string to use for stopping httpd |
+ self._httpd_cmd_string = httpd_cmd_string % httpd_vars |
+ |
+ httpd_cmd = [self._bash, "-c", self._httpd_cmd_string] |
+ return httpd_cmd |
+ |
+ def GetStopHttpdCommand(self): |
+ """Returns a list of strings that contains the command line+args needed to |
+ stop the http server used in the http tests. |
+ |
+ This tries to fetch the pid of httpd (if available) and returns the |
+ command to kill it. If pid is not available, kill all httpd processes |
+ """ |
+ |
+ if not self._httpd_cmd_string: |
+ return ["true"] # Haven't been asked for the start cmd yet. Just pass. |
+ # Add a sleep after the shutdown because sometimes it takes some time for |
+ # the port to be available again. |
+ return [self._bash, "-c", self._httpd_cmd_string + ' -k stop && sleep 5'] |