home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / DistUpgrade / DistUpgradeAptCdrom.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  10.2 KB  |  284 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import re
  5. import os
  6. import apt
  7. import apt_pkg
  8. import logging
  9. import gzip
  10. import shutil
  11. import subprocess
  12. from gettext import gettext as _
  13.  
  14. class AptCdromError(Exception):
  15.     ''' base exception for apt cdrom errors '''
  16.     pass
  17.  
  18.  
  19. class AptCdrom(object):
  20.     ''' represents a apt cdrom object '''
  21.     
  22.     def __init__(self, view, path):
  23.         self.view = view
  24.         self.cdrompath = path
  25.         self.packages = set()
  26.         self.signatures = set()
  27.         self.i18n = set()
  28.  
  29.     
  30.     def restoreBackup(self, backup_ext):
  31.         ''' restore the backup copy of the cdroms.list file (*not* sources.list)! '''
  32.         cdromstate = os.path.join(apt_pkg.Config.FindDir('Dir::State'), apt_pkg.Config.Find('Dir::State::cdroms'))
  33.         if os.path.exists(cdromstate + backup_ext):
  34.             shutil.copy(cdromstate + backup_ext, cdromstate)
  35.         
  36.  
  37.     
  38.     def _scanCD(self):
  39.         ''' 
  40.         scan the CD for interessting files and return them as:
  41.         (packagesfiles, signaturefiles, i18nfiles)
  42.         '''
  43.         packages = set()
  44.         signatures = set()
  45.         i18n = set()
  46.         for root, dirs, files in os.walk(self.cdrompath, topdown = True):
  47.             if root.endswith('debian-installer') or root.endswith('dist-upgrader'):
  48.                 del dirs[:]
  49.                 continue
  50.                 continue
  51.             if '.aptignr' in files:
  52.                 continue
  53.                 continue
  54.             if 'Packages' in files:
  55.                 packages.add(os.path.join(root, 'Packages'))
  56.                 continue
  57.             if 'Packages.gz' in files:
  58.                 packages.add(os.path.join(root, 'Packages.gz'))
  59.                 continue
  60.             if 'Sources' in files or 'Sources.gz' in files:
  61.                 logging.error('Sources entry found in %s but not supported' % root)
  62.                 continue
  63.             if 'Release.gpg' in files:
  64.                 signatures.add(os.path.join(root, 'Release.gpg'))
  65.                 continue
  66.             if 'i18n' in dirs:
  67.                 for f in os.listdir(os.path.join(root, 'i18n')):
  68.                     i18n.add(os.path.join(root, 'i18n', f))
  69.                 
  70.             if os.path.split(root)[1] == 'pool':
  71.                 del dirs[:]
  72.                 continue
  73.         
  74.         return (packages, signatures, i18n)
  75.  
  76.     
  77.     def _writeDatabase(self):
  78.         ''' update apts cdrom.list '''
  79.         dbfile = apt_pkg.Config.FindFile('Dir::State::cdroms')
  80.         cdrom = apt_pkg.GetCdrom()
  81.         (res, id) = cdrom.Ident(apt.progress.CdromProgress())
  82.         label = self._readDiskName()
  83.         out = open(dbfile, 'a')
  84.         out.write('CD::%s "%s";\n' % (id, label))
  85.         out.write('CD::%s::Label "%s";\n' % (id, label))
  86.  
  87.     
  88.     def _dropArch(self, packages):
  89.         ''' drop architectures that are not ours '''
  90.         packages = set(packages)
  91.         arch = apt_pkg.Config.Find('APT::Architecture')
  92.         for d in set(packages):
  93.             if '/binary-' in d and arch not in d:
  94.                 packages.remove(d)
  95.                 continue
  96.         
  97.         return packages
  98.  
  99.     
  100.     def _readDiskName(self):
  101.         diskname = None
  102.         info = os.path.join(self.cdrompath, '.disk', 'info')
  103.         if os.path.exists(info):
  104.             diskname = open(info).read()
  105.             for special in ('"', ']', '[', '_'):
  106.                 diskname = diskname.replace(special, '_')
  107.             
  108.         
  109.         return diskname
  110.  
  111.     
  112.     def _generateSourcesListLine(self, diskname, packages):
  113.         path = ''
  114.         dist = ''
  115.         comps = []
  116.         for d in packages:
  117.             m = re.match('(.*)/dists/([^/]*)/(.*)/binary-*', d)
  118.             if not m:
  119.                 raise AptCdromError, _('Could not calculate sources.list entry')
  120.             m
  121.             path = m.group(1)
  122.             dist = m.group(2)
  123.             comps.append(m.group(3))
  124.         
  125.         if not path or not comps:
  126.             return None
  127.         comps.sort()
  128.         pentry = 'deb cdrom:[%s]/ %s %s' % (diskname, dist, ' '.join(comps))
  129.         return pentry
  130.  
  131.     
  132.     def _copyTranslations(self, translations, targetdir = None):
  133.         if not targetdir:
  134.             targetdir = apt_pkg.Config.FindDir('Dir::State::lists')
  135.         
  136.         diskname = self._readDiskName()
  137.         for f in translations:
  138.             fname = apt_pkg.URItoFileName('cdrom:[%s]/%s' % (diskname, f[f.find('dists'):]))
  139.             outf = os.path.join(targetdir, os.path.splitext(fname)[0])
  140.             if f.endswith('.gz'):
  141.                 g = gzip.open(f)
  142.                 out = open(outf, 'w')
  143.                 while True:
  144.                     s = g.read(64000)
  145.                     out.write(s)
  146.                     if s == '':
  147.                         break
  148.                         continue
  149.                 continue
  150.             shutil.copy(f, outf)
  151.         
  152.         return True
  153.  
  154.     
  155.     def _copyPackages(self, packages, targetdir = None):
  156.         if not targetdir:
  157.             targetdir = apt_pkg.Config.FindDir('Dir::State::lists')
  158.         
  159.         diskname = self._readDiskName()
  160.         for f in packages:
  161.             fname = apt_pkg.URItoFileName('cdrom:[%s]/%s' % (diskname, f[f.find('dists'):]))
  162.             outf = os.path.join(targetdir, os.path.splitext(fname)[0])
  163.             if f.endswith('.gz'):
  164.                 g = gzip.open(f)
  165.                 out = open(outf, 'w')
  166.                 while True:
  167.                     s = g.read(64000)
  168.                     out.write(s)
  169.                     if s == '':
  170.                         break
  171.                         continue
  172.                 continue
  173.             shutil.copy(f, outf)
  174.         
  175.         return True
  176.  
  177.     
  178.     def _verifyRelease(self, signatures):
  179.         ''' verify the signatues and hashes '''
  180.         gpgv = apt_pkg.Config.Find('Dir::Bin::gpg', '/usr/bin/gpgv')
  181.         keyring = apt_pkg.Config.Find('Apt::GPGV::TrustedKeyring', '/etc/apt/trusted.gpg')
  182.         for sig in signatures:
  183.             basepath = os.path.split(sig)[0]
  184.             releasef = os.path.splitext(sig)[0]
  185.             cmd = [
  186.                 gpgv,
  187.                 '--keyring',
  188.                 keyring,
  189.                 '--ignore-time-conflict',
  190.                 sig,
  191.                 releasef]
  192.             ret = subprocess.call(cmd)
  193.             if not ret == 0:
  194.                 return False
  195.             t = apt_pkg.ParseTagFile(open(releasef))
  196.             t.Step()
  197.             for entry in t.Section['SHA256'].split('\n'):
  198.                 (hash, size, name) = entry.split()
  199.                 f = os.path.join(basepath, name)
  200.                 if not os.path.exists(f):
  201.                     logging.info("ignoring missing '%s'" % f)
  202.                     continue
  203.                 
  204.                 sum = apt_pkg.sha256sum(open(f))
  205.                 if not sum == hash:
  206.                     logging.error('hash sum mismatch expected %s but got %s' % (hash, sum))
  207.                     return False
  208.             
  209.         
  210.         return True
  211.  
  212.     
  213.     def _copyRelease(self, signatures, targetdir = None):
  214.         ''' copy the release file '''
  215.         if not targetdir:
  216.             targetdir = apt_pkg.Config.FindDir('Dir::State::lists')
  217.         
  218.         diskname = self._readDiskName()
  219.         for sig in signatures:
  220.             releasef = os.path.splitext(sig)[0]
  221.             for f in (sig, releasef):
  222.                 fname = apt_pkg.URItoFileName('cdrom:[%s]/%s' % (diskname, f[f.find('dists'):]))
  223.                 shutil.copy(f, os.path.join(targetdir, fname))
  224.             
  225.         
  226.         return True
  227.  
  228.     
  229.     def _doAdd(self):
  230.         ''' reimplement pkgCdrom::Add() in python '''
  231.         (self.packages, self.signatures, self.i18n) = self._scanCD()
  232.         self.packages = self._dropArch(self.packages)
  233.         if len(self.packages) == 0:
  234.             logging.error('no useable indexes found on CD, wrong ARCH?')
  235.             raise AptCdromError, _('Unable to locate any package files, perhaps this is not a Ubuntu Disc or the wrong architecture?')
  236.         len(self.packages) == 0
  237.         if self._verifyRelease(self.signatures):
  238.             self._copyRelease(self.signatures)
  239.         
  240.         self._copyPackages(self.packages)
  241.         self._copyTranslations(self.i18n)
  242.         diskname = self._readDiskName()
  243.         if not diskname:
  244.             logging.error('no .disk/ directory found')
  245.             return False
  246.         debline = self._generateSourcesListLine(diskname, self.packages)
  247.         sourceslist = apt_pkg.Config.FindFile('Dir::Etc::sourcelist')
  248.         content = open(sourceslist).read()
  249.         open(sourceslist, 'w').write('# added by the release upgrader\n%s\n%s' % (debline, content))
  250.         self._writeDatabase()
  251.         return True
  252.  
  253.     
  254.     def add(self, backup_ext = None):
  255.         """ add a cdrom to apt's database """
  256.         logging.debug("AptCdrom.add() called with '%s'", self.cdrompath)
  257.         if backup_ext:
  258.             cdromstate = os.path.join(apt_pkg.Config.FindDir('Dir::State'), apt_pkg.Config.Find('Dir::State::cdroms'))
  259.             if os.path.exists(cdromstate):
  260.                 shutil.copy(cdromstate, cdromstate + backup_ext)
  261.             
  262.         
  263.         apt_pkg.Config.Set('Acquire::cdrom::mount', self.cdrompath)
  264.         apt_pkg.Config.Set('APT::CDROM::NoMount', 'true')
  265.         progress = self.view.getCdromProgress()
  266.         
  267.         try:
  268.             res = self._doAdd()
  269.         except (SystemError, AptCdromError):
  270.             e = None
  271.             logging.error("can't add cdrom: %s" % e)
  272.             self.view.error(_('Failed to add the CD'), _("There was a error adding the CD, the upgrade will abort. Please report this as a bug if this is a valid Ubuntu CD.\n\nThe error message was:\n'%s'") % e)
  273.             return False
  274.  
  275.         logging.debug('AptCdrom.add() returned: %s' % res)
  276.         return res
  277.  
  278.     
  279.     def __nonzero__(self):
  280.         """ helper to use this as 'if cdrom:' """
  281.         return self.cdrompath is not None
  282.  
  283.  
  284.