1
|
|
|
# coding: utf8 |
2
|
|
|
|
3
|
|
|
""" |
4
|
|
|
This software is licensed under the Apache 2 license, quoted below. |
5
|
|
|
|
6
|
|
|
Copyright 2014 Crystalnix Limited |
7
|
|
|
|
8
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not |
9
|
|
|
use this file except in compliance with the License. You may obtain a copy of |
10
|
|
|
the License at |
11
|
|
|
|
12
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
13
|
|
|
|
14
|
|
|
Unless required by applicable law or agreed to in writing, software |
15
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
16
|
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
17
|
|
|
License for the specific language governing permissions and limitations under |
18
|
|
|
the License. |
19
|
|
|
""" |
20
|
|
|
|
21
|
|
|
import os |
22
|
|
|
|
23
|
|
|
from lxml import etree, objectify |
24
|
|
|
from omaha.settings import DEFAULT_CHANNEL |
25
|
|
|
|
26
|
|
|
__all__ = ['parser', 'parse_request'] |
27
|
|
|
|
28
|
|
|
|
29
|
|
|
BASE_DIR = os.path.dirname(__file__) |
30
|
|
|
|
31
|
|
|
with open(os.path.join(BASE_DIR, 'request.xsd')) as f: |
32
|
|
|
schema = etree.XMLSchema(file=f) |
33
|
|
|
|
34
|
|
|
parser = objectify.makeparser(schema=schema) |
35
|
|
|
|
36
|
|
|
|
37
|
|
|
def parse_request(request): |
38
|
|
|
""" |
39
|
|
|
>>> request = b'''<?xml version="1.0" encoding="UTF-8"?> |
40
|
|
|
... <request protocol="3.0" |
41
|
|
|
... version="1.3.23.0" |
42
|
|
|
... ismachine="0" |
43
|
|
|
... sessionid="{5FAD27D4-6BFA-4daa-A1B3-5A1F821FEE0F}" |
44
|
|
|
... userid="{D0BBD725-742D-44ae-8D46-0231E881D58E}" |
45
|
|
|
... installsource="scheduler" |
46
|
|
|
... testsource="ossdev" |
47
|
|
|
... requestid="{C8F6EDF3-B623-4ee6-B2DA-1D08A0B4C665}"> |
48
|
|
|
... <os platform="win" version="6.1" sp="" arch="x64"/> |
49
|
|
|
... <app appid="{430FD4D0-B729-4F61-AA34-91526481799D}" version="1.2.23.0" nextversion="" lang="en" brand="GGLS" |
50
|
|
|
... client="someclientid" installage="39"> |
51
|
|
|
... <updatecheck/> |
52
|
|
|
... <ping r="1"/> |
53
|
|
|
... </app> |
54
|
|
|
... <app appid="{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}" version="2.2.2.0" nextversion="" lang="en" brand="GGLS" |
55
|
|
|
... client="" installage="6"> |
56
|
|
|
... <updatecheck/> |
57
|
|
|
... <ping r="1"/> |
58
|
|
|
... </app> |
59
|
|
|
... </request>''' |
60
|
|
|
>>> request_obj = parse_request(request) |
61
|
|
|
>>> request_obj.get('version') |
62
|
|
|
'1.3.23.0' |
63
|
|
|
>>> request_obj.os.get('platform') |
64
|
|
|
'win' |
65
|
|
|
>>> request_obj.app.get('appid') |
66
|
|
|
'{430FD4D0-B729-4F61-AA34-91526481799D}' |
67
|
|
|
>>> request_obj.app.find('updatecheck') |
68
|
|
|
'' |
69
|
|
|
>>> request_obj.keys() |
70
|
|
|
['protocol', 'version', 'ismachine', 'sessionid', 'userid', 'installsource', 'testsource', 'requestid'] |
71
|
|
|
>>> request_obj.values() |
72
|
|
|
['3.0', '1.3.23.0', '0', '{5FAD27D4-6BFA-4daa-A1B3-5A1F821FEE0F}', '{D0BBD725-742D-44ae-8D46-0231E881D58E}', 'scheduler', 'ossdev', '{C8F6EDF3-B623-4ee6-B2DA-1D08A0B4C665}'] |
73
|
|
|
>>> request_obj.tag |
74
|
|
|
'request' |
75
|
|
|
>>> for app in request_obj.find('app'): |
76
|
|
|
... app.get('appid') |
77
|
|
|
... |
78
|
|
|
'{430FD4D0-B729-4F61-AA34-91526481799D}' |
79
|
|
|
'{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}' |
80
|
|
|
""" |
81
|
|
|
return objectify.fromstring(request, parser) |
82
|
|
|
|
83
|
|
|
|
84
|
|
|
def get_channel(app): |
85
|
|
|
return app.get('tag') or app.get('ap') or DEFAULT_CHANNEL |
86
|
|
|
|