[Ovirt-devel] [PATCH node] ovirt-node-selinux: new sub-module, for conforming SELinux policy

Jim Meyering jim at meyering.net
Wed Oct 8 21:19:15 UTC 2008


ovirt-node needs SELinux policy to allow qemu to access the iSCSI block
devices. This is done presently via a script during install, but it
should be done by a subpackage of ovirt-node called ovirt-node-selinux.
Follow the Fedora guidelines for this located at:
http://fedoraproject.org/wiki/PackagingDrafts/SELinux/PolicyModules

* Makefile.am (EXTRA_DIST): Add ovirt-node-selinux.te.
* ovirt-node-selinux.te: New file, with contents from...
* ovirt-listen-awake/ovirt-install-node: ...here.  Remove policy
definition and semodule-running code.
* ovirt-node.spec.in: Update per the above wiki URL.
---
 Makefile.am                           |    6 ++--
 ovirt-listen-awake/ovirt-install-node |   19 ----------
 ovirt-node-selinux.te                 |    8 ++++
 ovirt-node.spec.in                    |   59 ++++++++++++++++++++++++++++++++-
 4 files changed, 69 insertions(+), 23 deletions(-)
 create mode 100644 ovirt-node-selinux.te

diff --git a/Makefile.am b/Makefile.am
index 28aa71e..8ca63dc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,10 +21,11 @@ SUBDIRS = ovirt-identify-node ovirt-listen-awake
 EXTRA_DIST =			\
   .gitignore			\
   ovirt-node.spec		\
-  ovirt-node.spec.in	\
+  ovirt-node.spec.in		\
+  ovirt-node-selinux.te		\
   scripts/collectd		\
   scripts/collectd.conf.in	\
-  scripts/ovirt				\
+  scripts/ovirt			\
   scripts/ovirt-awake		\
   scripts/ovirt-early		\
   scripts/ovirt-functions	\
@@ -48,4 +49,3 @@ publish: rpms
 	createrepo $(OVIRT_CACHE_DIR)/ovirt

 .PHONY: rpms publish
-
diff --git a/ovirt-listen-awake/ovirt-install-node b/ovirt-listen-awake/ovirt-install-node
index c741acf..1d998f4 100644
--- a/ovirt-listen-awake/ovirt-install-node
+++ b/ovirt-listen-awake/ovirt-install-node
@@ -100,22 +100,3 @@ elif [ "$1" = "stateful" ]; then
 else
     usage
 fi
-
-# Common to both stateless and stateful Nodes
-
-if selinuxenabled ; then
-    # make disks available to VMs
-    t=$(mktemp -d)
-    cat > $t/te <<\EOF
-module ovirt 1.0.0;
-require {
-    type fixed_disk_device_t;
-    type qemu_t;
-    class blk_file { ioctl getattr setattr read write };
-}
-allow qemu_t fixed_disk_device_t:blk_file { ioctl getattr setattr read write };
-EOF
-    checkmodule -M -m -o $t/mod $t/te
-    semodule_package -o $t/pp -m $t/mod
-    semodule -i $t/pp
-fi
diff --git a/ovirt-node-selinux.te b/ovirt-node-selinux.te
new file mode 100644
index 0000000..a53d3de
--- /dev/null
+++ b/ovirt-node-selinux.te
@@ -0,0 +1,8 @@
+module ovirt 1.0.0;
+require {
+    type fixed_disk_device_t;
+    type qemu_t;
+    class blk_file { ioctl getattr setattr read write };
+}
+# Give qemu_t access to any block device
+allow qemu_t fixed_disk_device_t:blk_file { ioctl getattr setattr read write };
diff --git a/ovirt-node.spec.in b/ovirt-node.spec.in
index 3dc4e1d..daa3d7f 100644
--- a/ovirt-node.spec.in
+++ b/ovirt-node.spec.in
@@ -6,6 +6,11 @@ Source0:        %{name}-%{version}.tar.gz
 License:        GPLv2+
 Group:          Applications/System

+%define selinux_variants mls strict targeted
+%define selinux_policyver %(sed -n 's,.*selinux-policy-\([^/]*\)/.*,\1,p' /usr/share/selinux/devel/policyhelp)
+%define modulename %{name}-selinux
+Source1:        %{modulename}.te
+
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-buildroot
 URL:            http://www.ovirt.org/
 Requires(post):  /sbin/chkconfig
@@ -26,14 +31,38 @@ ExclusiveArch:  %{ix86} x86_64
 Provides a series of daemons and support utilities to allow an
 oVirt Node to interact with the oVirt server.

-%prep
+%package selinux
+Summary:        SELinux policy module supporting ovirt-node
+Group:          System Environment/Base
+BuildRequires:  checkpolicy, selinux-policy-devel, hardlink
+%if "%{selinux_policyver}" != ""
+Requires:       selinux-policy >= %{selinux_policyver}
+%endif
+Requires:       %{name} = %{version}-%{release}
+Requires(post):   /usr/sbin/semodule, /sbin/restorecon
+Requires(postun): /usr/sbin/semodule, /sbin/restorecon
+
+%description selinux
+SELinux policy module supporting ovirt-node

+%prep
 %setup -q

+mkdir SELinux
+cp -p %{SOURCE1} SELinux
+
 %build
 %configure
 make

+cd SELinux
+for selinuxvariant in %{selinux_variants}; do
+  make NAME=${selinuxvariant} -f /usr/share/selinux/devel/Makefile
+  mv %{modulename}.pp %{modulename}.pp.${selinuxvariant}
+  make NAME=${selinuxvariant} -f /usr/share/selinux/devel/Makefile clean
+done
+cd -
+
 %install
 %{__rm} -rf %{buildroot}
 %{__install} -d -m0755 %{buildroot}%{_sbindir}
@@ -65,6 +94,16 @@ make

 echo "oVirt Node release %{version}-%{release}" > %{buildroot}%{_sysconfdir}/ovirt-release

+cd SELinux
+for selinuxvariant in %{selinux_variants}; do
+  install -d %{buildroot}%{_datadir}/selinux/${selinuxvariant}
+  install -p -m 644 %{modulename}.pp.${selinuxvariant} \
+  %{buildroot}%{_datadir}/selinux/${selinuxvariant}/%{modulename}.pp
+done
+cd -
+
+/usr/sbin/hardlink -cv %{buildroot}%{_datadir}/selinux
+
 %clean
 %{__rm} -rf %{buildroot}

@@ -85,6 +124,24 @@ if [ "$1" = 0 ] ; then
   /sbin/chkconfig --del ovirt-listen-awake
 fi

+%post selinux
+for selinuxvariant in %{selinux_variants}; do
+  /usr/sbin/semodule -s ${selinuxvariant} -i \
+    %{_datadir}/selinux/${selinuxvariant}/%{modulename}.pp &> /dev/null || :
+done
+
+%postun selinux
+if [ $1 -eq 0 ] ; then
+  for selinuxvariant in %{selinux_variants}; do
+    /usr/sbin/semodule -s ${selinuxvariant} -r %{modulename} &> /dev/null || :
+  done
+fi
+
+%files selinux
+%defattr(-,root,root,0755)
+%doc SELinux/*
+%{_datadir}/selinux/*/%{modulename}.pp
+
 %files
 %defattr(-,root,root,0755)
 %{_sbindir}/ovirt-awake
--
1.6.0.2.304.gc76d




More information about the ovirt-devel mailing list