dreport: initial commit for Plugin based infrastrcture

Refactor existing dreport to support new plugin
based reporting infrastructure.

Resolves openbmc/openbmc#2351

Change-Id: Ibf078cf0609e93a873dbcb28a9bfdc25b182500f
Signed-off-by: Jayanth Othayoth <ojayanth@in.ibm.com>
diff --git a/tools/dreport b/tools/dreport
deleted file mode 100755
index d37131c..0000000
--- a/tools/dreport
+++ /dev/null
@@ -1,682 +0,0 @@
-#! /bin/bash
-
-help=$"
-        dreport creates an archive(xz compressed) consisting of the following:
-                * Configuration information
-                * Debug information
-                * A summary report
-        The type parameter controls the content of the data. The generated
-        archive is stored in the user specified location.
-
-usage: dreport [OPTION]
-
-Options:
-        -n, —-name <name>     Name to be used for the archive.
-                              Default name format obmcdump_<id>_<epochtime>
-        -d, —-dir <directory> Archive directory to copy the compressed report.
-                              Default output directory is /tmp
-        -i, —-id <id>         Dump identifier to associate with the archive.
-                              Identifiers include numeric characters.
-                              Default dump identifier is 0
-        -t, —-type <type>     Data collection type. Valid types are
-                              "user", "core", "elog".
-                              Default type is "user" initiated.
-        -p, —-path <path>     Optional contents to be included in the archive.
-                              Valid paths are absolute file path or d-bus path
-                              based on type parameter.
-                                 -Absolute file path for "core" type.
-                                 -elog d-bus object for "elog" type.
-        -s, --size <size>     Maximum allowed size(in KB) of the archive.
-                              Report will be truncated in case size exceeds
-                              this limit. Default size is unlimited.
-        -v, —-verbose         Increase logging verbosity.
-        -V, --version         Output version information.
-        -q, —-quiet           Only log fatal errors to stderr
-        -h, —-help            Display this help and exit.
-"
-
-#CONSTANTS
-declare -r TRUE=1
-declare -r FALSE=0
-declare -r UNLIMITED="unlimited"
-declare -r SUMMARY_DUMP="summary"
-declare -r TYPE_USER="user"
-declare -r TYPE_CORE="core"
-declare -r TYPE_ELOG="elog"
-declare -r SUMMARY_LOG="summary.log"
-declare -r DREPORT_LOG="dreport.log"
-declare -r TMP_DIR="/tmp"
-declare -r EPOCHTIME=$(date +"%s")
-declare -r TIME_STAMP="date -u"
-
-#Error Codes
-declare -r SUCCESS="0"
-declare -r INTERNAL_FAILURE="1"
-declare -r RESOURCE_UNAVAILABLE="2"
-
-#VARIABLES
-declare -x name=""
-declare -x dump_dir="/tmp"
-declare -x dump_id="00000000"
-declare -x dump_type=$TYPE_USER
-declare -x verbose=$FALSE
-declare -x quiet=$FALSE
-declare -x dump_size="unlimited"
-declare -x name_dir=""
-declare -x optional_path=""
-declare -x dreport_log=""
-declare -x summary_log=""
-declare -x cur_dump_size=0
-declare -a command_list=("")
-declare -x pid="0"
-declare -x elog_id=""
-
-# @brief Initialize general command array
-#        Set of commands, which provide general debug information
-function runlevel_general()
-{
-command_list=(
-    get_fw_level
-    bmc_state
-    host_state
-    chassis_state
-    get_host_info
-    get_uname
-    get_uptime
-    get_disk_usage
-    get_host_info
-    get_cpuinfo
-    get_meminfo
-    get_top
-    )
-}
-
-# @brief Initialize user type command array
-function runlevel_user()
-{
-command_list=(
-    get_journal
-    get_elog_all
-    get_obmc_console
-    get_failed_services
-    )
-}
-
-# @brief Initialize core type command array
-function runlevel_core()
-{
-command_list=(
-    move_optional_file
-    get_proc_journal
-    get_failed_services
-    get_obmc_console
-    )
-}
-
-# @brief Initialize elog type command array
-function runlevel_elog()
-{
-command_list=(
-    get_proc_journal
-    get_elog
-    )
-}
-
-function get_fw_level()
-{
-    desc="Firmware Release"
-    command="cat /etc/os-release"
-    copy_loc="firmware_release.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_uname()
-{
-    desc="uname"
-    command="uname -a"
-    copy_loc="uname.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_uptime()
-{
-    desc="uptime"
-    command="uptime"
-    copy_loc="uptime.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_disk_usage()
-{
-    desc="Disk Usage"
-    command="df -hT"
-    copy_loc="disk_usage.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_journal()
-{
-    desc="Journal log"
-    command="journalctl -o json-pretty -r"
-    copy_loc="journal.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_proc_journal()
-{
-    desc="Process Journal log"
-    command="journalctl -o verbose _PID=$pid"
-    copy_loc="proc_journal.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_host_info()
-{
-    desc="Host information"
-    command="hostnamectl status"
-    copy_loc="hostnamectl.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_failed_services()
-{
-    desc="Failed Services"
-    command="systemctl --failed"
-    copy_loc="failed_services.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_obmc_console()
-{
-    desc="OBMC Console"
-    command="cat /var/log/obmc-console.log"
-    copy_loc="obmc_console.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_cpuinfo()
-{
-    desc="cpuinfo"
-    command="cat /proc/cpuinfo"
-    copy_loc="cpuinfo.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_meminfo()
-{
-    desc="meminfo"
-    command="cat /proc/meminfo"
-    copy_loc="meminfo.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_top()
-{
-    desc="top"
-    command="top -n 1 -b"
-    copy_loc="top.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function bmc_state()
-{
-    desc="BMC State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.BMC \
-                    /xyz/openbmc_project/state/bmc0 \
-                    xyz.openbmc_project.State.BMC \
-                    CurrentBMCState"
-    copy_loc="BMCState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function host_state()
-{
-    desc="Host State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.Host \
-                    /xyz/openbmc_project/state/host0 \
-                    xyz.openbmc_project.State.Host \
-                    CurrentHostState"
-    copy_loc="HostState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function chassis_state()
-{
-    desc="Chassis State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.Chassis \
-                    /xyz/openbmc_project/state/chassis0 \
-                    xyz.openbmc_project.State.Chassis \
-                    CurrentPowerState"
-    copy_loc="ChassisState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-# @brief get all available elogs in BMC.
-function get_elog_all()
-{
-    desc="elog"
-
-    entries=$(busctl --list --no-pager tree \
-                     xyz.openbmc_project.Logging | grep \
-                     '/xyz/openbmc_project/logging/entry/')
-
-    #check for eSEL entries.
-    if [ -z "$entries" ]; then
-        log_info "No $desc entries"
-        return 0
-    fi
-
-    command="busctl --list --no-pager tree \
-                     xyz.openbmc_project.Logging | grep \
-                     '/xyz/openbmc_project/logging/entry/' \
-                     | xargs -I {} busctl --verbose --no-pager \
-                     call xyz.openbmc_project.Logging {} \
-                     org.freedesktop.DBus.Properties GetAll s \
-                     xyz.openbmc_project.Logging.Entry"
-    copy_loc="elog.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-# @brief get elog specific to global elog_id
-function get_elog()
-{
-    desc="elog id:$elog_id"
-
-    command="busctl --verbose --no-pager \
-                     call xyz.openbmc_project.Logging \
-                     $optional_path \
-                     org.freedesktop.DBus.Properties GetAll s \
-                     xyz.openbmc_project.Logging.Entry"
-    copy_loc="elog_$elog_id.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function move_optional_file()
-{
-    desc="Move Optional file"
-
-    mv $optional_path $name_dir
-    if [ $? -ne 0 ]; then
-        log_error "Failed to move file $optional_path"
-        return 1
-    fi
-    if check_size "$name_dir/$(basename "$optional_path")"; then
-        log_info "Moving file $file_name"
-    else
-        log_warning "Skipping $file_name move"
-    fi
-}
-
-# @brief Run the requested command and save the output
-#        into temporary location for successful size check
-
-function run_command()
-{
-    command="$1"
-    copy_loc="$2"
-    desc="$3"
-
-    eval $command >> "$name_dir/$copy_loc"
-    if [ $? -ne 0 ]; then
-        log_error "Failed to collect $desc"
-        return 1
-    fi
-
-    if check_size "$name_dir/$copy_loc"; then
-        log_info "Collected $desc"
-    else
-        log_warning "Skipping $desc"
-    fi
-}
-
-# @brief Initiate data collection based on the type.
-# @return 0 on success, error code otherwise
-function collect_data()
-{
-    runlevel_general
-    capture_data "${command_list[@]}"
-
-    case $dump_type in
-        $TYPE_USER)
-            runlevel_user
-            capture_data "${command_list[@]}"
-            ;;
-        $TYPE_CORE)
-            set_core_pid
-            runlevel_core
-            capture_data "${command_list[@]}"
-            ;;
-        $TYPE_ELOG)
-            elog_id=$(basename "$optional_path")
-            set_elog_pid
-            runlevel_elog
-            capture_data "${command_list[@]}"
-            ;;
-
-        $SUMMARY_DUMP)
-            #No data collection is required.
-            ;;
-        *) # unknown option
-            log_error "Skipping: Unknown dump type: $dump_type"
-            ;;
-    esac
-}
-
-# @brief set pid by reading information from the optional path.
-#        dreport "core" type user provides core file as optional path parameter.
-#        As per coredump source code systemd-coredump uses below format
-#        https://github.com/systemd/systemd/blob/master/src/coredump/coredump.c
-#        /var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR “.
-#        <process ID>.%s000000"
-function set_core_pid()
-{
-    #Escape bash characters in file name
-    file=$(printf %q "$optional_path")
-
-    #matching systemd-coredump core file format.
-    pid=$(echo $file | awk -F . '{ print $5}')
-}
-
-# @brief set elog pid by reading _PID information from the elog d-bus object.
-#        _PID information is stored  elog Additional data field
-#        Data format  "_PID=<pid>"
-function set_elog_pid()
-{
-    additional_data=$(busctl get-property xyz.openbmc_project.Logging \
-                             $optional_path \
-                             xyz.openbmc_project.Logging.Entry \
-                             AdditionalData)
-
-    #read _PID data.
-    if [ ! -z "$additional_data" ]; then
-        pid=$(echo $additional_data | \
-                   awk -F _PID= '{ print ($2+0)}')
-    fi
-}
-
-# @brief Capture debug data based on the input command array.
-#        and stores in to global temporary name specific location.
-# @param $1 Source array
-# @return 0 on success, error code otherwise
-function capture_data()
-{
-    source=("$@")
-
-    for ((i=0;i<${#source[@]};i+=1)); do
-        ${source[i]}
-    done
-
-    return 0
-}
-
-# @brief Calculate file or directory compressed size based on input
-#        and check whether the size in the the allowed size limit.
-#        Remove the file or directory from the name_dir
-#        if the check fails.
-# @param $1 Source file or directory
-# @return 0 on success, error code if size exceeds the limit.
-# Limitation: compress and tar will have few bytes size difference
-function check_size()
-{
-    source=$1
-
-    #No size check required incase dump_size is set to unlimited
-    if [ $dump_size = $UNLIMITED ]; then
-        return 0
-    fi
-
-    #get the file or directory size
-    if [[ -d $source ]] && [[ -n $source ]]; then
-        tar -cf "$source.tar" -C \
-                 $(dirname "$source") $(basename "$source")
-        size=$(stat -c%s "$source.tar")
-        rm "$source.tar"
-    else
-        size=$(stat -c%s "$source")
-    fi
-
-    if [ $((size + cur_dump_size)) -gt $dump_size ]; then
-        #Exceed the allowed limit,
-        #tar and compress the files and check the size
-        tar -Jcf "$name_dir.tar.xz" -C \
-                  $(dirname "$name_dir") $(basename "$name_dir")
-        size=$(stat -c%s "$name_dir.tar.xz")
-        if [ $size -gt $dump_size ]; then
-            #Remove the the specific data from the name_dir and contniue
-            rm "$source" "$name_dir.tar.xz"
-            return $RESOURCE_UNAVAILABLE
-        else
-            rm "$name_dir.tar.xz"
-        fi
-    fi
-
-    #Remove the compressed file from the name directory
-    cur_dump_size=$((size + cur_dump_size))
-    return $SUCCESS
-}
-
-# @brief Initial version of the summary log
-init_summary()
-{
-   log_summary "Name:          $name.tar.xz"
-   log_summary "Epochtime:     $EPOCHTIME"
-   log_summary "ID:            $dump_id"
-   log_summary "Type:          $dump_type"
-   log_summary "Optional path: $optional_path"
-}
-
-# @brief Check the validity of user inputs and initialize global
-#        variables. Create directory for temporary data collection
-# @return 0 on success, error code otherwise
-
-function initialize()
-{
-    #Dump file name
-    if [ -z $name ]; then
-        name=$"obmcdump_"$dump_id"_$EPOCHTIME"
-    fi
-
-    #Create temporary data directory.
-    mkdir -p "$TMP_DIR/$name"
-    if [ $? -ne 0 ]; then
-        echo "Error: Failed to create the temporary directory."
-        return $RESOURCE_UNAVAILABLE;
-    fi
-
-    #name directory
-    name_dir="$TMP_DIR/$name"
-
-    #dreport log file
-    dreport_log="$name_dir/$DREPORT_LOG"
-
-    #summary log file
-    summary_log="$name_dir/$SUMMARY_LOG"
-
-    #Type
-    if [[ !($dump_type = $TYPE_USER || \
-            $dump_type = $TYPE_CORE || \
-            $dump_type = $TYPE_ELOG) ]]; then
-       log_error "Invalid -type, Only summary log is available"
-       dump_type=$SUMMARY_DUMP
-    fi
-
-    #Size
-    #Check the input is integer.
-    if [ "$dump_size" -eq "$dump_size" ] 2>/dev/null; then
-       #Converts in to bytes.
-       dump_size="$((dump_size * 1024))"
-    else
-       dump_size=$UNLIMITED
-    fi
-
-    return $SUCCESS
-}
-
-# @brief Packaging the dump and transferring to dump location.
-function package()
-{
-    mkdir -p "$dump_dir"
-    if [ $? -ne 0 ]; then
-        log_error "Could not create the destination directory $dump_dir"
-        dest_dir=$TMP_DIR
-    fi
-
-    #tar and compress the files.
-    tar -Jcf "$name_dir.tar.xz" -C \
-             $(dirname "$name_dir") $(basename "$name_dir")
-
-    if [ $? -ne 0 ]; then
-        echo $($TIME_STAMP) "Could not create the compressed tar file"
-        rm -r "$name_dir"
-        return $INTERNAL_FAILURE
-    fi
-
-    #remove the temporary name specific directory
-    rm -r "$name_dir"
-
-    echo $($TIME_STAMP) "Report is available in $dump_dir"
-
-    if [ "$TMP_DIR" == "$dump_dir" ]; then
-       return $SUCCESS
-    fi
-
-    #copy the compressed tar file into the destination
-    cp "$name_dir.tar.xz" "$dump_dir"
-    if [ $? -ne 0 ]; then
-        echo "Failed to copy the $name_dir.tar.xz to $dump_dir"
-        rm "$name_dir.tar.xz"
-        return $INTERNAL_FAILURE
-    fi
-
-    #Remove the temporary copy of the file
-    rm "$name_dir.tar.xz"
-}
-
-# @brief log the error message
-# @param error message
-function log_error()
-{
-   echo $($TIME_STAMP) "ERROR: $@" >> $dreport_log
-   if ((quiet != TRUE)); then
-      echo $($TIME_STAMP) "ERROR: $@" >&2
-   fi
-}
-
-# @brief log warning message
-# @param warning message
-function log_warning()
-{
-    if ((verbose == TRUE)); then
-        echo $($TIME_STAMP) "WARNING: $@" >> $dreport_log
-        if ((quiet != TRUE)); then
-            echo $($TIME_STAMP) "WARNING: $@" >&2
-        fi
-    fi
-}
-
-# @brief log info message
-# @param info message
-function log_info()
-{
-    if ((verbose == TRUE)); then
-        echo $($TIME_STAMP) "INFO: $@" >> $dreport_log
-        if ((quiet != TRUE)); then
-            echo $($TIME_STAMP) "INFO: $@" >&1
-        fi
-    fi
-}
-
-# @brief log summary message
-# @param message
-function log_summary()
-{
-    echo $($TIME_STAMP) "$@" >> $summary_log
-    if ((quiet != TRUE)); then
-        echo $($TIME_STAMP) "$@" >&1
-    fi
-}
-
-# @brief Main function
-function main()
-{
-    #initialize the global variables and
-    #create temporary storage locations
-    initialize
-    result=$?
-    if [[ ${result} -ne $SUCCESS ]]; then
-        echo $($TIME_STAMP) "Error: Failed to initialize, Exiting"
-        exit;
-    fi
-
-    #Initilize the summary log
-    init_summary
-
-    #collect data based on the type.
-    collect_data
-
-    package  #package the dump
-    result=$?
-    if [[ ${result} -ne $SUCCESS ]]; then
-        echo $($TIME_STAMP) "Error: Failed to package, Exiting"
-    else
-        echo $($TIME_STAMP) "Sucessfully completed"
-        exit;
-    fi
-}
-
-TEMP=`getopt -o n:d:i:t:s:p:vVqh \
-      --long name:,dir:,dumpid:,type:,size:,path:,verbose,version,quiet,help \
-      -- "$@"`
-
-if [ $? -ne 0 ]
-then
-    echo "Error: Invalid options"
-    exit 1
-fi
-
-eval set -- "$TEMP"
-
-while [[ $# -gt 1 ]]; do
-    key="$1"
-    case $key in
-        -n|--name)
-            name=$2
-            shift 2;;
-        -d|--dir)
-            dump_dir=$2
-            shift 2;;
-        -i|--dumpid)
-            dump_id=$2
-            shift 2;;
-        -t|--type)
-            dump_type=$2
-            shift 2;;
-        -s|--size)
-            dump_size=$2
-            shift 2;;
-        -p|--path)
-            optional_path=$2
-            shift 2;;
-        -v|—-verbose)
-            verbose=$TRUE
-            shift;;
-        -V|--version)
-            shift;;
-        -q|—-quiet)
-            quiet=$TRUE
-            shift;;
-        -h|--help)
-            echo "$help"
-            exit;;
-        *) # unknown option
-            log_error "Unknown argument: $1"
-            log_info "$help"
-            exit 1;;
-    esac
-done
-
-main #main program
-exit $?
diff --git a/tools/dreport.d/dreport b/tools/dreport.d/dreport
new file mode 100755
index 0000000..908d6ec
--- /dev/null
+++ b/tools/dreport.d/dreport
@@ -0,0 +1,328 @@
+#! /bin/bash
+
+help=$"
+        dreport creates an archive(xz compressed) consisting of the following:
+                * Configuration information
+                * Debug information
+                * A summary report
+        The type parameter controls the content of the data. The generated
+        archive is stored in the user specified location.
+
+usage: dreport [OPTION]
+
+Options:
+        -n, —-name <name>     Name to be used for the archive.
+                              Default name format obmcdump_<id>_<epochtime>
+        -d, —-dir <directory> Archive directory to copy the compressed report.
+                              Default output directory is /tmp
+        -i, —-id <id>         Dump identifier to associate with the archive.
+                              Identifiers include numeric characters.
+                              Default dump identifier is 0
+        -t, —-type <type>     Data collection type. Valid types are
+                              "user", "core", "elog".
+                              Default type is "user" initiated.
+        -p, —-path <path>     Optional contents to be included in the archive.
+                              Valid paths are absolute file path or d-bus path
+                              based on type parameter.
+                                 -Absolute file path for "core" type.
+                                 -elog d-bus object for "elog" type.
+        -s, --size <size>     Maximum allowed size(in KB) of the archive.
+                              Report will be truncated in case size exceeds
+                              this limit. Default size is unlimited.
+        -v, —-verbose         Increase logging verbosity.
+        -V, --version         Output version information.
+        -q, —-quiet           Only log fatal errors to stderr
+        -h, —-help            Display this help and exit.
+"
+
+#CONSTANTS
+declare -rx TRUE=1
+declare -rx FALSE=0
+declare -rx UNLIMITED="unlimited"
+declare -rx SUMMARY_DUMP="summary"
+declare -rx TYPE_USER="user"
+declare -rx TYPE_CORE="core"
+declare -rx TYPE_ELOG="elog"
+declare -rx SUMMARY_LOG="summary.log"
+declare -rx DREPORT_LOG="dreport.log"
+declare -rx TMP_DIR="/tmp"
+declare -rx EPOCHTIME=$(date +"%s")
+declare -rx TIME_STAMP="date -u"
+declare -rx PLUGIN="pl_"
+declare -rx DREPORT_SOURCE="/usr/share/dreport.d"
+declare -rx DREPORT_INCLUDE="$DREPORT_SOURCE/include.d"
+
+#Error Codes
+declare -rx SUCCESS="0"
+declare -rx INTERNAL_FAILURE="1"
+declare -rx RESOURCE_UNAVAILABLE="2"
+
+#VARIABLES
+declare -x name=""
+declare -x dump_dir="/tmp"
+declare -x dump_id="00000000"
+declare -x dump_type=$TYPE_USER
+declare -x verbose=$FALSE
+declare -x quiet=$FALSE
+declare -x dump_size="unlimited"
+declare -x name_dir=""
+declare -x optional_path=""
+declare -x dreport_log=""
+declare -x summary_log=""
+declare -x cur_dump_size=0
+declare -x pid="0"
+declare -x elog_id=""
+
+#Source dreport common functions
+. $DREPORT_INCLUDE/functions
+
+# @brief Initiate data collection based on the type.
+# @return 0 on success, error code otherwise
+function collect_data()
+{
+    case $dump_type in
+        $TYPE_USER)
+            ;;
+        $TYPE_CORE)
+            log_summary "Core: $optional_path"
+            set_core_pid
+            ;;
+        $TYPE_ELOG)
+            log_summary "ELOG: $optional_path"
+            elog_id=$(basename "$optional_path")
+            set_elog_pid
+            ;;
+
+        $SUMMARY_DUMP)
+            #No data collection is required.
+            return
+            ;;
+        *) # unknown option
+            log_error "Skipping: Unknown dump type: $dump_type"
+            return
+            ;;
+    esac
+
+    plugin_path=$DREPORT_SOURCE/$PLUGIN$dump_type.d
+
+    # check plugin directory for this dump type?
+    if [ ! -d $plugin_path ]; then
+        log_error "$plugin_path does not exist, skipping dump collection"
+        return 0
+    fi
+
+    #Executes plugins based on the type.
+    for i in $plugin_path/* ; do
+       $i
+    done
+}
+
+# @brief set pid by reading information from the optional path.
+#        dreport "core" type user provides core file as optional path parameter.
+#        As per coredump source code systemd-coredump uses below format
+#        https://github.com/systemd/systemd/blob/master/src/coredump/coredump.c
+#        /var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR “.
+#        <process ID>.%s000000"
+function set_core_pid()
+{
+    #Escape bash characters in file name
+    file=$(printf %q "$optional_path")
+
+    #matching systemd-coredump core file format.
+    pid=$(echo $file | awk -F . '{ print $5}')
+}
+
+# @brief set elog pid by reading _PID information from the elog d-bus object.
+#        _PID information is stored  elog Additional data field
+#        Data format  "_PID=<pid>"
+function set_elog_pid()
+{
+    additional_data=$(busctl get-property xyz.openbmc_project.Logging \
+                             $optional_path \
+                             xyz.openbmc_project.Logging.Entry \
+                             AdditionalData)
+
+    #read _PID data.
+    if [ ! -z "$additional_data" ]; then
+        pid=$(echo $additional_data | \
+                   awk -F _PID= '{ print ($2+0)}')
+    fi
+}
+
+# @brief Initial version of the summary log
+init_summary()
+{
+   log_summary "Name:          $name.tar.xz"
+   log_summary "Epochtime:     $EPOCHTIME"
+   log_summary "ID:            $dump_id"
+   log_summary "Type:          $dump_type"
+}
+
+# @brief Check the validity of user inputs and initialize global
+#        variables. Create directory for temporary data collection
+# @return 0 on success, error code otherwise
+
+function initialize()
+{
+    #Dump file name
+    if [ -z $name ]; then
+        name=$"obmcdump_"$dump_id"_$EPOCHTIME"
+    fi
+
+    #Create temporary data directory.
+    mkdir -p "$TMP_DIR/$name"
+    if [ $? -ne 0 ]; then
+        echo "Error: Failed to create the temporary directory."
+        return $RESOURCE_UNAVAILABLE;
+    fi
+
+    #name directory
+    name_dir="$TMP_DIR/$name"
+
+    #dreport log file
+    dreport_log="$name_dir/$DREPORT_LOG"
+
+    #summary log file
+    summary_log="$name_dir/$SUMMARY_LOG"
+
+    #Type
+    if [[ !($dump_type = $TYPE_USER || \
+            $dump_type = $TYPE_CORE || \
+            $dump_type = $TYPE_ELOG) ]]; then
+       log_error "Invalid -type, Only summary log is available"
+       dump_type=$SUMMARY_DUMP
+    fi
+
+    #Size
+    #Check the input is integer.
+    if [ "$dump_size" -eq "$dump_size" ] 2>/dev/null; then
+       #Converts in to bytes.
+       dump_size="$((dump_size * 1024))"
+    else
+       dump_size=$UNLIMITED
+    fi
+
+    return $SUCCESS
+}
+
+# @brief Packaging the dump and transferring to dump location.
+function package()
+{
+    mkdir -p "$dump_dir"
+    if [ $? -ne 0 ]; then
+        log_error "Could not create the destination directory $dump_dir"
+        dest_dir=$TMP_DIR
+    fi
+
+    #tar and compress the files.
+    tar -Jcf "$name_dir.tar.xz" -C \
+             $(dirname "$name_dir") $(basename "$name_dir")
+
+    if [ $? -ne 0 ]; then
+        echo $($TIME_STAMP) "Could not create the compressed tar file"
+        rm -r "$name_dir"
+        return $INTERNAL_FAILURE
+    fi
+
+    #remove the temporary name specific directory
+    rm -r "$name_dir"
+
+    echo $($TIME_STAMP) "Report is available in $dump_dir"
+
+    if [ "$TMP_DIR" == "$dump_dir" ]; then
+       return $SUCCESS
+    fi
+
+    #copy the compressed tar file into the destination
+    cp "$name_dir.tar.xz" "$dump_dir"
+    if [ $? -ne 0 ]; then
+        echo "Failed to copy the $name_dir.tar.xz to $dump_dir"
+        rm "$name_dir.tar.xz"
+        return $INTERNAL_FAILURE
+    fi
+
+    #Remove the temporary copy of the file
+    rm "$name_dir.tar.xz"
+}
+
+# @brief Main function
+function main()
+{
+    #initialize the global variables and
+    #create temporary storage locations
+    initialize
+    result=$?
+    if [[ ${result} -ne $SUCCESS ]]; then
+        echo $($TIME_STAMP) "Error: Failed to initialize, Exiting"
+        exit;
+    fi
+
+    #Initilize the summary log
+    init_summary
+
+    #collect data based on the type.
+    collect_data
+
+    package  #package the dump
+    result=$?
+    if [[ ${result} -ne $SUCCESS ]]; then
+        echo $($TIME_STAMP) "Error: Failed to package, Exiting"
+    else
+        echo $($TIME_STAMP) "Sucessfully completed"
+        exit;
+    fi
+}
+
+TEMP=`getopt -o n:d:i:t:s:p:vVqh \
+      --long name:,dir:,dumpid:,type:,size:,path:,verbose,version,quiet,help \
+      -- "$@"`
+
+if [ $? -ne 0 ]
+then
+    echo "Error: Invalid options"
+    exit 1
+fi
+
+eval set -- "$TEMP"
+
+while [[ $# -gt 1 ]]; do
+    key="$1"
+    case $key in
+        -n|--name)
+            name=$2
+            shift 2;;
+        -d|--dir)
+            dump_dir=$2
+            shift 2;;
+        -i|--dumpid)
+            dump_id=$2
+            shift 2;;
+        -t|--type)
+            dump_type=$2
+            shift 2;;
+        -s|--size)
+            dump_size=$2
+            shift 2;;
+        -p|--path)
+            optional_path=$2
+            shift 2;;
+        -v|—-verbose)
+            verbose=$TRUE
+            shift;;
+        -V|--version)
+            shift;;
+        -q|—-quiet)
+            quiet=$TRUE
+            shift;;
+        -h|--help)
+            echo "$help"
+            exit;;
+        *) # unknown option
+            log_error "Unknown argument: $1"
+            log_info "$help"
+            exit 1;;
+    esac
+done
+
+main #main program
+exit $?