| 185 | |
| 186 | |
| 187 | class HICPModuleScanResponse(Packet): |
| 188 | name = "Module scan response" |
| 189 | fields_desc = [ |
| 190 | StrField("protocol_version", "1.00"), |
| 191 | StrField("fieldbus_type", ""), |
| 192 | StrField("module_version", ""), |
| 193 | MACField("mac_address", "ff:ff:ff:ff:ff:ff"), |
| 194 | IPField("ip_address", "255.255.255.255"), |
| 195 | IPField("subnet_mask", "255.255.255.0"), |
| 196 | IPField("gateway_address", "0.0.0.0"), |
| 197 | StrField("dhcp", "OFF"), # ON or OFF |
| 198 | StrField("password", "OFF"), # ON or OFF |
| 199 | StrField("hostname", ""), |
| 200 | IPField("dns1", "0.0.0.0"), |
| 201 | IPField("dns2", "0.0.0.0"), |
| 202 | ByteField("padding", 0) |
| 203 | ] |
| 204 | |
| 205 | def post_build(self, p, pay): |
| 206 | p = [] |
| 207 | for field in self.fields_desc: |
| 208 | if field.name in KEYS: |
| 209 | value = getattr(self, field.name) |
| 210 | if isinstance(value, bytes): |
| 211 | value = value.decode('utf-8') |
| 212 | p.append("{0} = {1};".format(KEYS[field.name], value)) |
| 213 | return "".join(p).encode('utf-8') + b"\x00" + pay |
| 214 | |
| 215 | def do_dissect(self, s): |
| 216 | for arg in s.split(b";"): |
| 217 | kv = [x.strip().replace(b"\x00", b"") for x in arg.split(b"=")] |
| 218 | if len(kv) != 2 or not kv[1]: |
| 219 | continue |
| 220 | kv[0] = kv[0].decode('utf-8') |
| 221 | if kv[0] in KEYS.values(): |
| 222 | field = [x for x, y in KEYS.items() if y == kv[0]][0] |
| 223 | if field == "mac_address": |
| 224 | kv[1] = TO_MACFIELD(kv[1].decode('utf-8')) |
| 225 | setattr(self, field, kv[1]) |
| 226 | |
| 227 | |
| 228 | class HICPModuleScan(Packet): |