def _update_metadata_from_fn(fwobj, fn): """ Re-parses the .cab file and updates the database version. """ # load cab file arc = cabarchive.CabArchive() try: if os.path.exists(CABEXTRACT_CMD): arc.set_decompressor(CABEXTRACT_CMD) arc.parse_file(fn) except cabarchive.CorruptionError as e: return error_internal('Invalid file type: %s' % str(e)) # parse the MetaInfo file cf = arc.find_file("*.metainfo.xml") if not cf: return error_internal('The firmware file had no valid metadata') component = appstream.Component() try: component.parse(str(cf.contents)) except appstream.ParseError as e: return error_internal('The metadata could not be parsed: ' + str(e)) # parse the inf file cf = arc.find_file("*.inf") if not cf: return error_internal('The firmware file had no valid inf file') cfg = InfParser() cfg.read_data(cf.contents) try: tmp = cfg.get('Version', 'DriverVer') driver_ver = tmp.split(',') if len(driver_ver) != 2: return error_internal('The inf file Version:DriverVer was invalid') except ConfigParser.NoOptionError as e: driver_ver = None # get the contents fw_data = arc.find_file('*.bin') if not fw_data: fw_data = arc.find_file('*.rom') if not fw_data: fw_data = arc.find_file('*.cap') if not fw_data: return error_internal('No firmware found in the archive') # update sizes fwobj.mds[0].release_installed_size = len(fw_data.contents) fwobj.mds[0].release_download_size = os.path.getsize(fn) # update the descriptions fwobj.mds[0].release_description = component.releases[0].description fwobj.mds[0].description = component.description if driver_ver: fwobj.version_display = driver_ver[1] db = LvfsDatabase(os.environ) db_firmware = LvfsDatabaseFirmware(db) db_firmware.update(fwobj) return None
def firmware_modify(fwid): """ Modifies the update urgency and release notes for the update """ if request.method != 'POST': return redirect(url_for('.firmware')) # find firmware try: db = LvfsDatabase(os.environ) db_firmware = LvfsDatabaseFirmware(db) fwobj = db_firmware.get_item(fwid) except CursorError as e: return error_internal(str(e)) if not fwobj: return error_internal("No firmware %s" % fwid) # set new metadata values for md in fwobj.mds: if 'urgency' in request.form: md.release_urgency = request.form['urgency'] if 'description' in request.form: txt = request.form['description'] if txt.find('<p>') == -1: txt = appstream.utils.import_description(txt) try: appstream.utils.validate_description(txt) except appstream.ParseError as e: return error_internal("Failed to parse %s: %s" % (txt, str(e))) md.release_description = txt # modify try: db_firmware.update(fwobj) except CursorError as e: return error_internal(str(e)) # log _event_log('Changed update description on %s' % fwid) return redirect(url_for('.firmware_id', fwid=fwid))