blob: 4c73bf92df96bf5f62cec9513224459c30703b86 [file] [log] [blame]
/* Author: James Athey
*/
/* Never build rpm_execcon interface */
#ifndef DISABLE_RPM
#define DISABLE_RPM
#endif
%module selinux
%{
#include "selinux/selinux.h"
%}
%pythoncode %{
import shutil
import os
DISABLED = -1
PERMISSIVE = 0
ENFORCING = 1
def restorecon(path, recursive=False, verbose=False, force=False):
""" Restore SELinux context on a given path
Arguments:
path -- The pathname for the file or directory to be relabeled.
Keyword arguments:
recursive -- Change files and directories file labels recursively (default False)
verbose -- Show changes in file labels (default False)
force -- Force reset of context to match file_context for customizable files,
and the default file context, changing the user, role, range portion as well
as the type (default False)
"""
restorecon_flags = SELINUX_RESTORECON_IGNORE_DIGEST | SELINUX_RESTORECON_REALPATH
if recursive:
restorecon_flags |= SELINUX_RESTORECON_RECURSE
if verbose:
restorecon_flags |= SELINUX_RESTORECON_VERBOSE
if force:
restorecon_flags |= SELINUX_RESTORECON_SET_SPECFILE_CTX
selinux_restorecon(os.path.expanduser(path), restorecon_flags)
def chcon(path, context, recursive=False):
""" Set the SELinux context on a given path """
lsetfilecon(path, context)
if recursive:
for root, dirs, files in os.walk(path):
for name in files + dirs:
lsetfilecon(os.path.join(root, name), context)
def copytree(src, dest):
""" An SELinux-friendly shutil.copytree method """
shutil.copytree(src, dest)
restorecon(dest, recursive=True)
def install(src, dest):
""" An SELinux-friendly shutil.move method """
shutil.move(src, dest)
restorecon(dest, recursive=True)
%}
/* security_get_boolean_names() typemap */
%typemap(argout) (char ***names, int *len) {
PyObject* list = PyList_New(*$2);
int i;
for (i = 0; i < *$2; i++) {
PyList_SetItem(list, i, PyString_FromString((*$1)[i]));
}
$result = SWIG_Python_AppendOutput($result, list);
}
/* return a sid along with the result */
%typemap(argout) (security_id_t * sid) {
if (*$1) {
%append_output(SWIG_NewPointerObj(*$1, $descriptor(security_id_t), 0));
} else {
Py_INCREF(Py_None);
%append_output(Py_None);
}
}
%typemap(in,numinputs=0) security_id_t *(security_id_t temp) {
$1 = &temp;
}
%typemap(in, numinputs=0) void *(char *temp=NULL) {
$1 = temp;
}
/* Makes security_compute_user() return a Python list of contexts */
%typemap(argout) (char ***con) {
PyObject* plist;
int i, len = 0;
if (*$1) {
while((*$1)[len])
len++;
plist = PyList_New(len);
for (i = 0; i < len; i++) {
PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
}
} else {
plist = PyList_New(0);
}
$result = SWIG_Python_AppendOutput($result, plist);
}
/* Makes functions in get_context_list.h return a Python list of contexts */
%typemap(argout) (char ***list) {
PyObject* plist;
int i;
if (*$1) {
plist = PyList_New(result);
for (i = 0; i < result; i++) {
PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
}
} else {
plist = PyList_New(0);
}
/* Only return the Python list, don't need to return the length anymore */
$result = plist;
}
%typemap(in,noblock=1,numinputs=0) char ** (char * temp = 0) {
$1 = &temp;
}
%typemap(freearg,match="in") char ** "";
%typemap(argout,noblock=1) char ** {
if (*$1) {
%append_output(SWIG_FromCharPtr(*$1));
freecon(*$1);
}
else {
Py_INCREF(Py_None);
%append_output(Py_None);
}
}
%typemap(in,noblock=1,numinputs=0) char ** (char * temp = 0) {
$1 = &temp;
}
%typemap(freearg,match="in") char ** "";
%typemap(argout,noblock=1) char ** {
if (*$1) {
%append_output(SWIG_FromCharPtr(*$1));
free(*$1);
}
else {
Py_INCREF(Py_None);
%append_output(Py_None);
}
}
%include "selinuxswig_python_exception.i"
%include "selinuxswig.i"