| OLD | NEW |
| 1 # This file is part of the Adblock Plus web scripts, | 1 # This file is part of the Adblock Plus web scripts, |
| 2 # Copyright (C) 2006-2016 Eyeo GmbH | 2 # Copyright (C) 2006-2016 Eyeo GmbH |
| 3 # | 3 # |
| 4 # Adblock Plus is free software: you can redistribute it and/or modify | 4 # Adblock Plus is free software: you can redistribute it and/or modify |
| 5 # it under the terms of the GNU General Public License version 3 as | 5 # it under the terms of the GNU General Public License version 3 as |
| 6 # published by the Free Software Foundation. | 6 # published by the Free Software Foundation. |
| 7 # | 7 # |
| 8 # Adblock Plus is distributed in the hope that it will be useful, | 8 # Adblock Plus is distributed in the hope that it will be useful, |
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import traceback | 22 import traceback |
| 23 from StringIO import StringIO | 23 from StringIO import StringIO |
| 24 | 24 |
| 25 from sitescripts.utils import get_config | 25 from sitescripts.utils import get_config |
| 26 | 26 |
| 27 | 27 |
| 28 def _parse_targetspec(value, name): | 28 def _parse_targetspec(value, name): |
| 29 target = {} | 29 target = {} |
| 30 for spec in value.split(): | 30 for spec in value.split(): |
| 31 known = False | 31 known = False |
| 32 for parameter in ("extension", "application", "platform"): | 32 for parameter in ('extension', 'application', 'platform'): |
| 33 if spec.startswith(parameter + "="): | 33 if spec.startswith(parameter + '='): |
| 34 target[parameter] = spec[len(parameter + "="):] | 34 target[parameter] = spec[len(parameter + '='):] |
| 35 known = True | 35 known = True |
| 36 elif spec.startswith(parameter + "Version>="): | 36 elif spec.startswith(parameter + 'Version>='): |
| 37 target[parameter + "MinVersion"] = spec[len(parameter + "Version
>="):] | 37 target[parameter + 'MinVersion'] = spec[len(parameter + 'Version
>='):] |
| 38 known = True | 38 known = True |
| 39 elif spec.startswith(parameter + "Version<="): | 39 elif spec.startswith(parameter + 'Version<='): |
| 40 target[parameter + "MaxVersion"] = spec[len(parameter + "Version
<="):] | 40 target[parameter + 'MaxVersion'] = spec[len(parameter + 'Version
<='):] |
| 41 known = True | 41 known = True |
| 42 elif spec.startswith(parameter + "Version="): | 42 elif spec.startswith(parameter + 'Version='): |
| 43 target[parameter + "MinVersion"] = target[parameter + "MaxVersio
n"] = spec[len(parameter + "Version="):] | 43 target[parameter + 'MinVersion'] = target[parameter + 'MaxVersio
n'] = spec[len(parameter + 'Version='):] |
| 44 known = True | 44 known = True |
| 45 if not known: | 45 if not known: |
| 46 raise Exception("Unknown target specifier '%s' in file '%s'" % (spec
, name)) | 46 raise Exception("Unknown target specifier '%s' in file '%s'" % (spec
, name)) |
| 47 return target | 47 return target |
| 48 | 48 |
| 49 | 49 |
| 50 def _parse_notification(data, name): | 50 def _parse_notification(data, name): |
| 51 notification = {"id": name, "severity": "information", "message": {}, "title
": {}} | 51 notification = {'id': name, 'severity': 'information', 'message': {}, 'title
': {}} |
| 52 current = notification | 52 current = notification |
| 53 | 53 |
| 54 for line in data: | 54 for line in data: |
| 55 if not re.search(r"\S", line): | 55 if not re.search(r'\S', line): |
| 56 continue | 56 continue |
| 57 | 57 |
| 58 if re.search(r"^\[.*\]$", line): | 58 if re.search(r'^\[.*\]$', line): |
| 59 current = {"title": {}, "message": {}} | 59 current = {'title': {}, 'message': {}} |
| 60 notification.setdefault("variants", []).append(current) | 60 notification.setdefault('variants', []).append(current) |
| 61 continue | 61 continue |
| 62 | 62 |
| 63 if line.find("=") < 0: | 63 if line.find('=') < 0: |
| 64 raise Exception("Could not process line '%s' in file '%s'" % (line.s
trip(), name)) | 64 raise Exception("Could not process line '%s' in file '%s'" % (line.s
trip(), name)) |
| 65 | 65 |
| 66 key, value = map(unicode.strip, line.split("=", 1)) | 66 key, value = map(unicode.strip, line.split('=', 1)) |
| 67 is_variant = current != notification | 67 is_variant = current != notification |
| 68 | 68 |
| 69 if key == "inactive" and not is_variant: | 69 if key == 'inactive' and not is_variant: |
| 70 current["inactive"] = value.lower() not in ("", "0", "no", "false",
"off") | 70 current['inactive'] = value.lower() not in ('', '0', 'no', 'false',
'off') |
| 71 elif key == "severity": | 71 elif key == 'severity': |
| 72 if value not in ("information", "critical", "normal"): | 72 if value not in ('information', 'critical', 'normal'): |
| 73 raise Exception("Unknown severity value '%s' in file '%s'" % (va
lue, name)) | 73 raise Exception("Unknown severity value '%s' in file '%s'" % (va
lue, name)) |
| 74 current["severity"] = value | 74 current['severity'] = value |
| 75 elif key == "links": | 75 elif key == 'links': |
| 76 current["links"] = value.split() | 76 current['links'] = value.split() |
| 77 elif key.startswith("title."): | 77 elif key.startswith('title.'): |
| 78 locale = key[len("title."):] | 78 locale = key[len('title.'):] |
| 79 current["title"][locale] = value | 79 current['title'][locale] = value |
| 80 elif key.startswith("message."): | 80 elif key.startswith('message.'): |
| 81 locale = key[len("message."):] | 81 locale = key[len('message.'):] |
| 82 current["message"][locale] = value | 82 current['message'][locale] = value |
| 83 elif key == "target": | 83 elif key == 'target': |
| 84 target = _parse_targetspec(value, name) | 84 target = _parse_targetspec(value, name) |
| 85 if "targets" in notification: | 85 if 'targets' in notification: |
| 86 current["targets"].append(target) | 86 current['targets'].append(target) |
| 87 else: | 87 else: |
| 88 current["targets"] = [target] | 88 current['targets'] = [target] |
| 89 elif key == "sample" and is_variant: | 89 elif key == 'sample' and is_variant: |
| 90 current["sample"] = float(value) | 90 current['sample'] = float(value) |
| 91 elif key in ["start", "end"]: | 91 elif key in ['start', 'end']: |
| 92 current[key] = datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M") | 92 current[key] = datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M') |
| 93 else: | 93 else: |
| 94 raise Exception("Unknown parameter '%s' in file '%s'" % (key, name)) | 94 raise Exception("Unknown parameter '%s' in file '%s'" % (key, name)) |
| 95 | 95 |
| 96 for text_key in ("title", "message"): | 96 for text_key in ('title', 'message'): |
| 97 def has_default_locale(variant): | 97 def has_default_locale(variant): |
| 98 return "en-US" in variant[text_key] | 98 return 'en-US' in variant[text_key] |
| 99 if not has_default_locale(notification): | 99 if not has_default_locale(notification): |
| 100 variants = notification.get("variants", []) | 100 variants = notification.get('variants', []) |
| 101 if not all(map(has_default_locale, variants)): | 101 if not all(map(has_default_locale, variants)): |
| 102 raise Exception("No %s for en-US (default language) " | 102 raise Exception('No %s for en-US (default language) ' |
| 103 "in file '%s'" % (text_key, name)) | 103 "in file '%s'" % (text_key, name)) |
| 104 return notification | 104 return notification |
| 105 | 105 |
| 106 | 106 |
| 107 def load_notifications(): | 107 def load_notifications(): |
| 108 repo = get_config().get("notifications", "repository") | 108 repo = get_config().get('notifications', 'repository') |
| 109 command = ["hg", "-R", repo, "archive", "-r", "default", "-t", "tar", | 109 command = ['hg', '-R', repo, 'archive', '-r', 'default', '-t', 'tar', |
| 110 "-p", ".", "-X", os.path.join(repo, ".hg_archival.txt"), "-"] | 110 '-p', '.', '-X', os.path.join(repo, '.hg_archival.txt'), '-'] |
| 111 data = subprocess.check_output(command) | 111 data = subprocess.check_output(command) |
| 112 | 112 |
| 113 notifications = [] | 113 notifications = [] |
| 114 with tarfile.open(mode="r:", fileobj=StringIO(data)) as archive: | 114 with tarfile.open(mode='r:', fileobj=StringIO(data)) as archive: |
| 115 for fileinfo in archive: | 115 for fileinfo in archive: |
| 116 name = fileinfo.name | 116 name = fileinfo.name |
| 117 if name.startswith("./"): | 117 if name.startswith('./'): |
| 118 name = name[2:] | 118 name = name[2:] |
| 119 | 119 |
| 120 if fileinfo.type == tarfile.REGTYPE: | 120 if fileinfo.type == tarfile.REGTYPE: |
| 121 data = codecs.getreader("utf8")(archive.extractfile(fileinfo)) | 121 data = codecs.getreader('utf8')(archive.extractfile(fileinfo)) |
| 122 try: | 122 try: |
| 123 notification = _parse_notification(data, name) | 123 notification = _parse_notification(data, name) |
| 124 if not "inactive" in notification: | 124 if not 'inactive' in notification: |
| 125 current_time = datetime.datetime.now() | 125 current_time = datetime.datetime.now() |
| 126 start = notification.pop("start", current_time) | 126 start = notification.pop('start', current_time) |
| 127 end = notification.pop("end", current_time) | 127 end = notification.pop('end', current_time) |
| 128 if not start <= current_time <= end: | 128 if not start <= current_time <= end: |
| 129 notification["inactive"] = True | 129 notification['inactive'] = True |
| 130 notifications.append(notification) | 130 notifications.append(notification) |
| 131 except: | 131 except: |
| 132 traceback.print_exc() | 132 traceback.print_exc() |
| 133 return notifications | 133 return notifications |
| OLD | NEW |