Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

119 lines
3.9KB

  1. #!/usr/bin/env python3
  2. import os
  3. from datetime import datetime
  4. import subprocess
  5. from argparse import ArgumentParser
  6. from io import StringIO
  7. import pandas as pd
  8. def format_udp_pcap_to_csv(folder, sender_pcap_name, receiver_pcap_name, output=None):
  9. tmp = list()
  10. for pcap in [sender_pcap_name, receiver_pcap_name]:
  11. tshark_command = [
  12. "tshark",
  13. "-r",
  14. "{}{}".format(folder, pcap),
  15. "-O",
  16. "udp",
  17. "-T",
  18. "fields",
  19. "-e",
  20. "frame.time_epoch",
  21. "-e",
  22. "data.len",
  23. "-e",
  24. "data",
  25. "-E",
  26. "header=y",
  27. "-E",
  28. "separator=,",
  29. ]
  30. tshark_out = subprocess.check_output(tshark_command)
  31. tmp.append(
  32. pd.read_csv(
  33. StringIO(tshark_out.decode("utf-8")),
  34. converters=dict(data=lambda x: hash(x)),
  35. )
  36. )
  37. sender_df = tmp[0].rename(
  38. columns={"frame.time_epoch": "departure_time", "data": "data_hash", "data.len": "data.len_send"}
  39. )
  40. receiver_df = tmp[1].rename(
  41. columns={"frame.time_epoch": "arrival_time", "data": "data_hash", "data.len": "data.len_received"}
  42. )
  43. transmission_df = pd.merge(sender_df, receiver_df, on="data_hash", how="outer")
  44. transmission_df["delay"] = transmission_df.arrival_time - transmission_df.departure_time
  45. direction = "uplink"
  46. if "server" in sender_pcap_name and "client" in receiver_pcap_name:
  47. direction = "downlink"
  48. filename = sender_pcap_name.replace("_sender_", "_{}_".format(direction))
  49. filename = filename.replace("client_", "")
  50. filename = filename.replace("server_", "")
  51. filename = filename.replace(".pcap", ".csv")
  52. transmission_df.to_csv("{}{}".format(folder if output is None else output, filename))
  53. if __name__ == "__main__":
  54. start_time = datetime.now()
  55. parser = ArgumentParser()
  56. parser.add_argument("-f", "--folder", required=True, help="Folder with pcap files.")
  57. parser.add_argument(
  58. "-o", "--output", required=False, help="Folder for created csv files."
  59. )
  60. parser.add_argument(
  61. "--name_contains", required=False, default=".pcap", help="Substring in filename."
  62. )
  63. parser.add_argument(
  64. "--use_subdirs", required=False, default=False, help="Use pcaps in subdirs."
  65. )
  66. args = parser.parse_args()
  67. sender_pcap_list = list()
  68. counter = 1
  69. if args.use_subdirs:
  70. sub_dirs = os.listdir(args.folder)
  71. for d in sub_dirs:
  72. filenames = os.listdir("{}{}".format(args.folder, d))
  73. for filename in filenames:
  74. if filename.endswith(".pcap") and args.name_contains in filename and "sender" in filename:
  75. sender_pcap_list.append("{}/{}".format(d, filename))
  76. else:
  77. filenames = os.listdir(args.folder)
  78. for filename in filenames:
  79. if filename.endswith(".pcap") and args.name_contains in filename and "sender" in filename:
  80. sender_pcap_list.append(filename)
  81. for sender_pcap in sender_pcap_list:
  82. receiver_pcap = sender_pcap.replace("sender", "receiver")
  83. if "client" in receiver_pcap:
  84. receiver_pcap = receiver_pcap.replace("client", "server")
  85. else:
  86. receiver_pcap = receiver_pcap.replace("server", "client")
  87. print("\rProcessing file pair no: {} out of {} ({}%) ".format(
  88. counter,
  89. len(sender_pcap_list),
  90. round((counter / len(sender_pcap_list)) * 100, 2)
  91. ), end="")
  92. format_udp_pcap_to_csv(
  93. args.folder,
  94. sender_pcap,
  95. receiver_pcap,
  96. output=args.folder if args.output is None else args.output
  97. )
  98. counter += 1
  99. print("\nWrote CSV files to: {}".format(args.folder if args.output is None else args.output))
  100. print("Runtime: {}".format(datetime.now() - start_time))