0

I'm busy writing a reader for my network sniffer. It writes all sort of data into a MySQL database. I'm trying to print the data in a readable way into my console. I've build two function to print my data

def printHeader(destination, source, protocol):
print('Ethernet Frame:')
print(('| - Destination: {}, Source: {}, Protocol: {}')
      .format(destination, source, protocol))

def printDNS(version, header_length, ttl, protocolEGP, source, target, source_port, destination_port, length):
    print('| - IPv4 Packet:')
    print(('    | - Version: {}, Header Length: {}, TTL: {},'
           ).format(version, header_length, ttl))
    print(('    | - Protocol: {}, Source: {}, Target: {}'
           ).format(protocolEGP, source, target))
    print('    | - UDP Segment:')
    print(('        | - Source Port: {}, Destination Port: {}, '
           'Length: {}').format(source_port, destination_port, length))

def openCON(query):

    conn = cymysql.connect(host='*', port=3306, user='root', passwd='*', db='python')
    cur = conn.cursor()
    cur.execute(query)
    data = []
    for row in cur:
        data.extend(row)
    cur.close()
    conn.close()
    return data

Now when I run a query I retrieve something like this:

[19, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52698, 53, 28485, 18, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52681, 53, 28485, 20, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 34310, 53, 28502]

I'm trying to iterate over the array to send the correct array indexes to the functions

Example : first array[1:3] should be sent to printHeader() the second part array[4:11] should be sent to printDNS() the first array is the packet number, not using that one in this example. then I needs to send array [13:15] to printHeader() etc.

I can't seem to figure how to code this in a nice fashion, if tried something like, but as we all know its horrible; also tried looping but with none success so far

DNS = openCON(query)

z = 1
x = 2
c = 3
a = 4
s = 5
d = 6
g = 7
h = 8
j = 9
k = 10
l = 11
p = 12

while True:
    if p < len(DNS):
        printHeader(DNS[(z)], DNS[(x)], DNS[(c)])
        printDNS(DNS[(a)], DNS[(s)], DNS[(d)], DNS[(g)], DNS[(h)], DNS[(j)], DNS[(k)], DNS[(l)], DNS[(p)])
        z += 12
        x += 12
        c += 12
        a += 12
        s += 12
        d += 12
        g += 12
        h += 12
        j += 12
        k += 12
        l += 12
    else:
        break

Can somebody help me push in the right direction to code this nice and efficient? I've thought maybe I should not query the entire table but only a row at the time.

Thanks in advance.

2 Answers 2

1

Instead of putting mulitple dns data in a single list, you could construct a list of lists in openCON. Just replace extend with append. Then the return value will be more logically laid out:

[
    [19, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52698, 53, 28485], 
    [18, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52681, 53, 28485], 
    [20, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 34310, 53, 28502]
]

Sounds like you already know about slice operations, which you should make use of here. You should also use the splat operator, *, when you pass the arrays as arguments to your functions.

dnsses = openCON(query)
for dns in dnsses:
    printHeader(*dns[0:3])
    printDNS(*dns[3:])
Sign up to request clarification or add additional context in comments.

Comments

0

Use slices. This feature can return sublist of a list like this:

a = [1, 2, 3, 4,5]
a[2:3]   # [3]
a[2:5]   # [3, 4, 5]
a[-4:-2] # [2, 3]
a[1:3]   # [2, 3]

This gices you ability easily define what elements should be passed to a function. Instead of

printHeader(DNS[(z)], DNS[(x)], DNS[(c)])

you can write

printHeader(DNS[:3])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.