def store_binary_in_databse(binary_path: str, package: str, afl_dir_path, configuration_dir: str): p = pathlib.Path(afl_dir_path) p = p.relative_to(*p.parts[:2]) package, created = Package.objects.get_or_create( name=package, version=ArchCrawler.get_package_version(package)) binary, created = Binary.objects.get_or_create(path=binary_path, package=package) binary.afl_dir = os.path.abspath(os.path.join(configuration_dir, str(p))) binary.save()
def store_in_database(basepath: str, package_info_filepath: str, binary_path: str, parameter: str, crash_dir_path: str, crash_db_path: str, afl_dir_path: str, configuration_dir: str): print("Package info for package {0}".format(package_info_filepath)) package_info_dict = {} with open(basepath + "/" + package_info_filepath) as package_info_filepointer: text = package_info_filepointer.read() tmp_list = [item.strip().split(":", 1) for item in text.split("\n")] for item in tmp_list: if len(item) == 2: package_info_dict[item[0].strip()] = item[1].strip() package, created = Package.objects.get_or_create( name=package_info_dict["Name"], version=ArchCrawler.get_package_version(package_info_dict["Name"])) binary, created = Binary.objects.get_or_create(path=binary_path, package=package) p = pathlib.Path(afl_dir_path) p = p.relative_to(*p.parts[:2]) # type: pathlib.PosixPath binary.afl_dir = os.path.abspath(configuration_dir + "/" + str(p)) # First path is the volume path # binary.afl_dir= configuration_dir+"/"+afl_dir_path binary.save() crash_db_full_path = basepath + "/" + crash_db_path if not os.path.exists(crash_db_full_path): print("Error: The database {0} does not exist".format( crash_db_full_path)) print(crash_db_path) return print("Opening database {0}".format(crash_db_full_path)) connect = sqlite3.connect(basepath + "/" + crash_db_path) c = connect.cursor() c.execute( "select count(*) from sqlite_master where type='table' and name='Data';" ) if c.fetchone()[0] != 1: print("Error: The table Data does not exist") return c.execute("select count(*) from Data;") conv = Ansi2HTMLConverter() if c.fetchone()[0] > 0: print("Crashes for package {0} binary {1}".format( package, binary_path)) for row in c.execute('SELECT * FROM Data'): print(basepath + "/" + crash_dir_path + "/" + row[0]) if not os.path.exists(basepath + "/" + crash_dir_path + "/" + row[0]): continue with open(basepath + "/" + crash_dir_path + "/" + row[0], "rb") as crash_filepointer: crash_data = crash_filepointer.read() try: rendered_text = conv.convert(row[5].decode("utf-8")) except Exception as e: rendered_text = "" crash, created = Crash.objects.get_or_create( binary=binary, parameter=parameter, exploitability=row[1], file_blob=crash_data, description=row[2], execution_output=rendered_text) crash.name = row[0] else: print("No crashes for package {0} binary {1}".format( package, binary_path))