示例#1
0
文件: route.py 项目: xee5ch/scapy
 def __repr__(self):
     rt = "Network         Netmask         Gateway         Iface           Output IP\n"
     for net, msk, gw, iface, addr in self.routes:
         rt += "%-15s %-15s %-15s %-15s %-15s\n" % (
             ltoa(net), ltoa(msk), gw,
             (iface.name if WINDOWS else iface), addr)
     return rt
示例#2
0
 def parse_options(
         self,
         pool=Net("192.168.1.128/25"),
         network="192.168.1.0/24",
         gw="192.168.1.1",  # noqa: E501
         domain="localnet",
         renewal_time=60,
         lease_time=1800):
     self.domain = domain
     netw, msk = (network.split("/") + ["32"])[:2]
     msk = itom(int(msk))
     self.netmask = ltoa(msk)
     self.network = ltoa(atol(netw) & msk)
     self.broadcast = ltoa(atol(self.network) | (0xffffffff & ~msk))
     self.gw = gw
     if isinstance(pool, six.string_types):
         pool = Net(pool)
     if isinstance(pool, Iterable):
         pool = [
             k for k in pool if k not in [gw, self.network, self.broadcast]
         ]  # noqa: E501
         pool.reverse()
     if len(pool) == 1:
         pool, = pool
     self.pool = pool
     self.lease_time = lease_time
     self.renewal_time = renewal_time
     self.leases = {}
示例#3
0
 def __repr__(self):
     rt = "Network         Netmask         Gateway         Iface           Output IP\n"
     for net,msk,gw,iface,addr in self.routes:
         rt += "%-15s %-15s %-15s %-15s %-15s\n" % (ltoa(net),
                                           ltoa(msk),
                                           gw,
                                           iface,
                                           addr)
     return rt
示例#4
0
    def __repr__(self):
        rtlst = []
        for net, msk, gw, iface, addr, metric in self.routes:
            if_repr = resolve_iface(iface).description
            rtlst.append(
                (ltoa(net), ltoa(msk), gw, if_repr, addr, str(metric)))

        return pretty_list(rtlst, [
            ("Network", "Netmask", "Gateway", "Iface", "Output IP", "Metric")
        ])  # noqa: E501
示例#5
0
    def __repr__(self):
        rtlst = []
        for net, msk, gw, iface, addr, metric in self.routes:
            rtlst.append(
                (ltoa(net), ltoa(msk), gw,
                 (iface.name if not isinstance(iface, six.string_types) else
                  iface), addr, str(metric)))

        return pretty_list(rtlst, [
            ("Network", "Netmask", "Gateway", "Iface", "Output IP", "Metric")
        ])
示例#6
0
    def __repr__(self):
        # type: () -> str
        rtlst = []  # type: List[Tuple[Union[str, List[str]], ...]]
        for net, msk, gw, iface, addr, metric in self.routes:
            if_repr = cast(str, resolve_iface(iface).description)
            rtlst.append(
                (ltoa(net), ltoa(msk), gw, if_repr, addr, str(metric)))

        return pretty_list(rtlst, [
            ("Network", "Netmask", "Gateway", "Iface", "Output IP", "Metric")
        ])  # noqa: E501
示例#7
0
    def __repr__(self):
        rtlst = []

        for net, msk, gw, iface, addr in self.routes:
            rtlst.append(
                (ltoa(net), ltoa(msk), gw,
                 (iface.name if not isinstance(iface, basestring) else iface),
                 addr))

        return pretty_routes(
            rtlst, [("Network", "Netmask", "Gateway", "Iface", "Output IP")])
示例#8
0
文件: route.py 项目: plorinquer/scapy
    def __repr__(self):
        rtlst = []
        for net, msk, gw, iface, addr, metric in self.routes:
            rtlst.append((ltoa(net),
                          ltoa(msk),
                          gw,
                          (iface.name if not isinstance(iface, six.string_types) else iface),  # noqa: E501
                          addr,
                          str(metric)))

        return pretty_list(rtlst,
                           [("Network", "Netmask", "Gateway", "Iface", "Output IP", "Metric")])  # noqa: E501
示例#9
0
文件: route.py 项目: mcpat/scapy
    def __repr__(self):
        rtlst = []
        
        for net,msk,gw,iface,addr in self.routes:
	    rtlst.append((ltoa(net),
                      ltoa(msk),
                      gw,
                      (iface.name if not isinstance(iface, six.string_types) else iface),
                      addr))

        return pretty_routes(rtlst,
                             [("Network", "Netmask", "Gateway", "Iface", "Output IP")])
