Merge ~sylvain-pineau/checkbox-support:fix-1837350 into checkbox-support:master

Proposed by Sylvain Pineau
Status: Merged
Approved by: Sylvain Pineau
Approved revision: e4b7ad7f3a3110d94b52c12eb3ed1ee6b902a892
Merged at revision: 66ec4c055327bbb9ada36e33111dc59724173fb9
Proposed branch: ~sylvain-pineau/checkbox-support:fix-1837350
Merge into: checkbox-support:master
Diff against target: 368 lines (+171/-91)
2 files modified
checkbox_support/vendor/aioblescan/aioblescan.py (+168/-87)
checkbox_support/vendor/aioblescan/eddystone.py (+3/-4)
Reviewer Review Type Date Requested Status
Devices Certification Bot Needs Fixing
Sylvain Pineau (community) Approve
Review via email: mp+376054@code.launchpad.net

Description of the change

Update aioblescan to include You-Sheng Yang fixes (See https://github.com/frawau/aioblescan/issues/24)

To post a comment you must log in.
Revision history for this message
Sylvain Pineau (sylvain-pineau) wrote :

self-approved

review: Approve
Revision history for this message
Devices Certification Bot (ce-certification-qa) wrote :

The merge was fine but running tests failed.

[xenial] [09:05:42] starting container
Device project added to xenial-testing
[bionic] [09:05:45] starting container
Device project added to bionic-testing
[xenial] [09:05:50] provisioning container
[bionic] [09:05:56] provisioning container
[xenial] [09:06:12] Starting tests...
[xenial] Found a test script: ./requirements/container-tests-checkbox-support
[bionic] [09:06:12] Starting tests...
[bionic] Found a test script: ./requirements/container-tests-checkbox-support
[xenial] [09:06:13] container-tests-checkbox-support: FAIL
[xenial] output: https://paste.ubuntu.com/p/2xmHGZZGd6/
[xenial] [09:06:15] Fixing file permissions in source directory
[xenial] [09:06:15] Destroying container
[bionic] [09:06:41] container-tests-checkbox-support: PASS
[bionic] [09:06:41] Fixing file permissions in source directory
[bionic] [09:06:41] Destroying container

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/checkbox_support/vendor/aioblescan/aioblescan.py b/checkbox_support/vendor/aioblescan/aioblescan.py
index b0d9d0d..745686f 100644
--- a/checkbox_support/vendor/aioblescan/aioblescan.py
+++ b/checkbox_support/vendor/aioblescan/aioblescan.py
@@ -25,7 +25,7 @@
25# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR25# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
26# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE26# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
2727
28import socket, asyncio, sys28import socket, asyncio
29from struct import pack, unpack, calcsize29from struct import pack, unpack, calcsize
3030
3131
@@ -106,15 +106,14 @@ class Bool:
106106
107 """107 """
108 def __init__(self,name,val=True):108 def __init__(self,name,val=True):
109 self.name=name109 self.name = name
110 self.val=val110 self.val = val
111111
112 def encode (self):112 def encode (self):
113 val=(self.val and b'\x01') or b'\x00'113 return b'\x01' if self.val else b'\x00'
114 return val
115114
116 def decode(self,data):115 def decode(self,data):
117 self.val= data[:1]==b"\x01"116 self.val = (data[:1] == b"\x01")
118 return data[1:]117 return data[1:]
119118
120 def __len__(self):119 def __len__(self):
@@ -769,7 +768,7 @@ class HCI_Cmd_LE_Scan_Enable(HCI_Command):
769768
770 """769 """
771770
772 def __init__(self,enable=True,filter_dups=True):771 def __init__(self,enable=True,filter_dups=False):
773 super(self.__class__, self).__init__(b"\x08",b"\x0c")772 super(self.__class__, self).__init__(b"\x08",b"\x0c")
774 self.payload.append(Bool("enable",enable))773 self.payload.append(Bool("enable",enable))
775 self.payload.append(Bool("filter",filter_dups))774 self.payload.append(Bool("filter",filter_dups))
@@ -803,7 +802,7 @@ class HCI_Cmd_LE_Set_Scan_Params(HCI_Command):
803802
804 """803 """
805804
806 def __init__(self,scan_type=0x0,interval=10, window=750, oaddr_type=0,filter=0):805 def __init__(self,scan_type=0x1,interval=10, window=750, oaddr_type=0,filter=0):
807806
808 super(self.__class__, self).__init__(b"\x08",b"\x0b")807 super(self.__class__, self).__init__(b"\x08",b"\x0b")
809 self.payload.append(EnumByte("scan type",scan_type,808 self.payload.append(EnumByte("scan type",scan_type,
@@ -1000,7 +999,11 @@ class HCI_LE_Meta_Event(Packet):
1000 data=x.decode(data)999 data=x.decode(data)
1001 code=self.payload[0]1000 code=self.payload[0]
1002 if code.val==b"\x02":1001 if code.val==b"\x02":
1003 ev=HCI_LEM_Adv_Report()1002 ev=RepeatedField("Reports", HCI_LEM_Adv_Report)
1003 data=ev.decode(data)
1004 self.payload.append(ev)
1005 elif code.val==b"\x0d":
1006 ev=RepeatedField("Ext Adv Report", HCI_LEM_Ext_Adv_Report)
1004 data=ev.decode(data)1007 data=ev.decode(data)
1005 self.payload.append(ev)1008 self.payload.append(ev)
1006 else:1009 else:
@@ -1014,12 +1017,50 @@ class HCI_LE_Meta_Event(Packet):
1014 for x in self.payload:1017 for x in self.payload:
1015 x.show(depth+1)1018 x.show(depth+1)
10161019
1020class ManufacturerSpecificData(Packet):
1021 def __init__(self, name="Manufacturer Specific Data"):
1022 self.name = name
1023 self.payload = [UShortInt("Manufacturer ID", endian="little"), Itself("Payload")]
1024
1025 def decode(self, data):
1026 # Warning: Will consume all the data you give it!
1027 for p in self.payload:
1028 data = p.decode(data)
1029 return data
1030
1031 def show(self, depth=0):
1032 print("{}{}:".format(PRINT_INDENT*depth,self.name))
1033 for x in self.payload:
1034 x.show(depth+1)
1035
1036
1037class RepeatedField(Packet):
1038 def __init__(self, name, subfield_cls, length_field_cls=UIntByte):
1039 self.name = name
1040 self.subfield_cls = subfield_cls
1041 self.length_field = length_field_cls("count of " + name)
1042 self.payload = []
1043
1044 def decode(self, data):
1045 self.payload = []
1046 data = self.length_field.decode(data)
1047 for x in range(self.length_field.val):
1048 field = self.subfield_cls()
1049 data = field.decode(data)
1050 self.payload.append(field)
1051
1052 return data
1053
1054 def show(self, depth=0):
1055 print("{}{}: {}".format(PRINT_INDENT*depth, self.name, self.length_field.val))
1056 for field in self.payload:
1057 field.show(depth+1)
1058
10171059
1018class HCI_LEM_Adv_Report(Packet):1060class HCI_LEM_Adv_Report(Packet):
1019 def __init__(self):1061 def __init__(self):
1020 self.name="Adv Report"1062 self.name="Adv Report"
1021 self.payload=[UIntByte("num reports"),1063 self.payload=[EnumByte("ev type",0,{0:"generic adv", 3:"no connection adv", 4:"scan rsp"}),
1022 EnumByte("ev type",0,{0:"generic adv", 3:"no connection adv", 4:"scan rsp"}),
1023 EnumByte("addr type",0,{0:"public", 1:"random"}),1064 EnumByte("addr type",0,{0:"public", 1:"random"}),
1024 MACAddr("peer"),UIntByte("length")]1065 MACAddr("peer"),UIntByte("length")]
10251066
@@ -1029,80 +1070,15 @@ class HCI_LEM_Adv_Report(Packet):
1029 for x in self.payload:1070 for x in self.payload:
1030 data=x.decode(data)1071 data=x.decode(data)
1031 #Now we have a sequence of len, type data with possibly a RSSI byte at the end1072 #Now we have a sequence of len, type data with possibly a RSSI byte at the end
1032 while len(data) > 1:1073 datalength = self.payload[-1].val
1033 length=UIntByte("sublen")1074
1034 data=length.decode(data)1075 while datalength > 0:
1035 code=EIR_Hdr()1076 ad=AD_Structure()
1036 data=code.decode(data)1077 data=ad.decode(data)
10371078 self.payload.append(ad)
1038 if code.val == 0x01:1079
1039 #Flag1080 datalength -= len(ad)
1040 myinfo=BitFieldByte("flags",0,["Undef","Undef","Simul LE - BR/EDR (Host)","Simul LE - BR/EDR (Control.)","BR/EDR Not Supported",1081
1041 "LE General Disc.","LE Limited Disc."])
1042 xx=myinfo.decode(data[:length.val-len(code)])
1043 self.payload.append(myinfo)
1044 elif code.val == 0x02:
1045 myinfo=NBytes_List("Incomplete uuids",2)
1046 xx=myinfo.decode(data[:length.val-len(code)])
1047 self.payload.append(myinfo)
1048 elif code.val == 0x03:
1049 myinfo=NBytes_List("Complete uuids",2)
1050 xx=myinfo.decode(data[:length.val-len(code)])
1051 self.payload.append(myinfo)
1052 elif code.val == 0x04:
1053 myinfo=NBytes_List("Incomplete uuids",4)
1054 xx=myinfo.decode(data[:length.val-len(code)])
1055 self.payload.append(myinfo)
1056 elif code.val == 0x05:
1057 myinfo=NBytes_List("Complete uuids",4)
1058 xx=myinfo.decode(data[:length.val-len(code)])
1059 self.payload.append(myinfo)
1060 elif code.val == 0x06:
1061 myinfo=NBytes_List("Incomplete uuids",16)
1062 xx=myinfo.decode(data[:length.val-len(code)])
1063 self.payload.append(myinfo)
1064 elif code.val == 0x07:
1065 myinfo=NBytes_List("Complete uuids",16)
1066 xx=myinfo.decode(data[:length.val-len(code)])
1067 self.payload.append(myinfo)
1068 elif code.val == 0x14:
1069 myinfo=NBytes_List("Service Solicitation uuid",2)
1070 xx=myinfo.decode(data[:length.val-len(code)])
1071 self.payload.append(myinfo)
1072 elif code.val == 0x16:
1073 myinfo=Adv_Data("Advertised Data",2)
1074 xx=myinfo.decode(data[:length.val-len(code)])
1075 self.payload.append(myinfo)
1076 elif code.val == 0x1f:
1077 myinfo=NBytes_List("Service Solicitation uuid",4)
1078 xx=myinfo.decode(data[:length.val-len(code)])
1079 self.payload.append(myinfo)
1080 elif code.val == 0x20:
1081 myinfo=Adv_Data("Advertised Data",4)
1082 xx=myinfo.decode(data[:length.val-len(code)])
1083 self.payload.append(myinfo)
1084 elif code.val == 0x15:
1085 myinfo=NBytes_List("Service Solicitation uuid",16)
1086 xx=myinfo.decode(data[:length.val-len(code)])
1087 self.payload.append(myinfo)
1088 elif code.val == 0x21:
1089 myinfo=Adv_Data("Advertised Data",16)
1090 xx=myinfo.decode(data[:length.val-len(code)])
1091 self.payload.append(myinfo)
1092 elif code.val == 0x08:
1093 myinfo=String("Short Name")
1094 xx=myinfo.decode(data[:length.val-len(code)])
1095 self.payload.append(myinfo)
1096 elif code.val == 0x09:
1097 myinfo=String("Complete Name")
1098 xx=myinfo.decode(data[:length.val-len(code)])
1099 self.payload.append(myinfo)
1100 else:
1101 myinfo=Itself("Payload for %s"%code.strval)
1102 xx=myinfo.decode(data[:length.val-len(code)])
1103 self.payload.append(myinfo)
1104
1105 data=data[length.val-len(code):]
1106 if data:1082 if data:
1107 myinfo=IntByte("rssi")1083 myinfo=IntByte("rssi")
1108 data=myinfo.decode(data)1084 data=myinfo.decode(data)
@@ -1114,6 +1090,43 @@ class HCI_LEM_Adv_Report(Packet):
1114 for x in self.payload:1090 for x in self.payload:
1115 x.show(depth+1)1091 x.show(depth+1)
11161092
1093
1094class HCI_LEM_Ext_Adv_Report(Packet):
1095 def __init__(self):
1096 self.name="Ext Adv Report"
1097 self.payload=[BitFieldByte("ev type",0,["Connectable", "Scannable", "Directed", "Scan Response", "Legacy", "Incomplete/more", "Incomplete/truncated", "RFU"]),
1098 UIntByte("unused"),
1099 EnumByte("addr type",0,{0:"public device", 1:"random device", 2:"public identity", 3:"random identity", 0xFF:"anonymous"}),
1100 MACAddr("peer"),
1101 EnumByte("primary phy",1,{1:"LE 1M", 3:"LE Coded"}),
1102 EnumByte("secondary phy",0,{0:"N/A", 1:"LE 1M", 2:"LE 2M", 3:"LE Coded"}),
1103 EnumByte("adv sid",255,{0:"0x00", 1:"0x01", 2:"0x02", 3:"0x03", 4:"0x04", 5:"0x05", 6:"0x06", 7:"0x07", 8:"0x08", 9:"0x09", 10:"0x0A", 11:"0x0B", 12:"0x0C", 13:"0x0D", 14:"0x0E", 15:"0x0F", 0xFF:"N/A"}),
1104 IntByte("tx power"),
1105 IntByte("rssi"),
1106 UShortInt("adv interval", endian="little"),
1107 EnumByte("direct addr type",0,{0:"public device", 1:"random device", 2:"public identity", 3:"random identity", 0xFE:"random device"}),
1108 MACAddr("direct addr"),
1109 UIntByte("data len")]
1110
1111
1112 def decode(self,data):
1113
1114 for x in self.payload:
1115 data=x.decode(data)
1116
1117 datalength = self.payload[-1].val
1118 while datalength > 0:
1119 ad=AD_Structure()
1120 data=ad.decode(data)
1121 self.payload.append(ad)
1122
1123 datalength -= len(ad)
1124
1125 def show(self,depth=0):
1126 print("{}{}:".format(PRINT_INDENT*depth,self.name))
1127 for x in self.payload:
1128 x.show(depth+1)
1129
1117class EIR_Hdr(Packet):1130class EIR_Hdr(Packet):
1118 def __init__(self):1131 def __init__(self):
1119 self.type= EnumByte("type", 0, {1132 self.type= EnumByte("type", 0, {
@@ -1154,8 +1167,8 @@ class EIR_Hdr(Packet):
1154 def decode(self,data):1167 def decode(self,data):
1155 return self.type.decode(data)1168 return self.type.decode(data)
11561169
1157 def show(self):1170 def show(self,depth=0):
1158 return self.type.show()1171 return self.type.show(depth)
11591172
1160 @property1173 @property
1161 def val(self):1174 def val(self):
@@ -1195,7 +1208,75 @@ class Adv_Data(Packet):
1195 resu+=len(x)1208 resu+=len(x)
1196 return resu1209 return resu
11971210
1211class AD_Structure(Packet):
1212 def __init__(self):
1213 self.name=""
1214 self.length=0
1215 self.payload=[]
1216
1217 def __len__(self):
1218 return self.length
1219
1220 def decode(self,data):
1221 length=UIntByte("sublen")
1222 data=length.decode(data)
1223 self.length=len(length)+length.val
1224 self.payload=[]
1225 if length.val == 0:
1226 return data
1227
1228 type=EIR_Hdr()
1229 data=type.decode(data)
1230
1231 val = None
1232 if type.val == 0x01:
1233 val=BitFieldByte("flags",0,["Undef","Undef","Simul LE - BR/EDR (Host)","Simul LE - BR/EDR (Control.)","BR/EDR Not Supported",
1234 "LE General Disc.","LE Limited Disc."])
1235 elif type.val == 0x02:
1236 val=NBytes_List("Incomplete uuids",2)
1237 elif type.val == 0x03:
1238 val=NBytes_List("Complete uuids",2)
1239 elif type.val == 0x04:
1240 val=NBytes_List("Incomplete uuids",4)
1241 elif type.val == 0x05:
1242 val=NBytes_List("Complete uuids",4)
1243 elif type.val == 0x06:
1244 val=NBytes_List("Incomplete uuids",16)
1245 elif type.val == 0x07:
1246 val=NBytes_List("Complete uuids",16)
1247 elif type.val == 0x08:
1248 val=String("Short Name")
1249 elif type.val == 0x09:
1250 val=String("Complete Name")
1251 elif type.val == 0x14:
1252 val=NBytes_List("Service Solicitation uuid",2)
1253 elif type.val == 0x15:
1254 val=NBytes_List("Service Solicitation uuid",16)
1255 elif type.val == 0x16:
1256 val=Adv_Data("Advertised Data",2)
1257 elif type.val == 0x1f:
1258 val=NBytes_List("Service Solicitation uuid",4)
1259 elif type.val == 0x20:
1260 val=Adv_Data("Advertised Data",4)
1261 elif type.val == 0x21:
1262 val=Adv_Data("Advertised Data",16)
1263 elif type.val == 0xff:
1264 val=ManufacturerSpecificData()
1265 else:
1266 val=Itself("Payload for %s"%type.strval)
1267
1268 # Some data type may consume all input data, therefore an copy
1269 # is passed instead.
1270 val.decode(data[:length.val-len(type)])
1271
1272 self.payload.append(type)
1273 self.payload.append(val)
1274
1275 return data[length.val-len(type):]
11981276
1277 def show(self,depth=0):
1278 for x in self.payload:
1279 x.show(depth+1)
11991280
1200#1281#
1201# The defs are over. Now the realstuffs1282# The defs are over. Now the realstuffs
diff --git a/checkbox_support/vendor/aioblescan/eddystone.py b/checkbox_support/vendor/aioblescan/eddystone.py
index 3cc0d2c..1ee0217 100644
--- a/checkbox_support/vendor/aioblescan/eddystone.py
+++ b/checkbox_support/vendor/aioblescan/eddystone.py
@@ -114,22 +114,21 @@ class EddyStone(object):
114 url_schemes.index((myurl.scheme,myhostname.startswith("www.")))))114 url_schemes.index((myurl.scheme,myhostname.startswith("www.")))))
115 if myhostname.startswith("www."):115 if myhostname.startswith("www."):
116 myhostname = myhostname[4:]116 myhostname = myhostname[4:]
117
118 extval=None117 extval=None
119 if myhostname.split(".")[-1] in url_domain:118 if myhostname.split(".")[-1] in url_domain:
120 extval = url_domain.index(myhostname.split(".")[-1])119 extval = url_domain.index(myhostname.split(".")[-1])
121 myhostname = ".".join(myhostname.split(".")[:-1])120 myhostname = ".".join(myhostname.split(".")[:-1])
122 if extval and not mypath.startswith("/"):121 if extval is not None and not mypath.startswith("/"):
123 extval+=7122 extval+=7
124 else:123 else:
125 if myurl.port is None:124 if myurl.port is None:
126 if extval:125 if extval is not None:
127 mypath = mypath[1:]126 mypath = mypath[1:]
128 else:127 else:
129 extval += 7128 extval += 7
130 encodedurl.append(aios.String("URL string"))129 encodedurl.append(aios.String("URL string"))
131 encodedurl[-1].val = myhostname130 encodedurl[-1].val = myhostname
132 if extval:131 if extval is not None:
133 encodedurl.append(aios.IntByte("URL Extention",extval))132 encodedurl.append(aios.IntByte("URL Extention",extval))
134133
135 if myurl.port:134 if myurl.port:

Subscribers

People subscribed via source and target branches