source: examples/stats/ipdist-genplot.py @ 0d451ef

develop
Last change on this file since 0d451ef was 0d451ef, checked in by Jacob Van Walraven <jcv9@…>, 2 years ago

Cleanup

  • Property mode set to 100644
File size: 7.5 KB
Line 
1#!/usr/bin/python
2
3import sys
4import subprocess
5import os
6
7# Ensure a data directory was supplied
8if len(sys.argv) != 2:
9        print("Usage: python data-directory")
10        sys.exit()
11
12dir = sys.argv[1]
13dataFiles = []
14
15# Stats
16total_skew_src = [0, 0, 0, 0]
17total_skew_dst = [0, 0, 0, 0]
18
19# Get all data/stats files contained within the directory
20for file in os.listdir(dir):
21        if file.endswith(".data"):
22                dataFiles.append(file)
23
24# sort the datafiles list so they are read in the correct order
25dataFiles.sort()
26
27# Every datafile should have a corresponding stats file
28# Iterate over every dataFile
29for i in range(len(dataFiles)):
30        dataFile = dataFiles[i]
31        filename,extension = dataFiles[i].split(".")
32        statsFile = filename + ".stats"
33        tick = filename.split("-")
34        tick = tick[1]
35
36        # Open the current stats file
37        lines = []
38        with open(dir + "/" + statsFile, "r") as tmp:
39                lines = tmp.readlines()
40        # increment the total skew counters
41        for x in range(4):
42                total_skew_src[x] += float(lines[(4*x)+1].split()[6])
43                total_skew_dst[x] += float(lines[(4*x)+2].split()[6])
44
45        # Create/append to timeseries stats file
46        # the file needs to be created on the first pass
47        if i == 0:
48                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "w")
49                tmp.write("timestamp\tsrc1\t\tdst1\t\tsrc2\t\tdst2\t\tsrc3\t\tdst3\t\tsrc4\t\tdst4\n")
50        else:
51                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "a")
52        tmp.write(tick)
53        for x in range(4):
54                tmp.write("\t" + str(total_skew_src[x]/(i+1)) + "\t" + str(total_skew_dst[x]/(i+1)))
55        tmp.write("\n")
56        tmp.close()
57
58
59
60        # open data file to read from and count all occurances
61        with open(dir + "/" + dataFile, "r") as tmp:
62                lines = tmp.readlines()
63        tmp.close()
64        # Count up all octet count in current data file
65        count_src = [0] * 4
66        count_dst = [0] * 4
67        # initialize the array
68        for x in range(4):
69                count_src[x] = [0] * 256
70                count_dst[x] = [0] * 256
71        # count all occurances
72        for x in range(256):
73                for k in range(4):
74                        count_src[k][int(lines[x+2].split()[(k*4)+2])] = int(lines[x+2].split()[(k*4)+3])
75                        count_dst[k][int(lines[x+2].split()[(k*4)+4])] = int(lines[x+2].split()[(k*4)+5])
76        # output the results to the timeseries file
77        tmp_src = []
78        tmp_dst = []
79        if i == 0:
80                for x in range(4):
81                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "w"))
82                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "w"))
83                        tmp_src[x].write("timestamp")
84                        tmp_dst[x].write("timestamp")
85                        for k in range(256):
86                                tmp_src[x].write("\t" + str(k))
87                                tmp_dst[x].write("\t" + str(k))
88        else:
89                for x in range(4):
90                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "a"))
91                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "a"))
92        # print data into file
93        for x in range(4):
94                tmp_src[x].write("\n" + tick)
95                tmp_dst[x].write("\n" + tick)
96                for k in range(256):
97                        tmp_src[x].write("\t" + str(count_src[x][k]))
98                        tmp_dst[x].write("\t" + str(count_dst[x][k]))
99        # close all files
100        for x in range(4):
101                tmp_src[x].close()
102                tmp_dst[x].close()
103
104
105        # create interval plots
106        for x in range(4):
107                plot = subprocess.Popen(['gnuplot -persistent','-p'],
108                                        shell=True,
109                                        stdin=subprocess.PIPE,)
110
111                plot.stdin.write("set term pngcairo enhanced size 1280,960\n")
112                plot.stdin.write("set output '" + dir + "/" + filename + "-octet" + str(x+1) + ".png'\n")
113                plot.stdin.write("set multiplot layout 2,1\n")
114                plot.stdin.write("set title 'IP Distribution - " + tick + "'\n")
115                plot.stdin.write("set xrange[0:255]\n")
116                plot.stdin.write("set y2range[-1:1]\n")
117                plot.stdin.write("set y2tics\n")
118                plot.stdin.write("set xlabel 'Prefix'\n")
119                plot.stdin.write("set ylabel 'Hits'\n")
120                plot.stdin.write("set y2label 'Skewness'\n")
121                plot.stdin.write("set xtics 0,10,255\n")
122                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 2 name 'SOURCEMEAN' nooutput\n")
123                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 2 name 'DESTMEAN' nooutput\n")
124                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 7 name 'SOURCESKEW' nooutput\n")
125                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 7 name 'DESTSKEW' nooutput\n")
126                plot.stdin.write("set arrow from SOURCEMEAN_min, graph 0 to SOURCEMEAN_min, graph 1 nohead lt 1\n")
127                plot.stdin.write("set arrow from DESTMEAN_min, graph 0 to DESTMEAN_min, graph 1 nohead lt 2\n")
128                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using " + str((x*4)+3) + ":" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "' smooth unique with boxes,")
129                plot.stdin.write("'' using " + str((x*4)+5) + ":" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "' smooth unique with boxes,")
130                plot.stdin.write("1/0 t 'Source mean' lt 1,")
131                plot.stdin.write("1/0 t 'Destination mean' lt 2,")
132                plot.stdin.write("SOURCESKEW_min title 'Source Skewness' axes x1y2,")
133                plot.stdin.write("DESTSKEW_min title 'Destination Skewness' axes x1y2\n")
134                plot.stdin.write("unset y2tics\n")
135                plot.stdin.write("unset y2label\n")
136                plot.stdin.write("unset arrow\n")
137                plot.stdin.write("unset label 1\nunset label 2\nunset label 3\nunset label 4\nunset label 5\nunset label 6\n")
138                plot.stdin.write("set title 'Zipf Distribution'\n")
139                plot.stdin.write("set xlabel 'Rank'\n")
140                plot.stdin.write("set ylabel 'Frequency'\n")
141                plot.stdin.write("set logscale xy 10\n")
142                plot.stdin.write("set xrange[1:255]\n")
143                plot.stdin.write("set xtics 0,10,255\n")
144                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using 2:" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "',")
145                plot.stdin.write("'' using 2:" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "'\n")
146                plot.stdin.flush()
147                plot.communicate()
148
149
150# Generate plots for the timeseries data captured over the entire trace
151for i in range(4):
152        for x in range(2):
153                plot = subprocess.Popen(['gnuplot -persistent','-p'],
154                                        shell=True,
155                                        stdin=subprocess.PIPE,)
156                plot.stdin.write("set term pngcairo size 1280,960\n")
157                if x == 0:
158                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-src-octet" + str(i+1) + ".png'\n")
159                        plot.stdin.write("set title 'Timeseries src octet " + str(i+1) + "'\n")
160                else:
161                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-dst-octet" + str(i+1) + ".png'\n")
162                        plot.stdin.write("set title 'Timeseries dst octet " + str(i+1) + "'\n")
163                plot.stdin.write("set multiplot layout 2,1\n")
164                plot.stdin.write("set xtics rotate\n")
165                plot.stdin.write("set ytics\n")
166                plot.stdin.write("set xlabel 'Timestamp'\n")
167                plot.stdin.write("set key off\n")
168                plot.stdin.write("set autoscale xy\n")
169                if x == 0:
170                        plot.stdin.write("plot '" + dir + "/ipdist-src-octet" + str(i+1) + ".timeseries' using 2:xtic(1) with lines title columnheader(2) at end smooth cumulative, for[i=3:257] '' using i with lines title columnheader(i) at end smooth cumulative\n")
171                else:
172                        plot.stdin.write("plot '" + dir + "/ipdist-dst-octet" + str(i+1) + ".timeseries' using 2:xtic(1) with lines title columnheader(2) at end smooth cumulative, for[i=3:257] '' using i with lines title columnheader(i) at end smooth cumulative\n")
173                plot.stdin.write("set title 'Timeseries mean skewness'\n")
174                plot.stdin.write("set yrange[-1:1]\n")
175                plot.stdin.write("set xlabel 'Timestamp'\n")
176                plot.stdin.write("set ylabel 'Skewness'\n")
177                plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2+x) + ":xtic(1) with lines\n")
178                plot.stdin.write("unset multiplot\n")
179                plot.stdin.flush()
180                plot.communicate()
181
Note: See TracBrowser for help on using the repository browser.