Пример #1
0
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))
Пример #2
0
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()
Пример #3
0
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))
Пример #4
0
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))
Пример #5
0
            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)