mirror of
https://abf.rosa.ru/djam/repo-analyzer.git
synced 2025-02-23 04:22:46 +00:00
Initial commit
This commit is contained in:
commit
bccd41cb69
9 changed files with 3420 additions and 0 deletions
12
README
Normal file
12
README
Normal file
|
@ -0,0 +1,12 @@
|
|||
Порядок использования скриптов:
|
||||
|
||||
1. Настроить структуру репозиториев и пути в repo-analyze-config.xml
|
||||
2. Заполнить базу данных информацией из репозиториев:
|
||||
fill-repodb.py repo-analyze-config.xml
|
||||
* Скрипт создаёт в текущем каталоге базу данных repo.db размером около 1 Гб
|
||||
3. Подготовить базу данных к анализу:
|
||||
prepare-repodb.py
|
||||
4. Выполнить анализ/проверки:
|
||||
analyze-repodb.py
|
||||
analyze-repo-redundancy.py i586kde.lst --repo rosa-dx-chrome-1.0/i586/main/release >i586-redundant.txt
|
||||
|
130
analyze-repo-redundancy.py
Executable file
130
analyze-repo-redundancy.py
Executable file
|
@ -0,0 +1,130 @@
|
|||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import sqlite3
|
||||
import string
|
||||
import rpm
|
||||
import re
|
||||
import gettext
|
||||
from versutils import *
|
||||
|
||||
gettext.install('urpm-tools')
|
||||
|
||||
DB = 'repo.db'
|
||||
|
||||
def parseargs(args):
|
||||
parser = argparse.ArgumentParser(description=_('Check repository\'s redundancy for a given list of packages.'))
|
||||
parser.add_argument('packages_lst', metavar='packages.lst',
|
||||
help=('path to packages.lst'))
|
||||
parser.add_argument('--repo', action='append', nargs='+', required=True,
|
||||
metavar='REPO', help=_('URL or name of a repository'))
|
||||
opts = parser.parse_args()
|
||||
return opts
|
||||
|
||||
def main(args):
|
||||
options = parseargs(args)
|
||||
with open(options.packages_lst, 'r') as f:
|
||||
ks_cfg = f.read()
|
||||
section = None
|
||||
in_packages = False
|
||||
sel_packages = []
|
||||
for line in ks_cfg.split('\n'):
|
||||
ls = line.strip()
|
||||
if ls and not ls.startswith('#'):
|
||||
sel_packages.append(ls)
|
||||
|
||||
conn = sqlite3.connect(DB)
|
||||
c = conn.cursor()
|
||||
repodirs = []
|
||||
for repo in options.repo[0]:
|
||||
print repo
|
||||
rid = c.execute("""
|
||||
SELECT id FROM repodirs WHERE name = ? OR name = ?
|
||||
""", [repo, repo]).fetchall()
|
||||
if rid is None:
|
||||
print 'Repository "%" not found.' % repo
|
||||
exit(1)
|
||||
repodirs.append(rid[0][0])
|
||||
if not repodirs:
|
||||
print 'No repositories specified.'
|
||||
exit(1)
|
||||
if not sel_packages:
|
||||
print 'No packages specified.'
|
||||
exit(1)
|
||||
in_repodirs = ','.join(str(id) for id in repodirs)
|
||||
package_ids = []
|
||||
for spackage in sel_packages:
|
||||
packages_found = c.execute("""
|
||||
SELECT id, nvra, version, release FROM packages WHERE repodir_id IN (%s) AND name = ?
|
||||
""" % in_repodirs, [spackage]).fetchall()
|
||||
if not packages_found:
|
||||
print 'Package "%s" not found!' % spackage
|
||||
continue
|
||||
pid = None
|
||||
if len(packages_found) > 1:
|
||||
chosen_nvra = None
|
||||
chosen_version = None
|
||||
for vpid in packages_found:
|
||||
better_found = pid is None
|
||||
verrel = (vpid[2] if vpid[2] is not None else '') + '-' + \
|
||||
(vpid[3] if vpid[3] is not None else '')
|
||||
if not better_found:
|
||||
better_found = version_ok(chosen_version,
|
||||
RPMSENSE_GREATER,
|
||||
verrel)
|
||||
if better_found:
|
||||
pid = vpid[0]
|
||||
chosen_nvra = vpid[1]
|
||||
chosen_version = verrel
|
||||
print ('Multiple versions of "%s" found (%s). Choosing latest: %s.' %
|
||||
(spackage, ', '.join(cp[1] for cp in packages_found), chosen_nvra))
|
||||
else:
|
||||
pid = packages_found[0][0]
|
||||
package_ids.append(pid)
|
||||
|
||||
package_cnt = 0
|
||||
while package_cnt < len(package_ids):
|
||||
package_cnt = len(package_ids)
|
||||
in_packages = ','.join(str(id) for id in package_ids)
|
||||
for required_package in c.execute("""
|
||||
SELECT packages.id, packages.name, nvra
|
||||
FROM packages, requires
|
||||
WHERE packages.id = requires.dep_package_id AND
|
||||
packages.repodir_id IN (%s) AND
|
||||
requires.package_id IN (%s) AND
|
||||
packages.id NOT IN (%s)
|
||||
ORDER BY packages.name
|
||||
""" % (in_repodirs, in_packages, in_packages)):
|
||||
package_ids.append(required_package[0])
|
||||
|
||||
in_packages = ','.join(str(id) for id in package_ids)
|
||||
pre_repodir_id = -1
|
||||
repo_packages_cnt = 0
|
||||
for reduntant_package in c.execute("""
|
||||
SELECT repodir_id, repodirs.name, packages.id, packages.nvra
|
||||
FROM packages, repodirs
|
||||
WHERE packages.repodir_id = repodirs.id AND
|
||||
repodirs.id IN (%s) AND packages.id NOT IN (%s)
|
||||
ORDER BY repodir_id, nvra
|
||||
""" % (in_repodirs, in_packages)):
|
||||
(repodir_id, repodir_name, package_nvra) = \
|
||||
(reduntant_package[0], reduntant_package[1], reduntant_package[3])
|
||||
if pre_repodir_id != repodir_id:
|
||||
if pre_repodir_id == -1:
|
||||
print 'Redundant packages:'
|
||||
else:
|
||||
print 'Total: %d' % repo_packages_cnt
|
||||
print ''
|
||||
print '%d) %s' % (repodir_id, repodir_name)
|
||||
pre_repodir_id = repodir_id
|
||||
repo_packages_cnt = 0
|
||||
print '\t%s' % package_nvra
|
||||
repo_packages_cnt += 1
|
||||
if pre_repodir_id != -1:
|
||||
print 'Total: %d' % repo_packages_cnt
|
||||
print ''
|
||||
|
||||
conn.rollback()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
389
analyze-repodb.py
Executable file
389
analyze-repodb.py
Executable file
|
@ -0,0 +1,389 @@
|
|||
import os
|
||||
import sys
|
||||
import gettext
|
||||
import argparse
|
||||
import sqlite3
|
||||
import string
|
||||
import rpm
|
||||
import re
|
||||
|
||||
DB = 'repo.db'
|
||||
|
||||
def detect_broken_dependencies(dbc):
|
||||
def print_broken_packages():
|
||||
for rpb_name in sorted(repo_packages_broken.keys()):
|
||||
rpb_id = repo_packages_broken[rpb_name]
|
||||
dep_chain = []
|
||||
dep_id = all_broken[rpb_id]['depid']
|
||||
while dep_id != 0:
|
||||
dep_chain.append('%s (%d)' % (all_broken[dep_id]['nvra'], all_broken[dep_id]['repo']))
|
||||
dep_id = all_broken[dep_id]['depid']
|
||||
print '\t' + rpb_name + ' => '+ (' => '.join(dep_chain))
|
||||
print 'Total: %d' % len(repo_packages_broken)
|
||||
print ''
|
||||
|
||||
# Detect broken dependencies with recursion
|
||||
repodirs_analyzed = []
|
||||
broken = {}
|
||||
broken_level0 = dbc.execute("""
|
||||
SELECT packages.id, nvra, repodir_id, repodirs.name, requires.name AS req_name, requires.build_arch AS req_arch
|
||||
FROM packages, repodirs, requires
|
||||
WHERE packages.repodir_id = repodirs.id AND packages.id=requires.package_id AND
|
||||
dep_package_id IS NULL
|
||||
ORDER BY repodir_id, nvra""").fetchall()
|
||||
|
||||
all_broken = {}
|
||||
if len(broken_level0) > 0:
|
||||
print 'Broken dependencies (bottom level):'
|
||||
bp_reqs = []
|
||||
pre_repodir_id = -1
|
||||
pre_bp_id = -1
|
||||
pre_bp_nvra = -1
|
||||
pre_cnt = 0
|
||||
for bp in broken_level0:
|
||||
(bp_id, bp_nvra, bp_repodir_id, bp_repodir_name, bp_reqname, bp_reqarch) = \
|
||||
(bp[0], bp[1], bp[2], bp[3], bp[4], bp[5])
|
||||
broken[bp_id] = bp_nvra
|
||||
if pre_bp_id != bp_id and pre_bp_id != -1:
|
||||
print '\t%s (%s)' % (pre_bp_nvra, ', '.join(bp_reqs))
|
||||
pre_cnt += 1
|
||||
bp_reqs = []
|
||||
if bp_reqarch is not None:
|
||||
bp_reqname += ':' + bp_reqarch
|
||||
if bp_reqname not in bp_reqs:
|
||||
bp_reqs.append(bp_reqname)
|
||||
if pre_repodir_id != bp_repodir_id:
|
||||
if pre_repodir_id != -1:
|
||||
print 'Total: %d' % pre_cnt
|
||||
print '%d) %s' % (bp_repodir_id, bp_repodir_name)
|
||||
pre_repodir_id = bp_repodir_id
|
||||
pre_cnt = 0
|
||||
if bp_id not in all_broken:
|
||||
all_broken[bp_id] = {'repo': bp_repodir_id, 'nvra': bp_nvra, 'reqname': bp_reqname, 'depid': 0}
|
||||
pre_bp_id = bp_id
|
||||
pre_bp_nvra = bp_nvra
|
||||
|
||||
if pre_bp_id != -1:
|
||||
print '\t%s (%s)' % (pre_bp_nvra, ','.join(bp_reqs))
|
||||
print 'Total: %d' % pre_cnt
|
||||
|
||||
all_broken_cnt = -1
|
||||
broken_recursive = []
|
||||
while all_broken_cnt < len(all_broken):
|
||||
all_broken_cnt = len(all_broken)
|
||||
pids = ','.join(str(id) for id in all_broken.keys())
|
||||
#print pids
|
||||
packages_broken_recurs = dbc.execute("""
|
||||
SELECT packages.id, nvra, repodir_id, repodirs.name, requires.name AS req_name, build_arch, dep_package_id
|
||||
FROM packages, repodirs, requires
|
||||
WHERE packages.repodir_id = repodirs.id AND packages.id=requires.package_id AND
|
||||
dep_package_id IN (%(pids)s) AND packages.id NOT IN (%(pids)s)
|
||||
ORDER BY repodir_id, nvra""" % {'pids': pids}).fetchall()
|
||||
# print len(packages_broken_recurs)
|
||||
for packb in packages_broken_recurs:
|
||||
all_broken[packb[0]] = {'repo': packb[2], 'nvra': packb[1], 'reqname': packb[4], 'build_arch': packb[5], 'depid': packb[6]}
|
||||
broken_recursive.append(packb[0])
|
||||
#print len(all_broken.keys())
|
||||
|
||||
if broken_recursive:
|
||||
print 'Recursive broken dependencies:'
|
||||
all_repodirs = dbc.execute("""
|
||||
SELECT id, name, sources FROM repodirs ORDER BY id""").fetchall()
|
||||
for rd in all_repodirs:
|
||||
(rd_id, rd_name, rd_sources) = (rd[0], rd[1], rd[2])
|
||||
if rd_sources == '.':
|
||||
archs = dbc.execute("""
|
||||
SELECT DISTINCT build_arch FROM requires WHERE package_id IN (SELECT id FROM packages WHERE repodir_id = ?)
|
||||
""", [rd_id]).fetchall()
|
||||
for arch_rec in archs:
|
||||
repo_packages_broken = {all_broken[id]['nvra']: id for id in broken_recursive \
|
||||
if all_broken[id]['repo'] == rd_id and all_broken[id]['build_arch'] == arch_rec[0]}
|
||||
if repo_packages_broken:
|
||||
print '%d) %s (%s)' % (rd_id, rd_name, arch_rec[0])
|
||||
print_broken_packages()
|
||||
else:
|
||||
repo_packages_broken = {all_broken[id]['nvra']: id for id in broken_recursive if all_broken[id]['repo'] == rd_id}
|
||||
if repo_packages_broken:
|
||||
print '%d) %s' % (rd_id, rd_name)
|
||||
print_broken_packages()
|
||||
|
||||
#all_repodirs = dbc.execute("""
|
||||
#SELECT id, name FROM repodirs ORDER BY id""").fetchall()
|
||||
#for rd in all_repodirs:
|
||||
#(rd_id, rd_name) = (rd[0], rd[1])
|
||||
#repo_broken_recurs = dbc.execute("""
|
||||
#SELECT packages.id, nvra, requires.name AS req_name
|
||||
#FROM packages, requires
|
||||
#WHERE packages.repodir_id = ? AND packages.id=requires.package_id AND
|
||||
#dep_package_id IS NULL AND packages.id NOT IN()
|
||||
#""").fetchall()
|
||||
#print rd_name
|
||||
|
||||
|
||||
def detect_lost_sources(dbc):
|
||||
print '==='
|
||||
print 'Lost sources:'
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs WHERE sources <> '.' ORDER BY id
|
||||
""").fetchall()
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
lost_sources = dbc.execute("""
|
||||
SELECT name, nvra, sourcerpm FROM packages
|
||||
WHERE repodir_id = ? AND
|
||||
sourcerpm IS NOT NULL AND sourcerpm_package IS NULL
|
||||
ORDER BY name
|
||||
""", [rd_id]).fetchall()
|
||||
if lost_sources:
|
||||
print '%d) %s' % (rd_id, rd_name)
|
||||
for ls in lost_sources:
|
||||
print '\t%s (%s)' % (ls[1], ls[2])
|
||||
print 'Total: %d' % len(lost_sources)
|
||||
|
||||
|
||||
def analyze_partitioning(dbc):
|
||||
print '==='
|
||||
print 'Possible partitioning:'
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs WHERE sources <> '.' ORDER BY id
|
||||
""").fetchall()
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
partitions = []
|
||||
partitioned_packages = []
|
||||
singles = []
|
||||
while True:
|
||||
ppackages = ','.join(str(id) for id in partitioned_packages)
|
||||
if not ppackages:
|
||||
ppackages = '0'
|
||||
pkg1_rec = dbc.execute("""
|
||||
SELECT id, name, nvra
|
||||
FROM packages WHERE repodir_id = ? AND id NOT IN (%s)
|
||||
ORDER BY name
|
||||
LIMIT 1""" % ppackages, [rd_id]).fetchall()
|
||||
if not pkg1_rec:
|
||||
break
|
||||
if not partitioned_packages:
|
||||
print '%d) %s' % (rd_id, rd_name)
|
||||
(pkg_id, pkg_name) = (pkg1_rec[0][0], pkg1_rec[0][2])
|
||||
partition_names = []
|
||||
partition_names.append(pkg_name)
|
||||
partition_ids = []
|
||||
partition_ids.append(pkg_id)
|
||||
partitioned_packages.append(pkg_id)
|
||||
current_level_packages = [pkg_id]
|
||||
while True:
|
||||
cl_packages = ','.join(str(id) for id in current_level_packages)
|
||||
part_packages = ','.join(str(id) for id in partition_ids)
|
||||
upper_packages = dbc.execute("""
|
||||
SELECT packages.id, packages.name, nvra
|
||||
FROM packages, requires
|
||||
WHERE packages.id = requires.package_id AND
|
||||
packages.repodir_id = ? AND
|
||||
requires.dep_package_id IN (%s) AND
|
||||
packages.id NOT IN (%s)
|
||||
ORDER BY packages.name
|
||||
""" % (cl_packages, part_packages), [rd_id]).fetchall()
|
||||
|
||||
lower_packages = dbc.execute("""
|
||||
SELECT packages.id, packages.name, nvra
|
||||
FROM packages, requires
|
||||
WHERE packages.id = requires.dep_package_id AND
|
||||
packages.repodir_id = ? AND
|
||||
requires.package_id IN (%s) AND
|
||||
packages.id NOT IN (%s)
|
||||
ORDER BY packages.name
|
||||
""" % (cl_packages, part_packages), [rd_id]).fetchall()
|
||||
|
||||
if not upper_packages and not lower_packages:
|
||||
break
|
||||
current_level_packages = []
|
||||
for rec in upper_packages:
|
||||
if rec[0] not in current_level_packages:
|
||||
current_level_packages.append(rec[0])
|
||||
partitioned_packages.append(rec[0])
|
||||
partition_ids.append(rec[0])
|
||||
partition_names.append(rec[2])
|
||||
for rec in lower_packages:
|
||||
if rec[0] not in current_level_packages:
|
||||
current_level_packages.append(rec[0])
|
||||
partitioned_packages.append(rec[0])
|
||||
partition_ids.append(rec[0])
|
||||
partition_names.append(rec[2])
|
||||
|
||||
if len(partition_names) == 1:
|
||||
#print partition_names
|
||||
singles.append(partition_names[0])
|
||||
#raise Exception('aaa')
|
||||
else:
|
||||
for p in sorted(partition_names):
|
||||
print '\t%s', p
|
||||
print 'Total: %d' % len(partition_names)
|
||||
print '---'
|
||||
print ''
|
||||
|
||||
if len(singles) > 0:
|
||||
print 'Singles:'
|
||||
for s in sorted(singles):
|
||||
print '\t%s' % s
|
||||
print 'Total: %d' % len(singles)
|
||||
|
||||
def detect_lost_object_files(dbc):
|
||||
print '==='
|
||||
print 'Lost object (executable) files (provided but not found):'
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs ORDER BY id
|
||||
""").fetchall()
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
lost_object_files = dbc.execute("""
|
||||
SELECT nvra, package_files.path, mark
|
||||
FROM packages, package_files
|
||||
WHERE repodir_id = ? AND packages.id = package_files.package_id AND mark = 'not-found'
|
||||
ORDER BY packages.name, package_files.path
|
||||
""", [rd_id]).fetchall()
|
||||
if lost_object_files:
|
||||
print '%d) %s' % (rd_id, rd_name)
|
||||
for lof in lost_object_files:
|
||||
print '\t%s: %s' % (lof[0], lof[1])
|
||||
print 'Total: %d' % len(lost_object_files)
|
||||
|
||||
def detect_broken_object_links(dbc):
|
||||
print '==='
|
||||
print 'Invalid object (executable) file links:'
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs ORDER BY id
|
||||
""").fetchall()
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
broken_object_links = dbc.execute("""
|
||||
SELECT nvra, package_files.path, link_to_path, mark
|
||||
FROM packages, package_files
|
||||
WHERE repodir_id = ? AND packages.id = package_files.package_id AND
|
||||
mark = 'link' AND link_to_path IS NOT NULL AND link_to_file_id IS NULL
|
||||
ORDER BY packages.name, package_files.path
|
||||
""", [rd_id]).fetchall()
|
||||
if broken_object_links:
|
||||
print '%d) %s' % (rd_id, rd_name)
|
||||
for bol in broken_object_links:
|
||||
print '\t%s: %s -/-> %s' % \
|
||||
(bol[0], bol[1], bol[2])
|
||||
print 'Total: %d' % len(broken_object_links)
|
||||
|
||||
def get_repodir_depends(dbc, repodir_id):
|
||||
dep_repos = dbc.execute("""
|
||||
SELECT depend_repodir_name FROM repodir_depends WHERE repodir_id = ?
|
||||
""", [repodir_id]).fetchall()
|
||||
return ', '.join([dep_repo[0] for dep_repo in dep_repos])
|
||||
|
||||
def detect_so_needed_not_found(dbc):
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs ORDER BY id
|
||||
""").fetchall()
|
||||
print '==='
|
||||
print 'Objects needed and resolved by rpm requires-provides:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
objects_needed_resolved1 = dbc.execute("""
|
||||
SELECT COUNT(1) FROM packages CROSS JOIN package_files CROSS JOIN so_needed CROSS JOIN so_needed_res
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
so_needed.obj_file_id = package_files.id AND so_needed_id = so_needed.id AND res_type = 1
|
||||
""", [rd_id]).fetchone()
|
||||
print '%d) %s: %d' % (rd_id, rd_name, objects_needed_resolved1[0])
|
||||
|
||||
print '==='
|
||||
print 'Objects needed and resolved by flat search:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
objects_needed_resolved2 = dbc.execute("""
|
||||
SELECT COUNT(1) FROM packages CROSS JOIN package_files CROSS JOIN so_needed CROSS JOIN so_needed_res
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
so_needed.obj_file_id = package_files.id AND so_needed_id = so_needed.id AND res_type = 2
|
||||
""", [rd_id]).fetchone()
|
||||
print '%d) %s: %d' % (rd_id, rd_name, objects_needed_resolved2[0])
|
||||
|
||||
print '==='
|
||||
print 'Objects needed but not resolved:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
objects_needed_not_resolved = dbc.execute("""
|
||||
SELECT packages.nvra, package_files.path, so_needed.name
|
||||
FROM packages CROSS JOIN package_files CROSS JOIN so_needed
|
||||
LEFT OUTER JOIN so_needed_res ON so_needed_id = so_needed.id
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
so_needed.obj_file_id = package_files.id AND so_needed_id IS NULL
|
||||
""", [rd_id]).fetchall()
|
||||
if objects_needed_not_resolved:
|
||||
repodir_depends = get_repodir_depends(dbc, rd_id)
|
||||
print ('%d) %s' % (rd_id, rd_name)) + \
|
||||
('' if repodir_depends == '' else
|
||||
(' (depends on: %s)' % repodir_depends))
|
||||
for obj_nr in objects_needed_not_resolved:
|
||||
print '\t%s: %s -?-> %s' % (obj_nr[0], obj_nr[1], obj_nr[2])
|
||||
print 'Total: %d' % len(objects_needed_not_resolved)
|
||||
|
||||
def detect_symbols_not_found(dbc):
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs ORDER BY id
|
||||
""").fetchall()
|
||||
|
||||
print '==='
|
||||
print 'Symbols resolved by .so NEEDED search:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
symbols_resolved1_2 = dbc.execute("""
|
||||
SELECT COUNT(1) FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols CROSS JOIN obj_symbols_res
|
||||
WHERE packages.repodir_id = ? AND packages.id = package_files.package_id AND
|
||||
package_files.id = obj_symbols.obj_file_id AND sym_type = 0 AND
|
||||
obj_symbols_res.obj_sym_id = obj_symbols.id AND res_type IN (1, 2)
|
||||
""", [rd_id]).fetchone()
|
||||
print '%d) %s: %d' % (rd_id, rd_name, symbols_resolved1_2[0])
|
||||
|
||||
|
||||
print '==='
|
||||
print 'Symbols resolved by flat search:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
symbols_resolved3 = dbc.execute("""
|
||||
SELECT COUNT(1) FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols CROSS JOIN obj_symbols_res
|
||||
WHERE packages.repodir_id = ? AND packages.id = package_files.package_id AND
|
||||
package_files.id = obj_symbols.obj_file_id AND sym_type = 0 AND
|
||||
obj_symbols_res.obj_sym_id = obj_symbols.id AND res_type = 3
|
||||
""", [rd_id]).fetchone()
|
||||
print '%d) %s: %d' % (rd_id, rd_name, symbols_resolved3[0])
|
||||
|
||||
print '==='
|
||||
print 'Symbols not resolved:'
|
||||
for repodir in repodirs:
|
||||
(rd_id, rd_name) = (repodir[0], repodir[1])
|
||||
symbols_not_resolved = dbc.execute("""
|
||||
SELECT packages.nvra, package_files.path, obj_symbols.name
|
||||
FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols
|
||||
WHERE packages.repodir_id = ? AND packages.id = package_files.package_id AND
|
||||
package_files.id = obj_symbols.obj_file_id AND sym_type = 0 AND
|
||||
NOT EXISTS (SELECT 1 FROM obj_symbols_res WHERE obj_sym_id = obj_symbols.id)
|
||||
""", [rd_id]).fetchall()
|
||||
if symbols_not_resolved:
|
||||
repodir_depends = get_repodir_depends(dbc, rd_id)
|
||||
print ('%d) %s' % (rd_id, rd_name)) + \
|
||||
('' if repodir_depends == '' else
|
||||
(' (depends on: %s)' % repodir_depends))
|
||||
for sym_nr in symbols_not_resolved:
|
||||
print '\t%s: %s -?-> %s' % (sym_nr[0], sym_nr[1], sym_nr[2])
|
||||
print 'Total: %d' % len(symbols_not_resolved)
|
||||
|
||||
def main(args):
|
||||
|
||||
conn = sqlite3.connect(DB)
|
||||
dbc = conn.cursor()
|
||||
detect_broken_dependencies(dbc)
|
||||
detect_lost_sources(dbc)
|
||||
analyze_partitioning(dbc)
|
||||
detect_lost_object_files(dbc)
|
||||
detect_broken_object_links(dbc)
|
||||
detect_so_needed_not_found(dbc)
|
||||
detect_symbols_not_found(dbc)
|
||||
conn.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
538
fill-repodb.py
Executable file
538
fill-repodb.py
Executable file
|
@ -0,0 +1,538 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import sys
|
||||
import gettext
|
||||
import argparse
|
||||
import sqlite3
|
||||
import string
|
||||
import rpm
|
||||
import re
|
||||
import tempfile
|
||||
import xml.etree.ElementTree as ET
|
||||
import subprocess
|
||||
import shutil
|
||||
import time
|
||||
import multiprocessing as mp
|
||||
import gc
|
||||
|
||||
gettext.install('urpm-tools')
|
||||
|
||||
DB = 'repo.db'
|
||||
|
||||
NUM_PROCESSES = 4 # number of CPU's (evaluated automatically)
|
||||
|
||||
RPMFILEMODE_DIRECTORY = 0x4000
|
||||
RPMFILEMODE_EXECUTE = 0111
|
||||
|
||||
def getFileList(path, ext, filelist):
|
||||
extlen = len(ext)
|
||||
dir_list = os.listdir(path)
|
||||
|
||||
for d in dir_list:
|
||||
if os.path.isdir(path + '/' + d):
|
||||
filelist = getFileList(path + '/' + d, ext, filelist)
|
||||
else:
|
||||
if string.lower(d[-extlen:]) == '%s' % (ext):
|
||||
newpath = os.path.normpath(path + '/' + d)
|
||||
filelist.append(newpath)
|
||||
return filelist
|
||||
|
||||
def parseargs(args):
|
||||
parser = argparse.ArgumentParser(description=_('extract packages metadata from RPM repositories'))
|
||||
parser.add_argument("config", metavar="config",
|
||||
help=_('path to repo-analyze-config.xml'))
|
||||
opts = parser.parse_args()
|
||||
return opts
|
||||
|
||||
def to_string(rpm, tag, val):
|
||||
if type(val) == type([]):
|
||||
if not(val):
|
||||
return None
|
||||
try:
|
||||
return str(val).decode('utf-8')
|
||||
except:
|
||||
print >> sys.stderr, 'Invalid UTF-8 string!\n(%s:\n%s = "%s")\n' % \
|
||||
(rpm, tag, val)
|
||||
return str(val).decode('utf-8', 'replace')
|
||||
|
||||
def init_database(conn):
|
||||
conn.execute("""
|
||||
CREATE TABLE repodirs(id INTEGER PRIMARY KEY NOT NULL,
|
||||
name TEXT UNIQUE, path TEXT, arch TEXT, sources TEXT)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE repodir_depends(id INTEGER PRIMARY KEY NOT NULL,
|
||||
repodir_id INTEGER, depend_repodir_name TEXT)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS package_files(id INTEGER PRIMARY KEY NOT NULL,
|
||||
package_id INTEGER NOT NULL, basename TEXT, path TEXT, size INTEGER, mode INTEGER,
|
||||
link_to_file_id INTEGER, link_to_path TEXT, mark TEXT)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE so_needed(id INTEGER PRIMARY KEY NOT NULL,
|
||||
obj_file_id INTEGER, name TEXT)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE so_needed_res(id INTEGER PRIMARY KEY NOT NULL,
|
||||
so_needed_id INTEGER, dep_obj_file_id INTEGER, res_type INTEGER)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE obj_symbols(id INTEGER PRIMARY KEY NOT NULL,
|
||||
obj_file_id INTEGER, name TEXT, sym_type INTEGER)""")
|
||||
conn.execute("""
|
||||
CREATE TABLE obj_symbols_res(id INTEGER PRIMARY KEY NOT NULL,
|
||||
obj_sym_id INTEGER, dep_obj_sym_id INTEGER, res_type INTEGER)""")
|
||||
conn.execute("""PRAGMA synchronous = OFF""")
|
||||
conn.execute("""PRAGMA journal_mode = OFF""")
|
||||
|
||||
def index_database(conn):
|
||||
print 'Indexing the database...'
|
||||
# conn.execute("""CREATE INDEX IF NOT EXISTS rd_rd_id ON repodir_depends(repodir_id)""")
|
||||
# conn.execute("""CREATE INDEX IF NOT EXISTS rd_drd_id ON repodir_depends(depend_repodir_id)""")
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS rd_name ON repodirs(name)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_name ON packages(name)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_arch ON packages(nvra)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_arch ON packages(arch)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_group ON packages(rpm_group)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_repodir ON packages(repodir_id)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_file_pkg_id ON package_files(package_id)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_file_name ON package_files(basename)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_file_path ON package_files(path)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS pkg_file_mark ON package_files(mark)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS so_needed_obj_id ON so_needed(obj_file_id)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS so_needed_res_sn ON so_needed_res(so_needed_id)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS symbols_obj_name_type ON obj_symbols(obj_file_id, name, sym_type)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS symbols_name_type ON obj_symbols(name, sym_type)')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS symbols_res_sym ON obj_symbols_res(obj_sym_id)')
|
||||
dep_tables = ['requires', 'provides', 'conflicts', 'obsoletes']
|
||||
for table in dep_tables:
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS %(tbl)s_pkg ON %(tbl)s(package_id)' % {'tbl': table})
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS %(tbl)s_name ON %(tbl)s(name)' % {'tbl': table})
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS %(tbl)s_dep_pkg ON %(tbl)s(dep_package_id)' % {'tbl': table})
|
||||
conn.commit()
|
||||
|
||||
def add_repodir(xrepodir, conn):
|
||||
c = conn.cursor()
|
||||
c.execute("""INSERT INTO repodirs (name, path, sources) VALUES (?, ?, ?)""",
|
||||
[xrepodir.get('name'), xrepodir.get('path'), xrepodir.get('sources')])
|
||||
repodir_id = c.lastrowid
|
||||
for depend in xrepodir.findall('dependency'):
|
||||
c.execute("""INSERT INTO repodir_depends(repodir_id, depend_repodir_name)
|
||||
VALUES (?, ?)""",
|
||||
[repodir_id, depend.text.strip()])
|
||||
conn.commit()
|
||||
return repodir_id
|
||||
|
||||
def get_build_archs(xrepodir, xrepodirs):
|
||||
build_archs = []
|
||||
for depend in xrepodir.findall('dependency'):
|
||||
arch_sign = '$arch'
|
||||
depend_repo = depend.text.strip()
|
||||
spos = depend_repo.find(arch_sign)
|
||||
if spos >= 0:
|
||||
drepo_prefix = depend_repo[:spos]
|
||||
drepo_postfix = depend_repo[spos + len(arch_sign):]
|
||||
for xrepodir in xrepodirs.findall('dir'):
|
||||
repo_name = xrepodir.get('name')
|
||||
if repo_name.startswith(drepo_prefix) and \
|
||||
repo_name.endswith(drepo_postfix):
|
||||
repo_arch = repo_name[len(drepo_prefix) :
|
||||
len(repo_name) - len(drepo_postfix)]
|
||||
if repo_arch == 'SRPMS':
|
||||
continue
|
||||
if repo_arch not in build_archs:
|
||||
build_archs.append(repo_arch)
|
||||
if build_archs:
|
||||
return build_archs
|
||||
return [None]
|
||||
|
||||
def get_rpm_header(rpm_ts, pkg):
|
||||
hdr = None
|
||||
try:
|
||||
fdno = os.open(pkg, os.O_RDONLY)
|
||||
except OSError, e:
|
||||
raise Exception('Unable to open file %s.' % pkg)
|
||||
try:
|
||||
hdr = rpm_ts.hdrFromFdno(fdno)
|
||||
except rpm.error, e:
|
||||
raise Exception('Unable to read RPM header for %s.' % pkg)
|
||||
finally:
|
||||
os.close(fdno)
|
||||
return hdr
|
||||
|
||||
def generate_new_id(generator, gen_lock):
|
||||
gen_lock.acquire()
|
||||
last_id = generator.value
|
||||
last_id += 1
|
||||
generator.value = last_id
|
||||
gen_lock.release()
|
||||
return last_id
|
||||
|
||||
FILE_REC_ID_IDX = 0
|
||||
FILE_REC_PATH_IDX = 3
|
||||
FILE_REC_LINK_IDX = 6
|
||||
FILE_REC_MARK_IDX = 7
|
||||
|
||||
def register_object(data, pkg_id, pkg, object_file_record, temp_dir):
|
||||
# print 'register_library ', obj_file_path
|
||||
so_needed = data['so_needed']
|
||||
obj_symbols = data['obj_symbols']
|
||||
obj_id = object_file_record[0]
|
||||
obj_file_path = object_file_record[3]
|
||||
obj_file_basename = os.path.basename(obj_file_path)
|
||||
temp_obj_file = os.path.join(temp_dir, obj_file_path.lstrip('/'))
|
||||
|
||||
target_file = None
|
||||
file_mark = None
|
||||
od_out = ''
|
||||
nmundef_out = ''
|
||||
nmdef_out = ''
|
||||
if os.path.islink(temp_obj_file):
|
||||
target_file = os.path.join(os.path.dirname(obj_file_path),
|
||||
os.readlink(temp_obj_file))
|
||||
file_mark = 'link'
|
||||
elif not os.path.exists(temp_obj_file):
|
||||
# print 'File %s was not extracted from the package %s.' % \
|
||||
# (obj_file_path, pkg)
|
||||
file_mark = 'not-found'
|
||||
else:
|
||||
p = subprocess.Popen(['objdump', '-p', temp_obj_file],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
od_out = p.communicate()[0]
|
||||
if p.returncode != 0:
|
||||
file_mark = 'invalid-format'
|
||||
else:
|
||||
p = subprocess.Popen(['nm', '-p', '-D', '--undefined-only',
|
||||
temp_obj_file],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
nmundef_out = p.communicate()[0]
|
||||
if p.returncode != 0:
|
||||
file_mark = 'no-symbols'
|
||||
else:
|
||||
p = subprocess.Popen(['nm', '-p', '-D', '--defined-only',
|
||||
temp_obj_file],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
nmdef_out = p.communicate()[0]
|
||||
if p.returncode != 0:
|
||||
file_mark = 'no-symbols'
|
||||
else:
|
||||
file_mark = 'so'
|
||||
|
||||
object_file_record[FILE_REC_LINK_IDX] = target_file
|
||||
object_file_record[FILE_REC_MARK_IDX] = file_mark
|
||||
|
||||
needed_list = []
|
||||
dynsection = False
|
||||
for odline in od_out.split('\n'):
|
||||
odls = odline.strip()
|
||||
if odls == '':
|
||||
dynsection = False
|
||||
elif odls == 'Динамический раздел:' or odls == 'Dynamic section:':
|
||||
dynsection = True
|
||||
elif dynsection:
|
||||
needrem = re.match(r'\s+NEEDED\s+(.*)', odline)
|
||||
if needrem:
|
||||
so_needed.append([obj_id, needrem.group(1)])
|
||||
|
||||
symbols_list = []
|
||||
for symline in nmundef_out.split('\n'):
|
||||
smre = re.match('^.([\S]*)\s+(\w)\s(.*)$', symline)
|
||||
if smre:
|
||||
if smre.group(2) in ['v', 'w']:
|
||||
continue
|
||||
symname = smre.group(3)
|
||||
obj_symbols.append([obj_id, symname, 0])
|
||||
|
||||
for symline in nmdef_out.split('\n'):
|
||||
smre = re.match('^.([\S]*)\s+(\w)\s(.*)$', symline)
|
||||
if smre:
|
||||
symname = smre.group(3)
|
||||
obj_symbols.append([obj_id, symname, 1])
|
||||
|
||||
return obj_id
|
||||
|
||||
def extract_files(pkg, files_list, obj_so_files_idx, temp_dir):
|
||||
#local_pkg = getLocalPackageName(pkg)
|
||||
local_pkg = pkg
|
||||
filelist = os.path.join(temp_dir, 'files.lst')
|
||||
with open(filelist, 'w') as f:
|
||||
for i in obj_so_files_idx:
|
||||
f.write('.' + files_list[i][FILE_REC_PATH_IDX] + '\n')
|
||||
|
||||
rpm_cpio_cmd = 'rpm2cpio ' + pkg + ' | cpio -ivdu -E ' + filelist
|
||||
p = subprocess.Popen(rpm_cpio_cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
cwd=temp_dir,
|
||||
shell=True)
|
||||
output = p.communicate()[0]
|
||||
if p.returncode != 0:
|
||||
print >> sys.stderr, 'Couldn\'t extract files from package %s.' \
|
||||
'\n\t%s' % (pkg, output)
|
||||
return False
|
||||
return True
|
||||
|
||||
def process_package_worker(num, queue_in, generator, gen_lock, db_struct, repodir_id, build_archs, temp_dir):
|
||||
|
||||
rpm_ts = rpm.TransactionSet()
|
||||
rpm_ts.setVSFlags(~(rpm.RPMVSF_NEEDPAYLOAD))
|
||||
data = {}
|
||||
data['packages'] = []
|
||||
for table in db_struct['dep_tables']:
|
||||
data[table] = []
|
||||
data['package_files'] = []
|
||||
data['so_needed'] = []
|
||||
data['obj_symbols'] = []
|
||||
|
||||
while True:
|
||||
job = queue_in.get()
|
||||
if job == None:
|
||||
break
|
||||
(pkg, ) = job
|
||||
|
||||
pkg_id = generate_new_id(generator, gen_lock)
|
||||
|
||||
hdr = get_rpm_header(rpm_ts, pkg)
|
||||
package_values = []
|
||||
package_values.append(pkg_id)
|
||||
|
||||
for tag in db_struct['packages_tags']:
|
||||
hval = hdr[tag]
|
||||
package_values.append(
|
||||
sqlite3.Binary(hval) if tag in db_struct['blob_tags'] else \
|
||||
to_string(pkg, tag, hval) if type(hval) in [type([]), type('')] else \
|
||||
hval
|
||||
)
|
||||
# sorted(packages_extra_fields.keys())
|
||||
package_values.append(repodir_id)
|
||||
package_values.append(pkg)
|
||||
package_values.append(None)
|
||||
data['packages'].append(package_values)
|
||||
for table in db_struct['dep_tables']:
|
||||
table_data = data[table]
|
||||
rpref = 'RPMTAG_' + table[:-1].upper()
|
||||
(dep_name, dep_flags, dep_version) = \
|
||||
(hdr[rpref + 'NAME'], hdr[rpref + 'FLAGS'], hdr[rpref + 'VERSION'])
|
||||
for i in xrange(0, len(hdr[rpref + 'NAME'])):
|
||||
#print pkg, table, hdr[rpref + 'NAME'][i]
|
||||
for build_arch in build_archs:
|
||||
table_data.append([dep_name[i].decode('utf-8'),
|
||||
dep_flags[i],
|
||||
dep_version[i],
|
||||
pkg_id, build_arch])
|
||||
# fonts-ttf-decoratives-1.3-27-rosa.lts2012.0.noarch.rpm provides font(derdämonschriftkegel)
|
||||
(pkg_file_paths, pkg_file_names, pkg_file_sizes, pkg_file_modes) = \
|
||||
(hdr['RPMTAG_FILEPATHS'], hdr['RPMTAG_BASENAMES'], hdr['RPMTAG_FILESIZES'], hdr['RPMTAG_FILEMODES'])
|
||||
files_list = data['package_files']
|
||||
obj_so_files_idx = []
|
||||
for i in xrange(0, len(pkg_file_paths)):
|
||||
file_name = pkg_file_names[i]
|
||||
file_path = pkg_file_paths[i]
|
||||
pkg_file_id = generate_new_id(generator, gen_lock)
|
||||
files_list.append([pkg_file_id, #FILE_REC_ID_IDX = 0
|
||||
pkg_id,
|
||||
file_name.decode('utf-8'),
|
||||
file_path.decode('utf-8'), #FILE_REC_PATH_IDX = 3
|
||||
pkg_file_sizes[i],
|
||||
pkg_file_modes[i],
|
||||
None, #link_to_path FILE_REC_LINK_IDX = 6
|
||||
None #mark FILE_REC_LINK_IDX = 7
|
||||
])
|
||||
if pkg_file_modes[i] & RPMFILEMODE_DIRECTORY != 0:
|
||||
continue
|
||||
if os.path.splitext(file_name)[1] in \
|
||||
['.debug', '.xz', '.conf', '.py', '.c', '.h', '.hpp', '.png',
|
||||
'.cc', '.cpp', '.sh', '.java', '.pl', '.patch', '.desktop']:
|
||||
continue
|
||||
if file_path.startswith('/usr/lib/debug/.build-id') or
|
||||
file_path.endswith('/ld.so.cache'):
|
||||
continue
|
||||
if re.search(r'\.so($|\.)', file_name) or \
|
||||
(pkg_file_modes[i] & RPMFILEMODE_EXECUTE) != 0:
|
||||
obj_so_files_idx.append(len(files_list) - 1)
|
||||
|
||||
if obj_so_files_idx:
|
||||
pkg_temp_dir = os.path.join(temp_dir, os.path.basename(pkg))
|
||||
os.makedirs(pkg_temp_dir)
|
||||
if extract_files(pkg, files_list, obj_so_files_idx, pkg_temp_dir):
|
||||
for i in obj_so_files_idx:
|
||||
register_object(data, pkg_id, pkg, files_list[i], pkg_temp_dir)
|
||||
|
||||
shutil.rmtree(pkg_temp_dir, True)
|
||||
|
||||
queue_in.task_done()
|
||||
|
||||
conn = sqlite3.connect(DB, timeout=30) #, isolation_level='DEFERRED', timeout=30)
|
||||
conn.executemany("""
|
||||
INSERT INTO packages (%s) VALUES (%s)""" %
|
||||
(db_struct['packages_field_names'],
|
||||
db_struct['packages_values_template']),
|
||||
data['packages'])
|
||||
|
||||
for table in db_struct['dep_tables']:
|
||||
conn.executemany("""
|
||||
INSERT INTO %s (name, flags, version, package_id, build_arch)
|
||||
VALUES (?, ?, ?, ?, ?)""" % table, data[table])
|
||||
|
||||
conn.executemany("""
|
||||
INSERT INTO package_files (id, package_id, basename, path, size, mode, link_to_path, mark)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", data['package_files'])
|
||||
|
||||
conn.executemany("""
|
||||
INSERT INTO so_needed(obj_file_id, name) VALUES(?, ?)
|
||||
""", data['so_needed'])
|
||||
|
||||
conn.executemany("""
|
||||
INSERT INTO obj_symbols(obj_file_id, name, sym_type) VALUES(?, ?, ?)
|
||||
""", data['obj_symbols'])
|
||||
|
||||
conn.commit()
|
||||
queue_in.task_done()
|
||||
|
||||
generator_value = 0
|
||||
|
||||
def process_repodir(repodir_path, repodir_id, build_archs, conn, db_struct, tempdir):
|
||||
|
||||
rpm_list = []
|
||||
rpm_list = getFileList(repodir_path, '.rpm', rpm_list)
|
||||
if not rpm_list:
|
||||
return
|
||||
print repodir_path, ': ', len(rpm_list)
|
||||
|
||||
if not db_struct.get('defined'):
|
||||
rpm_ts = rpm.TransactionSet()
|
||||
rpm_ts.setVSFlags(~(rpm.RPMVSF_NEEDPAYLOAD))
|
||||
# ts.setVSFlags(~(rpm.RPMVSF_NOMD5|rpm.RPMVSF_NEEDPAYLOAD))
|
||||
hdr = get_rpm_header(rpm_ts, rpm_list[0])
|
||||
|
||||
packages_extra_fields = {'repodir_id': 'INTEGER',
|
||||
'rpm_filepath': 'TEXT',
|
||||
'sourcerpm_package': 'TEXT'}
|
||||
|
||||
file_tags_re = '^RPMTAG_(BASENAMES|FILE[\w\d]+)'
|
||||
dir_tags_re = '^RPMTAG_DIR(INDEXES|NAMES)'
|
||||
changelog_tags_re = '^RPMTAG_CHANGELOG\w+'
|
||||
trigger_tags_re = '^RPMTAG_TRIGGER\w+'
|
||||
|
||||
datetime_tags = ['RPMTAG_PACKAGETIME', 'RPMTAG_RPMLIBTIMESTAMP', ]
|
||||
db_struct['blob_tags'] = ['RPMTAG_DSAHEADER', 'RPMTAG_HEADERIMMUTABLE',
|
||||
'RPMTAG_PKGID', 'RPMTAG_SIGMD5']
|
||||
|
||||
reserved_field_names = ['id', 'group']
|
||||
skip_tags_re = '^RPMTAG_(C|D|E|N|P|R|V|HEADERIMMUTABLE)$'
|
||||
#C - CONFLICTNAME, D - DISTEPOCH, E - EPOCH, N - NAME, O - OBSOLETENAME
|
||||
#P - PROVIDENAME, R - RELEASE, V - VERSION
|
||||
|
||||
types = {"<type 'str'>" : "TEXT", "<type 'int'>": "INTEGER",
|
||||
"<type 'NoneType'>": "TEXT", "<type 'list'>": "TEXT"}
|
||||
|
||||
dep_tags_re = '^RPMTAG_(CONFLICT|OBSOLETE|PROVIDE|REQUIRE)\w+'
|
||||
|
||||
db_struct['dep_tables'] = ['requires', 'provides',
|
||||
'conflicts', 'obsoletes']
|
||||
|
||||
packages_field_names = 'id, '
|
||||
packages_values_template = '?,'
|
||||
packages_tags = []
|
||||
packages_fields = ''
|
||||
|
||||
rpmtags = [str(t) for t in dir(rpm) if t.startswith('RPMTAG_') ]
|
||||
for tag in rpmtags:
|
||||
if re.match(file_tags_re, tag) or re.match(dir_tags_re, tag) or \
|
||||
re.match(changelog_tags_re, tag) or \
|
||||
re.match(skip_tags_re, tag) or re.match(trigger_tags_re, tag) or \
|
||||
re.match(dep_tags_re, tag): # and tag < 'RPMTAG_DIRINDEXES':
|
||||
continue
|
||||
sqltype = "TIMESTAMP" if tag in datetime_tags else \
|
||||
"BLOB" if tag in db_struct['blob_tags'] else \
|
||||
types[str(type(hdr[tag]))]
|
||||
fieldname = tag.replace('RPMTAG_', '').lower()
|
||||
if fieldname in ['id', 'group']:
|
||||
fieldname = 'rpm_' + fieldname
|
||||
packages_tags.append(tag)
|
||||
packages_field_names += fieldname + ', '
|
||||
packages_values_template += '?, '
|
||||
packages_fields += fieldname + ' ' + sqltype + ', '
|
||||
nef = 0
|
||||
for extra_field in sorted(packages_extra_fields.keys()):
|
||||
packages_field_names += (', ' if nef > 0 else '') + extra_field
|
||||
packages_values_template += (', ' if nef > 0 else '') + '?'
|
||||
packages_fields += (', ' if nef > 0 else '') + extra_field + ' ' + packages_extra_fields[extra_field]
|
||||
nef += 1
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS packages(id INTEGER PRIMARY KEY NOT NULL, %s)
|
||||
""" % (packages_fields))
|
||||
for table in db_struct['dep_tables']:
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS %s (id INTEGER PRIMARY KEY NOT NULL,
|
||||
name TEXT, flags INTEGER, version TEXT, build_arch TEXT,
|
||||
package_id INTEGER NOT NULL, dep_package_id INTEGER)""" % (table))
|
||||
conn.commit()
|
||||
db_struct['packages_tags'] = packages_tags
|
||||
db_struct['packages_field_names'] = packages_field_names
|
||||
db_struct['packages_values_template'] = packages_values_template
|
||||
db_struct['defined'] = True
|
||||
|
||||
|
||||
queue_in = mp.JoinableQueue()
|
||||
for pkg in rpm_list:
|
||||
queue_in.put((pkg, ))
|
||||
|
||||
for i in xrange(NUM_PROCESSES):
|
||||
queue_in.put(None)
|
||||
|
||||
# run workers
|
||||
gc.collect() # Trying to prevent Exception AssertionError: AssertionError() in <Finalize object, dead> ignored
|
||||
time.sleep(1)
|
||||
gc.disable()
|
||||
global generator_value
|
||||
id_generator = mp.Value('i', generator_value)
|
||||
generator_lock = mp.Lock()
|
||||
workers = []
|
||||
for i in xrange(NUM_PROCESSES):
|
||||
worker = mp.Process(target = process_package_worker,
|
||||
args = (i, queue_in, id_generator, generator_lock, db_struct,
|
||||
repodir_id, build_archs, tempdir))
|
||||
workers.append(worker)
|
||||
worker.start()
|
||||
queue_in.join()
|
||||
gc.enable()
|
||||
generator_value = id_generator.value
|
||||
|
||||
|
||||
def main(args):
|
||||
|
||||
if os.path.exists(DB):
|
||||
os.unlink(DB)
|
||||
|
||||
if hasattr(os, "sysconf"):
|
||||
if os.sysconf_names.has_key("SC_NPROCESSORS_ONLN"):
|
||||
n = os.sysconf("SC_NPROCESSORS_ONLN")
|
||||
if isinstance(n, int) and n > 0:
|
||||
NUM_PROCESSES = n
|
||||
|
||||
conn = sqlite3.connect(DB)
|
||||
init_database(conn)
|
||||
conn.commit()
|
||||
c = conn.cursor()
|
||||
|
||||
options = parseargs(args)
|
||||
parser = ET.XMLParser()
|
||||
tree = ET.parse(options.config, parser=parser)
|
||||
config_root = tree.getroot()
|
||||
tempdir = '/dev/shm/rt-tmp/' #tempfile.mkdtemp()
|
||||
shutil.rmtree(tempdir, True)
|
||||
os.mkdir(tempdir)
|
||||
rpm_db_struct = {}
|
||||
for xrepodir in config_root.find('repositories').findall('dir'):
|
||||
repodir_id = add_repodir(xrepodir, conn)
|
||||
build_archs = [None] if xrepodir.get('sources') != '.' else \
|
||||
get_build_archs(xrepodir,
|
||||
config_root.find('repositories'))
|
||||
process_repodir(xrepodir.get('path'), repodir_id, build_archs, conn, rpm_db_struct, tempdir)
|
||||
shutil.rmtree(tempdir, True)
|
||||
index_database(conn)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
870
i586kde.lst
Normal file
870
i586kde.lst
Normal file
|
@ -0,0 +1,870 @@
|
|||
cups-pdf
|
||||
lsb
|
||||
xvfb
|
||||
xlsfonts
|
||||
qt3
|
||||
policycoreutils-sandbox
|
||||
setools-console
|
||||
policycoreutils-gui
|
||||
openscap-extra-probes
|
||||
openscap-content
|
||||
openscap-content-sectool
|
||||
openscap-utils
|
||||
openscap
|
||||
kmail
|
||||
kernel-selinux-desktop-latest
|
||||
mcstrans
|
||||
rosa-test-suite
|
||||
ccid
|
||||
at-spi
|
||||
freerdp
|
||||
opensc
|
||||
pam_pkcs11
|
||||
cgroup
|
||||
gawk
|
||||
policycoreutils-python
|
||||
semanage
|
||||
selinux-policy
|
||||
selinux-policy-mls
|
||||
selinux-policy-targeted
|
||||
audit
|
||||
openldap-servers
|
||||
policycoreutils
|
||||
ipsec-tools
|
||||
netlabel_tools
|
||||
stunnel
|
||||
ebtables
|
||||
#setroubleshoot
|
||||
#setroubleshoot-plugins
|
||||
system-config-services
|
||||
star
|
||||
lm_sensors
|
||||
wine
|
||||
socat
|
||||
amtu
|
||||
mcstrans
|
||||
cups
|
||||
aide
|
||||
imagemagick-desktop
|
||||
policycoreutils-newrole
|
||||
policycoreutils-restorecond
|
||||
vsftpd
|
||||
#minicom
|
||||
rosa-chrome-theme
|
||||
amarok
|
||||
mozilla-thunderbird
|
||||
firefox
|
||||
krfb
|
||||
libreoffice
|
||||
okular
|
||||
gwenview
|
||||
kolourpaint
|
||||
rosa-media-player
|
||||
xsane
|
||||
ark
|
||||
java-1.6.0-openjdk
|
||||
wine
|
||||
kcalc
|
||||
konsole
|
||||
dolphin
|
||||
korganizer
|
||||
kdebase4-workspace
|
||||
stunnel
|
||||
#minicom
|
||||
gkermit
|
||||
pcsc-lite
|
||||
pcsc-tools
|
||||
ntp
|
||||
nfs-utils
|
||||
tftp-server
|
||||
openssh-server
|
||||
vsftpd
|
||||
bind
|
||||
dhcp-server
|
||||
util-linux
|
||||
man
|
||||
net-tools
|
||||
dhcp-client
|
||||
tftp
|
||||
rsync
|
||||
nfs-utils-clients
|
||||
openssh-clients
|
||||
lftp
|
||||
ntp-client
|
||||
systemd
|
||||
dump
|
||||
pam
|
||||
audit
|
||||
policycoreutils-restorecond
|
||||
aide
|
||||
bash
|
||||
mc
|
||||
sharutils
|
||||
xz
|
||||
star
|
||||
findutils
|
||||
sed
|
||||
vim-enhanced
|
||||
coreutils
|
||||
dosfstools
|
||||
e2fsprogs
|
||||
cdrdao
|
||||
cdrkit-genisoimage
|
||||
shadow-utils
|
||||
sudo
|
||||
coreutils
|
||||
policycoreutils-newrole
|
||||
libsemanage
|
||||
procps
|
||||
util-linux
|
||||
sysvinit-tools
|
||||
coreutils
|
||||
drakbackup
|
||||
libreoffice-l10n-ru
|
||||
libreoffice-help-ru
|
||||
libxcb-glx0
|
||||
|
||||
|
||||
make
|
||||
makedev
|
||||
coreutils
|
||||
livecd-tools
|
||||
livecd-iso-to-disk
|
||||
syslinux
|
||||
strace
|
||||
harddrake
|
||||
mc
|
||||
kernel-selinux-desktop-latest
|
||||
kernel-selinux-desktop-devel-latest
|
||||
dracut-017
|
||||
locales
|
||||
libstdc++6
|
||||
|
||||
acl
|
||||
acpi
|
||||
acpid
|
||||
alsa-plugins-doc
|
||||
alsa-plugins-pulse-config
|
||||
alsa-utils
|
||||
aoss
|
||||
apmd
|
||||
aria2
|
||||
ark
|
||||
as10k1
|
||||
at
|
||||
atk1.0-common
|
||||
#aumix-text
|
||||
avahi
|
||||
awesfx
|
||||
b43-fwcutter
|
||||
basesystem
|
||||
basesystem-minimal
|
||||
bash
|
||||
#bluez
|
||||
bootloader-utils
|
||||
bootsplash
|
||||
busybox-static
|
||||
bzip2
|
||||
canberra-common
|
||||
canberra-gtk
|
||||
ccp
|
||||
cdialog
|
||||
cdrkit
|
||||
cdrkit-genisoimage
|
||||
chkconfig
|
||||
comgt
|
||||
common-licenses
|
||||
consolekit
|
||||
consolekit-x11
|
||||
coreutils
|
||||
cpio
|
||||
cracklib-dicts
|
||||
crda
|
||||
cronie
|
||||
crontabs
|
||||
cryptsetup
|
||||
curl
|
||||
dash
|
||||
dash-static
|
||||
davfs2
|
||||
dbus
|
||||
dbus-x11
|
||||
desktop-common-data
|
||||
desktop-file-utils
|
||||
dhcp-client
|
||||
dhcp-common
|
||||
diffutils
|
||||
dirmngr
|
||||
dkms
|
||||
dkms-minimal
|
||||
dmidecode
|
||||
dmraid
|
||||
dmraid-events
|
||||
dmsetup
|
||||
dosfstools
|
||||
drakconf
|
||||
drakconf-icons
|
||||
drakguard
|
||||
draklive-install
|
||||
#draksnapshot
|
||||
drakx-finish-install
|
||||
drakx-installer-binaries-probe
|
||||
drakx-installer-matchbox
|
||||
drakx-kbd-mouse-x11
|
||||
drakx-net
|
||||
drakx-net-text
|
||||
drakxtools
|
||||
drakxtools-backend
|
||||
drakxtools-curses
|
||||
dump
|
||||
dvb-apps
|
||||
dvbsnoop
|
||||
dvbtune
|
||||
dvd+rw-tools
|
||||
e2fsprogs
|
||||
eject
|
||||
enchant
|
||||
etcskel
|
||||
ethtool
|
||||
ffmpeg
|
||||
ffmpegthumbs
|
||||
file
|
||||
filesystem
|
||||
findutils
|
||||
|
||||
firefox
|
||||
firefox-en_GB
|
||||
firefox-ru
|
||||
|
||||
fontconfig
|
||||
fonts-ttf-decoratives
|
||||
fonts-ttf-dejavu
|
||||
fonts-ttf-liberation
|
||||
fonts-ttf-west_european
|
||||
font-tools
|
||||
libfreetype6
|
||||
libfreetype2
|
||||
fuse
|
||||
gamin
|
||||
gawk
|
||||
gcc-cpp
|
||||
GConf2
|
||||
genhdlist2
|
||||
gettext-base
|
||||
ghostscript
|
||||
ghostscript-common
|
||||
ghostscript-fonts
|
||||
glib2.0-common
|
||||
glibc
|
||||
gnupg
|
||||
gnupg2
|
||||
grep
|
||||
groff
|
||||
groff-for-man
|
||||
#grub2
|
||||
gstreamer0.10-cdparanoia
|
||||
gstreamer0.10-ffmpeg
|
||||
gstreamer0.10-plugins-base
|
||||
gstreamer0.10-plugins-good
|
||||
gstreamer0.10-pulse
|
||||
gstreamer0.10-python
|
||||
gstreamer0.10-soup
|
||||
gstreamer0.10-tools
|
||||
gtk+2.0
|
||||
gtksourceview
|
||||
gurpmi
|
||||
gvfs
|
||||
gvfs-archive
|
||||
gvfs-fuse
|
||||
gvfs-gphoto2
|
||||
gvfs-smb
|
||||
#gwenview
|
||||
gzip
|
||||
#hal
|
||||
#hal-info
|
||||
harddrake
|
||||
harddrake-ui
|
||||
hcl
|
||||
hdparm
|
||||
hfsutils
|
||||
hicolor-icon-theme
|
||||
html2text
|
||||
iceauth
|
||||
ifmetric
|
||||
ifplugd
|
||||
indexhtml
|
||||
info
|
||||
info-install
|
||||
initscripts
|
||||
iproute2
|
||||
ipset
|
||||
iptables
|
||||
iputils
|
||||
iso-codes
|
||||
iw
|
||||
jackit
|
||||
jasper
|
||||
jfsutils
|
||||
kbd
|
||||
bluedevil
|
||||
kcalc
|
||||
kcm_touchpad
|
||||
kcron
|
||||
kde4-audiocd
|
||||
kde4-filesharing
|
||||
kde4-nsplugins
|
||||
kdeartwork4-kscreensaver
|
||||
kdebase4-runtime
|
||||
kdebase4-workspace
|
||||
|
||||
kde-l10n-en_GB
|
||||
kde-l10n-pl
|
||||
kde-l10n-pt_BR
|
||||
kde-l10n-ru
|
||||
kde-l10n-uk
|
||||
kde-l10n-es
|
||||
kde-l10n-nn
|
||||
kde-l10n-nl
|
||||
kde-l10n-fr
|
||||
kde-l10n-it
|
||||
kde-l10n-ro
|
||||
kde-l10n-de
|
||||
|
||||
kdnssd
|
||||
keychain
|
||||
kfind
|
||||
kfingermanager
|
||||
kgamma
|
||||
kget
|
||||
kio4-imap
|
||||
kio4-ldap
|
||||
kio4-mbox
|
||||
kio4-nntp
|
||||
kio4-pop3
|
||||
kio4-sieve
|
||||
kio4-smtp
|
||||
kio-sysinfo
|
||||
kipi-common
|
||||
kmix
|
||||
kmozillahelper
|
||||
knotes
|
||||
kolourpaint
|
||||
konqueror
|
||||
konsole
|
||||
kopete
|
||||
kpartx
|
||||
kppp
|
||||
krb5
|
||||
krdc
|
||||
krfb
|
||||
ksendemail
|
||||
ksnapshot
|
||||
#kttsd
|
||||
kwallet
|
||||
kwallet-daemon
|
||||
kwrite
|
||||
ld10k1
|
||||
ldetect
|
||||
ldetect-lst
|
||||
libldetect0.12
|
||||
less
|
||||
lftp
|
||||
lm_sensors
|
||||
locales
|
||||
|
||||
locales-en
|
||||
locales-no
|
||||
locales-pl
|
||||
locales-pt
|
||||
locales-ru
|
||||
locales-uk
|
||||
locales-es
|
||||
locales-fr
|
||||
locales-it
|
||||
locales-nl
|
||||
locales-de
|
||||
locales-ro
|
||||
|
||||
logrotate
|
||||
lsb-release
|
||||
lshw
|
||||
lvm2
|
||||
mailcap
|
||||
makedev
|
||||
man
|
||||
mandi
|
||||
mandi-ifw
|
||||
mandriva-doc-common
|
||||
rosa-gfxboot-theme
|
||||
mandriva-kde-icons
|
||||
mandriva-kde4-config-common
|
||||
mandriva-kde-translation
|
||||
#rosa-release-common
|
||||
#rosa-release-EE
|
||||
mandriva-theme-common
|
||||
mandriva-theme-Rosa
|
||||
mandriva-theme-Rosa-screensaver
|
||||
man-pages
|
||||
mdadm
|
||||
#mdkonline
|
||||
mdv-rpm-summary
|
||||
menu-messages
|
||||
meta-task
|
||||
migration-assistant
|
||||
mingetty
|
||||
mkfontdir
|
||||
mkfontscale
|
||||
mkxauth
|
||||
mlocate
|
||||
#module-init-tools
|
||||
monitor-edid
|
||||
mtools
|
||||
|
||||
aspell
|
||||
aspell-ru
|
||||
|
||||
mozilla-thunderbird-ru
|
||||
|
||||
myspell-ru_RU
|
||||
|
||||
mysql-client
|
||||
#mysql-common
|
||||
#mysql-common-core
|
||||
#mysql-core
|
||||
nail
|
||||
ncurses
|
||||
ndiswrapper
|
||||
net_monitor
|
||||
netprofile
|
||||
net-tools
|
||||
nfs-utils-clients
|
||||
notification-daemon
|
||||
nss
|
||||
nss_mdns
|
||||
nss_tcb
|
||||
ntfs-3g
|
||||
#ntfsprogs
|
||||
ntp
|
||||
ntp-client
|
||||
obex-data-server
|
||||
okular
|
||||
#free-kde4-config
|
||||
one-kde4-config
|
||||
open
|
||||
openldap
|
||||
|
||||
openssh
|
||||
openssh-clients
|
||||
openssh-server
|
||||
openssl
|
||||
ORBit2
|
||||
oxygen-icon-theme
|
||||
pam
|
||||
pam_tcb
|
||||
pango
|
||||
paprefs
|
||||
passwd
|
||||
pavucontrol
|
||||
pciutils
|
||||
pcmciautils
|
||||
phonon-gstreamer
|
||||
|
||||
pkgconfig
|
||||
|
||||
plasma-dataengine-microblog
|
||||
plasma-dataengine-ocs
|
||||
plasma-dataengine-rtm
|
||||
plasma-desktoptheme-aya
|
||||
plasma-desktoptheme-default
|
||||
plasma-krunner-powerdevil
|
||||
plasma-runner-audioplayercontrol
|
||||
plasma-runner-browserhistory
|
||||
plasma-runner-contacts
|
||||
plasma-runner-converter
|
||||
plasma-runner-katesessions
|
||||
plasma-runner-konquerorsessions
|
||||
plasma-runner-konsolesessions
|
||||
plasma-runner-kopete
|
||||
plasma-runner-mediawiki
|
||||
plasma-runner-spellchecker
|
||||
plasma-wallpaper-mandelbrot
|
||||
plasma-wallpaper-pattern
|
||||
plasma-wallpaper-timeoftheday
|
||||
plasma-wallpaper-virus
|
||||
plasma-wallpaper-weather
|
||||
plymouth
|
||||
plymouth-plugin-label
|
||||
plymouth-plugin-script
|
||||
plymouth-scripts
|
||||
plymouth-system-theme
|
||||
pm-fallback-policy
|
||||
pm-utils
|
||||
policykit
|
||||
polkit
|
||||
polkit-kde-agent-1
|
||||
popt-data
|
||||
ppp
|
||||
ppp-pppoatm
|
||||
pptp-linux
|
||||
#prcsys
|
||||
preload
|
||||
prism2-utils
|
||||
procps
|
||||
psmisc
|
||||
pulseaudio
|
||||
pulseaudio-client-config
|
||||
pulseaudio-esound-compat
|
||||
pulseaudio-module-gconf
|
||||
pulseaudio-module-x11
|
||||
pulseaudio-module-zeroconf
|
||||
pulseaudio-utils
|
||||
python
|
||||
python-cairo
|
||||
python-gobject
|
||||
python-kde4
|
||||
python-ldap
|
||||
python-notify
|
||||
python-numpy
|
||||
python-OpenSSL
|
||||
python-pycrypto
|
||||
python-qt4
|
||||
python-qt4-assistant
|
||||
python-qt4-core
|
||||
python-qt4-designer
|
||||
python-qt4-gui
|
||||
python-qt4-multimedia
|
||||
python-qt4-network
|
||||
python-qt4-opengl
|
||||
python-qt4-script
|
||||
python-qt4-sql
|
||||
python-qt4-svg
|
||||
python-qt4-test
|
||||
python-qt4-webkit
|
||||
python-qt4-xml
|
||||
python-qt4-xmlpatterns
|
||||
python-sip
|
||||
python-twisted-core
|
||||
python-twisted-web
|
||||
python-zope-interface
|
||||
pyxdg
|
||||
qca2-plugin-openssl
|
||||
qt4-common
|
||||
qt4-database-plugin-mysql
|
||||
qt4-qtdbus
|
||||
qt4-style-iaora
|
||||
qt4-xmlpatterns
|
||||
qtscriptbindings
|
||||
quota
|
||||
radeontool
|
||||
reiserfsprogs
|
||||
resolvconf
|
||||
rgb
|
||||
rmt
|
||||
rng-utils
|
||||
rootcerts
|
||||
rootfiles
|
||||
rpcbind
|
||||
rpm
|
||||
rpmdrake
|
||||
rpm-helper
|
||||
rpmstats
|
||||
rp-pppoe
|
||||
rsnapshot
|
||||
rsync
|
||||
rsyslog
|
||||
rtkit
|
||||
run-parts
|
||||
s2u
|
||||
sane-backends
|
||||
sane-backends-iscan
|
||||
sash
|
||||
sb16_csp
|
||||
sdparm
|
||||
sed
|
||||
sessreg
|
||||
setup
|
||||
setxkbmap
|
||||
shadow-utils
|
||||
shared-desktop-ontologies
|
||||
shared-mime-info
|
||||
sharutils
|
||||
shorewall
|
||||
soprano
|
||||
soprano-plugin-common
|
||||
soprano-plugin-redland
|
||||
soprano-plugin-virtuoso
|
||||
sound-scripts
|
||||
sound-theme-freedesktop
|
||||
soundwrapper
|
||||
sscape_ctl
|
||||
strigi
|
||||
sudo
|
||||
suspend
|
||||
sysfsutils
|
||||
sysvinit-tools
|
||||
t1utils
|
||||
taglib-extras
|
||||
tar
|
||||
tcb
|
||||
tcl
|
||||
tcp_wrappers
|
||||
termcap
|
||||
time
|
||||
timezone
|
||||
tmpwatch
|
||||
transfugdrake
|
||||
uClibc
|
||||
udev
|
||||
udisks
|
||||
unionfs-utils
|
||||
unzip
|
||||
update-alternatives
|
||||
upower
|
||||
urpmi
|
||||
urw-fonts
|
||||
us428control
|
||||
usb_modeswitch
|
||||
usbmuxd
|
||||
usbutils
|
||||
userdrake
|
||||
usermode
|
||||
usermode-consoleonly
|
||||
utempter
|
||||
util-linux
|
||||
v4l-utils
|
||||
vbetool
|
||||
vim-minimal
|
||||
vnstat
|
||||
vte
|
||||
webkit1.0
|
||||
webkit1.0-webinspector
|
||||
wget
|
||||
which
|
||||
wireless-regdb
|
||||
wireless-tools
|
||||
wpa_supplicant
|
||||
x11-data-cursor-themes
|
||||
x11-data-xkbdata
|
||||
#x11-driver-input
|
||||
x11-driver-input-acecad
|
||||
x11-driver-input-aiptek
|
||||
x11-driver-input-evdev
|
||||
x11-driver-input-fpit
|
||||
x11-driver-input-hyperpen
|
||||
x11-driver-input-joystick
|
||||
x11-driver-input-keyboard
|
||||
x11-driver-input-mouse
|
||||
x11-driver-input-mutouch
|
||||
x11-driver-input-penmount
|
||||
x11-driver-input-synaptics
|
||||
x11-driver-input-void
|
||||
x11-driver-input-wacom
|
||||
x11-driver-video
|
||||
x11-driver-video-ati
|
||||
x11-driver-video-cirrus
|
||||
x11-driver-video-fbdev
|
||||
x11-driver-video-glint
|
||||
x11-driver-video-intel
|
||||
x11-driver-video-mach64
|
||||
x11-driver-video-mga
|
||||
x11-driver-video-neomagic
|
||||
x11-driver-video-nouveau
|
||||
x11-driver-video-nv
|
||||
x11-driver-video-openchrome
|
||||
x11-driver-video-r128
|
||||
x11-driver-video-radeonhd
|
||||
x11-driver-video-s3
|
||||
x11-driver-video-s3virge
|
||||
x11-driver-video-savage
|
||||
x11-driver-video-sis
|
||||
x11-driver-video-sisusb
|
||||
x11-driver-video-tdfx
|
||||
x11-driver-video-trident
|
||||
x11-driver-video-v4l
|
||||
x11-driver-video-vboxvideo
|
||||
x11-driver-video-vesa
|
||||
x11-driver-video-vmware
|
||||
x11-driver-video-qxl
|
||||
x11-font-adobe-75dpi
|
||||
x11-font-alias
|
||||
x11-font-bh-75dpi
|
||||
x11-font-bh-lucidatypewriter-75dpi
|
||||
x11-font-bitstream-75dpi
|
||||
x11-font-cronyx-cyrillic
|
||||
x11-font-cursor-misc
|
||||
x11-font-cyrillic
|
||||
x11-font-encodings
|
||||
x11-font-misc-cyrillic
|
||||
x11-font-misc-misc
|
||||
x11-font-screen-cyrillic
|
||||
x11-font-winitzki-cyrillic
|
||||
x11-server-common
|
||||
x11-server-xorg
|
||||
xauth
|
||||
xdg-user-dirs
|
||||
xdg-user-dirs-gtk
|
||||
xdg-utils
|
||||
xdm
|
||||
xdpyinfo
|
||||
xev
|
||||
xfsprogs
|
||||
xhost
|
||||
xinit
|
||||
xinitrc
|
||||
xkbcomp
|
||||
xmessage
|
||||
xmodmap
|
||||
xorg-x11
|
||||
xprop
|
||||
xrandr
|
||||
xrdb
|
||||
xset
|
||||
xsetroot
|
||||
xsettings-kde
|
||||
xulrunner
|
||||
xz
|
||||
zcip
|
||||
zip
|
||||
|
||||
systemd-sysvinit
|
||||
systemd
|
||||
knetworkmanager
|
||||
networkmanager-openvpn
|
||||
networkmanager-vpnc
|
||||
networkmanager-pptp
|
||||
modemmanager
|
||||
mobile-broadband-provider-info
|
||||
plasma-applet-networkmanagement
|
||||
|
||||
task-kde4
|
||||
task-x11
|
||||
x11-driver-input
|
||||
x11-driver-video
|
||||
task-pulseaudio
|
||||
|
||||
kde4-style-qtcurve
|
||||
qtcurve-gtk2
|
||||
|
||||
livestart-rosa
|
||||
rosa-launcher
|
||||
|
||||
#ktorrent
|
||||
kde4-windeco-dekorator
|
||||
rosa-elementary-theme
|
||||
rosa-icons
|
||||
kamera
|
||||
aica-firmware
|
||||
asihpi-firmware
|
||||
emagic-firmware
|
||||
emu1010-firmware
|
||||
kernel-firmware
|
||||
pcmcia-cis-firmware
|
||||
turtlebeach-firmware
|
||||
zd1211-firmware
|
||||
|
||||
#x11-driver-video-fglrx
|
||||
#x11-driver-video-nvidia-current
|
||||
#x11-driver-video-nvidia173
|
||||
#x11-driver-video-nvidia96xx
|
||||
|
||||
glxinfo
|
||||
alsa-utils
|
||||
libalsa-plugins-pulseaudio
|
||||
mesa-demos
|
||||
|
||||
#mandriva-control-center
|
||||
qgtkstylealt
|
||||
plasma-desktoptheme-rosa
|
||||
kdepasswd
|
||||
|
||||
sphere-client-rosa
|
||||
fonts-ttf-droid
|
||||
#psyncclient
|
||||
|
||||
nut-server
|
||||
samba-client
|
||||
samba-server
|
||||
nfs-utils
|
||||
btrfs-progs
|
||||
knetworkmanager-pptp
|
||||
samba-client
|
||||
cifs-utils
|
||||
nss_wins
|
||||
samba-common
|
||||
comgt
|
||||
madwimax
|
||||
rp-pppoe
|
||||
btrfs-progs
|
||||
x11-driver-video-vboxvideo
|
||||
x11-driver-input-vmmouse
|
||||
whois
|
||||
cups
|
||||
task-printing
|
||||
task-printing-hp
|
||||
task-printing-server
|
||||
system-config-printer
|
||||
nfs-utils
|
||||
#vpnpptp-allde
|
||||
xl2tpd
|
||||
wvdial
|
||||
gksu
|
||||
ozerocdoff
|
||||
usb_modeswitch-data
|
||||
cpufrequtils
|
||||
libstdc++6
|
||||
bind-utils
|
||||
#aumix
|
||||
#kamera
|
||||
|
||||
zenity
|
||||
rosa-media-player
|
||||
rosa-media-player-plugin
|
||||
ffmpeg
|
||||
gstreamer0.10-mpeg
|
||||
rdesktop
|
||||
amarok
|
||||
|
||||
autofs
|
||||
|
||||
ccid
|
||||
krb5-workstation
|
||||
libsasl2-plug-gssapi
|
||||
nscd
|
||||
nss_ldap
|
||||
openldap-clients
|
||||
opensc
|
||||
pam_krb5
|
||||
pam_ldap
|
||||
pcsc-lite
|
||||
pcsc-tools
|
||||
perl-Digest-SHA
|
||||
perl-Net-DNS
|
||||
samba-winbind
|
||||
tigervnc-server
|
||||
xl2tpd
|
||||
lsof
|
||||
vpnpptp-allde
|
||||
kcm_license
|
||||
lsb-release
|
||||
libglibc_lsb
|
||||
perl-CGI
|
||||
perl-Pod-Perldoc
|
||||
perl-Safe
|
||||
perl-Class-ISA
|
||||
perl-Pod-Plainer
|
||||
glibc-i18ndata
|
||||
|
||||
gstreamer0.10-plugins-ugly
|
||||
htop
|
||||
traceroute
|
||||
pulseaudio-module-bluetooth
|
||||
bluez-alsa
|
||||
elementary-theme
|
||||
plasma-applet-battery
|
||||
plasma-applet-folderview
|
||||
ktorrent
|
||||
libalsa-plugins
|
||||
autologin
|
||||
bash-completion
|
||||
k3b
|
||||
akonadi-mailfilter-agent
|
380
prepare-repodb.py
Executable file
380
prepare-repodb.py
Executable file
|
@ -0,0 +1,380 @@
|
|||
import os
|
||||
import sys
|
||||
import gettext
|
||||
import argparse
|
||||
import sqlite3
|
||||
import string
|
||||
import re
|
||||
from versutils import *
|
||||
|
||||
DB = 'repo.db'
|
||||
|
||||
def process_repodir_requires(dbc, repodir_id, repodir_name, repodir_depends, requires_build_arch):
|
||||
global n
|
||||
|
||||
print 'Processing repo %d: %s (with depends: %s)' % (repodir_id, repodir_name, str(repodir_depends))
|
||||
package_requires = dbc.execute("""
|
||||
SELECT packages.id AS package_id, packages.name AS package_name, packages.nvra,
|
||||
requires.id, requires.name, flags, requires.version
|
||||
FROM packages, requires
|
||||
WHERE repodir_id = ? AND requires.package_id = packages.id %s
|
||||
ORDER BY packages.name, requires.name
|
||||
""" % ((" AND build_arch = '%s'" % requires_build_arch)
|
||||
if requires_build_arch is not None else ""),
|
||||
[repodir_id]).fetchall()
|
||||
|
||||
search_repodirs = [repodir_id]
|
||||
search_repodirs.extend(repodir_depends)
|
||||
in_repodirs = ','.join(str(id) for id in search_repodirs)
|
||||
# print 'package requires count: ', len(package_requires)
|
||||
broken_dep = 0
|
||||
requires_cache = {}
|
||||
# TODO: Reuse the cache for dependent repositories???
|
||||
|
||||
for packreq in package_requires:
|
||||
(cpackage_id, package_nvra, requires_id, requires_name, requires_flags, requires_version) = \
|
||||
(packreq[0], packreq[2], packreq[3], packreq[4], packreq[5], packreq[6])
|
||||
# if requires_name != '/usr/sbin/glibc-post-wrapper':
|
||||
# continue
|
||||
# print packreq
|
||||
requirement_uid = requires_name + '\0' + str(requires_flags) + '\0' + requires_version
|
||||
pkg_id = requires_cache.get(requirement_uid)
|
||||
if pkg_id is None:
|
||||
if (re.match(r'\A(rpmlib|executable)\(.+\)\Z', requires_name)):
|
||||
# see if($N=~/\A(rpmlib|executable)\(.+\)\Z/) in urpm_repoclosure.pl
|
||||
pkg_id = -1
|
||||
if pkg_id is None:
|
||||
depend_candidates = dbc.execute("""
|
||||
SELECT packages.id AS package_id, packages.name AS package_name,
|
||||
provides.id, provides.name, flags, provides.version
|
||||
FROM packages, provides
|
||||
WHERE provides.package_id = packages.id AND repodir_id IN (%s) AND provides.name = ?
|
||||
""" % in_repodirs, [requires_name]).fetchall()
|
||||
provides_found_pkg_id = None
|
||||
provides_found_id = None
|
||||
provides_found_version = None
|
||||
for dep_cand in depend_candidates:
|
||||
(provides_pkg_id, provides_id, provides_flags, provides_version) = \
|
||||
(dep_cand[0], dep_cand[2], dep_cand[4], dep_cand[5])
|
||||
#print 'provides_version: ', provides_flags, ' ', provides_version
|
||||
if provides_flags & RPMSENSE_SENSEMASK == 0:
|
||||
if not provides_version:
|
||||
provides_version = '*'
|
||||
else:
|
||||
raise Exception('Invalid provides version (flags = %d, version = %s)!' %
|
||||
(provides_flags, provides_version))
|
||||
if version_ok(requires_version,
|
||||
requires_flags & RPMSENSE_SENSEMASK,
|
||||
provides_version):
|
||||
better_version = provides_found_version is None or \
|
||||
provides_version == '*'
|
||||
if not better_version:
|
||||
better_version = version_ok(provides_version,
|
||||
RPMSENSE_GREATER,
|
||||
provides_found_version)
|
||||
if better_version:
|
||||
(provides_found_pkg_id,
|
||||
provides_found_id,
|
||||
provides_found_version) = \
|
||||
(provides_pkg_id,
|
||||
provides_id,
|
||||
provides_version)
|
||||
pkg_id = provides_found_pkg_id
|
||||
#print "->", provides_found_version, ' ->', provides_found_pkg_id
|
||||
if pkg_id is None and (requires_flags & RPMSENSE_MISSINGOK) != 0:
|
||||
pkg_id = -1 # TODO: Fix for valid foreign key
|
||||
if pkg_id is None and requires_name.startswith('/'): # file dependency
|
||||
if (requires_flags & (RPMSENSE_SCRIPT_POST |
|
||||
RPMSENSE_SCRIPT_PREUN |
|
||||
RPMSENSE_SCRIPT_POSTUN)) != 0:
|
||||
internal_files = dbc.execute("""
|
||||
SELECT 1 FROM package_files WHERE package_id = ? AND path = ?
|
||||
""", [cpackage_id, requires_name]).fetchall()
|
||||
if len(internal_files) > 0:
|
||||
pkg_id = cpackage_id
|
||||
else:
|
||||
#TODO: Check file dependencies (/usr/bin/python (required by ant-scripts-1.7.1-7.0.6.noarch), /usr/sbin/useradd (required by tomcat5-5.5.28-0.5.2.noarch))?
|
||||
files_dependency = dbc.execute("""
|
||||
SELECT package_id FROM package_files
|
||||
WHERE path = ? AND
|
||||
package_id in (SELECT id FROM packages WHERE repodir_id IN (%s))
|
||||
""" % in_repodirs, [requires_name]).fetchall()
|
||||
if len(files_dependency) > 0:
|
||||
if len(files_dependency) == 1:
|
||||
pkg_id = files_dependency[0][0]
|
||||
else:
|
||||
print "File dependency (%s) has multiple resolutions (%d)." % len(files_dependency)
|
||||
if pkg_id is not None:
|
||||
dbc.execute("""
|
||||
UPDATE requires SET dep_package_id = ? WHERE id = ?
|
||||
""", [pkg_id, requires_id])
|
||||
requires_cache[requirement_uid] = pkg_id
|
||||
else:
|
||||
print requires_name, ' ', requires_version, ' (required by %s)' % package_nvra, ' not found!!!'
|
||||
broken_dep += 1
|
||||
n = n + 1
|
||||
#print "n = ", n
|
||||
# if n == 60000:
|
||||
# break
|
||||
print 'broken_deps: ', broken_dep
|
||||
print ''
|
||||
|
||||
def extract_arch(arch_template, repo_name):
|
||||
arch_sign = '$arch'
|
||||
spos = arch_template.find(arch_sign)
|
||||
if spos >= 0:
|
||||
repo_prefix= arch_template[:spos]
|
||||
repo_postfix = arch_template[spos + len(arch_sign):]
|
||||
if repo_name.startswith(repo_prefix) and \
|
||||
repo_name.endswith(repo_postfix):
|
||||
return repo_name[len(repo_prefix) :
|
||||
len(repo_name) - len(repo_postfix)]
|
||||
return None
|
||||
|
||||
def process_repodir_file_links(dbc, repodir_id, repodir_name, repodir_depends):
|
||||
package_files_links = dbc.execute("""
|
||||
SELECT packages.id AS package_id, packages.name AS package_name, packages.nvra,
|
||||
package_files.id AS object_id, package_files.path, package_files.link_to_path
|
||||
FROM packages, package_files
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
link_to_path IS NOT NULL
|
||||
ORDER BY packages.name, link_to_path
|
||||
""", [repodir_id]).fetchall()
|
||||
for file_link in package_files_links:
|
||||
pkg_id = file_link[0]
|
||||
pkg_name = file_link[1]
|
||||
object_id = file_link[3]
|
||||
target_path = os.path.normpath(file_link[5])
|
||||
target_obj_id = None
|
||||
tofile = dbc.execute("""
|
||||
SELECT id FROM package_files WHERE path = ? AND package_id = ?
|
||||
""", [target_path, pkg_id]).fetchone()
|
||||
if tofile:
|
||||
target_obj_id = tofile[0]
|
||||
if not target_obj_id:
|
||||
tofile = dbc.execute("""
|
||||
SELECT id FROM package_files WHERE path = ? AND package_id IN (SELECT dep_package_id FROM requires WHERE package_id = ?)
|
||||
""", [target_path, pkg_id]).fetchone()
|
||||
if tofile:
|
||||
target_obj_id = tofile[0]
|
||||
|
||||
if target_obj_id:
|
||||
dbc.execute("""
|
||||
UPDATE package_files SET link_to_file_id = ? WHERE id = ?
|
||||
""", [target_obj_id, object_id])
|
||||
else:
|
||||
# print 'target %s not found (%d: %s)' % (target_path, pkg_id, pkg_name)
|
||||
pass
|
||||
|
||||
def process_repodir_so_needed(dbc, repodir_id, repodir_name, repodir_depends):
|
||||
print 'Searching object files resolutions (1)...'
|
||||
dbc.execute("""
|
||||
INSERT INTO so_needed_res(so_needed_id, dep_obj_file_id, res_type)
|
||||
SELECT so_needed.id, tpf.id, 1 FROM packages
|
||||
CROSS JOIN package_files spf CROSS JOIN so_needed CROSS JOIN requires CROSS JOIN package_files tpf
|
||||
WHERE so_needed.obj_file_id = spf.id AND spf.package_id = packages.id AND packages.repodir_id = ? AND
|
||||
spf.package_id = requires.package_id AND so_needed.name = requires.name AND
|
||||
requires.dep_package_id = tpf.package_id AND so_needed.name = tpf.basename
|
||||
""", [repodir_id])
|
||||
|
||||
search_repodirs = [repodir_id]
|
||||
search_repodirs.extend(repodir_depends)
|
||||
in_repodirs = ','.join(str(id) for id in search_repodirs)
|
||||
|
||||
objects_not_resolved1 = dbc.execute("""
|
||||
SELECT packages.id AS package_id, packages.nvra,
|
||||
package_files.id AS object_id, package_files.basename AS object_name,
|
||||
so_needed.id AS so_needed_id, so_needed.name AS so_needed_name
|
||||
FROM packages CROSS JOIN package_files CROSS JOIN so_needed
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
so_needed.obj_file_id = package_files.id AND
|
||||
NOT EXISTS (SELECT 1 FROM so_needed_res WHERE so_needed_res.so_needed_id = so_needed.id)
|
||||
ORDER BY packages.nvra, package_files.basename, so_needed.name
|
||||
""", [repodir_id]).fetchall()
|
||||
print 'object files not resolved by rpm requires-provides: ', len(objects_not_resolved1)
|
||||
if objects_not_resolved1:
|
||||
print 'Searching object files resolutions (2)...'
|
||||
in_so_needed = ','.join(str(obj_rec[4]) for obj_rec in objects_not_resolved1)
|
||||
dbc.execute("""
|
||||
INSERT INTO so_needed_res(so_needed_id, dep_obj_file_id, res_type)
|
||||
SELECT so_needed.id, tpf.id, 2 FROM packages, package_files tpf, so_needed
|
||||
WHERE packages.repodir_id IN (%s) AND packages.id = tpf.package_id AND
|
||||
so_needed.id IN (%s) AND tpf.basename = so_needed.name
|
||||
""" % (in_repodirs, in_so_needed))
|
||||
|
||||
objects_not_resolved2 = dbc.execute("""
|
||||
SELECT packages.id AS package_id, packages.nvra,
|
||||
package_files.id AS object_id, package_files.basename AS object_name,
|
||||
so_needed.id AS so_needed_id, so_needed.name AS so_needed_name
|
||||
FROM packages, package_files, so_needed
|
||||
WHERE repodir_id = ? AND package_files.package_id = packages.id AND
|
||||
so_needed.obj_file_id = package_files.id AND
|
||||
NOT EXISTS (SELECT 1 FROM so_needed_res WHERE so_needed_res.so_needed_id = so_needed.id)
|
||||
ORDER BY packages.nvra, package_files.basename, so_needed.name
|
||||
""", [repodir_id]).fetchall()
|
||||
print 'Object files not resolved: ', len(objects_not_resolved2)
|
||||
|
||||
|
||||
def process_repodir_obj_symbols(dbc, repodir_id, repodir_name, repodir_depends):
|
||||
print 'Searching symbols resolutions (1)...'
|
||||
# EXPLAIN QUERY PLAN
|
||||
dbc.execute("""
|
||||
INSERT INTO obj_symbols_res(obj_sym_id, dep_obj_sym_id, res_type)
|
||||
SELECT sos.id, tos.id, 1 FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols sos CROSS JOIN
|
||||
so_needed CROSS JOIN so_needed_res CROSS JOIN obj_symbols tos
|
||||
WHERE packages.repodir_id = ? AND packages.id = package_files.package_id AND package_files.id = sos.obj_file_id AND
|
||||
sos.sym_type = 0 AND sos.obj_file_id = so_needed.obj_file_id AND so_needed.id = so_needed_res.so_needed_id AND
|
||||
so_needed_res.res_type = 1 AND so_needed_res.dep_obj_file_id = tos.obj_file_id AND
|
||||
tos.sym_type = 1 AND tos.name = sos.name
|
||||
""", [repodir_id])
|
||||
print 'Searching symbols resolutions (2)...'
|
||||
dbc.execute("""
|
||||
INSERT INTO obj_symbols_res(obj_sym_id, dep_obj_sym_id, res_type)
|
||||
SELECT sos.id, tos.id, 2 FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols sos CROSS JOIN
|
||||
so_needed CROSS JOIN so_needed_res CROSS JOIN obj_symbols tos
|
||||
WHERE packages.repodir_id = ? AND packages.id = package_files.package_id AND package_files.id = sos.obj_file_id AND
|
||||
sos.sym_type = 0 AND sos.obj_file_id = so_needed.obj_file_id AND so_needed.id = so_needed_res.so_needed_id AND
|
||||
so_needed_res.res_type = 2 AND so_needed_res.dep_obj_file_id = tos.obj_file_id AND
|
||||
tos.sym_type = 1 AND tos.name = sos.name
|
||||
""", [repodir_id])
|
||||
print 'Searching symbols resolutions (3)...'
|
||||
search_repodirs = [repodir_id]
|
||||
search_repodirs.extend(repodir_depends)
|
||||
in_repodirs = ','.join(str(id) for id in search_repodirs)
|
||||
dbc.execute("""
|
||||
INSERT INTO obj_symbols_res(obj_sym_id, dep_obj_sym_id, res_type)
|
||||
SELECT sos.id, tos.id, 3 FROM packages CROSS JOIN package_files CROSS JOIN obj_symbols sos CROSS JOIN
|
||||
obj_symbols tos CROSS JOIN package_files tpf
|
||||
WHERE repodir_id = ? AND packages.id = package_files.package_id AND package_files.id = sos.obj_file_id AND
|
||||
sos.sym_type = 0 AND NOT EXISTS (SELECT 1 FROM obj_symbols_res WHERE obj_sym_id = sos.id) AND
|
||||
sos.name = tos.name AND tos.sym_type = 1 AND tos.obj_file_id = tpf.id AND
|
||||
tpf.package_id IN (SELECT id FROM packages WHERE repodir_id IN (%s))
|
||||
""" % in_repodirs, [repodir_id])
|
||||
|
||||
|
||||
def process_repodir(dbc, repo_id, repo_name, repo_sources, depend_repodir_list, repodirs_processed, dep_arch):
|
||||
all_depends_ready = True
|
||||
repodir_depends = []
|
||||
|
||||
in_repodirs = ','.join(str(id) for id in repodirs_processed)
|
||||
for dr_name in depend_repodir_list:
|
||||
repodir_depend_found = dbc.execute("""
|
||||
SELECT id, name FROM repodirs WHERE id IN (%s) AND name = ?
|
||||
""" % in_repodirs, [dr_name]).fetchall()
|
||||
if len(repodir_depend_found) == 0:
|
||||
all_depends_ready = False
|
||||
break
|
||||
else:
|
||||
for rdf in repodir_depend_found:
|
||||
repodir_depends.append(rdf[0])
|
||||
if not all_depends_ready:
|
||||
return False
|
||||
print repo_name, ' ', depend_repodir_list, ' ', dep_arch
|
||||
process_repodir_requires(dbc, repo_id, repo_name, repodir_depends, dep_arch)
|
||||
process_repodir_file_links(dbc, repo_id, repo_name, repodir_depends)
|
||||
process_repodir_so_needed(dbc, repo_id, repo_name, repodir_depends)
|
||||
process_repodir_obj_symbols(dbc, repo_id, repo_name, repodir_depends)
|
||||
|
||||
if repo_sources:
|
||||
print 'Searching source rpms...'
|
||||
dbc.execute("""
|
||||
UPDATE packages SET sourcerpm_package = NULL
|
||||
WHERE repodir_id = ?""", [repo_id])
|
||||
dbc.execute("""
|
||||
UPDATE packages SET sourcerpm_package =
|
||||
(SELECT id FROM packages ps
|
||||
WHERE repodir_id IN (SELECT id FROM repodirs WHERE name = ?) AND
|
||||
ps.nvra = substr(packages.sourcerpm, 1, length(packages.sourcerpm)-4)
|
||||
)
|
||||
WHERE repodir_id = ? AND sourcerpm LIKE '%.rpm'
|
||||
""", [repo_sources, repo_id])
|
||||
return True
|
||||
|
||||
def main(args):
|
||||
|
||||
conn = sqlite3.connect(DB)
|
||||
dbc = conn.cursor()
|
||||
|
||||
global n
|
||||
n = 0
|
||||
dbc.execute("""
|
||||
PRAGMA cache_size = -1048576
|
||||
""")
|
||||
dbc.execute("""
|
||||
DELETE FROM so_needed_res""")
|
||||
dbc.execute("""
|
||||
DELETE FROM obj_symbols_res""")
|
||||
dbc.execute("""
|
||||
ANALYZE""")
|
||||
repodirs_processed = []
|
||||
#Process binary rpms
|
||||
repodirs_processed_cnt = -1
|
||||
while repodirs_processed_cnt < len(repodirs_processed):
|
||||
in_repodirs = ','.join(str(id) for id in repodirs_processed)
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs WHERE sources <> '.' AND id NOT IN (%s)
|
||||
""" % in_repodirs).fetchall()
|
||||
for repodir in repodirs:
|
||||
(repo_id, repo_name, repo_sources) = (repodir[0], repodir[1], repodir[2])
|
||||
depend_repodir_names = dbc.execute(
|
||||
"""
|
||||
SELECT depend_repodir_name FROM repodir_depends WHERE repodir_id = ?
|
||||
""", [repo_id]).fetchall()
|
||||
depend_repodir_list = [drn[0] for drn in depend_repodir_names]
|
||||
if process_repodir(dbc, repo_id, repo_name, repo_sources, depend_repodir_list, repodirs_processed, None):
|
||||
repodirs_processed.append(repo_id)
|
||||
repodirs_processed_cnt = len(repodirs_processed)
|
||||
|
||||
#Process SRPMS
|
||||
repodirs_processed_cnt = -1
|
||||
while repodirs_processed_cnt < len(repodirs_processed):
|
||||
repodirs = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs WHERE sources = '.'
|
||||
""").fetchall()
|
||||
for repodir in repodirs:
|
||||
(repo_id, repo_name, repo_sources) = (repodir[0], repodir[1], repodir[2])
|
||||
src_build_archs = []
|
||||
depend_repodir_names = dbc.execute(
|
||||
"""
|
||||
SELECT depend_repodir_name FROM repodir_depends WHERE repodir_id = ?
|
||||
""", [repo_id]).fetchall()
|
||||
for drn in depend_repodir_names:
|
||||
dr_name = drn[0]
|
||||
if '$arch' in dr_name:
|
||||
depend_repodir_found = dbc.execute(
|
||||
"""
|
||||
SELECT id, name FROM repodirs WHERE name LIKE ?
|
||||
""", [dr_name.replace('$arch', '%')]).fetchall()
|
||||
if len(depend_repodir_found) == 0:
|
||||
raise Exception('Dependancy repositories not found!')
|
||||
for drf in depend_repodir_found:
|
||||
arch = extract_arch(dr_name, drf[1])
|
||||
if arch:
|
||||
if arch == 'SRPMS':
|
||||
continue
|
||||
src_build_archs.append(arch)
|
||||
else:
|
||||
raise Exception('Source repository should depend on */$arch/* repo.')
|
||||
for arch in src_build_archs:
|
||||
depend_repodir_list = [drn[0].replace('$arch', arch)
|
||||
for drn in depend_repodir_names]
|
||||
if not process_repodir(dbc, repo_id, repo_name, None, depend_repodir_list, repodirs_processed, arch):
|
||||
raise Exception('Couldn\'t process SRPMS repository!')
|
||||
repodirs_processed.append(repo_id)
|
||||
|
||||
repodirs_processed_cnt = len(repodirs_processed)
|
||||
|
||||
in_repodirs = ','.join(str(id) for id in repodirs_processed)
|
||||
repodirs_not_processed = dbc.execute("""
|
||||
SELECT id, name, sources, path FROM repodirs rd WHERE id NOT IN (%s)
|
||||
""" % in_repodirs).fetchall()
|
||||
if len(repodirs_not_processed) > 0:
|
||||
print 'Repodirs not processed due to dependencies:'
|
||||
for rdna in repodirs_not_processed:
|
||||
print rdna[1]
|
||||
dbc.execute("""
|
||||
ANALYZE""")
|
||||
conn.commit()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
83
repo-analyze-config.xml
Normal file
83
repo-analyze-config.xml
Normal file
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config>
|
||||
<repositories>
|
||||
<!-- <dir name="rosa-dx-chrome-1.0/armv7hl/debug_main/release"
|
||||
arch="armv7hl"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/armv7hl/debug_main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/armv7hl/main/release"
|
||||
arch="armv7hl"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/armv7hl/main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/armv7l/debug_main/release"
|
||||
arch="armv7l"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/armv7l/debug_main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/armv7l/main/release"
|
||||
arch="armv7l"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/armv7l/main/release/"></dir>
|
||||
-->
|
||||
|
||||
<dir name="rosa-dx-chrome-1.0/i586/debug_main/release"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/i586/debug_main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/i586/main/release"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/i586/main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/i586/main/updates"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/updates"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/i586/main/updates/">
|
||||
<dependency>rosa-dx-chrome-1.0/i586/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
<dir name="dx_rc_personal/i586/debug_main/release"
|
||||
sources="dx_rc_personal/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/dx_rc_personal/repository/rosa-dx-chrome-1.0/i586/debug_main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/i586/main/release</dependency>
|
||||
</dir>
|
||||
<dir name="dx_rc_personal/i586/main/release"
|
||||
sources="dx_rc_personal/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/dx_rc_personal/repository/rosa-dx-chrome-1.0/i586/main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/i586/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
|
||||
<dir name="rosa-dx-chrome-1.0/x86_64/debug_main/release"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/x86_64/debug_main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/x86_64/main/release"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/x86_64/main/release/"></dir>
|
||||
<dir name="rosa-dx-chrome-1.0/x86_64/main/updates"
|
||||
sources="rosa-dx-chrome-1.0/SRPMS/main/updates"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/x86_64/main/updates/">
|
||||
<dependency>rosa-dx-chrome-1.0/x86_64/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
<dir name="dx_rc_personal/x86_64/debug_main/release"
|
||||
sources="dx_rc_personal/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/dx_rc_personal/repository/rosa-dx-chrome-1.0/x86_64/debug_main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/x86_64/main/release</dependency>
|
||||
</dir>
|
||||
<dir name="dx_rc_personal/x86_64/main/release"
|
||||
sources="dx_rc_personal/SRPMS/main/release"
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/dx_rc_personal/repository/rosa-dx-chrome-1.0/x86_64/main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/x86_64/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
<dir name="rosa-dx-chrome-1.0/SRPMS/main/release"
|
||||
sources="."
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/rosa-dx-chrome-1.0/repository/SRPMS/main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/$arch/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
<dir name="dx_rc_personal/SRPMS/main/release"
|
||||
sources="."
|
||||
path="/mnt/7/repo/abf-downloads.rosalinux.ru/dx_rc_personal/repository/rosa-dx-chrome-1.0/SRPMS/main/release/">
|
||||
<dependency>rosa-dx-chrome-1.0/$arch/main/release</dependency>
|
||||
<dependency>dx_rc_personal/$arch/main/release</dependency>
|
||||
</dir>
|
||||
|
||||
</repositories>
|
||||
</config>
|
150
versutils.py
Normal file
150
versutils.py
Normal file
|
@ -0,0 +1,150 @@
|
|||
# -*- coding: UTF-8 -*-
|
||||
|
||||
import re
|
||||
import rpm
|
||||
|
||||
RPMSENSE_LESS = 0x02
|
||||
RPMSENSE_GREATER = 0x04
|
||||
RPMSENSE_EQUAL = 0x08
|
||||
RPMSENSE_SENSEMASK = 0x0f
|
||||
RPMSENSE_FIND_PROVIDES = 0x8000
|
||||
RPMSENSE_MISSINGOK = 0x80000
|
||||
RPMSENSE_SCRIPT_POST = 0x400
|
||||
RPMSENSE_SCRIPT_PREUN = 0x800
|
||||
RPMSENSE_SCRIPT_POSTUN = 0x1000
|
||||
|
||||
def version_ok(required_version, compare_flag, candidate_version):
|
||||
def sep_version(version):
|
||||
vrem = re.match(r'\A(.+)(\-[^\-\:]+)(\:[^\:]+|)\Z', version)
|
||||
if vrem:
|
||||
return (vrem.group(1), vrem.group(2), vrem.group(3))
|
||||
return (version, '', '')
|
||||
|
||||
def simple_version(version):
|
||||
version = re.sub(r'[\-:]', '.', version)
|
||||
version = re.sub(r'[a-z]+', '.', version, flags=re.I)
|
||||
version = re.sub(r'\.\Z', '', version)
|
||||
return version
|
||||
|
||||
def format_versions(ver1, ver2):
|
||||
#see urpm-repoclosure, formatVersions
|
||||
# v1 - provided
|
||||
# v2 - required
|
||||
(e1, e2) = (None, None)
|
||||
e1_m = re.match(r'\A([^\-\:]+)\:(.*)', ver1)
|
||||
if e1_m:
|
||||
(e1, ver1) = (e1_m.group(1), e1_m.group(2))
|
||||
e2_m = re.match(r'\A([^\-\:]+)\:(.*)', ver2)
|
||||
if e2_m:
|
||||
(e2, ver2) = (e2_m.group(1), e2_m.group(2))
|
||||
(ver1_m, ver1_r, ver1_rr) = sep_version(ver1)
|
||||
(ver2_m, ver2_r, ver2_rr) = sep_version(ver2)
|
||||
if not ver2_rr:
|
||||
ver1_rr = ''
|
||||
if not ver2_r:
|
||||
ver1_r = ''
|
||||
ver1 = ver1_m + ver1_r + ver1_rr
|
||||
ver2 = ver2_m + ver2_r + ver2_rr
|
||||
if e1_m and e2_m:
|
||||
ver1 = e1 + '.' + ver1
|
||||
ver2 = e2 + '.' + ver2
|
||||
return (simple_version(ver1), simple_version(ver2))
|
||||
|
||||
def cmp_nums(num1, num2):
|
||||
# 00503
|
||||
# 12
|
||||
if num1 == num2:
|
||||
return 0
|
||||
lzeros1 = re.match(r'\A([0]+)([1-9].*)', num1)
|
||||
if lzeros1:
|
||||
(num1, num2) = (lzeros1.group(2), num2 + lzeros1.group(1))
|
||||
lzeros2 = re.match(r'\A([0]+)([1-9].*)', num2)
|
||||
if lzeros2:
|
||||
(num2, num1) = (lzeros2.group(2), num1 + lzeros2.group(1))
|
||||
diff = int(num1) - int(num2)
|
||||
return 0 if diff == 0 else \
|
||||
(1 if diff > 0 else -1)
|
||||
|
||||
def cmp_versions(version1, version2):
|
||||
#see urpm-repoclosure, cmpVersions
|
||||
# 3.2.5-5:2011.0
|
||||
# NOTE: perl 5.00503 and 5.12
|
||||
(v1, v2) = format_versions(version1, version2)
|
||||
if v1 == v2:
|
||||
return 0
|
||||
v1parts = v1.split('.')
|
||||
v2parts = v2.split('.')
|
||||
for i in xrange(0, min(len(v1parts), len(v2parts))):
|
||||
(num1, num2)= (v1parts[i], v2parts[i])
|
||||
if (len(num1) > 0 and len(num2) == 0):
|
||||
return 1
|
||||
if (len(num1) == 0 and len(num2) > 0):
|
||||
return -1
|
||||
num_diff = cmp_nums(num1, num2)
|
||||
if num_diff != 0:
|
||||
return num_diff
|
||||
if len(v1parts) < len(v2parts):
|
||||
return -1
|
||||
if len(v1parts) > len(v2parts):
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def rpm_cmp_versions(version1, version2):
|
||||
def stringToVersion(verstring):
|
||||
# from rpmUtils
|
||||
if verstring in [None, '']:
|
||||
return (None, None, None)
|
||||
e1_m = re.match(r'\A([^\-\:]+)\:(.*)', verstring)
|
||||
epoch = None
|
||||
if e1_m:
|
||||
(epoch, verstring) = (e1_m.group(1), e1_m.group(2))
|
||||
j = verstring.find('-')
|
||||
if j != -1:
|
||||
if verstring[:j] == '':
|
||||
version = None
|
||||
else:
|
||||
version = verstring[:j]
|
||||
release = verstring[j + 1:]
|
||||
else:
|
||||
if verstring == '':
|
||||
version = None
|
||||
else:
|
||||
version = verstring
|
||||
release = None
|
||||
return (epoch, version, release)
|
||||
|
||||
(e1, v1, r1) = stringToVersion(version1)
|
||||
(e2, v2, r2) = stringToVersion(version2)
|
||||
if e1 is None or e2 is None:
|
||||
e1 = '0'
|
||||
e2 = '0'
|
||||
result = rpm.labelCompare((e1, v1, r1), (e2, v2, r2))
|
||||
return result
|
||||
|
||||
# print '===', required_version, compare_flag, candidate_version
|
||||
if compare_flag == 0:
|
||||
return True
|
||||
if candidate_version == '*':
|
||||
return True
|
||||
#see urpm-repoclosure, checkDeps
|
||||
if compare_flag == RPMSENSE_EQUAL and \
|
||||
candidate_version ==required_version:
|
||||
return True
|
||||
|
||||
cmp_res = cmp_versions(candidate_version, required_version)
|
||||
rpm_cmp_res = rpm_cmp_versions(candidate_version, required_version)
|
||||
#if (cmp_res != rpm_cmp_res):
|
||||
#print >> sys.stderr, ('Invalid compare: "%s" vs "%s"! Results: rc: %d, rpm: %d.' %
|
||||
#(candidate_version, required_version, cmp_res, rpm_cmp_res))
|
||||
if compare_flag == RPMSENSE_EQUAL:
|
||||
return cmp_res == 0
|
||||
elif compare_flag == RPMSENSE_LESS | RPMSENSE_EQUAL:
|
||||
return cmp_res <= 0
|
||||
elif compare_flag == RPMSENSE_GREATER | RPMSENSE_EQUAL:
|
||||
return cmp_res >= 0
|
||||
elif compare_flag == RPMSENSE_LESS:
|
||||
return cmp_res < 0
|
||||
elif compare_flag == RPMSENSE_GREATER:
|
||||
return cmp_res > 0
|
||||
return False
|
||||
|
868
x86_64.lst
Normal file
868
x86_64.lst
Normal file
|
@ -0,0 +1,868 @@
|
|||
cups-pdf
|
||||
lsb
|
||||
xvfb
|
||||
xlsfonts
|
||||
qt3
|
||||
policycoreutils-sandbox
|
||||
setools-console
|
||||
policycoreutils-gui
|
||||
openscap-extra-probes
|
||||
openscap-content
|
||||
openscap-content-sectool
|
||||
openscap-utils
|
||||
openscap
|
||||
kmail
|
||||
mcstrans
|
||||
rosa-test-suite
|
||||
ccid
|
||||
at-spi
|
||||
freerdp
|
||||
opensc
|
||||
pam_pkcs11
|
||||
cgroup
|
||||
gawk
|
||||
policycoreutils-python
|
||||
python-semanage
|
||||
selinux-policy
|
||||
selinux-policy-mls
|
||||
selinux-policy-targeted
|
||||
audit
|
||||
openldap-servers
|
||||
policycoreutils
|
||||
ipsec-tools
|
||||
netlabel_tools
|
||||
stunnel
|
||||
ebtables
|
||||
#setroubleshoot
|
||||
#setroubleshoot-plugins
|
||||
system-config-services
|
||||
star
|
||||
lm_sensors
|
||||
wine64
|
||||
socat
|
||||
amtu
|
||||
mcstrans
|
||||
cups
|
||||
aide
|
||||
imagemagick-desktop
|
||||
policycoreutils-newrole
|
||||
policycoreutils-restorecond
|
||||
vsftpd
|
||||
#minicom
|
||||
rosa-chrome-theme
|
||||
amarok
|
||||
mozilla-thunderbird
|
||||
firefox
|
||||
krfb
|
||||
libreoffice
|
||||
okular
|
||||
gwenview
|
||||
kolourpaint
|
||||
rosa-media-player
|
||||
xsane
|
||||
ark
|
||||
java-1.6.0-openjdk
|
||||
kcalc
|
||||
konsole
|
||||
dolphin
|
||||
korganizer
|
||||
kdebase4-workspace
|
||||
stunnel
|
||||
#minicom
|
||||
gkermit
|
||||
pcsc-lite
|
||||
pcsc-tools
|
||||
ntp
|
||||
nfs-utils
|
||||
tftp-server
|
||||
openssh-server
|
||||
vsftpd
|
||||
bind
|
||||
dhcp-server
|
||||
util-linux
|
||||
man
|
||||
net-tools
|
||||
dhcp-client
|
||||
tftp
|
||||
rsync
|
||||
nfs-utils-clients
|
||||
openssh-clients
|
||||
lftp
|
||||
ntp-client
|
||||
systemd
|
||||
glibc
|
||||
dump
|
||||
pam
|
||||
audit
|
||||
policycoreutils-restorecond
|
||||
aide
|
||||
bash
|
||||
mc
|
||||
sharutils
|
||||
xz
|
||||
star
|
||||
findutils
|
||||
sed
|
||||
vim-enhanced
|
||||
coreutils
|
||||
dosfstools
|
||||
e2fsprogs
|
||||
cdrdao
|
||||
cdrkit-genisoimage
|
||||
shadow-utils
|
||||
sudo
|
||||
coreutils
|
||||
policycoreutils-newrole
|
||||
libsemanage
|
||||
procps
|
||||
util-linux
|
||||
sysvinit-tools
|
||||
coreutils
|
||||
drakbackup
|
||||
libreoffice-l10n-ru
|
||||
libreoffice-help-ru
|
||||
lib64xcb-glx0
|
||||
|
||||
make
|
||||
makedev
|
||||
coreutils
|
||||
livecd-tools
|
||||
livecd-iso-to-disk
|
||||
syslinux
|
||||
strace
|
||||
harddrake
|
||||
mc
|
||||
kernel-selinux-desktop-latest
|
||||
kernel-selinux-desktop-devel-latest
|
||||
dracut-017
|
||||
locales
|
||||
lib64stdc++6
|
||||
|
||||
acl
|
||||
acpi
|
||||
acpid
|
||||
alsa-plugins-doc
|
||||
alsa-plugins-pulse-config
|
||||
alsa-utils
|
||||
aoss
|
||||
apmd
|
||||
aria2
|
||||
ark
|
||||
as10k1
|
||||
at
|
||||
atk1.0-common
|
||||
#aumix-text
|
||||
avahi
|
||||
awesfx
|
||||
b43-fwcutter
|
||||
basesystem
|
||||
basesystem-minimal
|
||||
bash
|
||||
#bluez
|
||||
bootloader-utils
|
||||
bootsplash
|
||||
busybox-static
|
||||
bzip2
|
||||
canberra-common
|
||||
canberra-gtk
|
||||
ccp
|
||||
cdialog
|
||||
cdrkit
|
||||
cdrkit-genisoimage
|
||||
chkconfig
|
||||
comgt
|
||||
common-licenses
|
||||
consolekit
|
||||
consolekit-x11
|
||||
coreutils
|
||||
cpio
|
||||
cracklib-dicts
|
||||
crda
|
||||
cronie
|
||||
crontabs
|
||||
cryptsetup
|
||||
curl
|
||||
dash
|
||||
dash-static
|
||||
davfs2
|
||||
dbus
|
||||
dbus-x11
|
||||
desktop-common-data
|
||||
desktop-file-utils
|
||||
dhcp-client
|
||||
dhcp-common
|
||||
diffutils
|
||||
dirmngr
|
||||
dkms
|
||||
dkms-minimal
|
||||
dmidecode
|
||||
dmraid
|
||||
dmraid-events
|
||||
dmsetup
|
||||
dosfstools
|
||||
drakconf
|
||||
drakconf-icons
|
||||
drakguard
|
||||
draklive-install
|
||||
#draksnapshot
|
||||
drakx-finish-install
|
||||
drakx-installer-binaries-probe
|
||||
drakx-installer-matchbox
|
||||
drakx-kbd-mouse-x11
|
||||
drakx-net
|
||||
drakx-net-text
|
||||
drakxtools
|
||||
drakxtools-backend
|
||||
drakxtools-curses
|
||||
dump
|
||||
dvb-apps
|
||||
dvbsnoop
|
||||
dvbtune
|
||||
dvd+rw-tools
|
||||
e2fsprogs
|
||||
eject
|
||||
enchant
|
||||
etcskel
|
||||
ethtool
|
||||
ffmpeg
|
||||
ffmpegthumbs
|
||||
file
|
||||
filesystem
|
||||
findutils
|
||||
|
||||
firefox
|
||||
firefox-en_GB
|
||||
firefox-ru
|
||||
|
||||
fontconfig
|
||||
fonts-ttf-decoratives
|
||||
fonts-ttf-dejavu
|
||||
fonts-ttf-liberation
|
||||
fonts-ttf-west_european
|
||||
font-tools
|
||||
lib64freetype6
|
||||
lib64freetype2
|
||||
fuse
|
||||
gamin
|
||||
gawk
|
||||
gcc-cpp
|
||||
GConf2
|
||||
genhdlist2
|
||||
gettext-base
|
||||
ghostscript
|
||||
ghostscript-common
|
||||
ghostscript-fonts
|
||||
glib2.0-common
|
||||
glibc
|
||||
gnupg
|
||||
gnupg2
|
||||
grep
|
||||
groff
|
||||
groff-for-man
|
||||
#grub2
|
||||
gstreamer0.10-cdparanoia
|
||||
gstreamer0.10-ffmpeg
|
||||
gstreamer0.10-plugins-base
|
||||
gstreamer0.10-plugins-good
|
||||
gstreamer0.10-pulse
|
||||
gstreamer0.10-python
|
||||
gstreamer0.10-soup
|
||||
gstreamer0.10-tools
|
||||
gtk+2.0
|
||||
gtksourceview
|
||||
gurpmi
|
||||
gvfs
|
||||
gvfs-archive
|
||||
gvfs-fuse
|
||||
gvfs-gphoto2
|
||||
gvfs-smb
|
||||
gwenview
|
||||
gzip
|
||||
#hal
|
||||
#hal-info
|
||||
harddrake
|
||||
harddrake-ui
|
||||
hcl
|
||||
hdparm
|
||||
hfsutils
|
||||
hicolor-icon-theme
|
||||
html2text
|
||||
iceauth
|
||||
ifmetric
|
||||
ifplugd
|
||||
indexhtml
|
||||
info
|
||||
info-install
|
||||
initscripts
|
||||
iproute2
|
||||
ipset
|
||||
iptables
|
||||
iputils
|
||||
iso-codes
|
||||
iw
|
||||
jackit
|
||||
jasper
|
||||
jfsutils
|
||||
kbd
|
||||
bluedevil
|
||||
kcalc
|
||||
kcm_touchpad
|
||||
kcron
|
||||
kde4-audiocd
|
||||
kde4-filesharing
|
||||
kde4-nsplugins
|
||||
kdeartwork4-kscreensaver
|
||||
kdebase4-runtime
|
||||
kdebase4-workspace
|
||||
|
||||
kde-l10n-en_GB
|
||||
kde-l10n-pl
|
||||
kde-l10n-pt_BR
|
||||
kde-l10n-ru
|
||||
kde-l10n-uk
|
||||
kde-l10n-es
|
||||
kde-l10n-nn
|
||||
kde-l10n-nl
|
||||
kde-l10n-fr
|
||||
kde-l10n-it
|
||||
kde-l10n-ro
|
||||
kde-l10n-de
|
||||
|
||||
kdnssd
|
||||
keychain
|
||||
kfind
|
||||
kfingermanager
|
||||
kgamma
|
||||
kget
|
||||
kio4-imap
|
||||
kio4-ldap
|
||||
kio4-mbox
|
||||
kio4-nntp
|
||||
kio4-pop3
|
||||
kio4-sieve
|
||||
kio4-smtp
|
||||
kio-sysinfo
|
||||
kipi-common
|
||||
kmix
|
||||
kmozillahelper
|
||||
knotes
|
||||
kolourpaint
|
||||
konqueror
|
||||
konsole
|
||||
kopete
|
||||
kpartx
|
||||
kppp
|
||||
krb5
|
||||
krdc
|
||||
krfb
|
||||
ksendemail
|
||||
ksnapshot
|
||||
#kttsd
|
||||
kwallet
|
||||
kwallet-daemon
|
||||
kwrite
|
||||
ld10k1
|
||||
ldetect
|
||||
ldetect-lst
|
||||
lib64ldetect0.12
|
||||
less
|
||||
lftp
|
||||
lm_sensors
|
||||
locales
|
||||
|
||||
locales-en
|
||||
locales-no
|
||||
locales-pl
|
||||
locales-pt
|
||||
locales-ru
|
||||
locales-uk
|
||||
locales-es
|
||||
locales-fr
|
||||
locales-it
|
||||
locales-nl
|
||||
locales-de
|
||||
locales-ro
|
||||
|
||||
logrotate
|
||||
lsb-release
|
||||
lshw
|
||||
lvm2
|
||||
mailcap
|
||||
makedev
|
||||
man
|
||||
mandi
|
||||
mandi-ifw
|
||||
mandriva-doc-common
|
||||
rosa-gfxboot-theme
|
||||
mandriva-kde-icons
|
||||
mandriva-kde4-config-common
|
||||
mandriva-kde-translation
|
||||
mandriva-theme-common
|
||||
mandriva-theme-Rosa
|
||||
mandriva-theme-Rosa-screensaver
|
||||
man-pages
|
||||
mdadm
|
||||
#mdkonline
|
||||
mdv-rpm-summary
|
||||
menu-messages
|
||||
meta-task
|
||||
migration-assistant
|
||||
mingetty
|
||||
mkfontdir
|
||||
mkfontscale
|
||||
mkxauth
|
||||
mlocate
|
||||
#module-init-tools
|
||||
monitor-edid
|
||||
mtools
|
||||
|
||||
aspell
|
||||
aspell-ru
|
||||
|
||||
mozilla-thunderbird-ru
|
||||
myspell-ru_RU
|
||||
|
||||
mysql-client
|
||||
#mysql-common
|
||||
#mysql-common-core
|
||||
#mysql-core
|
||||
nail
|
||||
ncurses
|
||||
ndiswrapper
|
||||
net_monitor
|
||||
netprofile
|
||||
net-tools
|
||||
nfs-utils-clients
|
||||
notification-daemon
|
||||
nss
|
||||
nss_mdns
|
||||
nss_tcb
|
||||
ntfs-3g
|
||||
#ntfsprogs
|
||||
ntp
|
||||
ntp-client
|
||||
obex-data-server
|
||||
okular
|
||||
#free-kde4-config
|
||||
one-kde4-config
|
||||
open
|
||||
openldap
|
||||
|
||||
|
||||
openssh
|
||||
openssh-clients
|
||||
openssh-server
|
||||
openssl
|
||||
ORBit2
|
||||
oxygen-icon-theme
|
||||
pam
|
||||
pam_tcb
|
||||
pango
|
||||
paprefs
|
||||
passwd
|
||||
pavucontrol
|
||||
pciutils
|
||||
pcmciautils
|
||||
phonon-gstreamer
|
||||
|
||||
pkgconfig
|
||||
|
||||
plasma-dataengine-microblog
|
||||
plasma-dataengine-ocs
|
||||
plasma-dataengine-rtm
|
||||
plasma-desktoptheme-aya
|
||||
plasma-desktoptheme-default
|
||||
plasma-krunner-powerdevil
|
||||
plasma-runner-audioplayercontrol
|
||||
plasma-runner-browserhistory
|
||||
plasma-runner-contacts
|
||||
plasma-runner-converter
|
||||
plasma-runner-katesessions
|
||||
plasma-runner-konquerorsessions
|
||||
plasma-runner-konsolesessions
|
||||
plasma-runner-kopete
|
||||
plasma-runner-mediawiki
|
||||
plasma-runner-spellchecker
|
||||
plasma-wallpaper-mandelbrot
|
||||
plasma-wallpaper-pattern
|
||||
plasma-wallpaper-timeoftheday
|
||||
plasma-wallpaper-virus
|
||||
plasma-wallpaper-weather
|
||||
plymouth
|
||||
plymouth-plugin-label
|
||||
plymouth-plugin-script
|
||||
plymouth-scripts
|
||||
plymouth-system-theme
|
||||
pm-fallback-policy
|
||||
pm-utils
|
||||
policykit
|
||||
polkit
|
||||
polkit-kde-agent-1
|
||||
popt-data
|
||||
ppp
|
||||
ppp-pppoatm
|
||||
pptp-linux
|
||||
#prcsys
|
||||
preload
|
||||
prism2-utils
|
||||
procps
|
||||
psmisc
|
||||
pulseaudio
|
||||
pulseaudio-client-config
|
||||
pulseaudio-esound-compat
|
||||
pulseaudio-module-gconf
|
||||
pulseaudio-module-x11
|
||||
pulseaudio-module-zeroconf
|
||||
pulseaudio-utils
|
||||
python
|
||||
python-cairo
|
||||
python-gobject
|
||||
python-kde4
|
||||
python-ldap
|
||||
python-notify
|
||||
python-numpy
|
||||
python-OpenSSL
|
||||
python-pycrypto
|
||||
python-qt4
|
||||
python-qt4-assistant
|
||||
python-qt4-core
|
||||
python-qt4-designer
|
||||
python-qt4-gui
|
||||
python-qt4-multimedia
|
||||
python-qt4-network
|
||||
python-qt4-opengl
|
||||
python-qt4-script
|
||||
python-qt4-sql
|
||||
python-qt4-svg
|
||||
python-qt4-test
|
||||
python-qt4-webkit
|
||||
python-qt4-xml
|
||||
python-qt4-xmlpatterns
|
||||
python-sip
|
||||
python-twisted-core
|
||||
python-twisted-web
|
||||
python-zope-interface
|
||||
pyxdg
|
||||
qca2-plugin-openssl
|
||||
qt4-common
|
||||
qt4-database-plugin-mysql
|
||||
qt4-qtdbus
|
||||
qt4-style-iaora
|
||||
qt4-xmlpatterns
|
||||
qtscriptbindings
|
||||
quota
|
||||
radeontool
|
||||
reiserfsprogs
|
||||
resolvconf
|
||||
rgb
|
||||
rmt
|
||||
rng-utils
|
||||
rootcerts
|
||||
rootfiles
|
||||
rpcbind
|
||||
rpm
|
||||
rpmdrake
|
||||
rpm-helper
|
||||
rpmstats
|
||||
rp-pppoe
|
||||
rsnapshot
|
||||
rsync
|
||||
rsyslog
|
||||
rtkit
|
||||
run-parts
|
||||
s2u
|
||||
sane-backends
|
||||
sane-backends-iscan
|
||||
sash
|
||||
sb16_csp
|
||||
sdparm
|
||||
sed
|
||||
sessreg
|
||||
setup
|
||||
setxkbmap
|
||||
shadow-utils
|
||||
shared-desktop-ontologies
|
||||
shared-mime-info
|
||||
sharutils
|
||||
shorewall
|
||||
soprano
|
||||
soprano-plugin-common
|
||||
soprano-plugin-redland
|
||||
soprano-plugin-virtuoso
|
||||
sound-scripts
|
||||
sound-theme-freedesktop
|
||||
soundwrapper
|
||||
sscape_ctl
|
||||
strigi
|
||||
sudo
|
||||
suspend
|
||||
sysfsutils
|
||||
sysvinit-tools
|
||||
t1utils
|
||||
taglib-extras
|
||||
tar
|
||||
tcb
|
||||
tcl
|
||||
tcp_wrappers
|
||||
termcap
|
||||
time
|
||||
timezone
|
||||
tmpwatch
|
||||
transfugdrake
|
||||
uClibc
|
||||
udev
|
||||
udisks
|
||||
unionfs-utils
|
||||
unzip
|
||||
update-alternatives
|
||||
upower
|
||||
urpmi
|
||||
urw-fonts
|
||||
us428control
|
||||
usb_modeswitch
|
||||
usbmuxd
|
||||
usbutils
|
||||
userdrake
|
||||
usermode
|
||||
usermode-consoleonly
|
||||
utempter
|
||||
util-linux
|
||||
v4l-utils
|
||||
vbetool
|
||||
vim-minimal
|
||||
vnstat
|
||||
vte
|
||||
webkit1.0
|
||||
webkit1.0-webinspector
|
||||
wget
|
||||
which
|
||||
wireless-regdb
|
||||
wireless-tools
|
||||
wpa_supplicant
|
||||
x11-data-cursor-themes
|
||||
x11-data-xkbdata
|
||||
#x11-driver-input
|
||||
x11-driver-input-acecad
|
||||
x11-driver-input-aiptek
|
||||
x11-driver-input-evdev
|
||||
x11-driver-input-fpit
|
||||
x11-driver-input-hyperpen
|
||||
x11-driver-input-joystick
|
||||
x11-driver-input-keyboard
|
||||
x11-driver-input-mouse
|
||||
x11-driver-input-mutouch
|
||||
x11-driver-input-penmount
|
||||
x11-driver-input-synaptics
|
||||
x11-driver-input-void
|
||||
x11-driver-input-wacom
|
||||
x11-driver-video
|
||||
x11-driver-video-ati
|
||||
x11-driver-video-cirrus
|
||||
x11-driver-video-fbdev
|
||||
x11-driver-video-glint
|
||||
x11-driver-video-intel
|
||||
x11-driver-video-mach64
|
||||
x11-driver-video-mga
|
||||
x11-driver-video-neomagic
|
||||
x11-driver-video-nouveau
|
||||
x11-driver-video-nv
|
||||
x11-driver-video-openchrome
|
||||
x11-driver-video-r128
|
||||
x11-driver-video-radeonhd
|
||||
x11-driver-video-s3
|
||||
x11-driver-video-s3virge
|
||||
x11-driver-video-savage
|
||||
x11-driver-video-sis
|
||||
x11-driver-video-sisusb
|
||||
x11-driver-video-tdfx
|
||||
x11-driver-video-trident
|
||||
x11-driver-video-v4l
|
||||
x11-driver-video-vboxvideo
|
||||
x11-driver-video-vesa
|
||||
x11-driver-video-vmware
|
||||
x11-driver-video-qxl
|
||||
x11-font-adobe-75dpi
|
||||
x11-font-alias
|
||||
x11-font-bh-75dpi
|
||||
x11-font-bh-lucidatypewriter-75dpi
|
||||
x11-font-bitstream-75dpi
|
||||
x11-font-cronyx-cyrillic
|
||||
x11-font-cursor-misc
|
||||
x11-font-cyrillic
|
||||
x11-font-encodings
|
||||
x11-font-misc-cyrillic
|
||||
x11-font-misc-misc
|
||||
x11-font-screen-cyrillic
|
||||
x11-font-winitzki-cyrillic
|
||||
x11-server-common
|
||||
x11-server-xorg
|
||||
xauth
|
||||
xdg-user-dirs
|
||||
xdg-user-dirs-gtk
|
||||
xdg-utils
|
||||
xdm
|
||||
xdpyinfo
|
||||
xev
|
||||
xfsprogs
|
||||
xhost
|
||||
xinit
|
||||
xinitrc
|
||||
xkbcomp
|
||||
xmessage
|
||||
xmodmap
|
||||
xorg-x11
|
||||
xprop
|
||||
xrandr
|
||||
xrdb
|
||||
xset
|
||||
xsetroot
|
||||
xsettings-kde
|
||||
xulrunner
|
||||
xz
|
||||
zcip
|
||||
zip
|
||||
|
||||
systemd-sysvinit
|
||||
systemd
|
||||
networkmanager
|
||||
networkmanager-openvpn
|
||||
networkmanager-vpnc
|
||||
networkmanager-pptp
|
||||
modemmanager
|
||||
mobile-broadband-provider-info
|
||||
plasma-applet-networkmanagement
|
||||
|
||||
task-kde4
|
||||
task-x11
|
||||
x11-driver-input
|
||||
x11-driver-video
|
||||
task-pulseaudio
|
||||
|
||||
kde4-style-qtcurve
|
||||
qtcurve-gtk2
|
||||
|
||||
livestart-rosa
|
||||
rosa-launcher
|
||||
|
||||
#ktorrent
|
||||
kde4-windeco-dekorator
|
||||
rosa-elementary-theme
|
||||
rosa-icons
|
||||
kamera
|
||||
aica-firmware
|
||||
asihpi-firmware
|
||||
emagic-firmware
|
||||
emu1010-firmware
|
||||
kernel-firmware
|
||||
pcmcia-cis-firmware
|
||||
turtlebeach-firmware
|
||||
zd1211-firmware
|
||||
|
||||
#x11-driver-video-fglrx
|
||||
#x11-driver-video-nvidia-current
|
||||
#x11-driver-video-nvidia173
|
||||
#x11-driver-video-nvidia96xx
|
||||
|
||||
|
||||
glxinfo
|
||||
alsa-utils
|
||||
lib64alsa-plugins-pulseaudio
|
||||
mesa-demos
|
||||
|
||||
#mandriva-control-center
|
||||
qgtkstylealt
|
||||
plasma-desktoptheme-rosa
|
||||
kdepasswd
|
||||
|
||||
sphere-client-rosa
|
||||
fonts-ttf-droid
|
||||
#psyncclient
|
||||
|
||||
nut-server
|
||||
samba-client
|
||||
samba-server
|
||||
nfs-utils
|
||||
btrfs-progs
|
||||
knetworkmanager-pptp
|
||||
samba-client
|
||||
cifs-utils
|
||||
nss_wins
|
||||
samba-common
|
||||
comgt
|
||||
madwimax
|
||||
rp-pppoe
|
||||
btrfs-progs
|
||||
x11-driver-video-vboxvideo
|
||||
x11-driver-input-vmmouse
|
||||
whois
|
||||
cups
|
||||
task-printing
|
||||
task-printing-hp
|
||||
task-printing-server
|
||||
system-config-printer
|
||||
nfs-utils
|
||||
#vpnpptp-allde
|
||||
xl2tpd
|
||||
wvdial
|
||||
gksu
|
||||
ozerocdoff
|
||||
usb_modeswitch-data
|
||||
cpufrequtils
|
||||
lib64stdc++6
|
||||
bind-utils
|
||||
#aumix
|
||||
kamera
|
||||
|
||||
zenity
|
||||
rosa-media-player
|
||||
rosa-media-player-plugin
|
||||
ffmpeg
|
||||
gstreamer0.10-mpeg
|
||||
rdesktop
|
||||
amarok
|
||||
|
||||
autofs
|
||||
|
||||
ccid
|
||||
krb5-workstation
|
||||
lib64sasl2-plug-gssapi
|
||||
nscd
|
||||
nss_ldap
|
||||
openldap-clients
|
||||
opensc
|
||||
|
||||
pam_krb5
|
||||
pam_ldap
|
||||
pcsc-lite
|
||||
pcsc-tools
|
||||
perl-Digest-SHA
|
||||
perl-Net-DNS
|
||||
samba-winbind
|
||||
tigervnc-server
|
||||
xl2tpd
|
||||
lsof
|
||||
vpnpptp-allde
|
||||
kcm_license
|
||||
lsb-release
|
||||
lib64glibc_lsb
|
||||
perl-CGI
|
||||
perl-Pod-Perldoc
|
||||
perl-Safe
|
||||
perl-Class-ISA
|
||||
perl-Pod-Plainer
|
||||
glibc-i18ndata
|
||||
|
||||
gstreamer0.10-plugins-ugly
|
||||
htop
|
||||
traceroute
|
||||
pulseaudio-module-bluetooth
|
||||
bluez-alsa
|
||||
elementary-theme
|
||||
plasma-applet-battery
|
||||
plasma-applet-folderview
|
||||
ktorrent
|
||||
lib64alsa-plugins
|
||||
bash-completion
|
||||
autologin
|
||||
k3b
|
||||
akonadi-mailfilter-agent
|
Loading…
Add table
Reference in a new issue