483b06
From 17f988f0524ff682a95fe6a4be55b49ea7a0a419 Mon Sep 17 00:00:00 2001
483b06
From: Martin Babinsky <mbabinsk@redhat.com>
483b06
Date: Mon, 5 Jun 2017 16:59:25 +0200
483b06
Subject: [PATCH] Extend the advice printing code by some useful abstractions
483b06
483b06
The advise printing code was augmented by methods that simplify
483b06
generating bash snippets that report errors or failed commands.
483b06
483b06
https://pagure.io/freeipa/issue/6982
483b06
483b06
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
483b06
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
483b06
---
483b06
 ipaserver/advise/base.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++--
483b06
 1 file changed, 61 insertions(+), 2 deletions(-)
483b06
483b06
diff --git a/ipaserver/advise/base.py b/ipaserver/advise/base.py
483b06
index 40dabd0426719c5a791fee5be81a998e1c45854b..ba412b872472580cd32baf2a326a14edb951cab1 100644
483b06
--- a/ipaserver/advise/base.py
483b06
+++ b/ipaserver/advise/base.py
483b06
@@ -94,8 +94,67 @@ class _AdviceOutput(object):
483b06
         if self.options.verbose:
483b06
             self.comment('DEBUG: ' + line)
483b06
 
483b06
-    def command(self, line):
483b06
-        self.content.append(line)
483b06
+    def command(self, line, indent_spaces=0):
483b06
+        self.content.append(
483b06
+            '{}{}'.format(self._format_indent(indent_spaces), line))
483b06
+
483b06
+    def _format_indent(self, num_spaces):
483b06
+        return ' ' * num_spaces
483b06
+
483b06
+    def echo_error(self, error_message, indent_spaces=0):
483b06
+        self.command(
483b06
+            self._format_error(error_message), indent_spaces=indent_spaces)
483b06
+
483b06
+    def _format_error(self, error_message):
483b06
+        return 'echo "{}" >&2'.format(error_message)
483b06
+
483b06
+    def exit_on_failed_command(self, command_to_run,
483b06
+                               error_message_lines, indent_spaces=0):
483b06
+        self.command(command_to_run, indent_spaces=indent_spaces)
483b06
+        self.exit_on_predicate(
483b06
+            '[ "$?" -ne "0" ]',
483b06
+            error_message_lines,
483b06
+            indent_spaces=indent_spaces)
483b06
+
483b06
+    def exit_on_nonroot_euid(self):
483b06
+        self.exit_on_predicate(
483b06
+            '[ "$(id -u)" -ne "0" ]',
483b06
+            ["This script has to be run as root user"]
483b06
+        )
483b06
+
483b06
+    def exit_on_predicate(self, predicate, error_message_lines,
483b06
+                          indent_spaces=0):
483b06
+        commands_to_run = [
483b06
+            self._format_error(error_message_line)
483b06
+            for error_message_line in error_message_lines]
483b06
+
483b06
+        commands_to_run.append('exit 1')
483b06
+        self.commands_on_predicate(
483b06
+            predicate,
483b06
+            commands_to_run,
483b06
+            indent_spaces=indent_spaces)
483b06
+
483b06
+    def commands_on_predicate(self, predicate, commands_to_run_when_true,
483b06
+                              commands_to_run_when_false=None,
483b06
+                              indent_spaces=0):
483b06
+        if_command = 'if {}'.format(predicate)
483b06
+        self.command(if_command, indent_spaces=indent_spaces)
483b06
+        self.command('then', indent_spaces=indent_spaces)
483b06
+
483b06
+        indented_block_spaces = indent_spaces + 2
483b06
+
483b06
+        for command_to_run_when_true in commands_to_run_when_true:
483b06
+            self.command(
483b06
+                command_to_run_when_true, indent_spaces=indented_block_spaces)
483b06
+
483b06
+        if commands_to_run_when_false is not None:
483b06
+            self.command("else", indent_spaces=indent_spaces)
483b06
+            for command_to_run_when_false in commands_to_run_when_false:
483b06
+                self.command(
483b06
+                    command_to_run_when_false,
483b06
+                    indent_spaces=indented_block_spaces)
483b06
+
483b06
+        self.command('fi', indent_spaces=indent_spaces)
483b06
 
483b06
 
483b06
 class Advice(Plugin):
483b06
-- 
483b06
2.9.4
483b06