1#!/usr/bin/env bash
2
3# @brief Execute the command and save the output into the dreport
4#        packaging, if it is in the user allowed dump size limit.
5# @param $1 Command to be executed.
6# @param $2 Save file name.
7# @param $3 Plugin description used for logging.
8function add_cmd_output()
9{
10    command="$1"
11    file_name="$2"
12    desc="$3"
13
14    eval $command >> "$name_dir/$file_name"
15    if [ $? -ne 0 ]; then
16        log_error "Failed to collect $desc"
17        rm -f "$name_dir/$file_name"
18        return 1
19    fi
20
21    if check_size "$name_dir/$file_name"; then
22        log_info "Collected $desc"
23    else
24        log_warning "Skipping $desc"
25    fi
26}
27
28# @brief Copy the file or directory into the dreport packaging,
29#        if it is in the user allowed dump size limit.
30# @param $1 Copy file or directory name.
31# @param $2 Plugin description used for logging.
32function add_copy_file()
33{
34    file_name="$1"
35    desc="$2"
36
37    cp -Lr $file_name $name_dir
38    if [ $? -ne 0 ]; then
39        log_error "Failed to copy $desc $file_name"
40        rm -fr "$name_dir/$file_name"
41        return $RESOURCE_UNAVAILABLE
42    fi
43    if check_size "$name_dir/$(basename "$file_name")"; then
44        log_info "Copied $desc $file_name"
45        return $SUCCESS
46    else
47        log_warning "Skipping copy $desc $file_name"
48        return $RESOURCE_UNAVAILABLE
49    fi
50}
51# @brief Copy the symbolic link file to the dreport packaging,
52#        if it is in the user allowed dump size limit.
53# @param $1 symbolic link file name
54# @param $2 Plugin description used for logging.
55function add_copy_sym_link_file()
56{
57    file_name="$1"
58    desc="$2"
59
60    cp $file_name $name_dir
61    if [ $? -ne 0 ]; then
62        log_error "Failed to copy $desc $file_name"
63        rm -fr "$name_dir/$file_name"
64        return $RESOURCE_UNAVAILABLE
65    fi
66    if check_size "$name_dir/$(basename "$file_name")"; then
67        log_info "Copied $desc $file_name"
68        return $SUCCESS
69    else
70        log_warning "Skipping copy $desc $file_name"
71        return $RESOURCE_UNAVAILABLE
72    fi
73}
74
75# @brief Calculate file or directory compressed size based on input
76#        and check whether the size in the allowed size limit.
77#        Remove the file or directory from the name_dir
78#        if the check fails.
79# @param $1 Source file or directory
80# @return 0 on success, error code if size exceeds the limit.
81# Limitation: compress and tar will have few bytes size difference
82function check_size()
83{
84    source=$1
85
86    #No size check required in case dump_size is set to unlimited
87    if [ $dump_size = $UNLIMITED ]; then
88        return 0
89    fi
90
91    #get the file or directory size
92    if [[ -d $source ]] && [[ -n $source ]]; then
93        tar -cf "$source.tar" -C \
94            $(dirname "$source") $(basename "$source")
95        size=$(stat -c%s "$source.tar")
96        rm "$source.tar"
97    else
98        size=$(stat -c%s "$source")
99    fi
100
101    if [ $((size + cur_dump_size)) -gt $dump_size ]; then
102        #Exceed the allowed limit,
103        #tar and compress the files and check the size
104        tar -Jcf "$name_dir.tar.xz" -C \
105            $(dirname "$name_dir") $(basename "$name_dir")
106        size=$(stat -c%s "$name_dir.tar.xz")
107        if [ $size -gt $dump_size ]; then
108            #Remove the the specific data from the name_dir and continue
109            rm "$source" "$name_dir.tar.xz"
110            return $RESOURCE_UNAVAILABLE
111        else
112            rm "$name_dir.tar.xz"
113        fi
114    fi
115
116    cur_dump_size=$((size + cur_dump_size))
117    return $SUCCESS
118}
119
120# @brief log the error message
121# @param error message
122function log_error()
123{
124    echo $($TIME_STAMP) "ERROR: $*" >> $dreport_log
125    if ((quiet != TRUE)); then
126        echo $($TIME_STAMP) "ERROR: $*" >&2
127    fi
128}
129
130# @brief log warning message
131# @param warning message
132function log_warning()
133{
134    if ((verbose == TRUE)); then
135        echo $($TIME_STAMP) "WARNING: $*" >> $dreport_log
136        if ((quiet != TRUE)); then
137            echo $($TIME_STAMP) "WARNING: $*" >&2
138        fi
139    fi
140}
141
142# @brief log info message
143# @param info message
144function log_info()
145{
146    if ((verbose == TRUE)); then
147        echo $($TIME_STAMP) "INFO: $*" >> $dreport_log
148        if ((quiet != TRUE)); then
149            echo $($TIME_STAMP) "INFO: $*" >&1
150        fi
151    fi
152}
153
154# @brief log summary message
155# @param message
156function log_summary()
157{
158    echo $($TIME_STAMP) "$*" >> $summary_log
159    if ((quiet != TRUE)); then
160        echo $($TIME_STAMP) "$*" >&1
161    fi
162}
163