def choose_attack(input_name): """" Finds the attack best matching to input_name :param input_name: The name of the attack the user put in :return: The best matching attack in case one was found """ import Attack # Find all attacks, exclude some classes package = Attack available_attacks = [] for _, name, __ in pkgutil.iter_modules(package.__path__): if name != 'BaseAttack' and name != 'AttackParameters': available_attacks.append(name) highest_sim = 0.0 highest_sim_attack = None for attack in available_attacks: # Check if attack name is accurate if input_name == attack: return attack # Compares input with one of the available attacks # Makes comparison with lowercase version with generic endings removed # List of generic attack name endings can be found in ID2TLib.Utility counter_check = attack.lower() if not any(ending in input_name for ending in Util.generic_attack_names): counter_check = Util.remove_generic_ending(counter_check) similarity = difflib.SequenceMatcher(None, input_name.lower(), counter_check).ratio() # Exact match, return appropriate attack name if similarity == 1.0: return attack # Found more likely match if similarity > highest_sim: highest_sim = similarity highest_sim_attack = attack # Found no exactly matching attack name, print best match and exit if highest_sim >= 0.6: print('Found no attack of name ' + input_name + '. The closest match was ' + highest_sim_attack + '. Use ./id2t -l for a list of available attacks.') exit(1) # Found no reasonably matching attack name, recommend -l and exit else: print('Found no attack of name ' + input_name + ' or one similar to it.' ' Use ./id2t -l for an overview of available attacks.') exit(1)
def test_remove_generic_ending_exploit(self): self.assertEqual(Utility.remove_generic_ending("someexploit"), "some")
def test_remove_generic_ending_wrong_ending(self): self.assertEqual(Utility.remove_generic_ending("somestuff"), "somestuff")
def test_remove_generic_ending_attack(self): self.assertEqual(Utility.remove_generic_ending("someattack"), "some")