Enable support for usecase specific bash script invocation

Resolves openbmc/openbmc#2037

Install dreport, dreport.conf, plugins
Parse the scripts to fetch config value
Create user directories based on config value with
softlinks to the plugins

Change-Id: If1bdefca362a282132364306b26eecb4b7003390
Signed-off-by: Marri Devender Rao <devenrao@in.ibm.com>
diff --git a/classes/phosphor-debug-collector.bbclass b/classes/phosphor-debug-collector.bbclass
index 2a2a3a4..d5d49a2 100644
--- a/classes/phosphor-debug-collector.bbclass
+++ b/classes/phosphor-debug-collector.bbclass
@@ -1 +1,5 @@
 bmc_dump_path="/var/lib/phosphor-debug-collector/dumps"
+dreport_plugin_dir = "${datadir}/dreport.d/plugins.d"
+dreport_include_dir = "${datadir}/dreport.d/include.d"
+dreport_conf_dir = "${datadir}/dreport.d/conf.d"
+dreport_dir = "${datadir}/dreport.d/"
diff --git a/common/recipes-phosphor/dump/phosphor-debug-collector.bb b/common/recipes-phosphor/dump/phosphor-debug-collector.bb
index c29c16a..24b233f 100644
--- a/common/recipes-phosphor/dump/phosphor-debug-collector.bb
+++ b/common/recipes-phosphor/dump/phosphor-debug-collector.bb
@@ -10,6 +10,7 @@
     ${PN}-manager \
     ${PN}-monitor \
     ${PN}-dreport \
+    ${PN}-scripts \
 "
 PACKAGES =+ "${DEBUG_COLLECTOR_PKGS}"
 PACKAGES_remove = "${PN}"
@@ -54,6 +55,9 @@
         bash \
         xz \
 "
+RDEPENDS_${PN}-scripts += " \
+        bash \
+"
 
 MGR_SVC ?= "xyz.openbmc_project.Dump.Manager.service"
 
@@ -62,6 +66,7 @@
 FILES_${PN}-manager += "${sbindir}/phosphor-dump-manager"
 FILES_${PN}-monitor += "${sbindir}/phosphor-dump-monitor"
 FILES_${PN}-dreport += "${bindir}/dreport"
+FILES_${PN}-scripts += "${dreport_dir}"
 
 DBUS_SERVICE_${PN}-manager += "${MGR_SVC}"
 SYSTEMD_SERVICE_${PN}-monitor += "obmc-dump-monitor.service"
@@ -70,10 +75,90 @@
 
 S = "${WORKDIR}/git"
 
