matrobriva » 27/06/2012, 10:19 ha scritto:Ora mi chiedo: ma se io ho utilizzato aptoncd, che senso ha che molte dipendenze non siano state incluse?
Come risolvere il problema delle versioni più vecchie installate dei pacchetti essenziali?
Ultima domanda, quasi scaramantica: quante probabilità ci sono che quello che faccio nella VM con Lubuntu sia UGUALE a quello che farò al mare? (teoricamente 100%, ma si sa, l'informatica...)
Da quel che ho visto aptoncd ti crea le dipendenze basandosi sui pacchetti del software che hai installato e che si trovano nella cache (ad esempio, se pulisci la cache non vedrà più nulla... volendo puoi indicare da altre fonti, ma comunque devi farglieli trovare, quindi scaricarli tu); inoltre, non so ho capito bene se e quanto sia più mantenuto, (le uniche cose recenti sono su launchpad, ma non vedo nuove release da un bel pò).
Dato che forse servirebbe una cosa del genere anche a me, ho scritto velocemente uno script che *dovrebbe* recuperare tutte le dipendenze di un dato pacchetto: semplicemente esplora ricorsivamente le dipendenze di ogni pacchetto partendo da quello iniziale.
Prova e vedi se va un pò meglio:
- Codice: Seleziona tutto
import apt
import argparse
import logging
import os
import sys
LOGNAME = 'get_deps'
LOG_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR']
DEFAULT_LOG_LEVEL = 'INFO'
def get_deps (pkgname, cache=None):
if cache is None:
cache = apt.Cache()
try:
pkg = cache[pkgname]
except KeyError as err:
logging.getLogger(LOGNAME).warning(err)
return set()
pkg_deps = set()
for dep in pkg.candidateDependencies:
# first choice for multiple packages dep
pkg_deps.add(dep.or_dependencies[0].name)
# all of or_*
#pkg_deps.update(odep.name for odep in dep.or_dependencies)
return pkg_deps
def get_deep_deps (pgkname, cache=None):
if cache is None:
cache = apt.Cache()
pkg_ddeps = set()
to_find = [pkgname]
while True:
nexts = set()
for p in to_find:
_pkgs = get_deps(p, cache)
new_pkgs = _pkgs.difference(pkg_ddeps)
pkg_ddeps.update(new_pkgs)
nexts.update(new_pkgs)
if nexts:
to_find = list(nexts)
else:
break
return pkg_ddeps
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('packages',
default=[], nargs='*', metavar='package_name',
help='find deps for every package')
parser.add_argument('-d', '--deep',
dest='deep', action='store_true', help='deep search dependencies')
parser.add_argument('-l', '--log-level',
dest='loglevel', metavar='LEVEL',
choices=LOG_LEVELS, default=DEFAULT_LOG_LEVEL,
help='set logging level: one of %(choices)s; default to %(default)s')
args = parser.parse_args()
logging.basicConfig(level=args.loglevel)
logger = logging.getLogger(LOGNAME)
func = get_deep_deps if args.deep else get_deps
for pkgname in args.packages:
deps = func(pkgname)
logger.info("Package {what} depends on {num} packages:".format(
what=pkgname, num=len(deps)))
print ' '.join(sorted(deps))
Nota che non fa altro che comunicare i pacchetti dipendenti, non installa, downloada o salva alcunchè: i pacchetti elencati potrai poi scaricarli manualmente con
- Codice: Seleziona tutto
apt-get download deb1 deb2 ecc..
e poi masterizzarli o, volendo, usarli con aptoncd per creare il cd.
Esempio:
crap0101@crap0101-M:~$ python get_deps.py imagemagick
INFO:get_deps:Package imagemagick depends on 3 packages:
libc6 libmagickcore3 libmagickwand3
invece, con l'opzione -d cerca ricorsivamente tutte le dipendenze:
crap0101@crap0101-M:~$ python get_deps.py imagemagick -d
INFO:get_deps:Package imagemagick depends on 43 packages:
coreutils debconf dpkg fontconfig-config gcc-4.6-base libacl1 libattr1 libbz2-1.0 libc-bin libc6 libexpat1 libffi6 libfontconfig1 libfreetype6 libgcc1 libglib2.0-0 libgomp1 libjasper1 libjpeg62 liblcms1 liblqr-1-0 libltdl7 liblzma2 libmagickcore3 libmagickwand3 libpcre3 libpng12-0 libselinux1 libtiff4 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxml2 multiarch-support perl-base ttf-dejavu-core tzdata ucf xz-utils zlib1g
che, come vedi sono molte di più perchè, rispetto al precedente, includono anche le sottodipendenze, ovvero le dipenzenze di libmagickcore3, quelle di libmagickwand3 e a tutte le altre.
Come noterai, ci sono cose "di troppo", ad esempio libc6 che è comune a molti programmi e librerie, ma generalmente non viene installata perchè è una di quelle fondamentali ed è già presente: per questo bisognerebbe fare un controllo più approfondito sulla priorità dei pacchetti (ma ora come ora ho buttato giù lo script così... è tutt'altro che perfetto); non è un problema per l'installazione, però (se non le individui e le elimini) devi scaricare un pò di roba che in realtà non ti serve.