示例#10
0
 def get_if_bcast(self, iff):
     for net, msk, gw, iface, addr in self.routes:
         if (iff == iface and net != 0L):
             bcast = atol(addr) | (~msk & 0xffffffffL)
             # FIXME: check error in atol()
             return ltoa(bcast)
     warning("No broadcast address found for iface %s\n" % iff)
 def get_if_bcast(self, iff):
     for net, msk, gw, iface, addr in self.routes:
         if (iff == iface and net != 0):
             bcast = atol(addr) | (~msk & 0xffffffff)
             # FIXME: check error in atol()
             return ltoa(bcast)
     warning("No broadcast address found for iface %s\n" % iff)
示例#12
0
文件: dhcp.py 项目: commial/scapy
 def parse_options(self, pool=Net("192.168.1.128/25"), network="192.168.1.0/24", gw="192.168.1.1",  # noqa: E501
                   domain="localnet", renewal_time=60, lease_time=1800):
     self.domain = domain
     netw, msk = (network.split("/") + ["32"])[:2]
     msk = itom(int(msk))
     self.netmask = ltoa(msk)
     self.network = ltoa(atol(netw) & msk)
     self.broadcast = ltoa(atol(self.network) | (0xffffffff & ~msk))
     self.gw = gw
     if isinstance(pool, six.string_types):
         pool = Net(pool)
     if isinstance(pool, Iterable):
         pool = [k for k in pool if k not in [gw, self.network, self.broadcast]]  # noqa: E501
         pool.reverse()
     if len(pool) == 1:
         pool, = pool
     self.pool = pool
     self.lease_time = lease_time
     self.renewal_time = renewal_time
     self.leases = {}
示例#13
0
文件: route.py 项目: vpfautz/scapy
 def get_if_bcast(self, iff):
     for net, msk, gw, iface, addr in self.routes:
         if net == 0:
             continue
         if WINDOWS:
             if iff.guid != iface.guid:
                 continue
         elif iff != iface:
             continue
         bcast = atol(addr)|(~msk&0xffffffffL); # FIXME: check error in atol()
         return ltoa(bcast)
     warning("No broadcast address found for iface %s\n" % iff);
示例#14
0
 def get_if_bcast(self, iff):
     for net, msk, gw, iface, addr, metric in self.routes:
         if net == 0:
             continue
         if scapy.consts.WINDOWS:
             if iff.guid != iface.guid:
                 continue
         elif iff != iface:
             continue
         bcast = atol(addr) | (~msk & 0xffffffff)  # FIXME: check error in atol()  # noqa: E501
         return ltoa(bcast)
     warning("No broadcast address found for iface %s\n", iff)
示例#15
0
文件: route.py 项目: mcpat/scapy
 def get_if_bcast(self, iff):
     for net, msk, gw, iface, addr in self.routes:
         if net == 0:
             continue
         if WINDOWS:
             if iff.guid != iface.guid:
                 continue
         elif iff != iface:
             continue
         bcast = atol(addr)|(~msk&0xffffffff); # FIXME: check error in atol()
         return ltoa(bcast)
     warning("No broadcast address found for iface %s\n" % iff);
示例#16
0
 def get_if_bcast(self, iff):
     bcast_list = []
     for net, msk, gw, iface, addr, metric in self.routes:
         if net == 0:
             continue  # Ignore default route "0.0.0.0"
         elif msk == 0xffffffff:
             continue  # Ignore host-specific routes
         if iff != iface:
             continue
         bcast = net | (~msk & 0xffffffff)
         bcast_list.append(ltoa(bcast))
     if not bcast_list:
         warning("No broadcast address found for iface %s\n", iff)
     return bcast_list
示例#17
0
    def mask(bytes_network, bytes_mask):
        """
        calculates the network address and mask
        :param bytes_network: network address in bytes
        :param bytes_mask: network mask in bytes
        :return: network address / mask
        """
        if bytes_mask <= 0 or bytes_mask >= 0xFFFFFFFF:
            raise ValueError("illegal netmask value", hex(bytes_mask))

        network = utils.ltoa(bytes_network)  # calculate the network address
        netmask = 32 - int(round(log(0xFFFFFFFF - bytes_mask,
                                     2)))  # calculate the mask range

        if netmask < 16:  # nets that have a mask bigger than that aren't supported
            return None

        return '{}/{}'.format(network, netmask)
