#!/bin/shwrite_f() {
echo "$*" >> ${WORKFILE}
}
printHelp() {
echo -e "Bacula Audit script\n"
echo -e "Help"
echo -e "\t-j\t-\tJob(s) to audit (for every job)"
echo -e "\t-y\t-\tYear for audit (default current)"
echo -e "\t-m\t-\tMonth for audit (default last month)"
echo -e "\t-d\t-\tDay for audit (default all days)"
echo -e "\t-t\t-\tSend email to (default $MAILTO)"
echo -e "\t-h\t-\tHelp"
}
year=$(date +%Y)
month=$(date --date='1 month ago' '+%m')
d1_grep=`date --date='1 month ago' '+%Y-%m'`
day="[0-9][0-9]?"
MAILTO="root"
while getopts "j:y:t:m:d:h" Option
do
case $Option in
j)
ARRAY="$ARRAY $OPTARG"
;;
y)
year=$OPTARG
;;
m)
month=$OPTARG
;;
d)
day=$OPTARG
;;
t)
MAILTO=$OPTARG
;;
h)
printHelp
exit 0
;;
esac
done
d1_grep="$year-$month-$day"
if [ "$ARRAY" == "" ]
then
ARRAY=$(echo "show jobs" | /usr/sbin/bconsole -c /etc/bacula/bconsole.conf | awk '/Job:/ && /Enabled=1/ {gsub(/^[A-Za-z]*=/,"",$2);print $2}')
fi
WORKDIR="/home/audit/bin"
WORKFILE="${WORKDIR}/audit.html"
if [ -f ${WORKFILE} ]
then
>${WORKFILE}
fi
tempfile="${WORKDIR}/temp.jobs"
trap "rm -f $tempfile" 0 1 2
echo "list jobs" | /usr/sbin/bconsole -c /etc/bacula/bconsole.conf| egrep $d1_grep > $tempfile
if [ "$day" == "[0-9][0-9]?" ]
then
day=""
fi
write_f "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"><title>Statistics for Jobs on $day $month $year</title>"
write_f "<style type=\"text/css\">"
write_f "p {text-align: justify;}"
write_f "p.error {color: red; }"
write_f "p.ok {color: green; }"
write_f "p.incr {color: teal; }"
write_f "p.diff {color: green; }"
write_f "tr.back:hover {background: #fc0;}"
write_f "td {vertical-align: top;}"
write_f "table.show_table {width: 100%; margin-top: 20px; border-collapse: collapse; border: 2px solid #000;}"
write_f "table.show_table th {border:3px solid; text-align:center; vertical-align:middle; font-style:italic; font-size:large; background:silver;}"
write_f "table.show_table td {padding-left: 5px; padding-right: 5px;}"
write_f "table.show_table td.num {text-align: right; vertical-align:middle;}"
write_f "table.show_table td.num_error {text-align: right; vertical-align:middle; background-color: lightpink;}"
write_f "table.show_table td.char {text-align: left; vertical-align:middle;}"
write_f "table.show_table tr.sum {border:2px solid;}"
write_f "li {color: teal; text-decoration: underline; cursor: pointer;}"
write_f "</style>"
write_f "<script type=\"text/javascript\">"
write_f "if(document.getElementsByClassName) {
getElementsByClass = function(classList, node) {
return (node || document).getElementsByClassName(classList)
}
} else {
getElementsByClass = function(classList, node) {
var node = node || document,
list = node.getElementsByTagName('*'),
length = list.length,
classArray = classList.split(/\s+/),
classes = classArray.length,
result = [], i,j
for(i = 0; i < length; i++) {
for(j = 0; j < classes; j++) {
if(list[i].className.search('\\\\b' + classArray[j] + '\\\\b') != -1) {
result.push(list[i])
break
}
}
}
return result
}
}"
write_f "function HideAndShow (classtable, classmenu, tegId) {
var obj = document.getElementById(tegId);
var menuid = document.getElementById(tegId + '_m');
var table = getElementsByClass(classtable) || document.getElementsByClassName(classtable);
var menu = getElementsByClass(classmenu) || document.getElementsByClassName(classmenu);
for (i = 0; i < table.length; i++) {
menu[i].style.color = 'teal';
table[i].style.display = 'none';
}
menu[i].style.color = 'teal';
menuid.style.color = '#fc0';
obj.style.display = '';
}"
write_f "function ShowAll(classtable, classmenu, tegId) {
var table = getElementsByClass(classtable) || document.getElementsByClassName(classtable);
var menu = getElementsByClass(classmenu) || document.getElementsByClassName(classmenu);
for (i = 0; i < table.length; i++) {
menu[i].style.color = 'teal';
table[i].style.display = '';
}
menu[i].style.color = 'teal';
document.getElementById(tegId).style.color = '#fc0';
}"
write_f "function mLoad() {
var table = getElementsByClass('show_table') || document.getElementsByClassName('show_table');;
var menu = getElementsByClass('table_menu') || document.getElementsByClassName('table_menu');
for (i=0;i<table.length;i++){
if(document.getElementById(table[i].id).rows['Errors'].cells[1].innerHTML>0){
document.getElementById(table[i].id+'_m').style.background='lightpink';
}
}
}"
write_f "</script>"
write_f "</head><body onLoad=mLoad()>"
write_f "<table widht=\"100%\"><tr><td colspan=2><h1>Статистика заданий за $day $month $year</h1></td></tr>"
write_f "<tr><td>"
write_f "<h2>Задания</h2>"
write_f "<ul>"
write_f "<li class=\"table_menu\" id=\"all\" onclick=\"ShowAll('show_table','table_menu','all')\"><p>all</li>"
for line in $ARRAY
do
write_f "<li class=\"table_menu\" id=\"${line}_m\" onclick=\"HideAndShow('show_table','table_menu','$line')\"><p>$line</li>"
done
write_f "</ul></td><td>"
for line in $ARRAY
do
awk 'BEGIN{
errors=0;
l_number=1
print "<table id=\"'$line'\" class=\"show_table\" border widht=100% style=\"display:block;\"><tr><th colspan=9>Статистика задания: '$line'</th></tr>";
print "<tr><th>№</th><th>Идентификатор</th><th>Имя</th><th>Время выполнения</th><th>Тип</th><th>Уровень</th><th>Количество файлов</th><th>Размер</th><th>Статус</th></tr>";
}
/ \<'$line'\> /{
if($17!="T"){
errors=errors+1
};
do {
if($9=="B") {type="<p>Backup";break}
if($9=="R") {type="<p>Restore";break}
} while (0)
do{
if($11=="F") {level="<p class=\"ok\">Full";break}
if($11=="I") {level="<p class=\"incr\">Incremental";break}
if($11=="D") {level="<p class=\"diff\">Differential";break}
}while(0)
do{
if($17=="C") {status="<p style=\"color:gray;\">Created, not yes running";break}
if($17=="R") {status="<p style=\"color:lime;\">Running</p>";break}
if($17=="B") {status="<p class=\"error\">Blocked";break}
if($17=="T") {status="<p class=\"ok\">Completed successfully</p>";break}
if($17=="E") {status="<p class=\"error\">Terminated with errors";break}
if($17=="e") {status="<p class=\"error\">Non-fatal error";break}
if($17=="f") {status="<p class=\"error\">Fatal error";break}
if($17=="D") {status="<p class=\"error\">Verify found differences";break}
if($17=="A") {status="<p class=\"error\">Canceled by user";break}
if($17=="F") {status="<p class=\"error\">Waiting for Client";break}
if($17=="S") {status="<p class=\"error\">Waiting for Storage daemon";break}
if($17=="m") {status="<p class=\"error\">Waiting for new media";break}
if($17=="M") {status="<p class=\"error\">Waiting for media mount";break}
if($17=="s") {status="<p class=\"error\">Waiting for storage resource";break}
if($17=="j") {status="<p class=\"error\">Waiting for job resource";break}
if($17=="c") {status="<p class=\"error\">Waiting for client resource";break}
if($17=="d") {status="<p class=\"error\">Waiting on maximum jobs";break}
if($17=="t") {status="<p class=\"error\">Waiting on start time";break}
if($17=="p") {status="<p class=\"error\">Waiting on higher priority jobs";break}
}while(0)
gsub(/,/,"",$15)
gsub(/,/,"`",$13)
size=0
if($15>1024 && $15!=0){
if($15>1048576){
if($15>1073741824){
size=$15/1073741824
bytes="GB"
}
else{
size=$15/1048576
bytes="MB"
}
}
else {
size=$15/1024
bytes="KB"
}
}
else {
bytes="B"
}
# print "<tr class=\"back\"><td class=\"num\">"l_number"</td><td class=\"char\">"$2"</td><td class=\"char\">"$4"</td><td class=\"char\">"$6" " $7"</td><td class=\"char\">"type"</td><td class=\"char\">"level"</td><td class=\"num\">"$13"</td><td class=\"num\">"size" "bytes"</td><td class=\"char\">"status"</td></tr>"
printf "<tr class=\"back\"><td class=\"num\">%d</td>",l_number
printf "<td class=\"char\">%s</td>",$2
printf "<td class=\"char\">%s</td>",$4
printf "<td class=\"char\">%s %s</td>",$6,$7
printf "<td class=\"char\">%s</td>",type
printf "<td class=\"char\">%s</td>",level
printf "<td class=\"num\">%s</td>",$13
if(size>0){
printf "<td class=\"num\">%.2f %.2s</td>",size,bytes
}
else {
printf "<td class=\"num\">%d %.2s</td>",size,bytes
}
printf "<td class=\"char\">%s</td></tr>\n",status
l_number++
}
END{
if(errors>0){
print "<tr id=\"Errors\" class=\"sum\"><td colspan=8 class=\"num\">Errors</td><td class=\"num_error\">"errors"</td></tr></table>"
}
else{
print "<tr id=\"Errors\" class=\"sum\"><td colspan=8 class=\"num\">Errors</td><td class=\"num\">"errors"</td></tr></table>"
}
}' $tempfile>> ${WORKFILE}
done
write_f "</td></tr></table></body>"
mutt -a ${WORKFILE} -s "Backups audit from $HOSTNAME $day $month $year" $MAILTO </dev/null
rm -f $WORKFILE