side report!
This commit is contained in:
parent
573ff92a85
commit
2077d293f5
9
Makefile
9
Makefile
@ -1,3 +1,10 @@
|
|||||||
|
|
||||||
all:
|
|
||||||
|
all: flake8; @:
|
||||||
|
|
||||||
|
flake8:
|
||||||
python2-flake8 --ignore=F403,F405,W503 port_stats/
|
python2-flake8 --ignore=F403,F405,W503 port_stats/
|
||||||
|
|
||||||
|
run:
|
||||||
|
python2 -im port_stats.interactive conf/local.json
|
||||||
|
|
||||||
|
@ -72,6 +72,10 @@ def evr_cmp(evr1, evr2, mode):
|
|||||||
p_e2, p_v2, p_r2, dep)
|
p_e2, p_v2, p_r2, dep)
|
||||||
|
|
||||||
|
|
||||||
|
def ver_cmp(ver1, ver2):
|
||||||
|
return evr_cmp((None, ver1, 1), (None, ver2, 1), 'pkg')
|
||||||
|
|
||||||
|
|
||||||
def _tests():
|
def _tests():
|
||||||
assert parse_evr('3:42.8.4-alt1.mipsel0') == (3, '42.8.4', 'alt1.mipsel0')
|
assert parse_evr('3:42.8.4-alt1.mipsel0') == (3, '42.8.4', 'alt1.mipsel0')
|
||||||
assert parse_evr('0:42.8.4-alt1.mipsel0') == (0, '42.8.4', 'alt1.mipsel0')
|
assert parse_evr('0:42.8.4-alt1.mipsel0') == (0, '42.8.4', 'alt1.mipsel0')
|
||||||
|
178
port_stats/side_report.py
Normal file
178
port_stats/side_report.py
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import collections
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
from port_stats import lists
|
||||||
|
from port_stats import rpm_ffi
|
||||||
|
from port_stats import utils
|
||||||
|
|
||||||
|
LOG = logging.getLogger('side_report')
|
||||||
|
|
||||||
|
_SRPM_PREFIXES = [
|
||||||
|
'boost',
|
||||||
|
'samba',
|
||||||
|
'opensm',
|
||||||
|
'scst',
|
||||||
|
'nut',
|
||||||
|
]
|
||||||
|
|
||||||
|
_SUFFIXES = [
|
||||||
|
'-devel-static',
|
||||||
|
'-devel',
|
||||||
|
'-static',
|
||||||
|
'-libs',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
_DISTROMAP = {
|
||||||
|
'corosynclib': 'corosync',
|
||||||
|
'dapl-utils': 'dapl',
|
||||||
|
'device-mapper-multipath': 'multipath-tools',
|
||||||
|
'drbd90-utils': 'drbd-utils',
|
||||||
|
'e1000e': 'kernel-source-e1000e',
|
||||||
|
'grub2': 'grub',
|
||||||
|
'grub2-tools': 'grub',
|
||||||
|
'krb5-workstation': 'krb5',
|
||||||
|
'libibumad': 'rdma-core',
|
||||||
|
'librdmacm': 'rdma-core',
|
||||||
|
'librdmacm-devel': 'rdma-core',
|
||||||
|
'librdmacm-utils': 'rdma-core',
|
||||||
|
'libsmbclient': 'samba',
|
||||||
|
'libwbclient': 'samba',
|
||||||
|
'mpitests_openmpi': 'mpitests',
|
||||||
|
'net-snmp': 'net-snmp30',
|
||||||
|
'net-snmp-agent': 'net-snmp30',
|
||||||
|
'net-snmp-perl': 'net-snmp30',
|
||||||
|
'net-snmp-utils': 'net-snmp30',
|
||||||
|
'nfs-utils': 'nfs',
|
||||||
|
'nodejs': 'node',
|
||||||
|
'nss-pam-ldapd': 'nss-ldapd',
|
||||||
|
'openldap-clients': 'openldap',
|
||||||
|
'openssl': 'openssl1.1',
|
||||||
|
'perl-Socket': 'perl',
|
||||||
|
'perl-Storable': 'perl',
|
||||||
|
'perl-Test-Simple': 'perl',
|
||||||
|
'perl-constant': 'perl',
|
||||||
|
'python-websockify': 'python-module-websockify',
|
||||||
|
'python34': 'python3',
|
||||||
|
'python34-PyYAML': 'python-module-yaml',
|
||||||
|
'python34-daemon': 'python-module-daemon',
|
||||||
|
'python34-lockfile': 'python-module-lockfile',
|
||||||
|
'python34-setproctitle': 'python-module-setproctitle',
|
||||||
|
'python34-setuptools': 'python-module-setuptools',
|
||||||
|
'python34-simplejson': 'python-module-simplejson',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def alt_srpm_name(name):
|
||||||
|
for s in _SUFFIXES:
|
||||||
|
if name.endswith(s):
|
||||||
|
name = name[:-len(s)]
|
||||||
|
for p in _SRPM_PREFIXES:
|
||||||
|
if name.startswith(p + '-'):
|
||||||
|
return p
|
||||||
|
return _DISTROMAP.get(name, name)
|
||||||
|
|
||||||
|
|
||||||
|
def repo_nv(repo):
|
||||||
|
result = {}
|
||||||
|
for nevr in repo:
|
||||||
|
result[nevr.name] = nevr.version
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
_CATEGORIES = [
|
||||||
|
('UPDATED', 'Пакет в sisyphus_mipsel большей версии'),
|
||||||
|
('SAME', 'Пакет в sisyphus_mipsel той же версии'),
|
||||||
|
('OLDER', 'Пакет в sisyphus_mipsel меньшей версии'),
|
||||||
|
('MISSING', 'Пакет есть в Sisyphus для x86_64, но не для mipsel'),
|
||||||
|
('KERNEL', 'Ядро и модули'),
|
||||||
|
('UNKNOWN', 'Сопоставить не удалось'),
|
||||||
|
]
|
||||||
|
|
||||||
|
_HEADER = '''
|
||||||
|
Сравнение списка с пакетной базой Sisyphus x86_64 и Sisyphus mipsel.
|
||||||
|
Время: %s
|
||||||
|
|
||||||
|
Поля:
|
||||||
|
- пакет в оригинальном списке
|
||||||
|
- имя пакета из списка
|
||||||
|
- имя SRPM из Сизифа
|
||||||
|
- версия в списке
|
||||||
|
- версия в Sisyphus x86_64
|
||||||
|
- версия в Sisyphus mipsel
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def category(srpm, side_v, sisyphus_v, mipsel_v):
|
||||||
|
if srpm.startswith('kmod-') or srpm == 'kernel':
|
||||||
|
return 'KERNEL'
|
||||||
|
if sisyphus_v is None:
|
||||||
|
return 'UNKNOWN'
|
||||||
|
if mipsel_v is None:
|
||||||
|
return 'MISSING'
|
||||||
|
c = rpm_ffi.ver_cmp(side_v, mipsel_v)
|
||||||
|
if c < 0:
|
||||||
|
return 'UPDATED'
|
||||||
|
if c == 0:
|
||||||
|
return 'SAME'
|
||||||
|
if c > 0:
|
||||||
|
return 'OLDER'
|
||||||
|
return 'OMG'
|
||||||
|
|
||||||
|
|
||||||
|
def main(config_path, side_list_path, *args):
|
||||||
|
logging.basicConfig(
|
||||||
|
format='%(asctime)s %(levelname)-5s %(name)s - %(message)s',
|
||||||
|
datefmt='%Y-%m-%d %H:%M:%S',
|
||||||
|
stream=sys.stderr, level=logging.INFO)
|
||||||
|
|
||||||
|
with open(config_path) as f:
|
||||||
|
config = json.load(f)
|
||||||
|
repos = lists.read_all_srclists(config['repos'])
|
||||||
|
sisyphus_nv = repo_nv(repos['sisyphus'])
|
||||||
|
mipsel_nv = repo_nv(repos['sisyphus_mipsel'])
|
||||||
|
|
||||||
|
with open(side_list_path) as f:
|
||||||
|
side_pkgs = f.read().split()
|
||||||
|
|
||||||
|
LOG.info("Found %s pkgs in %s", len(side_pkgs), side_list_path)
|
||||||
|
# original package, name, version
|
||||||
|
side_nvs = sorted((x,) + tuple(x.rsplit('-', 2)[:-1]) for x in side_pkgs)
|
||||||
|
# original package, name, ALT SRPM, version
|
||||||
|
side_nvs = [(o, n, alt_srpm_name(n), v)
|
||||||
|
for o, n, v in side_nvs]
|
||||||
|
|
||||||
|
# sanity check: each SRPM version should have 1 version in side list
|
||||||
|
s2v = collections.defaultdict(set)
|
||||||
|
for o, n, s, v in side_nvs:
|
||||||
|
s2v[s].add(v)
|
||||||
|
for s, vs in s2v.items():
|
||||||
|
if len(vs) > 1:
|
||||||
|
LOG.warn('%s versions of %s: %s', len(vs), s, ' '.join(sorted(vs)))
|
||||||
|
|
||||||
|
# add versions from sisyphus and sisyphus_mipsel
|
||||||
|
side_nvs = [(o, n, s, v, sisyphus_nv.get(s), mipsel_nv.get(s))
|
||||||
|
for o, n, s, v in side_nvs]
|
||||||
|
|
||||||
|
# categorize:
|
||||||
|
side_nvs = [(o, n, s, v, sv, mv, category(s, v, sv, mv))
|
||||||
|
for o, n, s, v, sv, mv in side_nvs]
|
||||||
|
|
||||||
|
print(_HEADER % utils.format_timestamp(time.time()))
|
||||||
|
for cat, descr in _CATEGORIES:
|
||||||
|
in_cat = sorted(t for t in side_nvs if t[-1] == cat)
|
||||||
|
print("\n\n%s: %s\n" % (len(in_cat), descr))
|
||||||
|
for t in in_cat:
|
||||||
|
tl = (t[0], t[2]) if cat == 'UNKNOWN' else t[:-1]
|
||||||
|
print('\t'.join(x or 'MISSING' for x in tl))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(*sys.argv[1:]))
|
Loading…
Reference in New Issue
Block a user