示例#18
0
    def to_code (self):
        """ Convert to Python code as profile  """
        packet = Ether(self.pkt)
        layer = packet
        while layer:                    # remove checksums
            for chksum_name in ('cksum', 'chksum'):
                if chksum_name in layer.fields:
                    del layer.fields[chksum_name]
            layer = layer.payload
        packet.hide_defaults()          # remove fields with default values
        payload = packet.getlayer('Raw')
        packet_command = packet.command()
        imports_arr = []
        if 'MPLS(' in packet_command:
            imports_arr.append('from scapy.contrib.mpls import MPLS')
            
        imports = '\n'.join(imports_arr)
        if payload:
            payload.remove_payload() # fcs etc.
            data = payload.fields.get('load', '')

            good_printable = [c for c in string.printable if ord(c) not in range(32)]
            good_printable.remove("'")

            if type(data) is str:
                new_data = ''.join([c if c in good_printable else r'\x{0:02x}'.format(ord(c)) for c in data])
            else:
                new_data = ''.join([chr(c) if chr(c) in good_printable else r'\x{0:02x}'.format(c) for c in data])

            payload_start = packet_command.find("Raw(load=")
            if payload_start != -1:
                packet_command = packet_command[:payload_start-1]
        layers = packet_command.split('/')

        if payload:
            if len(new_data) and new_data == new_data[0] * len(new_data):
                layers.append("Raw(load='%s' * %s)" % (new_data[0], len(new_data)))
            else:
                layers.append("Raw(load='%s')" % new_data)

        packet_code = 'packet = (' + (' / \n          ').join(layers) + ')'
        vm_list = []
        for inst in self.fields['vm']['instructions']:
            if inst['type'] == 'flow_var':
                vm_list.append("STLVmFlowVar(name='{name}', size={size}, op='{op}', init_value={init_value}, min_value={min_value}, max_value={max_value}, step={step})".format(**inst))
            elif inst['type'] == 'write_flow_var':
                vm_list.append("STLVmWrFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, add_val={add_value}, is_big={is_big_endian})".format(**inst))
            elif inst['type'] == 'write_mask_flow_var':
                inst = copy.copy(inst)
                inst['mask'] = hex(inst['mask'])
                vm_list.append("STLVmWrMaskFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, pkt_cast_size={pkt_cast_size}, mask={mask}, shift={shift}, add_value={add_value}, is_big={is_big_endian})".format(**inst))
            elif inst['type'] == 'fix_checksum_ipv4':
                vm_list.append("STLVmFixIpv4(offset={pkt_offset})".format(**inst))
            elif inst['type'] == 'trim_pkt_size':
                vm_list.append("STLVmTrimPktSize(fv_name='{name}')".format(**inst))
            elif inst['type'] == 'tuple_flow_var':
                inst = copy.copy(inst)
                inst['ip_min'] = ltoa(inst['ip_min'])
                inst['ip_max'] = ltoa(inst['ip_max'])
                vm_list.append("STLVmTupleGen(name='{name}', ip_min='{ip_min}', ip_max='{ip_max}', port_min={port_min}, port_max={port_max}, limit_flows={limit_flows}, flags={flags})".format(**inst))
        vm_code = 'vm = STLScVmRaw([' + ',\n                 '.join(vm_list) + '], split_by_field = %s)' % STLStream.__add_quotes(self.fields['vm'].get('split_by_var'))
        stream_params_list = []
        stream_params_list.append('packet = STLPktBuilder(pkt = packet, vm = vm)')
        if default_STLStream.name != self.name:
            stream_params_list.append('name = %s' % STLStream.__add_quotes(self.name))
        if default_STLStream.fields['enabled'] != self.fields['enabled']:
            stream_params_list.append('enabled = %s' % self.fields['enabled'])
        if default_STLStream.fields['self_start'] != self.fields['self_start']:
            stream_params_list.append('self_start = %s' % self.fields['self_start'])
        if default_STLStream.fields['isg'] != self.fields['isg']:
            stream_params_list.append('isg = %s' % self.fields['isg'])
        if default_STLStream.fields['flow_stats'] != self.fields['flow_stats']:
            stream_params_list.append('flow_stats = STLFlowStats(%s)' % self.fields['flow_stats']['stream_id'])
        if default_STLStream.next != self.next:
            stream_params_list.append('next = %s' % STLStream.__add_quotes(self.next))
        if default_STLStream.id != self.id:
            stream_params_list.append('stream_id = %s' % self.id)
        if default_STLStream.fields['action_count'] != self.fields['action_count']:
            stream_params_list.append('action_count = %s' % self.fields['action_count'])
        if 'random_seed' in self.fields:
            stream_params_list.append('random_seed = %s' % self.fields.get('random_seed', 0))
        if default_STLStream.mac_src_override_by_pkt != self.mac_src_override_by_pkt:
            stream_params_list.append('mac_src_override_by_pkt = %s' % self.mac_src_override_by_pkt)
        if default_STLStream.mac_dst_override_mode != self.mac_dst_override_mode:
            stream_params_list.append('mac_dst_override_mode = %s' % self.mac_dst_override_mode)

        mode_args = ''
        for key, value in self.fields['mode'].items():
            if key not in ('rate', 'type'):
                mode_args += '%s = %s, ' % (key, value)
        mode_args += '%s = %s' % (self.fields['mode']['rate']['type'], self.fields['mode']['rate']['value'])
        if self.mode_desc == STLTXCont.__str__():
            stream_params_list.append('mode = STLTXCont(%s)' % mode_args)
        elif self.mode_desc == STLTXSingleBurst().__str__():
            stream_params_list.append('mode = STLTXSingleBurst(%s)' % mode_args)
        elif self.mode_desc == STLTXMultiBurst().__str__():
            stream_params_list.append('mode = STLTXMultiBurst(%s)' % mode_args)
        else:
            raise STLError('Could not determine mode: %s' % self.mode_desc)

        stream = "stream = STLStream(" + ',\n                   '.join(stream_params_list) + ')'
        return '\n'.join([imports, packet_code, vm_code, stream])
示例#19
0
    def to_code(self):
        """ Convert to Python code as profile  """
        packet = Ether(self.pkt)
        layer = packet
        imports_arr = []
        # remove checksums, add imports if needed
        while layer:
            layer_class = layer.__class__.__name__
            try:  # check if class can be instantiated
                eval('%s()' % layer_class)
            except NameError:  # no such layer
                found_import = False
                for module_path, module in sys.modules.items():
                    import_string = 'from %s import %s' % (module_path,
                                                           layer_class)
                    if import_string in imports_arr:
                        found_import = True
                        break
                    if not module_path.startswith(
                        ('scapy.layers', 'scapy.contrib')):
                        continue
                    check_layer = getattr(module, layer_class, None)
                    if not check_layer:
                        continue
                    try:
                        check_layer()
                        imports_arr.append(import_string)
                        found_import = True
                        break
                    except:  # can't by instantiated
                        continue
                if not found_import:
                    raise STLError('Could not determine import of layer %s' %
                                   layer.name)
            for chksum_name in ('cksum', 'chksum'):
                if chksum_name in layer.fields:
                    del layer.fields[chksum_name]
            layer = layer.payload
        packet.hide_defaults()  # remove fields with default values
        payload = packet.getlayer('Raw')
        packet_command = packet.command()

        imports = '\n'.join(imports_arr)
        if payload:
            payload.remove_payload()  # fcs etc.
            data = payload.fields.get('load', '')

            good_printable = [
                c for c in string.printable if ord(c) not in range(32)
            ]
            good_printable.remove("'")

            if type(data) is str:
                new_data = ''.join([
                    c if c in good_printable else r'\x{0:02x}'.format(ord(c))
                    for c in data
                ])
            else:
                new_data = ''.join([
                    chr(c)
                    if chr(c) in good_printable else r'\x{0:02x}'.format(c)
                    for c in data
                ])

            payload_start = packet_command.find("Raw(load=")
            if payload_start != -1:
                packet_command = packet_command[:payload_start - 1]
        layers = packet_command.split('/')

        if payload:
            if len(new_data) and new_data == new_data[0] * len(new_data):
                layers.append("Raw(load='%s' * %s)" %
                              (new_data[0], len(new_data)))
            else:
                layers.append("Raw(load='%s')" % new_data)

        packet_code = 'packet = (' + (' / \n          ').join(layers) + ')'
        vm_list = []
        for inst in self.fields['vm']['instructions']:
            if inst['type'] == 'flow_var':
                vm_list.append(
                    "STLVmFlowVar(name='{name}', size={size}, op='{op}', init_value={init_value}, min_value={min_value}, max_value={max_value}, step={step})"
                    .format(**inst))
            elif inst['type'] == 'write_flow_var':
                vm_list.append(
                    "STLVmWrFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, add_val={add_value}, is_big={is_big_endian})"
                    .format(**inst))
            elif inst['type'] == 'write_mask_flow_var':
                inst = copy.copy(inst)
                inst['mask'] = hex(inst['mask'])
                vm_list.append(
                    "STLVmWrMaskFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, pkt_cast_size={pkt_cast_size}, mask={mask}, shift={shift}, add_value={add_value}, is_big={is_big_endian})"
                    .format(**inst))
            elif inst['type'] == 'fix_checksum_ipv4':
                vm_list.append(
                    "STLVmFixIpv4(offset={pkt_offset})".format(**inst))
            elif inst['type'] == 'trim_pkt_size':
                vm_list.append(
                    "STLVmTrimPktSize(fv_name='{name}')".format(**inst))
            elif inst['type'] == 'tuple_flow_var':
                inst = copy.copy(inst)
                inst['ip_min'] = ltoa(inst['ip_min'])
                inst['ip_max'] = ltoa(inst['ip_max'])
                vm_list.append(
                    "STLVmTupleGen(name='{name}', ip_min='{ip_min}', ip_max='{ip_max}', port_min={port_min}, port_max={port_max}, limit_flows={limit_flows}, flags={flags})"
                    .format(**inst))
            elif inst['type'] == 'flow_var_rand_limit':
                vm_list.append(
                    "STLVmFlowVarRepetableRandom(name='{name}', size={size}, limit={limit}, seed={seed}, min_value={min_value}, max_value={max_value})"
                    .format(**inst))

        vm_code = 'vm = STLScVmRaw([' + ',\n                 '.join(
            vm_list) + '], split_by_field = %s)' % STLStream.__add_quotes(
                self.fields['vm'].get('split_by_var'))
        stream_params_list = []
        stream_params_list.append(
            'packet = STLPktBuilder(pkt = packet, vm = vm)')
        if default_STLStream.name != self.name:
            stream_params_list.append('name = %s' %
                                      STLStream.__add_quotes(self.name))
        if default_STLStream.fields['enabled'] != self.fields['enabled']:
            stream_params_list.append('enabled = %s' % self.fields['enabled'])
        if default_STLStream.fields['self_start'] != self.fields['self_start']:
            stream_params_list.append('self_start = %s' %
                                      self.fields['self_start'])
        if default_STLStream.fields['isg'] != self.fields['isg']:
            stream_params_list.append('isg = %s' % self.fields['isg'])
        if default_STLStream.fields['flow_stats'] != self.fields['flow_stats']:
            stream_params_list.append('flow_stats = STLFlowStats(%s)' %
                                      self.fields['flow_stats']['stream_id'])
        if default_STLStream.next != self.next:
            stream_params_list.append('next = %s' %
                                      STLStream.__add_quotes(self.next))
        if default_STLStream.id != self.id:
            stream_params_list.append('stream_id = %s' % self.id)
        if default_STLStream.fields['action_count'] != self.fields[
                'action_count']:
            stream_params_list.append('action_count = %s' %
                                      self.fields['action_count'])
        if 'random_seed' in self.fields:
            stream_params_list.append('random_seed = %s' %
                                      self.fields.get('random_seed', 0))
        if default_STLStream.mac_src_override_by_pkt != self.mac_src_override_by_pkt:
            stream_params_list.append('mac_src_override_by_pkt = %s' %
                                      self.mac_src_override_by_pkt)
        if default_STLStream.mac_dst_override_mode != self.mac_dst_override_mode:
            stream_params_list.append('mac_dst_override_mode = %s' %
                                      self.mac_dst_override_mode)

        mode_args = ''
        for key, value in self.fields['mode'].items():
            if key not in ('rate', 'type'):
                mode_args += '%s = %s, ' % (key, value)
        mode_args += '%s = %s' % (self.fields['mode']['rate']['type'],
                                  self.fields['mode']['rate']['value'])
        if self.mode_desc == STLTXCont.__str__():
            stream_params_list.append('mode = STLTXCont(%s)' % mode_args)
        elif self.mode_desc == STLTXSingleBurst().__str__():
            stream_params_list.append('mode = STLTXSingleBurst(%s)' %
                                      mode_args)
        elif self.mode_desc == STLTXMultiBurst().__str__():
            stream_params_list.append('mode = STLTXMultiBurst(%s)' % mode_args)
        else:
            raise STLError('Could not determine mode: %s' % self.mode_desc)

        stream = "stream = STLStream(" + ',\n                   '.join(
            stream_params_list) + ')'
        return '\n'.join([imports, packet_code, vm_code, stream])
