def CreateHunt(self, flow_runner_args=None, flow_args=None, client_rule_set=None, original_object=None, client_rate=0, duration=None, token=None, **kwargs): # Only initialize default flow_args value if default flow_runner_args value # is to be used. if not flow_runner_args: flow_args = ( flow_args or transfer.GetFileArgs( pathspec=rdf_paths.PathSpec( path="/tmp/evil.txt", pathtype=rdf_paths.PathSpec.PathType.OS))) flow_runner_args = ( flow_runner_args or rdf_flow_runner.FlowRunnerArgs(flow_name=transfer.GetFile.__name__)) client_rule_set = (client_rule_set or self._CreateForemanClientRuleSet()) if data_store.RelationalDBEnabled(): token = token or self.token hunt_args = rdf_hunt_objects.HuntArguments( hunt_type=rdf_hunt_objects.HuntArguments.HuntType.STANDARD, standard=rdf_hunt_objects.HuntArgumentsStandard( flow_name=flow_runner_args.flow_name, flow_args=flow_args)) hunt_obj = rdf_hunt_objects.Hunt( creator=token.username, client_rule_set=client_rule_set, original_object=original_object, client_rate=client_rate, duration=duration, args=hunt_args, **kwargs) hunt.CreateHunt(hunt_obj) return hunt_obj.hunt_id return implementation.StartHunt( hunt_name=standard.GenericHunt.__name__, flow_runner_args=flow_runner_args, flow_args=flow_args, client_rule_set=client_rule_set, client_rate=client_rate, original_object=original_object, token=token or self.token, **kwargs)
def Handle(self, args: ApiCreatePerClientFileCollectionHuntArgs, context: api_call_context.ApiCallContext): if len(args.per_client_args) > self.MAX_CLIENTS: raise ValueError(f"At most {self.MAX_CLIENTS} clients can be specified " "in a per-client file collection hunt.") if sum(len(pca.paths) for pca in args.per_client_args) > self.MAX_FILES: raise ValueError(f"At most {self.MAX_FILES} file paths can be specified " "in a per-client file collection hunt.") hunt_obj = rdf_hunt_objects.Hunt( args=self._ArgsToHuntArgs(args), description=args.description, duration=args.duration_secs, creator=context.username, client_rate=0, ) hunt.CreateHunt(hunt_obj) return ApiHunt().InitFromHuntObject(hunt_obj, with_full_summary=True)
def Handle(self, args, context=None): hra = args.hunt_runner_args hunt_obj = rdf_hunt_objects.Hunt( args=rdf_hunt_objects.HuntArguments.Standard( flow_name=args.flow_name, flow_args=rdf_structs.AnyValue.Pack(args.flow_args)), description=hra.description, client_rule_set=hra.client_rule_set, client_limit=hra.client_limit, crash_limit=hra.crash_limit, avg_results_per_client_limit=hra.avg_results_per_client_limit, avg_cpu_seconds_per_client_limit=hra.avg_cpu_seconds_per_client_limit, avg_network_bytes_per_client_limit=hra .avg_network_bytes_per_client_limit, duration=hra.expiry_time, client_rate=hra.client_rate, per_client_cpu_limit=hra.per_client_cpu_limit, per_client_network_bytes_limit=hra.per_client_network_limit_bytes, creator=context.username, ) if args.original_hunt and args.original_flow: raise ValueError( "A hunt can't be a copy of a flow and a hunt at the same time.") if args.original_hunt: ref = rdf_hunts.FlowLikeObjectReference.FromHuntId( args.original_hunt.hunt_id) hunt_obj.original_object = ref elif args.original_flow: ref = rdf_hunts.FlowLikeObjectReference.FromFlowIdAndClientId( args.original_flow.flow_id, args.original_flow.client_id) hunt_obj.original_object = ref if hra.HasField("output_plugins"): hunt_obj.output_plugins = hra.output_plugins hunt.CreateHunt(hunt_obj) return ApiHunt().InitFromHuntObject(hunt_obj, with_full_summary=True)
def testHangingClientsAreCorrectlyAccountedFor(self): client_ids = self.SetupClients(10) hunt_obj = rdf_hunt_objects.Hunt( client_rule_set=foreman_rules.ForemanClientRuleSet(), client_rate=0, args=self.GetFileHuntArgs()) hunt.CreateHunt(hunt_obj) hunt_obj = hunt.StartHunt(hunt_obj.hunt_id) foreman_obj = foreman.Foreman() for client_id in client_ids: foreman_obj.AssignTasksToClient(client_id) client_mock = hunt_test_lib.SampleHuntMock(failrate=2) hunt_test_lib.TestHuntHelper(client_mock, client_ids[1:9]) hunt_counters = data_store.REL_DB.ReadHuntCounters(hunt_obj.hunt_id) self.assertEqual(hunt_counters.num_clients, 10) self.assertEqual(hunt_counters.num_successful_clients, 4) self.assertEqual(hunt_counters.num_failed_clients, 4)
def CreateHunt(self, flow_runner_args=None, flow_args=None, client_rule_set=None, original_object=None, client_rate=0, duration=None, creator=None, **kwargs): # Only initialize default flow_args value if default flow_runner_args value # is to be used. if not flow_runner_args: flow_args = (flow_args or transfer.GetFileArgs(pathspec=rdf_paths.PathSpec( path="/tmp/evil.txt", pathtype=rdf_paths.PathSpec.PathType.OS))) flow_runner_args = (flow_runner_args or rdf_flow_runner.FlowRunnerArgs( flow_name=transfer.GetFile.__name__)) client_rule_set = (client_rule_set or self._CreateForemanClientRuleSet()) hunt_args = rdf_hunt_objects.HuntArguments.Standard( flow_name=flow_runner_args.flow_name, flow_args=rdf_structs.AnyValue.Pack(flow_args)) hunt_obj = rdf_hunt_objects.Hunt(creator=creator, client_rule_set=client_rule_set, original_object=original_object, client_rate=client_rate, duration=duration, args=hunt_args, **kwargs) hunt.CreateHunt(hunt_obj) return hunt_obj.hunt_id
def _CreateHunt(self, **kwargs): hunt_obj = rdf_hunt_objects.Hunt(creator=self.test_username, **kwargs) hunt.CreateHunt(hunt_obj) hunt_obj = hunt.StartHunt(hunt_obj.hunt_id) return hunt_obj.hunt_id