Files
pisi/patches/add-non-root-build-support.patch
T
2011-05-24 12:07:15 +00:00

284 lines
11 KiB
Diff

Index: pisi/package.py
===================================================================
--- pisi/package.py (revision 34443)
+++ pisi/package.py (working copy)
@@ -170,7 +170,7 @@
tar = archive.ArchiveTar(fileobj=archive_file,
arch_type=archive_format,
no_same_permissions=False,
- no_same_owner=False)
+ no_same_owner=True)
return tar
Index: pisi/operations/build.py
===================================================================
--- pisi/operations/build.py (revision 34443)
+++ pisi/operations/build.py (working copy)
@@ -277,7 +277,7 @@
self.spec.getSourceVersion() + '-' + \
self.spec.getSourceRelease()
return util.join_path(ctx.config.dest_dir(),
- ctx.config.values.dirs.tmp_dir,
+ ctx.config.tmp_dir(),
packageDir)
def pkg_work_dir(self):
@@ -886,12 +886,43 @@
frpath = util.removepathprefix(install_dir, fpath) # relative path
ftype, permanent = get_file_type(frpath, package.files)
fsize = long(util.dir_size(fpath))
+
if not os.path.islink(fpath):
st = os.stat(fpath)
else:
st = os.lstat(fpath)
+
+ _uid = str(st.st_uid)
+ _gid = str(st.st_gid)
+
+ for afile in package.additionalFiles:
+ # FIXME: Better way?
+ if frpath == util.removepathprefix("/",afile.target):
+ # This is an additional file, uid and gid will change
+ if afile.owner:
+ try:
+ _uid = str(pwd.getpwnam(afile.owner)[2])
+ except KeyError:
+ ctx.ui.warning(_("No user named '%s' found "
+ "on the system") % afile.owner)
+ if afile.group:
+ try:
+ _gid = str(grp.getgrnam(afile.group)[2])
+ except KeyError:
+ ctx.ui.warning(_("No group named '%s' found "
+ "on the system") % afile.group)
+ else:
+ try:
+ # Assume owner == root if no group is given
+ _gid = str(grp.getgrnam(afile.owner)[2])
+ except KeyError:
+ ctx.ui.warning(_("No group named '%s' (value "
+ "guessed from owner) found "
+ "on the system") % afile.owner)
+ break
+
d[frpath] = pisi.files.FileInfo(path=frpath, type=ftype, permanent=permanent,
- size=fsize, hash=fhash, uid=str(st.st_uid), gid=str(st.st_gid),
+ size=fsize, hash=fhash, uid=_uid, gid=_gid,
mode=oct(stat.S_IMODE(st.st_mode)))
if stat.S_IMODE(st.st_mode) & stat.S_ISUID:
ctx.ui.warning(_("/%s has suid bit set") % frpath)
@@ -960,21 +991,12 @@
install_dir + os.path.dirname(afile.target),
os.path.basename(afile.target))
util.copy_file(src, dest)
+
+ # FIXME: Check that chmodding is safe for non-root builds
if afile.permission:
# mode is octal!
os.chmod(dest, int(afile.permission, 8))
- if afile.owner:
- try:
- os.chown(dest, pwd.getpwnam(afile.owner)[2], -1)
- except KeyError:
- ctx.ui.warning(_("No user named '%s' found "
- "on the system") % afile.owner)
- if afile.group:
- try:
- os.chown(dest, -1, grp.getgrnam(afile.group)[2])
- except KeyError:
- ctx.ui.warning(_("No group named '%s' found "
- "on the system") % afile.group)
+
os.chdir(c)
# Show the files those are not collected from the install dir
Index: pisi/config.py
===================================================================
--- pisi/config.py (revision 34443)
+++ pisi/config.py (working copy)
@@ -118,8 +118,13 @@
return self.subdir(self.values.dirs.packages_dir)
def archives_dir(self):
- return self.subdir(self.values.dirs.archives_dir)
+ retval = self.subdir(self.values.dirs.archives_dir)
+ # check write access
+ if not os.access(retval, os.W_OK):
+ retval = self.tmp_dir()
+ return retval
+
def cache_root_dir(self):
return self.subdir(self.values.dirs.cache_root_dir)
@@ -136,16 +141,15 @@
return self.subdir(self.values.dirs.index_dir)
def tmp_dir(self):
- sysdir = self.subdir(self.values.dirs.tmp_dir)
- if os.environ.has_key('USER'):
- userdir = self.subdir('/tmp/pisi-' + os.environ['USER'])
- else:
- userdir = self.subdir('/tmp/pisi-root')
+ retval = self.subdir(self.values.dirs.tmp_dir)
+ userdir = self.subdir("/tmp/pisi-%s" % \
+ os.environ.get("USER", "root"))
+
# check write access
- if os.access(sysdir, os.W_OK):
- return sysdir
- else:
- return userdir
+ if not os.access(retval, os.W_OK):
+ retval = userdir
+ return retval
+
#TODO: remove this
config = Config()
Index: pisi/atomicoperations.py
===================================================================
--- pisi/atomicoperations.py (revision 34443)
+++ pisi/atomicoperations.py (working copy)
@@ -112,7 +112,7 @@
# Bug 4113
if not cached_file:
downloaded_file = install_op.package.filepath
- if pisi.util.sha1_file(downloaded_file) != pkg_hash:
+ if util.sha1_file(downloaded_file) != pkg_hash:
raise pisi.Error(_("Download Error: Package does not match the repository package."))
return install_op
@@ -213,7 +213,7 @@
for f in self.files.list:
if self.filesdb.has_file(f.path):
pkg, existing_file = self.filesdb.get_file(f.path)
- dst = pisi.util.join_path(ctx.config.dest_dir(), f.path)
+ dst = util.join_path(ctx.config.dest_dir(), f.path)
if pkg != self.pkginfo.name and not os.path.isdir(dst) and really_conflicts(pkg):
file_conflicts.append( (pkg, existing_file) )
if file_conflicts:
@@ -283,6 +283,13 @@
def postinstall(self):
self.config_later = False
+
+ # Chowning for additional files
+ for _file in self.package.get_files().list:
+ fpath = util.join_path(ctx.config.dest_dir(), _file.path)
+ print "** chowning in postinstall (%s:%s)" % (_file.uid, _file.gid)
+ os.chown(fpath, int(_file.uid), int(_file.gid))
+
if ctx.comar:
import pisi.comariface
try:
@@ -318,8 +325,8 @@
config_changed = []
def check_config_changed(config):
- fpath = pisi.util.join_path(ctx.config.dest_dir(), config.path)
- if pisi.util.config_changed(config):
+ fpath = util.join_path(ctx.config.dest_dir(), config.path)
+ if util.config_changed(config):
config_changed.append(fpath)
self.historydb.save_config(self.pkginfo.name, fpath)
if os.path.exists(fpath + '.old'):
@@ -603,9 +610,9 @@
if fileinfo.permanent and not remove_permanent:
return
-
- fpath = pisi.util.join_path(ctx.config.dest_dir(), fileinfo.path)
+ fpath = util.join_path(ctx.config.dest_dir(), fileinfo.path)
+
historydb = pisi.db.historydb.HistoryDB()
filesdb = pisi.db.filesdb.FilesDB()
# we should check if the file belongs to another
@@ -626,7 +633,7 @@
# and when the package is reinstalled the symlink will
# link to that changed file again.
try:
- if os.path.islink(fpath) or pisi.util.sha1_file(fpath) == fileinfo.hash:
+ if os.path.islink(fpath) or util.sha1_file(fpath) == fileinfo.hash:
os.unlink(fpath)
else:
# keep changed file in history
@@ -635,7 +642,7 @@
# after saving to history db, remove the config file any way
if ctx.get_option("purge"):
os.unlink(fpath)
- except pisi.util.FileError:
+ except util.FileError:
pass
else:
if os.path.isfile(fpath) or os.path.islink(fpath):
Index: pisi/cli/build.py
===================================================================
--- pisi/cli/build.py (revision 34443)
+++ pisi/cli/build.py (working copy)
@@ -160,8 +160,8 @@
if not self.options.quiet:
self.options.debug = True
+ self.init(False, False)
if self.options.package_format == "help":
- self.init(False, False)
ctx.ui.info(_("Supported package formats:"))
for format in pisi.package.Package.formats:
if format == pisi.package.Package.default_format:
@@ -170,8 +170,6 @@
ctx.ui.info(" %s" % format)
return
- self.init()
-
if ctx.get_option('output_dir'):
ctx.ui.info(_('Output directory: %s')
% ctx.config.options.output_dir)
Index: pisi/archive.py
===================================================================
--- pisi/archive.py (revision 34443)
+++ pisi/archive.py (working copy)
@@ -251,7 +251,7 @@
This class provides the unpack magic for tar archives."""
def __init__(self, file_path=None, arch_type="tar",
no_same_permissions=True,
- no_same_owner=True,
+ no_same_owner=False,
fileobj=None):
super(ArchiveTar, self).__init__(file_path, arch_type)
self.tar = None
@@ -288,11 +288,10 @@
oldwd = os.getcwd()
except OSError:
pass
+
+ print "** %s" % target_dir
os.chdir(target_dir)
- uid = os.getuid()
- gid = os.getgid()
-
for tarinfo in self.tar:
if callback:
callback(tarinfo, extracted=False)
@@ -309,9 +308,15 @@
os.chmod(tarinfo.name, tarinfo.mode & ~ctx.const.umask)
if self.no_same_owner:
+ uid = os.getuid()
+ gid = os.getgid()
+
+
if not os.path.islink(tarinfo.name):
+ print "******** Chowning %s (%s:%s)" % (tarinfo.name, uid, gid)
os.chown(tarinfo.name, uid, gid)
else:
+ print "******** LChowning %s (%s:%s)" % (tarinfo.name, uid, gid)
os.lchown(tarinfo.name, uid, gid)
if callback: