21ab4e
From 8e91bc133859373acbb1ffdbd99849f160ae1193 Mon Sep 17 00:00:00 2001
21ab4e
From: Avra Sengupta <asengupt@redhat.com>
21ab4e
Date: Wed, 16 Nov 2016 16:19:14 +0530
21ab4e
Subject: [PATCH 338/361] snapshot/scheduler: Set sebool
21ab4e
 cron_system_cronjob_use_shares to on
21ab4e
21ab4e
Rhel 7.1 onwards, the user has to manually set the
21ab4e
selinux boolean 'cron_system_cronjob_use_shares' as
21ab4e
on, if selinux is enabled for snapshot scheduler to
21ab4e
work.
21ab4e
21ab4e
With this fix, we are automating that bit, in init step
21ab4e
of snapshot scheduler
21ab4e
21ab4e
mainline:
21ab4e
> BUG: 1395643
21ab4e
> Reviewed-on: https://review.gluster.org/15857
21ab4e
> Smoke: Gluster Build System <jenkins@build.gluster.org>
21ab4e
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
21ab4e
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
21ab4e
> Reviewed-by: Aravinda VK <avishwan@redhat.com>
21ab4e
(cherry picked from commit d592aee0bba98df44865e75fb0f1fceef14acf05)
21ab4e
21ab4e
BUG: 1247056
21ab4e
Change-Id: I5c1d23c14133c64770e84a77999ce647526f6711
21ab4e
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
21ab4e
Reviewed-on: https://code.engineering.redhat.com/gerrit/101319
21ab4e
Tested-by: Milind Changire <mchangir@redhat.com>
21ab4e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
21ab4e
---
21ab4e
 extras/snap_scheduler/snap_scheduler.py | 90 +++++++++++++++++++++++++++++++++
21ab4e
 1 file changed, 90 insertions(+)
21ab4e
21ab4e
diff --git a/extras/snap_scheduler/snap_scheduler.py b/extras/snap_scheduler/snap_scheduler.py
21ab4e
index b426cc7..61d1c51 100755
21ab4e
--- a/extras/snap_scheduler/snap_scheduler.py
21ab4e
+++ b/extras/snap_scheduler/snap_scheduler.py
21ab4e
@@ -545,8 +545,98 @@ def edit_schedules(jobname, schedule, volname):
21ab4e
 
21ab4e
     return ret
21ab4e
 
21ab4e
+def get_bool_val():
21ab4e
+    getsebool_cli = ["getsebool",
21ab4e
+                     "-a"]
21ab4e
+    p1 = subprocess.Popen(getsebool_cli, stdout=subprocess.PIPE,
21ab4e
+                          stderr=subprocess.PIPE)
21ab4e
+
21ab4e
+    grep_cmd = ["grep",
21ab4e
+                "cron_system_cronjob_use_shares"]
21ab4e
+    p2 = subprocess.Popen(grep_cmd, stdin=p1.stdout,
21ab4e
+                          stdout=subprocess.PIPE,
21ab4e
+                          stderr=subprocess.PIPE)
21ab4e
+
21ab4e
+    p1.stdout.close()
21ab4e
+    output, err = p2.communicate()
21ab4e
+    rv = p2.returncode
21ab4e
+
21ab4e
+    if rv:
21ab4e
+        log.error("Command output:")
21ab4e
+        log.error(err)
21ab4e
+        return -1
21ab4e
+
21ab4e
+    bool_val = output.split()[2]
21ab4e
+    log.debug("Bool value = '%s'", bool_val)
21ab4e
+
21ab4e
+    return bool_val
21ab4e
+
21ab4e
+def get_selinux_status():
21ab4e
+    getenforce_cli = ["getenforce"]
21ab4e
+    log.debug("Running command '%s'", " ".join(getenforce_cli))
21ab4e
+
21ab4e
+    p1 = subprocess.Popen(getenforce_cli, stdout=subprocess.PIPE,
21ab4e
+                          stderr=subprocess.PIPE)
21ab4e
+
21ab4e
+    output, err = p1.communicate()
21ab4e
+    rv = p1.returncode
21ab4e
+
21ab4e
+    if rv:
21ab4e
+        log.error("Command output:")
21ab4e
+        log.error(err)
21ab4e
+        return -1
21ab4e
+    else:
21ab4e
+        selinux_status=output.rstrip()
21ab4e
+        log.debug("selinux status: %s", selinux_status)
21ab4e
+
21ab4e
+    return selinux_status
21ab4e
+
21ab4e
+def set_cronjob_user_share():
21ab4e
+    selinux_status = get_selinux_status()
21ab4e
+    if (selinux_status == -1):
21ab4e
+        log.error("Failed to get selinux status")
21ab4e
+        return -1
21ab4e
+    elif (selinux_status == "Disabled"):
21ab4e
+        return 0
21ab4e
+
21ab4e
+    bool_val = get_bool_val()
21ab4e
+    # In case of a failure (where the boolean value is not)
21ab4e
+    # present in the system, we should not proceed further
21ab4e
+    # We should only proceed when the value is "off"
21ab4e
+    if (bool_val == -1 or bool_val != "off"):
21ab4e
+        return 0
21ab4e
+
21ab4e
+    setsebool_cli = ["setsebool", "-P",
21ab4e
+                     "cron_system_cronjob_use_shares",
21ab4e
+                     "on"]
21ab4e
+    log.debug("Running command '%s'", " ".join(setsebool_cli))
21ab4e
+
21ab4e
+    p1 = subprocess.Popen(setsebool_cli, stdout=subprocess.PIPE,
21ab4e
+                          stderr=subprocess.PIPE)
21ab4e
+
21ab4e
+    output, err = p1.communicate()
21ab4e
+    rv = p1.returncode
21ab4e
+
21ab4e
+    if rv:
21ab4e
+        log.error("Command output:")
21ab4e
+        log.error(err)
21ab4e
+        return rv
21ab4e
+
21ab4e
+    bool_val = get_bool_val()
21ab4e
+    if (bool_val == "on"):
21ab4e
+        return 0
21ab4e
+    else:
21ab4e
+        # In case of an error or if boolean is not on
21ab4e
+        # we return a failure here
21ab4e
+        return -1
21ab4e
 
21ab4e
 def initialise_scheduler():
21ab4e
+    ret = set_cronjob_user_share()
21ab4e
+    if ret:
21ab4e
+        log.error("Failed to set selinux boolean "
21ab4e
+                  "cron_system_cronjob_use_shares to 'on'")
21ab4e
+        return ret
21ab4e
+
21ab4e
     try:
21ab4e
         with open(TMP_FILE, "w+", 0644) as f:
21ab4e
             updater = ("* * * * * root PATH=$PATH:/usr/local/sbin:"
21ab4e
-- 
21ab4e
1.8.3.1
21ab4e