From 506ab0ccc2b1f258a1c7b1a82cff50944b9f1319 Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Tue, 6 Feb 2018 15:56:50 -0800 Subject: [PATCH] check browser version at startup --- brozzler/chrome.py | 29 +++++++++++++++++++++++++++++ brozzler/cli.py | 2 ++ brozzler/easy.py | 1 + 3 files changed, 32 insertions(+) diff --git a/brozzler/chrome.py b/brozzler/chrome.py index 3b44773..1d12b04 100644 --- a/brozzler/chrome.py +++ b/brozzler/chrome.py @@ -29,6 +29,35 @@ import signal import sqlite3 import json import tempfile +import sys + +def check_version(chrome_exe): + ''' + Raises SystemExit if `chrome_exe` is not a supported browser version. + + Must run in the main thread to have the desired effect. + ''' + # mac$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version + # Google Chrome 64.0.3282.140 + # mac$ /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --version + # Google Chrome 66.0.3341.0 canary + # linux$ chromium-browser --version + # Using PPAPI flash. + # --ppapi-flash-path=/usr/lib/adobe-flashplugin/libpepflashplayer.so --ppapi-flash-version= + # Chromium 61.0.3163.100 Built on Ubuntu , running on Ubuntu 16.04 + cmd = [chrome_exe, '--version'] + out = subprocess.check_output(cmd, timeout=60) + m = re.search(br'(Chromium|Google Chrome) ([\d.]+)', out) + if not m: + sys.exit( + 'unable to parse browser version from output of ' + '%r: %r' % (subprocess.list2cmdline(cmd), out)) + version_str = m.group(2).decode() + major_version = int(version_str.split('.')[0]) + if major_version < 64: + sys.exit('brozzler requires chrome/chromium version 64 or ' + 'later but %s reports version %s' % ( + chrome_exe, version_str)) class Chrome: logger = logging.getLogger(__module__ + '.' + __qualname__) diff --git a/brozzler/cli.py b/brozzler/cli.py index c4b4ced..39314fc 100644 --- a/brozzler/cli.py +++ b/brozzler/cli.py @@ -167,6 +167,7 @@ def brozzle_page(argv=None): args = arg_parser.parse_args(args=argv[1:]) configure_logging(args) + brozzler.chrome.check_version(args.chrome_exe) behavior_parameters = {} if args.behavior_parameters: @@ -325,6 +326,7 @@ def brozzler_worker(argv=None): args = arg_parser.parse_args(args=argv[1:]) configure_logging(args) + brozzler.chrome.check_version(args.chrome_exe) def dump_state(signum, frame): signal.signal(signal.SIGQUIT, signal.SIG_IGN) diff --git a/brozzler/easy.py b/brozzler/easy.py index c9480a1..83cf1ba 100644 --- a/brozzler/easy.py +++ b/brozzler/easy.py @@ -268,6 +268,7 @@ def main(argv=None): arg_parser = _build_arg_parser(argv) args = arg_parser.parse_args(args=argv[1:]) brozzler.cli.configure_logging(args) + brozzler.chrome.check_version(args.chrome_exe) controller = BrozzlerEasyController(args) signal.signal(signal.SIGTERM, lambda a,b: controller.stop.set())