def setup(self): """Sets up build with a particular revision.""" self._pre_setup() logs.log('Retrieving %s branch (%s).' % (self.build_type, self.revision)) environment.set_value('BUILD_URL', self.build_url) version_file = os.path.join(self.build_dir, 'VERSION') build_update = revisions.needs_update(version_file, self.revision) if build_update: if not _unpack_build(self.base_build_dir, self.build_dir, self.build_url): return False revisions.write_revision_to_revision_file(version_file, self.revision) logs.log('Retrieved %s branch (%s).' % (self.build_type, self.revision)) else: logs.log('Build already exists.') self._setup_application_path(build_update=build_update) # 'VERSION' file already written. self._post_setup_success(update_revision=False) return True
def setup(self): """Set up the custom binary for a particular job.""" self._pre_setup() # Track the key for the custom binary so we can create a download link # later. environment.set_value('BUILD_KEY', self.custom_binary_key) logs.log('Retrieving custom binary build r%d.' % self.revision) revision_file = os.path.join(self.build_dir, REVISION_FILE_NAME) build_update = revisions.needs_update(revision_file, self.revision) if build_update: if not self._unpack_build(): return False logs.log('Retrieved custom binary build r%d.' % self.revision) else: logs.log('Build already exists.') self._setup_application_path(build_update=build_update) self._post_setup_success(update_revision=build_update) return True
def update_fuzzer_and_data_bundles(fuzzer_name): """Update the fuzzer with a given name if necessary.""" fuzzer = data_types.Fuzzer.query( data_types.Fuzzer.name == fuzzer_name).get() if not fuzzer: logs.log_error('No fuzzer exists with name %s.' % fuzzer_name) raise errors.InvalidFuzzerError # Set some helper environment variables. fuzzer_directory = get_fuzzer_directory(fuzzer_name) environment.set_value('FUZZER_DIR', fuzzer_directory) environment.set_value('UNTRUSTED_CONTENT', fuzzer.untrusted_content) # Adjust the test timeout, if user has provided one. if fuzzer.timeout: environment.set_value('TEST_TIMEOUT', fuzzer.timeout) # Increase fuzz test timeout if the fuzzer timeout is higher than its # current value. fuzz_test_timeout = environment.get_value('FUZZ_TEST_TIMEOUT') if fuzz_test_timeout and fuzz_test_timeout < fuzzer.timeout: environment.set_value('FUZZ_TEST_TIMEOUT', fuzzer.timeout) # Adjust the max testcases if this fuzzer has specified a lower limit. max_testcases = environment.get_value('MAX_TESTCASES') if fuzzer.max_testcases and fuzzer.max_testcases < max_testcases: environment.set_value('MAX_TESTCASES', fuzzer.max_testcases) # Check for updates to this fuzzer. version_file = os.path.join(fuzzer_directory, '.%s_version' % fuzzer_name) if (not fuzzer.builtin and revisions.needs_update(version_file, fuzzer.revision)): logs.log('Fuzzer update was found, updating.') # Clear the old fuzzer directory if it exists. if not shell.remove_directory(fuzzer_directory, recreate=True): logs.log_error('Failed to clear fuzzer directory.') return False # Copy the archive to local disk and unpack it. archive_path = os.path.join(fuzzer_directory, fuzzer.filename) if not blobs.read_blob_to_disk(fuzzer.blobstore_key, archive_path): logs.log_error('Failed to copy fuzzer archive.') return False try: archive.unpack(archive_path, fuzzer_directory) except Exception: error_message = ( 'Failed to unpack fuzzer archive %s ' '(bad archive or unsupported format).') % fuzzer.filename logs.log_error(error_message) fuzzer_logs.upload_script_log('Fatal error: ' + error_message, fuzzer_name=fuzzer_name) return False fuzzer_path = os.path.join(fuzzer_directory, fuzzer.executable_path) if not os.path.exists(fuzzer_path): error_message = ( 'Fuzzer executable %s not found. ' 'Check fuzzer configuration.') % fuzzer.executable_path logs.log_error(error_message) fuzzer_logs.upload_script_log('Fatal error: ' + error_message, fuzzer_name=fuzzer_name) return False # Make fuzzer executable. os.chmod(fuzzer_path, 0o750) # Cleanup unneeded archive. shell.remove_file(archive_path) # Save the current revision of this fuzzer in a file for later checks. revisions.write_revision_to_revision_file(version_file, fuzzer.revision) logs.log('Updated fuzzer to revision %d.' % fuzzer.revision) # Setup data bundles associated with this fuzzer. data_bundles = ndb_utils.get_all_from_query( data_types.DataBundle.query( data_types.DataBundle.name == fuzzer.data_bundle_name)) for data_bundle in data_bundles: if not update_data_bundle(fuzzer, data_bundle): return False # Setup environment variable for launcher script path. if fuzzer.launcher_script: fuzzer_launcher_path = shell.get_execute_command( os.path.join(fuzzer_directory, fuzzer.launcher_script)) environment.set_value('LAUNCHER_PATH', fuzzer_launcher_path) return True