Coverage for snapcraft/repo : 39%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- # # Copyright (C) 2015 Canonical Ltd # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>.
'''deb http://${prefix}.ubuntu.com/${suffix}/ ${release} main restricted deb http://${prefix}.ubuntu.com/${suffix}/ ${release}-updates main restricted deb http://${prefix}.ubuntu.com/${suffix}/ ${release} universe deb http://${prefix}.ubuntu.com/${suffix}/ ${release}-updates universe deb http://${prefix}.ubuntu.com/${suffix}/ ${release} multiverse deb http://${prefix}.ubuntu.com/${suffix}/ ${release}-updates multiverse deb http://${security}.ubuntu.com/${suffix} ${release}-security main restricted deb http://${security}.ubuntu.com/${suffix} ${release}-security universe deb http://${security}.ubuntu.com/${suffix} ${release}-security multiverse '''
def message(self): return 'The Ubuntu package "{}" was not found'.format( self.package_name)
self.package_name = package_name
def message(self): return 'Error while provisioning "{}"'.format(self.package_name)
self.package_name = package_name
self.downloaddir = os.path.join(rootdir, 'download') self.rootdir = rootdir self.recommends = recommends sources = sources or _DEFAULT_SOURCES local = False
if 'SNAPCRAFT_LOCAL_SOURCES' in os.environ: print('using local sources') sources = _get_local_sources_list() local = True self.apt_cache, self.apt_progress = _setup_apt_cache( rootdir, sources, local)
os.makedirs(self.downloaddir, exist_ok=True)
manifest_dep_names = self._manifest_dep_names()
for name in package_names: try: self.apt_cache[name].mark_install() except KeyError: raise PackageNotFoundError(name)
skipped_essential = [] skipped_blacklisted = []
# unmark some base packages here # note that this will break the consistency check inside apt_cache # (self.apt_cache.broken_count will be > 0) # but that is ok as it was consistent before we excluded # these base package for pkg in self.apt_cache: # those should be already on each system, it also prevents # diving into downloading libc6 if (pkg.candidate.priority in 'essential' and pkg.name not in package_names): skipped_essential.append(pkg.name) pkg.mark_keep() continue if (pkg.name in manifest_dep_names and pkg.name not in package_names): skipped_blacklisted.append(pkg.name) pkg.mark_keep() continue
if skipped_essential: print('Skipping priority essential packages:', skipped_essential) if skipped_blacklisted: print('Skipping blacklisted from manifest packages:', skipped_blacklisted)
# download the remaining ones with proper progress apt.apt_pkg.config.set("Dir::Cache::Archives", self.downloaddir) self.apt_cache.fetch_archives(progress=self.apt_progress)
pkgs_abs_path = glob.glob(os.path.join(self.downloaddir, '*.deb')) for pkg in pkgs_abs_path: # TODO needs elegance and error control try: subprocess.check_call(['dpkg-deb', '--extract', pkg, rootdir]) except subprocess.CalledProcessError: raise UnpackError(pkg)
_fix_contents(rootdir) _fix_xml_tools(rootdir)
manifest_dep_names = set()
with open(os.path.abspath(os.path.join(__file__, '..', 'manifest.txt'))) as f: for line in f: pkg = line.strip() if pkg in self.apt_cache: manifest_dep_names.add(pkg)
return manifest_dep_names
sources_list = glob.glob('/etc/apt/sources.list.d/*.list') sources_list.append('/etc/apt/sources.list')
sources = '' for source in sources_list: with open(source) as f: sources += f.read()
return sources
try: with urllib.request.urlopen(_GEOIP_SERVER) as f: xml_data = f.read() et = ElementTree.fromstring(xml_data) cc = et.find("CountryCode") if cc is None: return "" return cc.text.lower() except (ElementTree.ParseError, urllib.error.URLError): pass return ''
else:
'prefix': prefix, 'release': release, 'suffix': suffix, 'security': security, })
os.makedirs(os.path.join(rootdir, 'etc', 'apt'), exist_ok=True) srcfile = os.path.join(rootdir, 'etc', 'apt', 'sources.list')
if not local: arch = snapcraft.common.get_arch() series = platform.linux_distribution()[2] sources = _format_sources_list(sources, arch, series)
with open(srcfile, 'w') as f: f.write(sources)
# Do not install recommends apt.apt_pkg.config.set('Apt::Install-Recommends', 'False')
# Make sure we always use the system GPG configuration, even with # apt.Cache(rootdir). for key in 'Dir::Etc::Trusted', 'Dir::Etc::TrustedParts': apt.apt_pkg.config.set(key, apt.apt_pkg.config.find_file(key))
progress = apt.progress.text.AcquireProgress() if not os.isatty(1): # Make output more suitable for logging. progress.pulse = lambda owner: True progress._width = 0
apt_cache = apt.Cache(rootdir=rootdir, memonly=True) apt_cache.update(fetch_progress=progress, sources_list=srcfile) apt_cache.open()
return apt_cache, progress
''' Sometimes debs will contain absolute symlinks (e.g. if the relative path would go all the way to root, they just do absolute). We can't have that, so instead clean those absolute symlinks.
Some unpacked items will also contain suid binaries which we do not want in the resulting snap. ''' # Symlinks to directories will be in dirs, while symlinks to # non-directories will be in files. logger.debug('Skipping {}'.format(target)) continue
xml2_config_path = os.path.join(root, 'usr', 'bin', 'xml2-config') if os.path.isfile(xml2_config_path): snapcraft.common.run( ['sed', '-i', '-e', 's|prefix=/usr|prefix={}/usr|'. format(root), xml2_config_path])
xslt_config_path = os.path.join(root, 'usr', 'bin', 'xslt-config') if os.path.isfile(xslt_config_path): snapcraft.common.run( ['sed', '-i', '-e', 's|prefix=/usr|prefix={}/usr|'. format(root), xslt_config_path])
global _skip_list
logger.warning( 'Copying needed target link from the system {}'.format(real_path)) os.makedirs(os.path.dirname(target), exist_ok=True) shutil.copyfile(os.readlink(path), target) return True else: '{} will be a dangling symlink'.format(path)) |