This repository has been archived by the owner on Oct 15, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
importer.py
142 lines (110 loc) · 5.24 KB
/
importer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import codecs
import json
import requests
import six
from kinto_client import cli_utils
from six.moves.urllib.parse import urljoin
from . import constants
from .amo import prepare_amo_records
from .kinto import get_kinto_records
from .logger import logger
from .synchronize import get_diff, push_changes
FIELDS = {
'add-ons': ['blockID', 'os', 'guid', 'prefs', 'versionRange', 'details'],
'certificates': ['serialNumber', 'issuerName', 'details'],
'gfx': ['blockID', 'os', 'vendor', 'feature', 'featureStatus',
'driverVersion', 'driverVersionmax', 'driverVersionComparator',
'devices', 'details'],
'plugins': ['blockID', 'os', 'xpcomabi', 'infoURL', 'versionRange',
'matchName', 'matchFilename', 'matchDescription', 'details']
}
def sync_records(amo_records, fields,
kinto_client, bucket, collection, schema, permissions):
amo_records = prepare_amo_records(amo_records, fields)
kinto_records = get_kinto_records(
kinto_client=kinto_client,
bucket=bucket,
collection=collection,
schema=schema,
permissions=permissions)
to_create, to_delete = get_diff(amo_records, kinto_records)
push_changes((to_create, to_delete), kinto_client,
bucket=bucket, collection=collection)
def main(args=None):
parser = cli_utils.add_parser_options(
description='Import the blocklists for AMO into Kinto.',
default_collection=None,
default_bucket=None,
default_server=constants.KINTO_SERVER,
default_auth=constants.AUTH,
include_bucket=False,
include_collection=False)
parser.add_argument('-S', '--schema-file', help='JSON Schemas file',
type=str, default=constants.SCHEMA_FILE)
parser.add_argument('--no-schema', help='Should we handle schemas',
action="store_true")
parser.add_argument('--certificates-bucket',
help='Bucket name for certificates',
type=str, default=constants.CERT_BUCKET)
parser.add_argument('--certificates-collection',
help='Collection name for certificates',
type=str, default=constants.CERT_COLLECTION)
parser.add_argument('--gfx-bucket', help='Bucket name for gfx',
type=str, default=constants.GFX_BUCKET)
parser.add_argument('--gfx-collection',
help='Collection name for gfx',
type=str, default=constants.GFX_COLLECTION)
parser.add_argument('--addons-bucket', help='Bucket name for addons',
type=str, default=constants.ADDONS_BUCKET)
parser.add_argument('--addons-collection',
help='Collection name for addon',
type=str, default=constants.ADDONS_COLLECTION)
parser.add_argument('--plugins-bucket', help='Bucket name for plugins',
type=str, default=constants.PLUGINS_BUCKET)
parser.add_argument('--plugins-collection',
help='Collection name for plugin',
type=str, default=constants.PLUGINS_COLLECTION)
parser.add_argument('-C', '--certificates',
help='Only import certificates',
action='store_true')
parser.add_argument('-G', '--gfx', help='Only import GFX drivers',
action='store_true')
parser.add_argument('-A', '--addons', help='Only import addons',
action='store_true')
parser.add_argument('-P', '--plugins', help='Only import plugins',
action='store_true')
# AMO Server selection
parser.add_argument('--amo-server', help='The AMO server to import from',
type=str, default=constants.AMO_SERVER)
args = parser.parse_args(args=args)
cli_utils.setup_logger(logger, args)
# If none of the different "collections" were passed as parameter, then we
# want to import them all.
import_all = not any([
args.certificates,
args.gfx,
args.addons,
args.plugins])
kinto_client = cli_utils.create_client_from_args(args)
# Load the schemas
schemas = {}
if not args.no_schema:
with codecs.open(args.schema_file, 'r', encoding='utf-8') as f:
schemas = json.load(f)
amo_blocklists_url = urljoin(args.amo_server, '/blocked/blocklists.json')
resp = requests.get(amo_blocklists_url)
resp.raise_for_status()
blocklists = resp.json()
for collection_type, records in six.iteritems(blocklists):
args_type = collection_type.replace('-', '')
if hasattr(args, args_type) and (getattr(args, args_type) or
import_all):
bucket = getattr(args, '%s_bucket' % args_type)
collection = getattr(args, '%s_collection' % args_type)
sync_records(amo_records=records,
fields=FIELDS[collection_type],
kinto_client=kinto_client,
bucket=bucket,
collection=collection,
schema=schemas.get(collection_type),
permissions=constants.COLLECTION_PERMISSIONS)