def _decode_custom_type(decoder: cbor2.CBORDecoder, value, fp, shareable_index: Optional[int], *, serializer: 'CBORSerializer'): typename, serialized_state = value try: cls, unmarshaller = serializer.unmarshallers[typename] except KeyError: raise LookupError( 'no unmarshaller found for type "{}"'.format(typename)) from None instance = cls.__new__(cls) if shareable_index is not None: decoder.shareables[shareable_index] = instance buf = BytesIO(serialized_state) state = decoder.decode(buf) unmarshaller(instance, state) return instance
def cbor_tag_decoder(self, decoder: cbor2.CBORDecoder, tag: cbor2.CBORTag, shareable_index: int = None): if tag.tag != self.type_tag: return tag typename, serialized_state = tag.value try: cls, unmarshaller = self.serializer.unmarshallers[typename] except KeyError: raise LookupError('no unmarshaller found for type "{}"'.format(typename)) from None if cls is not None: instance = cls.__new__(cls) decoder.set_shareable(shareable_index, instance) marshalled_state = decoder.decode_from_bytes(serialized_state) unmarshaller(instance, marshalled_state) return instance else: marshalled_state = decoder.decode_from_bytes(serialized_state) return unmarshaller(marshalled_state)
def main(): usage = '%prog [-v] [-h] <cds file...>' parser = optparse.OptionParser(usage, version='%prog 0.01') parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='turn verbose mode on') (options, args) = parser.parse_args() if options.verbose == True: log.setLevel(logging.DEBUG) log.debug('argv: %s', sys.argv) log.debug('options: %s', options) log.debug('args: %s', args) else: log.setLevel(logging.WARNING) if not args: parser.print_usage() exit(1) decoder = CBORDecoder() # if https://github.com/agronholm/cbor2/pull/5 is not merged/released yet if 0 not in decoder.special_decoders: decoder.special_decoders[0] = lambda self, fp, shareable_index=None: SimpleValue(0) decoder.special_decoders[1] = lambda self, fp, shareable_index=None: SimpleValue(1) decoder.special_decoders[2] = lambda self, fp, shareable_index=None: SimpleValue(2) decoder.special_decoders[3] = lambda self, fp, shareable_index=None: SimpleValue(3) decoder.special_decoders[4] = lambda self, fp, shareable_index=None: SimpleValue(4) decoder.special_decoders[5] = lambda self, fp, shareable_index=None: SimpleValue(5) decoder.special_decoders[6] = lambda self, fp, shareable_index=None: SimpleValue(6) decoder.special_decoders[7] = lambda self, fp, shareable_index=None: SimpleValue(7) decoder.special_decoders[8] = lambda self, fp, shareable_index=None: SimpleValue(8) decoder.special_decoders[9] = lambda self, fp, shareable_index=None: SimpleValue(9) decoder.special_decoders[10] = lambda self, fp, shareable_index=None: SimpleValue(10) decoder.special_decoders[11] = lambda self, fp, shareable_index=None: SimpleValue(11) decoder.special_decoders[12] = lambda self, fp, shareable_index=None: SimpleValue(12) decoder.special_decoders[13] = lambda self, fp, shareable_index=None: SimpleValue(13) decoder.special_decoders[14] = lambda self, fp, shareable_index=None: SimpleValue(14) decoder.special_decoders[15] = lambda self, fp, shareable_index=None: SimpleValue(15) decoder.special_decoders[16] = lambda self, fp, shareable_index=None: SimpleValue(16) decoder.special_decoders[17] = lambda self, fp, shareable_index=None: SimpleValue(17) decoder.special_decoders[18] = lambda self, fp, shareable_index=None: SimpleValue(18) decoder.special_decoders[19] = lambda self, fp, shareable_index=None: SimpleValue(19) decoder.special_decoders[24] = decode_simple_value version = None for f in args: log.debug('file: %s', f) with open(f, 'rb') as fp: obj = None try: obj = decoder.decode(fp) except Exception as e: if e.__str__().find("index out of range") == -1: raise if not isinstance(obj, list): raise Exception("Invalid element, expected an array but found: {}".format(type(obj))) version = obj.pop(0) if version != "CDSv1": raise Exception("Invalid version, expected CDSv1 but got: {}".format(version)) while len(obj): opt = obj.pop(0) if not isinstance(opt, int): raise Exception("Invalid option, expected int but got: {}".format(type(opt))) if opt == 0: MAX_RLABELS = obj.pop(0) if not isinstance(MAX_RLABELS, int) or MAX_RLABELS < 1: raise Exception("Invalid option for maximum rlabels, got: {}".format(MAX_RLABELS)) log.debug("Using maximum rlabels {}".format(MAX_RLABELS)) elif opt == 1: MIN_RLABEL_SIZE = obj.pop(0) if not isinstance(MIN_RLABEL_SIZE, int) or MIN_RLABEL_SIZE < 1: raise Exception("Invalid option for minimum rlabel size, got: {}".format(MIN_RLABEL_SIZE)) log.debug("Using minimum rlabel size {}".format(MIN_RLABEL_SIZE)) else: raise Exception("Unknown option: {}".format(opt)) while True: obj = None try: obj = decoder.decode(fp) except Exception as e: if e.__str__().find("index out of range") == -1: raise if obj is None: break if not isinstance(obj, list): raise Exception("Invalid element, expected an array but found: {}".format(type(obj))) parse(obj) last.reset()
def main(): usage = '%prog [-v] [-h] <cds file...>' parser = optparse.OptionParser(usage, version='%prog 0.01') parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='turn verbose mode on') (options, args) = parser.parse_args() if options.verbose == True: log.setLevel(logging.DEBUG) log.debug('argv: %s', sys.argv) log.debug('options: %s', options) log.debug('args: %s', args) else: log.setLevel(logging.WARNING) if not args: parser.print_usage() exit(1) decoder = CBORDecoder() # if https://github.com/agronholm/cbor2/pull/5 is not merged/released yet if 0 not in decoder.special_decoders: decoder.special_decoders[0] = lambda self, fp, shareable_index=None: SimpleValue(0) decoder.special_decoders[1] = lambda self, fp, shareable_index=None: SimpleValue(1) decoder.special_decoders[2] = lambda self, fp, shareable_index=None: SimpleValue(2) decoder.special_decoders[3] = lambda self, fp, shareable_index=None: SimpleValue(3) decoder.special_decoders[4] = lambda self, fp, shareable_index=None: SimpleValue(4) decoder.special_decoders[5] = lambda self, fp, shareable_index=None: SimpleValue(5) decoder.special_decoders[6] = lambda self, fp, shareable_index=None: SimpleValue(6) decoder.special_decoders[7] = lambda self, fp, shareable_index=None: SimpleValue(7) decoder.special_decoders[8] = lambda self, fp, shareable_index=None: SimpleValue(8) decoder.special_decoders[9] = lambda self, fp, shareable_index=None: SimpleValue(9) decoder.special_decoders[10] = lambda self, fp, shareable_index=None: SimpleValue(10) decoder.special_decoders[11] = lambda self, fp, shareable_index=None: SimpleValue(11) decoder.special_decoders[12] = lambda self, fp, shareable_index=None: SimpleValue(12) decoder.special_decoders[13] = lambda self, fp, shareable_index=None: SimpleValue(13) decoder.special_decoders[14] = lambda self, fp, shareable_index=None: SimpleValue(14) decoder.special_decoders[15] = lambda self, fp, shareable_index=None: SimpleValue(15) decoder.special_decoders[16] = lambda self, fp, shareable_index=None: SimpleValue(16) decoder.special_decoders[17] = lambda self, fp, shareable_index=None: SimpleValue(17) decoder.special_decoders[18] = lambda self, fp, shareable_index=None: SimpleValue(18) decoder.special_decoders[19] = lambda self, fp, shareable_index=None: SimpleValue(19) decoder.special_decoders[24] = decode_simple_value version = None for f in args: log.debug('file: %s', f) with open(f, 'rb') as fp: obj = None try: obj = decoder.decode(fp) except Exception as e: if e.__str__().find("index out of range") == -1: raise if not isinstance(obj, list): raise Exception("Invalid element, expected an array but found: {}".format(type(obj))) version = obj.pop(0) if version != "CDSv1": raise Exception("Invalid version, expected CDSv1 but got: {}".format(version)) while len(obj): opt = obj.pop(0) if not isinstance(opt, int): raise Exception("Invalid option, expected int but got: {}".format(type(opt))) if opt == 0: MAX_RLABELS = obj.pop(0) if not isinstance(MAX_RLABELS, int) or MAX_RLABELS < 1: raise Exception("Invalid option for maximum rlabels, got: {}".format(MAX_RLABELS)) log.debug("Using maximum rlabels {}".format(MAX_RLABELS)) elif opt == 1: MIN_RLABEL_SIZE = obj.pop(0) if not isinstance(MIN_RLABEL_SIZE, int) or MIN_RLABEL_SIZE < 1: raise Exception("Invalid option for minimum rlabel size, got: {}".format(MIN_RLABEL_SIZE)) log.debug("Using minimum rlabel size {}".format(MIN_RLABEL_SIZE)) else: raise Exception("Unknown option: {}".format(opt)) while True: obj = None try: obj = decoder.decode(fp) except Exception as e: if e.__str__().find("index out of range") == -1: raise if obj is None: break if not isinstance(obj, list): raise Exception("Invalid element, expected an array but found: {}".format(type(obj))) parse(obj) log.debug("unique labels: {} parts: {} rdata: {}".format(len(last.labels), len(last.label_parts), len(last.rdata))) n = 0 e = 0 for l in last.labels: # print("{}: {}".format(l, last.labels[l])) if last.labels[l] > 1: n += last.label_len[l] * ( last.labels[l] - 1 ) e += 2 * ( last.labels[l] - 1 ) log.debug("reduce labels: {} - {}".format(n, e)) n = 0 e = 0 for l in last.label_parts: # print("{}: {}".format(l, last.label_parts[l])) if last.label_parts[l] > 1: n += last.label_part_len[l] * ( last.label_parts[l] - 1 ) e += 2 * ( last.label_parts[l] - 1 ) log.debug("reduce label parts: {} - {}".format(n, e)) n = 0 e = 0 for l in last.rdata: if last.rdata[l] > 1: n += last.rdata_len[l] * ( last.rdata[l] - 1 ) e += 2 * ( last.rdata[l] - 1 ) # print("{}: {}".format(l, last.rdata[l])) log.debug("reduce rdata: {} - {}".format(n, e)) last.reset()