選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

118 行
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 = sender_df.merge(receiver_df, on="data_hash")
  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))