| # Copyright 1999-2009 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| import os |
| import selinux |
| import shutil |
| from selinux import is_selinux_enabled, getfilecon, lgetfilecon |
| |
| def copyfile(src, dest): |
| if isinstance(src, unicode): |
| src = src.encode('utf_8', 'replace') |
| if isinstance(dest, unicode): |
| dest = dest.encode('utf_8', 'replace') |
| (rc, ctx) = selinux.lgetfilecon(src) |
| if rc < 0: |
| raise OSError("copyfile: Failed getting context of \"%s\"." % src) |
| |
| setfscreate(ctx) |
| try: |
| shutil.copyfile(src, dest) |
| finally: |
| setfscreate() |
| |
| def getcontext(): |
| (rc, ctx) = selinux.getcon() |
| if rc < 0: |
| raise OSError("getcontext: Failed getting current process context.") |
| |
| return ctx |
| |
| def mkdir(target, refdir): |
| if isinstance(target, unicode): |
| target = target.encode('utf_8', 'replace') |
| if isinstance(refdir, unicode): |
| refdir = refdir.encode('utf_8', 'replace') |
| (rc, ctx) = selinux.getfilecon(refdir) |
| if rc < 0: |
| raise OSError( |
| "mkdir: Failed getting context of reference directory \"%s\"." \ |
| % refdir) |
| |
| setfscreatecon(ctx) |
| try: |
| os.mkdir(target) |
| finally: |
| setfscreatecon() |
| |
| def rename(src, dest): |
| if isinstance(src, unicode): |
| src = src.encode('utf_8', 'replace') |
| if isinstance(dest, unicode): |
| dest = dest.encode('utf_8', 'replace') |
| (rc, ctx) = selinux.lgetfilecon(src) |
| if rc < 0: |
| raise OSError("rename: Failed getting context of \"%s\"." % src) |
| |
| setfscreate(ctx) |
| try: |
| os.rename(src,dest) |
| finally: |
| setfscreate() |
| |
| def setexec(ctx="\n"): |
| if selinux.setexeccon(ctx) < 0: |
| raise OSError("setexec: Failed setting exec() context \"%s\"." % ctx) |
| |
| def setfscreate(ctx="\n"): |
| if selinux.setfscreatecon(ctx) < 0: |
| raise OSError( |
| "setfscreate: Failed setting fs create context \"%s\"." % ctx) |
| |
| def spawn(selinux_type, spawn_func, mycommand, opt_name=None, **keywords): |
| con = getcontext().split(":") |
| con[2] = selinux_type |
| setexec(":".join(con)) |
| try: |
| return spawn_func(mycommand, opt_name=opt_name, **keywords) |
| finally: |
| setexec() |
| |
| def symlink(target, link, reflnk): |
| if isinstance(target, unicode): |
| target = target.encode('utf_8', 'replace') |
| if isinstance(link, unicode): |
| link = link.encode('utf_8', 'replace') |
| if isinstance(reflnk, unicode): |
| reflnk = reflnk.encode('utf_8', 'replace') |
| (rc, ctx) = selinux.lgetfilecon(reflnk) |
| if rc < 0: |
| raise OSError( |
| "symlink: Failed getting context of reference symlink \"%s\"." \ |
| % reflnk) |
| |
| setfscreate(ctx) |
| try: |
| os.symlink(target, link) |
| finally: |
| setfscreate() |