Wave-Net / wavenet-backend

packet capture logic using scapy library
0 stars 0 forks source link

PacketHandler 단순화 하기 #45

Closed zhy2on closed 1 month ago

zhy2on commented 2 months ago

지금 PacketHandler의 process_packet에서 클라이언트에 보내줄 json data를 만들 때 필요한 딕셔너리를 scapy 패킷 객체에 해당하는 값이 있는지 없는지 일일이 판단한 다음에 key, value를 나눠서 지정해 줬음.

근데 불필요해 보임.... 그냥

image

해당 패킷의 필드 돌면서 필드 이름을 key로 하고 값을 value로 해주면 됐었음..... 수정 해보고 프로그램 돌렸을 때 오류 나지 않으면 바꾸면 될 것 같다......... 클래스도 아니고 그냥 함수 하나만 구현하면 될 듯.......

zhy2on commented 2 months ago
def get_layer_fields(layer):
    layer_fields = []
    for field in layer.__class__.fields_desc:
        if isinstance(field, ConditionalField):
            condition = field.condition.__func__
            if condition(layer):
                layer_fields.append(field.fld.name)
        else:
            layer_fields.append(field.name)
    return layer_fields

def layer_to_dict(layer):
    layer_dict = {}
    layer_fields = get_layer_fields(layer)
    for field_name in layer_fields:
        field_value = getattr(layer, field_name)
        if isinstance(field_value, bytes):
            field_value = field_value.decode('utf-8', errors='ignore')
        elif isinstance(field_value, int):
            layer_dict[field_name] = field_value
        else:
            layer_dict[field_name] = str(field_value)
    return layer_dict

def process_packet(packet):
    if MQTT in packet:
        layer = packet[MQTT]
        layer_dict = layer_to_dict(layer)
        packet_type = CONTROL_PACKET_TYPE.get(layer.type, 'Unknown')
        if packet_type != 'Unknown':
            packet_type_fields = get_layer_fields(MQTT(type=layer.type))
            type_dict = {field: layer_dict.get(
                field.lower(), None) for field in packet_type_fields}
            layer_dict[packet_type.lower()] = type_dict
        return layer_dict
    elif CoAP in packet:
        layer = packet[CoAP]
        return layer_to_dict(layer)
    else:
        raise ValueError("Unsupported protocol layer")

이런식으로 나중에 리팩토링 하기. 일단 서버부터 제대로 구현하기