示例#20
0
    def to_code(self):
        """ Convert to Python code as profile  """
        layer = Ether(self.pkt)
        layer.hide_defaults()  # remove fields with default values
        imports_arr = []
        layers_commands = []
        # remove checksums, add imports if needed
        while layer:
            layer_class = layer.__class__.__name__
            if layer_class not in vars(scapy.layers.all):  # custom import
                found_import = False
                for module_path, module in sys.modules.items():
                    if not module_path.startswith(
                        ('scapy.layers', 'scapy.contrib')):
                        continue
                    import_string = 'from %s import %s' % (module_path,
                                                           layer_class)
                    if import_string in imports_arr:  # already present in extra imports
                        found_import = True
                        break
                    if hasattr(module, layer_class):  # add as extra import
                        imports_arr.append(import_string)
                        found_import = True
                        break
                if not found_import:
                    raise STLError('Could not determine import of layer %s' %
                                   layer.name)

            # remove checksums
            for chksum_name in ('cksum', 'chksum'):
                if chksum_name in layer.fields:
                    del layer.fields[chksum_name]

            # remove Paddings (FCS etc.)
            if isinstance(layer, Padding):
                break

            payload = layer.payload
            layer.remove_payload()

            if isinstance(layer, Raw):
                payload_data = bytes(layer)
                if payload_data == payload_data[0:1] * len(
                        payload_data):  # compact form Raw('x' * 100) etc.
                    layer_command = '%s * %s)' % (Raw(
                        payload_data[0:1]).command().rstrip(')'),
                                                  len(payload_data))
                else:
                    layer_command = layer.command()
                layers_commands.append(layer_command)
                break

            layers_commands.append(layer.command())

            layer = payload

        imports = '\n'.join(imports_arr)
        packet_code = 'packet = (' + (
            ' / \n          ').join(layers_commands) + ')'

        vm_list = []
        for inst in self.fields['vm']['instructions']:
            if inst['type'] == 'flow_var':
                vm_list.append(
                    "STLVmFlowVar(name='{name}', size={size}, op='{op}', init_value={init_value}, min_value={min_value}, max_value={max_value}, step={step})"
                    .format(**inst))
            elif inst['type'] == 'write_flow_var':
                vm_list.append(
                    "STLVmWrFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, add_val={add_value}, is_big={is_big_endian})"
                    .format(**inst))
            elif inst['type'] == 'write_mask_flow_var':
                inst = copy.copy(inst)
                inst['mask'] = hex(inst['mask'])
                vm_list.append(
                    "STLVmWrMaskFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, pkt_cast_size={pkt_cast_size}, mask={mask}, shift={shift}, add_value={add_value}, is_big={is_big_endian})"
                    .format(**inst))
            elif inst['type'] == 'fix_checksum_ipv4':
                vm_list.append(
                    "STLVmFixIpv4(offset={pkt_offset})".format(**inst))
            elif inst['type'] == 'trim_pkt_size':
                vm_list.append(
                    "STLVmTrimPktSize(fv_name='{name}')".format(**inst))
            elif inst['type'] == 'tuple_flow_var':
                inst = copy.copy(inst)
                inst['ip_min'] = ltoa(inst['ip_min'])
                inst['ip_max'] = ltoa(inst['ip_max'])
                vm_list.append(
                    "STLVmTupleGen(name='{name}', ip_min='{ip_min}', ip_max='{ip_max}', port_min={port_min}, port_max={port_max}, limit_flows={limit_flows}, flags={flags})"
                    .format(**inst))
            elif inst['type'] == 'flow_var_rand_limit':
                vm_list.append(
                    "STLVmFlowVarRepetableRandom(name='{name}', size={size}, limit={limit}, seed={seed}, min_value={min_value}, max_value={max_value})"
                    .format(**inst))

        vm_code = 'vm = STLScVmRaw([' + ',\n                 '.join(
            vm_list) + '])'
        stream_params_list = []
        stream_params_list.append(
            'packet = STLPktBuilder(pkt = packet, vm = vm)')
        if default_STLStream.name != self.name:
            stream_params_list.append('name = %s' %
                                      STLStream.__add_quotes(self.name))
        if default_STLStream.fields['enabled'] != self.fields['enabled']:
            stream_params_list.append('enabled = %s' % self.fields['enabled'])
        if default_STLStream.fields['self_start'] != self.fields['self_start']:
            stream_params_list.append('self_start = %s' %
                                      self.fields['self_start'])
        if default_STLStream.fields['isg'] != self.fields['isg']:
            stream_params_list.append('isg = %s' % self.fields['isg'])
        if default_STLStream.fields['flow_stats'] != self.fields['flow_stats']:
            stream_params_list.append('flow_stats = STLFlowStats(%s)' %
                                      self.fields['flow_stats']['stream_id'])
        if default_STLStream.next != self.next:
            stream_params_list.append('next = %s' %
                                      STLStream.__add_quotes(self.next))
        if default_STLStream.id != self.id:
            stream_params_list.append('stream_id = %s' % self.id)
        if default_STLStream.fields['action_count'] != self.fields[
                'action_count']:
            stream_params_list.append('action_count = %s' %
                                      self.fields['action_count'])
        if 'random_seed' in self.fields:
            stream_params_list.append('random_seed = %s' %
                                      self.fields.get('random_seed', 0))
        if default_STLStream.mac_src_override_by_pkt != self.mac_src_override_by_pkt:
            stream_params_list.append('mac_src_override_by_pkt = %s' %
                                      self.mac_src_override_by_pkt)
        if default_STLStream.mac_dst_override_mode != self.mac_dst_override_mode:
            stream_params_list.append('mac_dst_override_mode = %s' %
                                      self.mac_dst_override_mode)

        mode_args = ''
        for key, value in self.fields['mode'].items():
            if key not in ('rate', 'type'):
                mode_args += '%s = %s, ' % (key, value)
        mode_args += '%s = %s' % (self.fields['mode']['rate']['type'],
                                  self.fields['mode']['rate']['value'])
        if self.mode_desc == STLTXCont.__str__():
            stream_params_list.append('mode = STLTXCont(%s)' % mode_args)
        elif self.mode_desc == STLTXSingleBurst().__str__():
            stream_params_list.append('mode = STLTXSingleBurst(%s)' %
                                      mode_args)
        elif self.mode_desc == STLTXMultiBurst().__str__():
            stream_params_list.append('mode = STLTXMultiBurst(%s)' % mode_args)
        else:
            raise STLError('Could not determine mode: %s' % self.mode_desc)

        stream = "stream = STLStream(" + ',\n                   '.join(
            stream_params_list) + ')'
        return '\n'.join([imports, packet_code, vm_code, stream])
