From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57166) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d0vlq-0004jt-7K for guix-patches@gnu.org; Wed, 19 Apr 2017 16:00:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d0vlj-0000Wy-2R for guix-patches@gnu.org; Wed, 19 Apr 2017 16:00:10 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:59205) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d0vli-0000WK-Uo for guix-patches@gnu.org; Wed, 19 Apr 2017 16:00:03 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1d0vli-0003LA-Mz for guix-patches@gnu.org; Wed, 19 Apr 2017 16:00:02 -0400 Subject: bug#26561: [PATCH 9/9] gnu: Add policycoreutils. Resent-Message-ID: From: Marius Bakke In-Reply-To: <20170419142918.11688-9-rekado@elephly.net> References: <20170419142918.11688-1-rekado@elephly.net> <20170419142918.11688-9-rekado@elephly.net> Date: Wed, 19 Apr 2017 21:59:29 +0200 Message-ID: <87tw5ktbha.fsf@fastmail.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: Ricardo Wurmus , 26561@debbugs.gnu.org --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Ricardo Wurmus writes: > * gnu/packages/selinux.scm (policycoreutils): New variable. > --- > gnu/local.mk | 1 + > ...policycoreutils-make-sepolicy-use-python3.patch | 335 +++++++++++++++= ++++++ > gnu/packages/selinux.scm | 135 +++++++++ > 3 files changed, 471 insertions(+) > create mode 100644 gnu/packages/patches/policycoreutils-make-sepolicy-us= e-python3.patch > > diff --git a/gnu/local.mk b/gnu/local.mk > index 77302573a..79ffbe2fe 100644 > --- a/gnu/local.mk > +++ b/gnu/local.mk > @@ -856,6 +856,7 @@ dist_patch_DATA =3D \ > %D%/packages/patches/plink-endian-detection.patch \ > %D%/packages/patches/plotutils-libpng-jmpbuf.patch \ > %D%/packages/patches/polkit-drop-test.patch \ > + %D%/packages/patches/policycoreutils-make-sepolicy-use-python3.patch \ > %D%/packages/patches/portaudio-audacity-compat.patch \ > %D%/packages/patches/portmidi-modular-build.patch \ > %D%/packages/patches/procmail-ambiguous-getline-debian.patch \ > diff --git a/gnu/packages/patches/policycoreutils-make-sepolicy-use-pytho= n3.patch b/gnu/packages/patches/policycoreutils-make-sepolicy-use-python3.p= atch > new file mode 100644 > index 000000000..befe9fbb2 > --- /dev/null > +++ b/gnu/packages/patches/policycoreutils-make-sepolicy-use-python3.patch > @@ -0,0 +1,335 @@ > +Downloaded from https://anonscm.debian.org/cgit/selinux/policycoreutils.= git/plain/debian/patches/policycoreutils-Make-sepolicy-work-with-python3.pa= tch > + > +From 2d7ca0b862a35196d562f59bd098df011fd7f0e6 Mon Sep 17 00:00:00 2001 > +From: Laurent Bigonville > +Date: Mon, 7 Nov 2016 10:51:08 +0100 > +Subject: [PATCH] policycoreutils: Make sepolicy work with python3 > + > +Add python3 support for sepolicy > + > +Signed-off-by: Laurent Bigonville > +--- > + policycoreutils/sepolicy/selinux_client.py | 6 ++-- > + policycoreutils/sepolicy/sepolicy.py | 38 ++++++++++++-----= ------- > + policycoreutils/sepolicy/sepolicy/__init__.py | 16 ++++++---- > + policycoreutils/sepolicy/sepolicy/communicate.py | 4 +-- > + policycoreutils/sepolicy/sepolicy/generate.py | 30 +++++++++--------= -- > + policycoreutils/sepolicy/sepolicy/interface.py | 14 ++++++--- > + policycoreutils/sepolicy/sepolicy/manpage.py | 7 +++-- > + 7 files changed, 65 insertions(+), 50 deletions(-) > + > +diff --git a/policycoreutils/sepolicy/selinux_client.py b/policycoreutil= s/sepolicy/selinux_client.py > +index 7f4a91c..dc29f28 100644 > +--- a/sepolicy/selinux_client.py > ++++ b/sepolicy/selinux_client.py > +@@ -39,6 +39,6 @@ if __name__ =3D=3D "__main__": > + try: > + dbus_proxy =3D SELinuxDBus() > + resp =3D dbus_proxy.customized() > +- print convert_customization(resp) > +- except dbus.DBusException, e: > +- print e > ++ print(convert_customization(resp)) > ++ except dbus.DBusException as e: > ++ print(e) > +diff --git a/policycoreutils/sepolicy/sepolicy.py b/policycoreutils/sepo= licy/sepolicy.py > +index 3e502a7..5bf9b52 100755 > +--- a/sepolicy/sepolicy.py > ++++ b/sepolicy/sepolicy.py > +@@ -262,7 +262,7 @@ def _print_net(src, protocol, perm): > + if len(portdict) > 0: > + bold_start =3D "\033[1m" > + bold_end =3D "\033[0;0m" > +- print "\n" + bold_start + "%s: %s %s" % (src, protocol, perm) += bold_end > ++ print("\n" + bold_start + "%s: %s %s" % (src, protocol, perm) += bold_end) > + port_strings =3D [] > + boolean_text =3D "" > + for p in portdict: > +@@ -275,7 +275,7 @@ def _print_net(src, protocol, perm): > + port_strings.append("%s (%s)" % (", ".join(recs), t= )) > + port_strings.sort(numcmp) > + for p in port_strings: > +- print "\t" + p > ++ print("\t" + p) > +=20 > +=20 > + def network(args): > +@@ -286,7 +286,7 @@ def network(args): > + if i[0] not in all_ports: > + all_ports.append(i[0]) > + all_ports.sort() > +- print "\n".join(all_ports) > ++ print("\n".join(all_ports)) > +=20 > + for port in args.port: > + found =3D False > +@@ -297,18 +297,18 @@ def network(args): > + else: > + range =3D "%s-%s" % (i[0], i[1]) > + found =3D True > +- print "%d: %s %s %s" % (port, i[2], portrecsbynum[i][0]= , range) > ++ print("%d: %s %s %s" % (port, i[2], portrecsbynum[i][0]= , range)) > + if not found: > + if port < 500: > +- print "Undefined reserved port type" > ++ print("Undefined reserved port type") > + else: > +- print "Undefined port type" > ++ print("Undefined port type") > +=20 > + for t in args.type: > + if (t, 'tcp') in portrecs.keys(): > +- print "%s: tcp: %s" % (t, ",".join(portrecs[t, 'tcp'])) > ++ print("%s: tcp: %s" % (t, ",".join(portrecs[t, 'tcp']))) > + if (t, 'udp') in portrecs.keys(): > +- print "%s: udp: %s" % (t, ",".join(portrecs[t, 'udp'])) > ++ print( "%s: udp: %s" % (t, ",".join(portrecs[t, 'udp']))) > +=20 > + for a in args.applications: > + d =3D sepolicy.get_init_transtype(a) > +@@ -357,7 +357,7 @@ def manpage(args): > +=20 > + for domain in test_domains: > + m =3D ManPage(domain, path, args.root, args.source_files, args.= web) > +- print m.get_man_page_path() > ++ print(m.get_man_page_path()) > +=20 > + if args.web: > + HTMLManPages(manpage_roles, manpage_domains, path, args.os) > +@@ -418,7 +418,7 @@ def communicate(args): > + out =3D list(set(writable) & set(readable)) > +=20 > + for t in out: > +- print t > ++ print(t) > +=20 > +=20 > + def gen_communicate_args(parser): > +@@ -445,7 +445,7 @@ def booleans(args): > + args.booleans.sort() > +=20 > + for b in args.booleans: > +- print "%s=3D_(\"%s\")" % (b, boolean_desc(b)) > ++ print("%s=3D_(\"%s\")" % (b, boolean_desc(b))) > +=20 > +=20 > + def gen_booleans_args(parser): > +@@ -484,16 +484,16 @@ def print_interfaces(interfaces, args, append=3D""= ): > + for i in interfaces: > + if args.verbose: > + try: > +- print get_interface_format_text(i + append) > ++ print(get_interface_format_text(i + append)) > + except KeyError: > +- print i > ++ print(i) > + if args.compile: > + try: > + interface_compile_test(i) > + except KeyError: > +- print i > ++ print(i) > + else: > +- print i > ++ print(i) > +=20 > +=20 > + def interface(args): > +@@ -565,7 +565,7 @@ def generate(args): > + if args.policytype in APPLICATIONS: > + mypolicy.gen_writeable() > + mypolicy.gen_symbols() > +- print mypolicy.generate(args.path) > ++ print(mypolicy.generate(args.path)) > +=20 > +=20 > + def gen_interface_args(parser): > +@@ -698,12 +698,12 @@ if __name__ =3D=3D '__main__': > + args =3D parser.parse_args(args=3Dparser_args) > + args.func(args) > + sys.exit(0) > +- except ValueError, e: > ++ except ValueError as e: > + sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) > + sys.exit(1) > +- except IOError, e: > ++ except IOError as e: > + sys.stderr.write("%s: %s\n" % (e.__class__.__name__, str(e))) > + sys.exit(1) > + except KeyboardInterrupt: > +- print "Out" > ++ print("Out") > + sys.exit(0) > +diff --git a/policycoreutils/sepolicy/sepolicy/__init__.py b/policycoreu= tils/sepolicy/sepolicy/__init__.py > +index 8fbd5b4..fee6438 100644 > +--- a/sepolicy/sepolicy/__init__.py > ++++ b/sepolicy/sepolicy/__init__.py > +@@ -695,7 +695,7 @@ def get_methods(): > + # List of per_role_template interfaces > + ifs =3D interfaces.InterfaceSet() > + ifs.from_file(fd) > +- methods =3D ifs.interfaces.keys() > ++ methods =3D list(ifs.interfaces.keys()) > + fd.close() > + except: > + sys.stderr.write("could not open interface info [%s]\n" % fn) > +@@ -752,7 +752,10 @@ def get_all_entrypoint_domains(): > +=20 > +=20 > + def gen_interfaces(): > +- import commands > ++ try: > ++ from commands import getstatusoutput > ++ except ImportError: > ++ from subprocess import getstatusoutput > + ifile =3D defaults.interface_info() > + headers =3D defaults.headers() > + try: > +@@ -763,7 +766,7 @@ def gen_interfaces(): > +=20 > + if os.getuid() !=3D 0: > + raise ValueError(_("You must regenerate interface info by runni= ng /usr/bin/sepolgen-ifgen")) > +- print(commands.getstatusoutput("/usr/bin/sepolgen-ifgen")[1]) > ++ print(getstatusoutput("/usr/bin/sepolgen-ifgen")[1]) > +=20 > +=20 > + def gen_port_dict(): > +@@ -1085,8 +1088,11 @@ def get_os_version(): > + os_version =3D "" > + pkg_name =3D "selinux-policy" > + try: > +- import commands > +- rc, output =3D commands.getstatusoutput("rpm -q '%s'" % pkg_nam= e) > ++ try: > ++ from commands import getstatusoutput > ++ except ImportError: > ++ from subprocess import getstatusoutput > ++ rc, output =3D getstatusoutput("rpm -q '%s'" % pkg_name) > + if rc =3D=3D 0: > + os_version =3D output.split(".")[-2] > + except: > +diff --git a/policycoreutils/sepolicy/sepolicy/communicate.py b/policyco= reutils/sepolicy/sepolicy/communicate.py > +index b96c4b9..299316e 100755 > +--- a/sepolicy/sepolicy/communicate.py > ++++ b/sepolicy/sepolicy/communicate.py > +@@ -34,8 +34,8 @@ def usage(parser, msg): > +=20 > + def expand_attribute(attribute): > + try: > +- return sepolicy.info(sepolicy.ATTRIBUTE, attribute)[0]["types"] > +- except RuntimeError: > ++ return list(next(sepolicy.info(sepolicy.ATTRIBUTE, attribute))[= "types"]) > ++ except StopIteration: > + return [attribute] > +=20 > +=20 > +diff --git a/policycoreutils/sepolicy/sepolicy/generate.py b/policycoreu= tils/sepolicy/sepolicy/generate.py > +index 65b33b6..5696110 100644 > +--- a/sepolicy/sepolicy/generate.py > ++++ b/sepolicy/sepolicy/generate.py > +@@ -31,21 +31,21 @@ import time > + import types > + import platform > +=20 > +-from templates import executable > +-from templates import boolean > +-from templates import etc_rw > +-from templates import unit_file > +-from templates import var_cache > +-from templates import var_spool > +-from templates import var_lib > +-from templates import var_log > +-from templates import var_run > +-from templates import tmp > +-from templates import rw > +-from templates import network > +-from templates import script > +-from templates import spec > +-from templates import user > ++from .templates import executable > ++from .templates import boolean > ++from .templates import etc_rw > ++from .templates import unit_file > ++from .templates import var_cache > ++from .templates import var_spool > ++from .templates import var_lib > ++from .templates import var_log > ++from .templates import var_run > ++from .templates import tmp > ++from .templates import rw > ++from .templates import network > ++from .templates import script > ++from .templates import spec > ++from .templates import user > + import sepolgen.interfaces as interfaces > + import sepolgen.defaults as defaults > +=20 > +diff --git a/policycoreutils/sepolicy/sepolicy/interface.py b/policycore= utils/sepolicy/sepolicy/interface.py > +index c2cb971..8956f39 100644 > +--- a/sepolicy/sepolicy/interface.py > ++++ b/sepolicy/sepolicy/interface.py > +@@ -192,10 +192,13 @@ def generate_compile_te(interface, idict, name=3D"= compiletest"): > + def get_xml_file(if_file): > + """ Returns xml format of interfaces for given .if policy file""" > + import os > +- import commands > ++ try: > ++ from commands import getstatusoutput > ++ except ImportError: > ++ from subprocess import getstatusoutput > + basedir =3D os.path.dirname(if_file) + "/" > + filename =3D os.path.basename(if_file).split(".")[0] > +- rc, output =3D commands.getstatusoutput("python /usr/share/selinux/= devel/include/support/segenxml.py -w -m %s" % basedir + filename) > ++ rc, output =3D getstatusoutput("python /usr/share/selinux/devel/inc= lude/support/segenxml.py -w -m %s" % basedir + filename) > + if rc !=3D 0: > + sys.stderr.write("\n Could not proceed selected interface file.= \n") > + sys.stderr.write("\n%s" % output) > +@@ -208,7 +211,10 @@ def interface_compile_test(interface, path=3D"/usr/= share/selinux/devel/policy.xml" > + exclude_interfaces =3D ["userdom", "kernel", "corenet", "files", "d= ev"] > + exclude_interface_type =3D ["template"] > +=20 > +- import commands > ++ try: > ++ from commands import getstatusoutput > ++ except ImportError: > ++ from subprocess import getstatusoutput > + import os > + policy_files =3D {'pp': "compiletest.pp", 'te': "compiletest.te", '= fc': "compiletest.fc", 'if': "compiletest.if"} > + idict =3D get_interface_dict(path) > +@@ -219,7 +225,7 @@ def interface_compile_test(interface, path=3D"/usr/s= hare/selinux/devel/policy.xml" > + fd =3D open(policy_files['te'], "w") > + fd.write(generate_compile_te(interface, idict)) > + fd.close() > +- rc, output =3D commands.getstatusoutput("make -f /usr/share= /selinux/devel/Makefile %s" % policy_files['pp']) > ++ rc, output =3D getstatusoutput("make -f /usr/share/selinux/= devel/Makefile %s" % policy_files['pp']) > + if rc !=3D 0: > + sys.stderr.write(output) > + sys.stderr.write(_("\nCompile test for %s failed.\n") %= interface) > +diff --git a/policycoreutils/sepolicy/sepolicy/manpage.py b/policycoreut= ils/sepolicy/sepolicy/manpage.py > +index 7365f93..773a9ab 100755 > +--- a/sepolicy/sepolicy/manpage.py > ++++ b/sepolicy/sepolicy/manpage.py > +@@ -27,7 +27,6 @@ __all__ =3D ['ManPage', 'HTMLManPages', 'manpage_domai= ns', 'manpage_roles', 'gen_d > + import string > + import selinux > + import sepolicy > +-import commands > + import os > + import time > +=20 > +@@ -162,7 +161,11 @@ def get_alphabet_manpages(manpage_list): > +=20 > +=20 > + def convert_manpage_to_html(html_manpage, manpage): > +- rc, output =3D commands.getstatusoutput("/usr/bin/groff -man -Thtml= %s 2>/dev/null" % manpage) > ++ try: > ++ from commands import getstatusoutput > ++ except ImportError: > ++ from subprocess import getstatusoutput > ++ rc, output =3D getstatusoutput("/usr/bin/groff -man -Thtml %s 2>/de= v/null" % manpage) > + if rc =3D=3D 0: > + print(html_manpage, "has been created") > + fd =3D open(html_manpage, 'w') > +--=20 > +2.10.2 > + > diff --git a/gnu/packages/selinux.scm b/gnu/packages/selinux.scm > index 05197b85c..7acda89a6 100644 > --- a/gnu/packages/selinux.scm > +++ b/gnu/packages/selinux.scm > @@ -28,6 +28,10 @@ > #:use-module (gnu packages bison) > #:use-module (gnu packages docbook) > #:use-module (gnu packages flex) > + #:use-module (gnu packages gettext) > + #:use-module (gnu packages glib) > + #:use-module (gnu packages linux) > + #:use-module (gnu packages networking) > #:use-module (gnu packages pcre) > #:use-module (gnu packages pkg-config) > #:use-module (gnu packages python) > @@ -338,3 +342,134 @@ tools, and libraries designed to facilitate SELinux= policy analysis.") > ;; Some programs are under GPL, all libraries under LGPL. > (license (list license:lgpl2.1+ > license:gpl2+)))) > + > +(define-public policycoreutils > + (package (inherit libsepol) > + (name "policycoreutils") > + (source > + (origin (inherit (package-source libsepol)) > + (patches (search-patches "policycoreutils-make-sepolicy-use= -python3.patch")) > + (patch-flags '("-p1" "-d" "policycoreutils")))) > + (arguments > + `(#:test-target "test" > + #:make-flags > + (let ((out (assoc-ref %outputs "out"))) > + (list "CC=3Dgcc" > + (string-append "PREFIX=3D" out) > + (string-append "LOCALEDIR=3D" out "/share/locale") > + (string-append "BASHCOMPLETIONDIR=3D" out > + "/share/bash-completion/completions") > + "INSTALL=3Dinstall -c -p" > + "INSTALL_DIR=3Dinstall -d" > + ;; These ones are needed because some Makefiles define the > + ;; directories relative to DESTDIR, not relative to PREFI= X. > + (string-append "SBINDIR=3D" out "/sbin") > + (string-append "ETCDIR=3D" out "/etc") > + (string-append "SYSCONFDIR=3D" out "/etc/sysconfig") > + (string-append "MAN5DIR=3D" out "/share/man/man5") > + (string-append "INSTALL_NLS_DIR=3D" out "/share/locale") > + (string-append "AUTOSTARTDIR=3D" out "/etc/xdg/autostart") > + (string-append "DBUSSERVICEDIR=3D" out "/share/dbus-1/ser= vices") > + (string-append "SYSTEMDDIR=3D" out "/lib/systemd") > + (string-append "INITDIR=3D" out "/etc/rc.d/init.d") > + (string-append "SELINUXDIR=3D" out "/etc/selinux"))) > + #:phases > + (modify-phases %standard-phases > + (delete 'configure) > + (add-after 'unpack 'enter-dir > + (lambda _ (chdir ,name) #t)) > + (add-after 'enter-dir 'ignore-/usr-tests > + (lambda* (#:key inputs #:allow-other-keys) > + ;; The Makefile decides to build restorecond only if it fin= ds the > + ;; inotify header somewhere under /usr. > + (substitute* "Makefile" > + (("ifeq.*") "") > + (("endif.*") "")) > + ;; Rewrite lookup paths for header files. > + (substitute* '("newrole/Makefile" > + "setfiles/Makefile" > + "run_init/Makefile") > + (("/usr(/include/security/pam_appl.h)" _ file) > + (string-append (assoc-ref inputs "pam") file)) > + (("/usr(/include/libaudit.h)" _ file) > + (string-append (assoc-ref inputs "audit") file))) > + #t)) > + (add-after 'enter-dir 'fix-glib-cflags > + (lambda* (#:key inputs #:allow-other-keys) > + (substitute* "restorecond/Makefile" > + (("/usr(/include/glib-2.0|/lib/glib-2.0/include)" _ path) > + (string-append (assoc-ref inputs "glib") path)) > + (("/usr(/include/dbus-1.0|/lib/dbus-1.0/include)" _ path) > + (string-append (assoc-ref inputs "dbus") path > + " -I" > + (assoc-ref inputs "dbus-glib") path))) > + #t)) > + (add-after 'enter-dir 'fix-linkage-with-libsepol > + (lambda* (#:key inputs #:allow-other-keys) > + (substitute* '("semodule_deps/Makefile" > + "sepolgen-ifgen/Makefile") > + (("\\$\\(LIBDIR\\)") > + (string-append (assoc-ref inputs "libsepol") "/lib/"))))) > + (add-after 'enter-dir 'fix-target-paths > + (lambda* (#:key outputs #:allow-other-keys) > + (let ((out (assoc-ref outputs "out"))) > + (substitute* "audit2allow/sepolgen-ifgen" > + (("ATTR_HELPER =3D \"/usr/bin/sepolgen-ifgen-attr-helpe= r\"") > + (string-append "ATTR_HELPER =3D \"" out > + "/bin/sepolgen-ifgen-attr-helper\""))) > + (substitute* "sepolicy/sepolicy/__init__.py" > + (("/usr/bin/sepolgen-ifgen") > + (string-append out "/bin/sepolgen-ifgen"))) > + (substitute* "sepolicy/Makefile" > + ;; By default all Python files would be installed to > + ;; $out/gnu/store/...-python-.../. > + (("setup.py install.*$") > + (string-append "setup.py install --prefix=3D" out "\n"= )) > + (("\\$\\(DESTDIR\\)/etc") > + (string-append out "/etc")) > + (("\\$\\(DESTDIR\\)/usr") out))) > + #t)) > + (add-after 'install 'wrap-python-tools > + (lambda* (#:key outputs #:allow-other-keys) > + (let* ((out (assoc-ref outputs "out")) > + (var (string-append out "/lib/python3.5/site-package= s:" ^^^ Can we use (version-major+minor (package-version python)) here? I plan to start a 3.6 branch soonish, unless someone beats me to it :) > + (getenv "PYTHONPATH")))) > + ;; The scripts' shebangs tell Python to ignore the PYTHON= PATH, > + ;; so we need to patch them before wrapping. > + (for-each (lambda (file) > + (let ((path (string-append out "/" file))) > + (substitute* path > + (("bin/python -Es") "bin/python -s")) > + (wrap-program path > + `("PYTHONPATH" ":" prefix (,var))))) > + '("bin/audit2allow" > + "bin/chcat" > + "bin/sandbox" > + "bin/sepolgen-ifgen" > + "bin/sepolicy" > + "sbin/semanage"))) > + #t))))) > + (inputs > + `(("python" ,python-wrapper) > + ("audit" ,audit) > + ("pam" ,linux-pam) > + ("libsepol" ,libsepol) > + ("libselinux" ,libselinux) > + ("libsemanage" ,libsemanage) > + ("python-sepolgen" ,python-sepolgen) > + ("python-setools" ,python-setools) > + ("python-ipy" ,python-ipy) > + ("libcap-ng" ,libcap-ng) > + ("pcre" ,pcre) > + ("dbus" ,dbus) > + ("dbus-glib" ,dbus-glib) > + ("glib" ,glib))) > + (native-inputs > + `(("gettext" ,gettext-minimal))) > + (synopsis "SELinux core utilities") > + (description "The policycoreutils package contains the core utilitie= s that > +are required for the basic operation of an SELinux-enabled GNU system an= d its > +policies. These utilities include @code{load_policy} to load policies, > +@code{setfiles} to label file systems, @code{newrole} to switch roles, a= nd > +@code{run_init} to run service scripts in their proper context.") > + (license license:gpl2+))) > --=20 > 2.12.2 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAlj3waEACgkQoqBt8qM6 VPoB6Af+JgrS7WT/eSivtmEieW1tEQY92bLNibSOPHuX+D6kH0oFnZBeJc2iaejH 69x1DJVBQXuPCBiDHED0G/Y2wBt3tBrbMDePL+WYJuF8xHuR+JinINoOvl/+roZ1 gltMFWHiVJEVjyCnsCUDTEhO4hbPNYf0+X6MNTvXsFQwu7f+WhC2NjDrJV+q46vn XLvtZYpKyiqNlepVrKKf2iRyAXdpi2P9QO96E6E7PmNOTgshqWe5vy28rHrtKDKU V7+rd0IIJ6WjtiTCgoYmK4kOdWV9fxoH951798KwiNulyZ6hP9b7X9CNbvUfifX0 2bIuMJ/rlLPi5kOOQXZIoIp4q8vpbg== =HFNl -----END PGP SIGNATURE----- --=-=-=--