CLI.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #! /usr/bin/python3
  2. import argparse
  3. import sys
  4. from ID2TLib.Controller import Controller
  5. class LoadFromFile(argparse.Action):
  6. """
  7. Parses the parameter file given by application param -c/--config.
  8. """
  9. def __call__(self, parser, namespace, values, option_string=None):
  10. with values as f:
  11. parser.parse_args(f.read().split(), namespace)
  12. class CLI(object):
  13. def __init__(self):
  14. """
  15. Creates a new CLI object used to handle
  16. """
  17. # Reference to PcapFile object
  18. self.args = None
  19. self.attack_config = None
  20. def process_arguments(self):
  21. """
  22. Loads the application controller, the PCAP file statistics and if present, processes the given attacks. Evaluates
  23. given queries.
  24. """
  25. # Create ID2T Controller
  26. controller = Controller(self.args.input)
  27. # Load PCAP statistics
  28. controller.load_pcap_statistics(self.args.export, self.args.recalculate, self.args.statistics)
  29. # Process attack(s) with given attack params
  30. if self.args.attack is not None:
  31. # If attack is present, load attack with params
  32. controller.process_attacks(self.args.attack)
  33. # Parameter -q without arguments was given -> go into query loop
  34. if self.args.query == [None]:
  35. controller.enter_query_mode()
  36. # Parameter -q with arguments was given -> process query
  37. elif self.args.query is not None:
  38. controller.process_db_queries(self.args.query, True)
  39. def parse_arguments(self, args):
  40. """
  41. Defines the allowed application arguments and invokes the evaluation of the arguments.
  42. :param args: The application arguments
  43. """
  44. # Create parser for arguments
  45. parser = argparse.ArgumentParser(description="Intrusion Detection Dataset Toolkit (ID2T) - A toolkit for "
  46. "injection of synthetically created attacks into PCAP datasets.")
  47. # Define required arguments
  48. # requiredNamed = parser.add_argument_group('required named arguments')
  49. # requiredNamed.add_argument('-i', '--input', metavar="FILEPATH", help='path to the input pcap file',
  50. # required=True)
  51. # Define optional arguments
  52. parser.add_argument('-i', '--input', metavar="FILEPATH", help='path to the input pcap file', required=False)
  53. parser.add_argument('-c', '--config', metavar='FILEPATH', help='file containing parameters used as input.',
  54. action=LoadFromFile, type=open)
  55. parser.add_argument('-e', '--export',
  56. help='stores the statistics as a textfile with ending .stat into the dataset directory',
  57. action='store_true', default=False)
  58. parser.add_argument('-a', '--attack', metavar="ATTACKNAME", action='append',
  59. help='injects a new attack into the given dataset.', nargs='+')
  60. parser.add_argument('-g', '--gui', help='enables the Graphical User Interface (GUI) mode.', action='store_true',
  61. default=False)
  62. parser.add_argument('-r', '--recalculate',
  63. help='forces to recalculate the statistics in case of an already existing statistics database.',
  64. action='store_true', default=False)
  65. parser.add_argument('-s', '--statistics', help='print general file statistics to stdout.', action='store_true',
  66. default=False)
  67. parser.add_argument('-q', '--query', metavar="QUERY",
  68. action='append', nargs='?',
  69. help='queries the statistics database. If no query is provided, the application enters into query mode.')
  70. # Parse arguments
  71. self.args = parser.parse_args(args)
  72. # Either PCAP filepath or GUI mode must be enabled
  73. if not self.args.input and not self.args.gui:
  74. parser.error("Parameter -i/--input or -g/--gui required.")
  75. # GUI mode enabled
  76. if self.args.gui:
  77. raise NotImplementedError("Feature not implemented yet.")
  78. # gui = GUI.GUI()
  79. pass
  80. # CLI mode enabled
  81. else:
  82. self.process_arguments()
  83. def main(args):
  84. """
  85. Creates a new CLI object and invokes the arguments parsing.
  86. :param args: The provided arguments
  87. """
  88. cli = CLI()
  89. # Check arguments
  90. cli.parse_arguments(args)
  91. # Uncomment to enable calling by terminal
  92. if __name__ == '__main__':
  93. main(sys.argv[1:])
  94. # if __name__ == '__main__':
  95. # FILE = ['-i', '/mnt/hgfs/datasets/95M.pcap']
  96. # FILE2 = ['-i', '/mnt/hgfs/datasets/95M_20161103-185151.pcap']
  97. #
  98. #
  99. # ATTACK = ['-a', 'PortscanAttack', 'ip.src=10.2.2.4', 'mac.dst=05:AB:47:B5:19:11',
  100. # 'inject.at-timestamp=1449038705.316721', 'attack.note=Portscan2']
  101. # ATTACK2 = ['-a', 'PortscanAttack', 'ip.dst=193.133.122.23, ip.src=192.124.34.12', 'inject.after-pkt=34']
  102. #
  103. # STATS_RECALC = ['-r']
  104. # STATS_PRINT = ['-s']
  105. #
  106. # QUERY_MODE_LOOP = ['-q']
  107. # QUERY_DB = ['-q', 'most_used(ttlValue)']
  108. #
  109. # main(FILE2 + ATTACK)
  110. # main(['-c', '/home/pjattke/Thesis/development/code/config'])