示例#21
0
    def to_code (self):
        """ convert to Python code as profile  """
        packet = Ether(self.pkt)
        packet.hide_defaults()
        payload = packet.getlayer('Raw')
        packet_command = packet.command()
        imports_arr = []
        if 'MPLS(' in packet_command:
            imports_arr.append('from scapy.contrib.mpls import MPLS')
            
        imports = '\n'.join(imports_arr)
        if payload:
            payload.remove_payload() # fcs etc.
            data = payload.fields.get('load', '')
            replchars = re.compile('(\s|/|\'|\\\|[^' + re.escape(string.printable) + '])') # convert bad chars to hex
            new_data =  replchars.sub(self.__replchars_to_hex, data)
            payload_start = packet_command.find("Raw(load='")
            if payload_start != -1:
                packet_command = packet_command[:payload_start-1]
        layers = packet_command.split('/')
        if payload:
            if len(new_data) and new_data == new_data[0] * len(new_data):
                layers.append("Raw(load='%s' * %s)" % (new_data[0], len(new_data)))
            else:
                layers.append("Raw(load='%s')" % new_data)
        packet_code = 'packet = (' + (' / \n          ').join(layers) + ')'
        vm_list = []
        for inst in self.fields['vm']['instructions']:
            if inst['type'] == 'flow_var':
                vm_list.append("CTRexVmDescFlowVar(name='{name}', size={size}, op='{op}', init_value={init_value}, min_value={min_value}, max_value={max_value}, step={step})".format(**inst))
            elif inst['type'] == 'write_flow_var':
                vm_list.append("CTRexVmDescWrFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, add_val={add_value}, is_big={is_big_endian})".format(**inst))
            elif inst['type'] == 'write_mask_flow_var':
                inst = copy.copy(inst)
                inst['mask'] = hex(inst['mask'])
                vm_list.append("CTRexVmDescWrMaskFlowVar(fv_name='{name}', pkt_offset={pkt_offset}, pkt_cast_size={pkt_cast_size}, mask={mask}, shift={shift}, add_value={add_value}, is_big={is_big_endian})".format(**inst))
            elif inst['type'] == 'fix_checksum_ipv4':
                vm_list.append("CTRexVmDescFixIpv4(offset={pkt_offset})".format(**inst))
            elif inst['type'] == 'trim_pkt_size':
                vm_list.append("CTRexVmDescTrimPktSize(fv_name='{name}')".format(**inst))
            elif inst['type'] == 'tuple_flow_var':
                inst = copy.copy(inst)
                inst['ip_min'] = ltoa(inst['ip_min'])
                inst['ip_max'] = ltoa(inst['ip_max'])
                vm_list.append("CTRexVmDescTupleGen(name='{name}', ip_min='{ip_min}', ip_max='{ip_max}', port_min={port_min}, port_max={port_max}, limit_flows={limit_flows}, flags={flags})".format(**inst))
        vm_code = 'vm = CTRexScRaw([' + ',\n                 '.join(vm_list) + '], split_by_field = %s)' % STLStream.__add_quotes(self.fields['vm'].get('split_by_var'))
        stream_params_list = []
        stream_params_list.append('packet = CScapyTRexPktBuilder(pkt = packet, vm = vm)')
        if default_STLStream.name != self.name:
            stream_params_list.append('name = %s' % STLStream.__add_quotes(self.name))
        if default_STLStream.fields['enabled'] != self.fields['enabled']:
            stream_params_list.append('enabled = %s' % self.fields['enabled'])
        if default_STLStream.fields['self_start'] != self.fields['self_start']:
            stream_params_list.append('self_start = %s' % self.fields['self_start'])
        if default_STLStream.fields['isg'] != self.fields['isg']:
            stream_params_list.append('isg = %s' % self.fields['isg'])
        if default_STLStream.fields['flow_stats'] != self.fields['flow_stats']:
            stream_params_list.append('flow_stats = STLFlowStats(%s)' % self.fields['flow_stats']['stream_id'])
        if default_STLStream.next != self.next:
            stream_params_list.append('next = %s' % STLStream.__add_quotes(self.next))
        if default_STLStream.id != self.id:
            stream_params_list.append('stream_id = %s' % self.id)
        if default_STLStream.fields['action_count'] != self.fields['action_count']:
            stream_params_list.append('action_count = %s' % self.fields['action_count'])
        if 'random_seed' in self.fields:
            stream_params_list.append('random_seed = %s' % self.fields.get('random_seed', 0))
        if default_STLStream.mac_src_override_by_pkt != self.mac_src_override_by_pkt:
            stream_params_list.append('mac_src_override_by_pkt = %s' % self.mac_src_override_by_pkt)
        if default_STLStream.mac_dst_override_mode != self.mac_dst_override_mode:
            stream_params_list.append('mac_dst_override_mode = %s' % self.mac_dst_override_mode)

        mode_args = ''
        for key, value in self.fields['mode'].items():
            if key not in ('rate', 'type'):
                mode_args += '%s = %s, ' % (key, value)
        mode_args += '%s = %s' % (self.fields['mode']['rate']['type'], self.fields['mode']['rate']['value'])
        if self.mode_desc == STLTXCont.__str__():
            stream_params_list.append('mode = STLTXCont(%s)' % mode_args)
        elif self.mode_desc == STLTXSingleBurst().__str__():
            stream_params_list.append('mode = STLTXSingleBurst(%s)' % mode_args)
        elif self.mode_desc == STLTXMultiBurst().__str__():
            stream_params_list.append('mode = STLTXMultiBurst(%s)' % mode_args)
        else:
            raise STLError('Could not determine mode: %s' % self.mode_desc)

        stream = "stream = STLStream(" + ',\n                   '.join(stream_params_list) + ')'
        return '\n'.join([imports, packet_code, vm_code, stream])