-do_install_append() {
-       install -d ${D}${bindir}
-       install -m 0755 ${S}/tools/dreport \
-                       ${D}${bindir}/dreport
+# Install dreport script
+# From tools/dreport.d/dreport to /usr/bin/dreport
+install_dreport() {
+    install -d ${D}${bindir}
+    install -m 0755 ${S}/tools/dreport.d/dreport \
+                    ${D}${bindir}/dreport
+}
+
+# Install dreport sample configuration file
+# From tools/dreport.d/sample.conf
+# to /usr/share/dreport.d/conf.d/dreport.conf
+install_dreport_conf_file() {
+    install -d ${D}${dreport_conf_dir}
+    install -m 0644 ${S}/tools/dreport.d/sample.conf \
+                        ${D}${dreport_conf_dir}/dreport.conf
+}
+
+# Install dreport plugins
+# From tools/dreport.d/plugins.d to /usr/share/dreport.d/plugins.d
+install_dreport_plugins_scripts() {
+    install -d ${D}${dreport_plugin_dir}
+    install -m 0755 ${S}/tools/dreport.d/plugins.d/* ${D}${dreport_plugin_dir}/
+}
+
+# Install dreport utility functions
+# From tools/dreport.d/include.d to /usr/share/dreport.d/include.d
+install_dreport_include_scripts() {
+    install -d ${D}${dreport_include_dir}
+    install -m 0755 ${S}/tools/dreport.d/include.d/* \
+                ${D}${dreport_include_dir}/
+}
+
+# Parse the scripts in base directory, read config value
+# Create user directories based on the dump type value in the config section
+# Create softlinks for the base scripts in the user directories
+python install_dreport_user_scripts() {
+    from shutil import copyfile
+    import stat
+    import re
+    import configparser
+
+    #Read the user types from the dreport.conf file
+    configure = configparser.ConfigParser()
+    conf_dir  = d.getVar('D', True) + d.getVar('dreport_conf_dir', True)
+    confsource = os.path.join(conf_dir, "dreport.conf")
+    configure.read(confsource)
+    section = "DumpType"
+    options = configure.options(section)
+
+    #open the script from base dir and read the config value
+    source = d.getVar('S', True)
+    source_path = os.path.join(source, "tools", "dreport.d", "plugins.d")
+    scripts = os.listdir(source_path)
+    dreport_dir= d.getVar('D', True) + d.getVar('dreport_dir', True)
+    config = ("config:")
+    for script in scripts:
+        srcname = os.path.join(source_path, script)
+        srclink = os.path.join(d.getVar('dreport_plugin_dir', True), script)
+        file = open(srcname, "r")
+        for line in file:
+            if not config in line:
+                continue
+            revalue = re.search('[0-9]+.[0-9]+', line)
+            if not revalue:
+                bb.warn("Invalid format for config value =%s" % line)
+                continue
+            parse_value = revalue.group(0)
+            config_values = re.split('\W+', parse_value, 1)
+            if(len(config_values) != 2):
+                bb.warn("Invalid config value=%s" % parse_value)
+                break;
+            priority = config_values[1]
+            types = [int(d) for d in str(config_values[0])]
+            for type in types:
+                if not configure.has_option(section, str(type)):
+                    bb.warn("Invalid dump type id =%s" % (str(type)))
+                    continue
+                typestr = configure.get(section, str(type))
+                destdir = os.path.join(dreport_dir, ("pl_" + typestr + ".d"))
+                if not os.path.exists(destdir):
+                    os.makedirs(destdir)
+                linkname = "E" + priority + script
+                destlink = os.path.join(destdir, linkname)
+                os.symlink(srclink, destlink)
 }
 
 #Enable ubifs-workaround by MACHINE_FEATURE obmc-ubi-fs.
@@ -82,3 +167,9 @@
        --enable-ubifs-workaround, \
        --disable-ubifs-workaround \
 "
+
+do_install[postfuncs] += "install_dreport"
+do_install[postfuncs] += "install_dreport_conf_file"
+do_install[postfuncs] += "install_dreport_plugins_scripts"
+do_install[postfuncs] += "install_dreport_include_scripts"
+do_install[postfuncs] += "install_dreport_user_scripts"
diff --git a/common/recipes-phosphor/dump/phosphor-debug-collector.inc b/common/recipes-phosphor/dump/phosphor-debug-collector.inc
index 8fd608b..d5f4af2 100644
--- a/common/recipes-phosphor/dump/phosphor-debug-collector.inc
+++ b/common/recipes-phosphor/dump/phosphor-debug-collector.inc
@@ -2,4 +2,4 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
 SRC_URI += "git://github.com/openbmc/phosphor-debug-collector"
-SRCREV = "7f2f8027b013c39e28da6b3e1e10f6ddc7d3d042"
+SRCREV = "11eaab7b68d7984199a283bc6c78617ce72b8ca6"
diff --git a/common/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb b/common/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
index 50f9065..788bd48 100644
--- a/common/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
+++ b/common/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
@@ -94,6 +94,7 @@
         ${VIRTUAL-RUNTIME_obmc-dump-manager} \
         ${VIRTUAL-RUNTIME_obmc-dump-monitor} \
         phosphor-debug-collector-dreport \
+        phosphor-debug-collector-scripts \
         "
 
 SUMMARY_${PN}-settings = "Settings applications"