def build_task_config( job_id: UUID, task_id: UUID, task_config: TaskConfig ) -> TaskUnitConfig: if task_config.task.type not in TASK_DEFINITIONS: raise TaskConfigError("unsupported task type: %s" % task_config.task.type.name) definition = TASK_DEFINITIONS[task_config.task.type] config = TaskUnitConfig( job_id=job_id, task_id=task_id, task_type=task_config.task.type, instrumentation_key=os.environ.get("APPINSIGHTS_INSTRUMENTATIONKEY"), telemetry_key=os.environ.get("ONEFUZZ_TELEMETRY"), heartbeat_queue=get_queue_sas( "heartbeat", account_id=os.environ["ONEFUZZ_FUNC_STORAGE"], add=True, ), back_channel_address="https://%s/api/back_channel" % (get_instance_url()), ) if definition.monitor_queue: config.input_queue = get_queue_sas( task_id, add=True, read=True, update=True, process=True, account_id=get_fuzz_storage(), ) for container_def in definition.containers: if container_def.type == ContainerType.setup: continue containers = [] for (i, container) in enumerate(task_config.containers): if container.type != container_def.type: continue containers.append( { "path": "_".join(["task", container_def.type.name, str(i)]), "url": get_container_sas_url( container.name, read=ContainerPermission.Read in container_def.permissions, write=ContainerPermission.Write in container_def.permissions, add=ContainerPermission.Add in container_def.permissions, delete=ContainerPermission.Delete in container_def.permissions, create=ContainerPermission.Create in container_def.permissions, list=ContainerPermission.List in container_def.permissions, ), } ) if not containers: continue if ( container_def.compare in [Compare.Equal, Compare.AtMost] and container_def.value == 1 ): setattr(config, container_def.type.name, containers[0]) else: setattr(config, container_def.type.name, containers) EMPTY_DICT: Dict[str, str] = {} EMPTY_LIST: List[str] = [] if TaskFeature.supervisor_exe in definition.features: config.supervisor_exe = task_config.task.supervisor_exe if TaskFeature.supervisor_env in definition.features: config.supervisor_env = task_config.task.supervisor_env or EMPTY_DICT if TaskFeature.supervisor_options in definition.features: config.supervisor_options = task_config.task.supervisor_options or EMPTY_LIST if TaskFeature.supervisor_input_marker in definition.features: config.supervisor_input_marker = task_config.task.supervisor_input_marker if TaskFeature.target_exe in definition.features: config.target_exe = "setup/%s" % task_config.task.target_exe if TaskFeature.target_env in definition.features: config.target_env = task_config.task.target_env or EMPTY_DICT if TaskFeature.target_options in definition.features: config.target_options = task_config.task.target_options or EMPTY_LIST if TaskFeature.target_options_merge in definition.features: config.target_options_merge = task_config.task.target_options_merge or False if TaskFeature.rename_output in definition.features: config.rename_output = task_config.task.rename_output or False if TaskFeature.generator_exe in definition.features: config.generator_exe = task_config.task.generator_exe if TaskFeature.generator_env in definition.features: config.generator_env = task_config.task.generator_env or EMPTY_DICT if TaskFeature.generator_options in definition.features: config.generator_options = task_config.task.generator_options or EMPTY_LIST if ( TaskFeature.wait_for_files in definition.features and task_config.task.wait_for_files ): config.wait_for_files = task_config.task.wait_for_files.name if TaskFeature.analyzer_exe in definition.features: config.analyzer_exe = task_config.task.analyzer_exe if TaskFeature.analyzer_options in definition.features: config.analyzer_options = task_config.task.analyzer_options or EMPTY_LIST if TaskFeature.analyzer_env in definition.features: config.analyzer_env = task_config.task.analyzer_env or EMPTY_DICT if TaskFeature.stats_file in definition.features: config.stats_file = task_config.task.stats_file config.stats_format = task_config.task.stats_format if TaskFeature.target_timeout in definition.features: config.target_timeout = task_config.task.target_timeout if TaskFeature.check_asan_log in definition.features: config.check_asan_log = task_config.task.check_asan_log if TaskFeature.check_debugger in definition.features: config.check_debugger = task_config.task.check_debugger if TaskFeature.check_retry_count in definition.features: config.check_retry_count = task_config.task.check_retry_count or 0 return config
def build_task_config(job: Job, task: Task) -> TaskUnitConfig: job_id = job.job_id task_id = task.task_id task_config = task.config if task_config.task.type not in TASK_DEFINITIONS: raise TaskConfigError("unsupported task type: %s" % task_config.task.type.name) definition = TASK_DEFINITIONS[task_config.task.type] config = TaskUnitConfig( job_id=job_id, task_id=task_id, task_type=task_config.task.type, instance_telemetry_key=os.environ.get( "APPINSIGHTS_INSTRUMENTATIONKEY"), microsoft_telemetry_key=os.environ.get("ONEFUZZ_TELEMETRY"), heartbeat_queue=get_queue_sas( "task-heartbeat", StorageType.config, add=True, ), instance_id=get_instance_id(), ) if job.config.logs: config.logs = add_container_sas_url(job.config.logs) else: LOGGER.warning("Missing log container: job_id %s, task_id %s", job_id, task_id) if definition.monitor_queue: config.input_queue = get_queue_sas( task_id, StorageType.corpus, add=True, read=True, update=True, process=True, ) for container_def in definition.containers: if container_def.type == ContainerType.setup: continue containers = [] for (i, container) in enumerate(task_config.containers): if container.type != container_def.type: continue containers.append({ "path": "_".join(["task", container_def.type.name, str(i)]), "url": get_container_sas_url( container.name, StorageType.corpus, read=ContainerPermission.Read in container_def.permissions, write=ContainerPermission.Write in container_def.permissions, delete=ContainerPermission.Delete in container_def.permissions, list_=ContainerPermission.List in container_def.permissions, ), }) if not containers: continue if (container_def.compare in [Compare.Equal, Compare.AtMost] and container_def.value == 1): setattr(config, container_def.type.name, containers[0]) else: setattr(config, container_def.type.name, containers) EMPTY_DICT: Dict[str, str] = {} EMPTY_LIST: List[str] = [] if TaskFeature.supervisor_exe in definition.features: config.supervisor_exe = task_config.task.supervisor_exe if TaskFeature.supervisor_env in definition.features: config.supervisor_env = task_config.task.supervisor_env or EMPTY_DICT if TaskFeature.supervisor_options in definition.features: config.supervisor_options = task_config.task.supervisor_options or EMPTY_LIST if TaskFeature.supervisor_input_marker in definition.features: config.supervisor_input_marker = task_config.task.supervisor_input_marker if TaskFeature.target_exe in definition.features: config.target_exe = "setup/%s" % task_config.task.target_exe if (TaskFeature.target_exe_optional in definition.features and task_config.task.target_exe): config.target_exe = "setup/%s" % task_config.task.target_exe if TaskFeature.target_env in definition.features: config.target_env = task_config.task.target_env or EMPTY_DICT if TaskFeature.target_options in definition.features: config.target_options = task_config.task.target_options or EMPTY_LIST if TaskFeature.target_options_merge in definition.features: config.target_options_merge = task_config.task.target_options_merge or False if TaskFeature.target_workers in definition.features: config.target_workers = task_config.task.target_workers if TaskFeature.rename_output in definition.features: config.rename_output = task_config.task.rename_output or False if TaskFeature.generator_exe in definition.features: config.generator_exe = task_config.task.generator_exe if TaskFeature.generator_env in definition.features: config.generator_env = task_config.task.generator_env or EMPTY_DICT if TaskFeature.generator_options in definition.features: config.generator_options = task_config.task.generator_options or EMPTY_LIST if (TaskFeature.wait_for_files in definition.features and task_config.task.wait_for_files): config.wait_for_files = task_config.task.wait_for_files.name if TaskFeature.analyzer_exe in definition.features: config.analyzer_exe = task_config.task.analyzer_exe if TaskFeature.analyzer_options in definition.features: config.analyzer_options = task_config.task.analyzer_options or EMPTY_LIST if TaskFeature.analyzer_env in definition.features: config.analyzer_env = task_config.task.analyzer_env or EMPTY_DICT if TaskFeature.stats_file in definition.features: config.stats_file = task_config.task.stats_file config.stats_format = task_config.task.stats_format if TaskFeature.target_timeout in definition.features: config.target_timeout = task_config.task.target_timeout if TaskFeature.check_asan_log in definition.features: config.check_asan_log = task_config.task.check_asan_log if TaskFeature.check_debugger in definition.features: config.check_debugger = task_config.task.check_debugger if TaskFeature.check_retry_count in definition.features: config.check_retry_count = task_config.task.check_retry_count or 0 if TaskFeature.ensemble_sync_delay in definition.features: config.ensemble_sync_delay = task_config.task.ensemble_sync_delay if TaskFeature.check_fuzzer_help in definition.features: config.check_fuzzer_help = (task_config.task.check_fuzzer_help if task_config.task.check_fuzzer_help is not None else True) if TaskFeature.report_list in definition.features: config.report_list = task_config.task.report_list if TaskFeature.minimized_stack_depth in definition.features: config.minimized_stack_depth = task_config.task.minimized_stack_depth if TaskFeature.expect_crash_on_failure in definition.features: config.expect_crash_on_failure = ( task_config.task.expect_crash_on_failure if task_config.task.expect_crash_on_failure is not None else True) if TaskFeature.coverage_filter in definition.features: coverage_filter = task_config.task.coverage_filter if coverage_filter is not None: config.coverage_filter = "setup/%s" % coverage_filter return config