def _unsquashfs_lls(self, snap_pkg): '''Run unsquashfs -lls on a snap package''' return cmd(['unsquashfs', '-lls', snap_pkg])
def _get_sha512sum(self, fn): '''Pretend we found performed a sha512''' (rc, out) = common.cmd(['sha512sum', os.path.realpath(__file__)]) if rc != 0: return None return out.split()[0]
def check_squashfs_resquash(self): '''Check resquash of squashfs''' if not self.is_snap2: return fn = os.path.abspath(self.pkg_filename) # Verify squashfs supports the -fstime option, if not, warn (which # blocks in store) (rc, out) = cmd(['unsquashfs', '-fstime', fn]) if rc != 0: t = 'warn' n = self._get_check_name('squashfs_supports_fstime') s = 'could not determine fstime of squashfs' self._add_result(t, n, s) return fstime = out.strip() # For now, skip the checks on if have symlinks due to LP: #1555305 (rc, out) = cmd(['unsquashfs', '-lls', fn]) if rc != 0: t = 'error' n = self._get_check_name('squashfs_lls') s = 'could not list contents of squashfs' self._add_result(t, n, s) return elif 'lrwxrwxrwx' in out: t = 'info' n = self._get_check_name('squashfs_resquash_1555305') s = 'cannot reproduce squashfs' link = 'https://launchpad.net/bugs/1555305' self._add_result(t, n, s, link=link) return # end LP: #1555305 workaround tmpdir = create_tempdir() # this is autocleaned tmp_unpack = os.path.join(tmpdir, 'squashfs-root') tmp_repack = os.path.join(tmpdir, 'repack.snap') curdir = os.getcwd() os.chdir(tmpdir) # ensure we don't alter the permissions from the unsquashfs old_umask = os.umask(000) try: (rc, out) = cmd(['unsquashfs', '-d', tmp_unpack, fn]) if rc != 0: raise ReviewException("could not unsquash '%s': %s" % (os.path.basename(fn), out)) (rc, out) = cmd( ['mksquashfs', tmp_unpack, tmp_repack, '-fstime', fstime] + MKSQUASHFS_OPTS) if rc != 0: raise ReviewException( "could not mksquashfs '%s': %s" % (os.path.relpath(tmp_unpack, tmpdir), out)) except ReviewException as e: t = 'error' n = self._get_check_name('squashfs_resquash') self._add_result(t, n, str(e)) return finally: os.umask(old_umask) os.chdir(curdir) # Now calculate the hashes t = 'info' n = self._get_check_name('squashfs_repack_checksum') s = "OK" (rc, out) = cmd(['sha512sum', fn]) if rc != 0: t = 'error' s = "could not determine checksum of '%s'" % os.path.basename(fn) self._add_result(t, n, s) return orig_sum = out.split()[0] (rc, out) = cmd(['sha512sum', tmp_repack]) if rc != 0: t = 'error' s = "could not determine checksum of '%s'" % \ os.path.relpath(tmp_repack, tmpdir) self._add_result(t, n, s) return repack_sum = out.split()[0] if orig_sum != repack_sum: if 'type' in self.snap_yaml and self.snap_yaml['type'] == 'os': t = 'info' s = 'checksums do not match (expected for os snap)' else: # FIXME: turn this into an error once the squashfs-tools bugs # are fixed # t = 'error' t = 'info' s = "checksums do not match. Please ensure the snap is " + \ "created with either 'snapcraft snap <DIR>' or " + \ "'mksquashfs <dir> <snap> %s'" % " ".join(MKSQUASHFS_OPTS) self._add_result(t, n, s)