Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

119 linhas
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))