def route_create(): # ensure has enough data if 'guid' not in request.form: flash('No form data found', 'warning') return redirect(url_for('shards.route_list')) guid = request.form['guid'].lower() try: _ = UUID(guid) except ValueError: flash('Failed to add shard: Not a GUID', 'warning') return redirect(url_for('shards.route_list')) # already exists if db.session.query(ComponentShardInfo).filter( ComponentShardInfo.guid == guid).first(): flash('Failed to add shard: Already exists', 'info') return redirect(url_for('shards.route_list')) # add ComponentShardInfo shard = ComponentShardInfo(guid=guid) db.session.add(shard) db.session.commit() flash('Added shard', 'info') return redirect( url_for('shards.route_show', component_shard_info_id=shard.component_shard_info_id))
def _regenerate_shard_infos(): # Set ComponentShardInfo in ComponentShard if GUID matches infos = {} for info in db.session.query(ComponentShardInfo): infos[info.guid] = info for component_shard_id, in db.session.query(ComponentShard.component_shard_id)\ .filter(ComponentShard.component_shard_info_id == None): shard = db.session.query(ComponentShard)\ .filter(ComponentShard.component_shard_id == component_shard_id).one() shard.info = infos.get(shard.guid) if shard.info: print('fixing shard {} with {}'.format(component_shard_id, shard.guid)) else: print('creating ComponentShardInfo for {}'.format(shard.guid)) shard.info = ComponentShardInfo(guid=shard.guid) infos[shard.guid] = shard.info db.session.commit() # update ComponentShardInfo.cnt for info_id, in db.session.query(ComponentShardInfo.component_shard_info_id)\ .order_by(ComponentShardInfo.component_shard_info_id.asc()): info = db.session.query(ComponentShardInfo)\ .filter(ComponentShardInfo.component_shard_info_id == info_id)\ .one() _generate_stats_shard_info(info) db.session.commit()
def _generate_stats(kinds=None): if not kinds: kinds = ['FirmwareReport', 'ShardCount', 'ShardInfo'] # Set ComponentShardInfo in ComponentShard if GUID matches if 'ShardInfo' in kinds: print('stats::ShardInfo') infos = {} for info in db.session.query(ComponentShardInfo): infos[info.guid] = info for component_shard_id, in db.session.query(ComponentShard.component_shard_id).\ filter(ComponentShard.component_shard_info_id == None): shard = db.session.query(ComponentShard).\ filter(ComponentShard.component_shard_id == component_shard_id).one() shard.info = infos.get(shard.guid) if shard.info: print('fixing shard {} with {}'.format(component_shard_id, shard.guid)) else: print('creating ComponentShardInfo for {}'.format(shard.guid)) shard.info = ComponentShardInfo(guid=shard.guid) infos[shard.guid] = shard.info db.session.commit() # update ComponentShardInfo.cnt if 'ShardCount' in kinds: print('stats::ShardCount') for info_id, in db.session.query(ComponentShardInfo.component_shard_info_id)\ .order_by(ComponentShardInfo.component_shard_info_id.asc()): info = db.session.query(ComponentShardInfo)\ .filter(ComponentShardInfo.component_shard_info_id == info_id)\ .one() _generate_stats_shard_info(info) db.session.commit() # update FirmwareReport counts if 'FirmwareReport' in kinds: print('stats::FirmwareReport') for fw in db.session.query(Firmware)\ .join(Remote).filter(Remote.name != 'deleted'): _generate_stats_firmware_reports(fw) db.session.commit() print('generated %s' % ','.join(kinds))
def _generate_stats(kinds=None): if not kinds: kinds = ['FirmwareReport', 'ShardCount', 'ShardInfo', 'Metrics'] # Set ComponentShardInfo in ComponentShard if GUID matches if 'Metrics' in kinds: print('stats::Metrics') values = {} values['ClientCnt'] = _execute_count_star(\ db.session.query(Client)) values['FirmwareCnt'] = _execute_count_star(\ db.session.query(Firmware)) values['FirmwareStableCnt'] = _execute_count_star(\ db.session.query(Firmware)\ .join(Remote)\ .filter(Remote.name == 'stable')) values['FirmwareTestingCnt'] = _execute_count_star(\ db.session.query(Firmware)\ .join(Remote)\ .filter(Remote.name == 'testing')) values['FirmwarePrivateCnt'] = _execute_count_star(\ db.session.query(Firmware)\ .join(Remote)\ .filter(Remote.is_public == False)) values['TestCnt'] = _execute_count_star(\ db.session.query(Test)) values['ReportCnt'] = _execute_count_star(\ db.session.query(Report)) values['ProtocolCnt'] = _execute_count_star(\ db.session.query(Protocol)) values['ComponentShardInfoCnt'] = _execute_count_star(\ db.session.query(ComponentShardInfo)) values['ComponentShardCnt'] = _execute_count_star(\ db.session.query(ComponentShard)) values['ComponentCnt'] = _execute_count_star(\ db.session.query(Component)) values['VendorCnt'] = _execute_count_star(\ db.session.query(Vendor)\ .filter(Vendor.visible)\ .filter(Vendor.username_glob != None)) values['UserCnt'] = _execute_count_star(\ db.session.query(User)\ .filter(User.auth_type != 'disabled')) # save to database for key in values: metric = db.session.query(Metric).filter(Metric.key == key).first() if not metric: metric = Metric(key=key) db.session.add(metric) metric.value = values[key] print('{}={}'.format(metric.key, metric.value)) db.session.commit() if 'ShardInfo' in kinds: print('stats::ShardInfo') infos = {} for info in db.session.query(ComponentShardInfo): infos[info.guid] = info for component_shard_id, in db.session.query(ComponentShard.component_shard_id).\ filter(ComponentShard.component_shard_info_id == None): shard = db.session.query(ComponentShard).\ filter(ComponentShard.component_shard_id == component_shard_id).one() shard.info = infos.get(shard.guid) if shard.info: print('fixing shard {} with {}'.format(component_shard_id, shard.guid)) else: print('creating ComponentShardInfo for {}'.format(shard.guid)) shard.info = ComponentShardInfo(guid=shard.guid) infos[shard.guid] = shard.info db.session.commit() # update ComponentShardInfo.cnt if 'ShardCount' in kinds: print('stats::ShardCount') for info_id, in db.session.query(ComponentShardInfo.component_shard_info_id)\ .order_by(ComponentShardInfo.component_shard_info_id.asc()): info = db.session.query(ComponentShardInfo)\ .filter(ComponentShardInfo.component_shard_info_id == info_id)\ .one() _generate_stats_shard_info(info) db.session.commit() # update FirmwareReport counts if 'FirmwareReport' in kinds: print('stats::FirmwareReport') for fw in db.session.query(Firmware)\ .join(Remote).filter(Remote.name != 'deleted'): _generate_stats_firmware_reports(fw) db.session.commit() print('generated %s' % ','.join(kinds))
db.session.commit() for shard in md.shards: if shard.blob: self._run_test_on_shard(test, shard) # run with PYTHONPATH=. ./.env3/bin/python3 plugins/pecheck/__init__.py ./test.efi if __name__ == '__main__': import sys from lvfs.models import Firmware, Component, ComponentShard, ComponentShardInfo, Protocol for argv in sys.argv[1:]: print('Processing', argv) plugin = Plugin('pecheck') _test = Test(plugin.id) _fw = Firmware() _md = Component() _md.protocol = Protocol('org.uefi.capsule') _shard = ComponentShard() _shard.info = ComponentShardInfo(name=os.path.basename(argv)) try: with open(argv, 'rb') as f: _shard.set_blob(f.read()) except IsADirectoryError as _: continue _md.shards.append(_shard) _fw.mds.append(_md) plugin.run_test_on_fw(_test, _fw) for attribute in _test.attributes: print(attribute)