|
@@ -1,112 +1,195 @@
|
|
|
#!/bin/bash
|
|
#!/bin/bash
|
|
|
#########################################################################
|
|
#########################################################################
|
|
|
-# Script for extract PVE backup VM status #
|
|
|
|
|
|
|
+# Script for extract PVE backup VM status II #
|
|
|
# Created by Pavol Macko - DoIT #
|
|
# Created by Pavol Macko - DoIT #
|
|
|
-# ver 0.4 #
|
|
|
|
|
|
|
+# ver 0.3 #
|
|
|
#########################################################################
|
|
#########################################################################
|
|
|
|
|
|
|
|
#---------------------------- VARIABLES --------------------------------#
|
|
#---------------------------- VARIABLES --------------------------------#
|
|
|
|
|
+SRC="usb"
|
|
|
SRV=$(hostname -s)
|
|
SRV=$(hostname -s)
|
|
|
-SRC="/var/www/backup/"
|
|
|
|
|
-test -d $SRC || mkdir $SRC
|
|
|
|
|
-WEB="$SRC/index.html"
|
|
|
|
|
|
|
+FLD="/var/www/backup"
|
|
|
|
|
+test -d $FLD || mkdir $FLD
|
|
|
|
|
+WEB="$FLD/index.html"
|
|
|
|
|
+test -d /mnt/pve/$SRC/ || echo -e "- \e[1;31mWrong\e[0m source variable [\e[1;36m$SRC\e[0m]"
|
|
|
|
|
+test -d /mnt/pve/$SRC/ || exit 1
|
|
|
|
|
+
|
|
|
|
|
+#------------------------------- DATE ----------------------------------#
|
|
|
|
|
+aid(){
|
|
|
|
|
+date +%s
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
#--------------------------- EXTRACT-ALL -------------------------------#
|
|
#--------------------------- EXTRACT-ALL -------------------------------#
|
|
|
extall(){
|
|
extall(){
|
|
|
echo -e " \e[1;32mACTUAL SUMMARY\e[0m of \e[1;36mALL\e[0m extracted PROXMOX virtual server \e[1;35mbackups\e[0m from server \e[1;33m$SRV\e[0m "
|
|
echo -e " \e[1;32mACTUAL SUMMARY\e[0m of \e[1;36mALL\e[0m extracted PROXMOX virtual server \e[1;35mbackups\e[0m from server \e[1;33m$SRV\e[0m "
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" > /tmp/pveb.log
|
|
|
|
|
-echo "PID HOSTNAME START-DATE START-TIME END-DATE END-TIME HDD-SIZE DUR(s) BCK-SIZE" >> /tmp/pveb.log
|
|
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" >> /tmp/pveb.log
|
|
|
|
|
-LST=$(egrep -lRi "backup" /var/log/pve/tasks/* | grep pam)
|
|
|
|
|
-for b in $LST;
|
|
|
|
|
-do
|
|
|
|
|
-cat $b | grep "Starting Backup" | awk '{print $6}' > /tmp/pbi
|
|
|
|
|
-cat $b | grep "Backup started" | awk '{print $5,$6}' > /tmp/pbs
|
|
|
|
|
-cat $b | grep "VM Name" | awk '{print $4}' > /tmp/pbn
|
|
|
|
|
-cat $b | grep "Backup finished" | awk '{print $5,$6}' > /tmp/pbe
|
|
|
|
|
-cat $b | grep "transferred" | awk '{print $3$4,$6}' | sed 's/\.00//g' | sed 's/i//g' > /tmp/pbt
|
|
|
|
|
-SIZ=$(cat $b | grep "archive file" | awk '{print $5}')
|
|
|
|
|
-if [ ! -z "$SIZ" ];
|
|
|
|
|
-then
|
|
|
|
|
- cat $b | grep "archive file" | awk '{print $5}' > /tmp/pbz
|
|
|
|
|
-else
|
|
|
|
|
- cat $b | grep "backup is sparse" | awk '{print $5$6}' > /tmp/pbz
|
|
|
|
|
-fi
|
|
|
|
|
-paste /tmp/pbi /tmp/pbn /tmp/pbs /tmp/pbe /tmp/pbt /tmp/pbz >> /tmp/pveb
|
|
|
|
|
-done
|
|
|
|
|
-cat /tmp/pveb | sort -n >> /tmp/pveb.log
|
|
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" >> /tmp/pveb.log
|
|
|
|
|
-cat /tmp/pveb.log | column -t
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-#--------------------------- EXTRACT-LAST -------------------------------#
|
|
|
|
|
-extlast(){
|
|
|
|
|
-echo -e " \e[1;32mACTUAL SUMMARY\e[0m of \e[1;36mLAST\e[0m extracted PROXMOX virtual server \e[1;35mbackups\e[0m from server \e[1;33m$SRV\e[0m "
|
|
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" > /tmp/pvebt.log
|
|
|
|
|
-echo "PID HOSTNAME START-DATE START-TIME END-DATE END-TIME HDD-SIZE DUR(s) BCK-SIZE" >> /tmp/pvebt.log
|
|
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" >> /tmp/pvebt.log
|
|
|
|
|
-PID=$(cat /tmp/pveb.log | awk '{print $1}' | egrep -v "\---|PID" | sort | uniq)
|
|
|
|
|
-for t in $PID;
|
|
|
|
|
|
|
+echo "---------- --------- ---------- ---------- ---------- -------- -------- -------- ----------" > /tmp/pveb.log
|
|
|
|
|
+echo "AUTOID HOSTNAME START-DATE START-TIME END-DATE END-TIME HDD-SIZE BCK-SIZE DUR" >> /tmp/pveb.log
|
|
|
|
|
+echo "---------- --------- ---------- ---------- ---------- -------- -------- -------- ----------" >> /tmp/pveb.log
|
|
|
|
|
+LST=$(ls /mnt/pve/$SRC/dump/*.log)
|
|
|
|
|
+for i in $LST;
|
|
|
do
|
|
do
|
|
|
-cat /tmp/pveb.log | grep -w $t | tail -1 >> /tmp/pvebt.log
|
|
|
|
|
|
|
+SDAT=$(cat $i | grep "VM Name" | awk '{print $1}')
|
|
|
|
|
+STIM=$(cat $i | grep "VM Name" | awk '{print $2}')
|
|
|
|
|
+HST=$(cat $i | grep "VM Name" | awk '{print $NF}')
|
|
|
|
|
+DSK=$(cat $i | grep "include disk" | egrep -v "efidisk|tpmstat" | awk '{print $NF}')
|
|
|
|
|
+ARC=$(cat $i | grep "archive file" | awk '{print $NF}')
|
|
|
|
|
+DUR=$(cat $i | grep "Finished" | awk '{print $NF}')
|
|
|
|
|
+FDAT=$(cat $i | grep "Finished" | awk '{print $1}')
|
|
|
|
|
+FTIM=$(cat $i | grep "Finished" | awk '{print $2}')
|
|
|
|
|
+echo "$(aid) $HST $SDAT $STIM $FDAT $FTIM $DSK $ARC $DUR" | awk 'NF >= 2' >> /tmp/pveb.log
|
|
|
|
|
+sleep 1
|
|
|
done
|
|
done
|
|
|
-sed -i "s/[[:space:]]\+/ /g" /tmp/pvebt.log
|
|
|
|
|
-echo "--- --------- ---------- ---------- ---------- -------- -------- ------ --------" >> /tmp/pvebt.log
|
|
|
|
|
|
|
+echo "---------- --------- ---------- ---------- ---------- -------- -------- -------- ----------" >> /tmp/pveb.log
|
|
|
|
|
+sed -i 's/(//g' /tmp/pveb.log
|
|
|
|
|
+sed -i 's/)//g' /tmp/pveb.log
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#-------------------------- GENERATE-WEB -------------------------------#
|
|
#-------------------------- GENERATE-WEB -------------------------------#
|
|
|
extweb(){
|
|
extweb(){
|
|
|
-cat > $WEB <<\EOG
|
|
|
|
|
-<html>
|
|
|
|
|
|
|
+ cat > $WEB <<EOG
|
|
|
|
|
+<!DOCTYPE html>
|
|
|
|
|
+<html lang="sk">
|
|
|
<head>
|
|
<head>
|
|
|
-<title>PVE-Backups</title>
|
|
|
|
|
|
|
+ <meta charset="UTF-8">
|
|
|
|
|
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
+ <title>$SRV Backup</title>
|
|
|
|
|
+ <style>
|
|
|
|
|
+ :root {
|
|
|
|
|
+ --bg: #111827;
|
|
|
|
|
+ --card-bg: #1f2937;
|
|
|
|
|
+ --border: #374151;
|
|
|
|
|
+ --text: #f9fafb;
|
|
|
|
|
+ --text-muted: #9ca3af;
|
|
|
|
|
+ --accent: #e57008;
|
|
|
|
|
+ --hover: #2d3748;
|
|
|
|
|
+ }
|
|
|
|
|
+ body {
|
|
|
|
|
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
|
|
|
+ background-color: var(--bg);
|
|
|
|
|
+ color: var(--text);
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ padding: 2rem;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ }
|
|
|
|
|
+ .container {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ max-width: 1200px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-bottom: 1.5rem;
|
|
|
|
|
+ border-bottom: 2px solid var(--accent);
|
|
|
|
|
+ padding-bottom: 0.75rem;
|
|
|
|
|
+ }
|
|
|
|
|
+ h1 {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ font-size: 1.5rem;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 0.5rem;
|
|
|
|
|
+ }
|
|
|
|
|
+ h1 span {
|
|
|
|
|
+ color: var(--accent);
|
|
|
|
|
+ }
|
|
|
|
|
+ .table-wrapper {
|
|
|
|
|
+ background: var(--card-bg);
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ overflow-x: auto;
|
|
|
|
|
+ border: 1px solid var(--border);
|
|
|
|
|
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
|
|
|
|
|
+ }
|
|
|
|
|
+ table {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ border-collapse: collapse;
|
|
|
|
|
+ text-align: left;
|
|
|
|
|
+ font-size: 0.9rem;
|
|
|
|
|
+ }
|
|
|
|
|
+ th {
|
|
|
|
|
+ background-color: #111827;
|
|
|
|
|
+ color: var(--text-muted);
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ text-transform: uppercase;
|
|
|
|
|
+ font-size: 0.75rem;
|
|
|
|
|
+ letter-spacing: 0.05em;
|
|
|
|
|
+ padding: 0.85rem 1rem;
|
|
|
|
|
+ border-bottom: 1px solid var(--border);
|
|
|
|
|
+ }
|
|
|
|
|
+ td {
|
|
|
|
|
+ padding: 0.85rem 1rem;
|
|
|
|
|
+ border-bottom: 1px solid var(--border);
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ }
|
|
|
|
|
+ tr:last-child td {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+ }
|
|
|
|
|
+ tr:hover {
|
|
|
|
|
+ background-color: var(--hover);
|
|
|
|
|
+ }
|
|
|
|
|
+ .hostname {
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #60a5fa;
|
|
|
|
|
+ }
|
|
|
|
|
+ .footer {
|
|
|
|
|
+ margin-top: 1rem;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ font-size: 0.8rem;
|
|
|
|
|
+ color: var(--text-muted);
|
|
|
|
|
+ }
|
|
|
|
|
+ </style>
|
|
|
</head>
|
|
</head>
|
|
|
-<BODY>
|
|
|
|
|
-<TABLE WIDTH="100%" BORDER=1>
|
|
|
|
|
-<TBODY>
|
|
|
|
|
-<TR BGCOLOR="#C0C0C0" VALIGN=center>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>PID</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="20%"><DIV ALIGN=center><B>HOSTNAME</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>START-DATE</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>START-TIME</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>END-DATE</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>END-TIME</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>HDD-SIZE</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>DUR(s)</B></DIV></TD>
|
|
|
|
|
-<TD WIDTH="10%"><DIV ALIGN=center><B>BCK-SIZE</B></DIV></TD>
|
|
|
|
|
-</TR>
|
|
|
|
|
|
|
+<body>
|
|
|
|
|
+ <div class="container">
|
|
|
|
|
+ <div class="header">
|
|
|
|
|
+ <h1>PVE <span>Backup Report</span></h1>
|
|
|
|
|
+ <div>Server: <strong>$SRV</strong></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="table-wrapper">
|
|
|
|
|
+ <table>
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <th>Hostname</th>
|
|
|
|
|
+ <th>Start Date</th>
|
|
|
|
|
+ <th>Start Time</th>
|
|
|
|
|
+ <th>End Date</th>
|
|
|
|
|
+ <th>End Time</th>
|
|
|
|
|
+ <th>HDD Size</th>
|
|
|
|
|
+ <th>Bck Size</th>
|
|
|
|
|
+ <th>Duration</th>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
EOG
|
|
EOG
|
|
|
-IDS=$(cat /tmp/pvebt.log | grep "^[0-9]" | awk '{print $9}')
|
|
|
|
|
-for e in $IDS;
|
|
|
|
|
-do
|
|
|
|
|
-ID=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $1}')
|
|
|
|
|
-HST=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $2}')
|
|
|
|
|
-SDATE=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $3}')
|
|
|
|
|
-STIME=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $4}')
|
|
|
|
|
-EDATE=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $5}')
|
|
|
|
|
-ETIME=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $6}')
|
|
|
|
|
-HSIZE=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $7}')
|
|
|
|
|
-DUR=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $8}')
|
|
|
|
|
-BSIZE=$(cat /tmp/pvebt.log | grep -w "$e" | awk '{print $9}')
|
|
|
|
|
-echo "<TR VALIGN=center>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$ID</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"20%\"><DIV ALIGN=center>$HST</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$SDATE</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$STIME</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$EDATE</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$ETIME</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$HSIZE</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$DUR</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "<TD WIDTH=\"10%\"><DIV ALIGN=center>$e</DIV></TD>" >> $WEB
|
|
|
|
|
-echo "</TR>" >> $WEB
|
|
|
|
|
-done
|
|
|
|
|
-cat >> $WEB <<EOX
|
|
|
|
|
-<TR BGCOLOR="#C0C0C0" VALIGN=center>
|
|
|
|
|
-<TD COlSPAN="9" WIDTH="100%"><DIV ALIGN=center><B>GENERATED: <I>`date +%d/%m/%Y" "%T`</I></B></DIV></TD>
|
|
|
|
|
-</TR>
|
|
|
|
|
-</TBODY>
|
|
|
|
|
-</TABLE>
|
|
|
|
|
-</BODY>
|
|
|
|
|
|
|
+ while read -r line; do
|
|
|
|
|
+ if [[ "$line" =~ ^[0-9]+ ]]; then
|
|
|
|
|
+ read -r _ hst sdate stime edate etime hsize bsize dura <<< "$line"
|
|
|
|
|
+ cat >> $WEB <<EOF
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td class="hostname">$hst</td>
|
|
|
|
|
+ <td>$sdate</td>
|
|
|
|
|
+ <td>$stime</td>
|
|
|
|
|
+ <td>$edate</td>
|
|
|
|
|
+ <td>$etime</td>
|
|
|
|
|
+ <td>$hsize</td>
|
|
|
|
|
+ <td>$bsize</td>
|
|
|
|
|
+ <td>$dura</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+EOF
|
|
|
|
|
+ fi
|
|
|
|
|
+ done < /tmp/pveb.log
|
|
|
|
|
+ cat >> $WEB <<EOX
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="footer">
|
|
|
|
|
+ Generated: $(date +'%d.%m.%Y %H:%M:%S')
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</body>
|
|
|
|
|
+</html>
|
|
|
EOX
|
|
EOX
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -114,7 +197,6 @@ EOX
|
|
|
rm -rf /tmp/pveb*
|
|
rm -rf /tmp/pveb*
|
|
|
echo ""
|
|
echo ""
|
|
|
extall
|
|
extall
|
|
|
-extlast
|
|
|
|
|
extweb
|
|
extweb
|
|
|
-cat /tmp/pvebt.log | column -t
|
|
|
|
|
|
|
+cat /tmp/pveb.log | column -t
|
|
|
echo -e "- \e[1;32mGenerating\e[0m web report [\e[1;33m$WEB\e[0m]"
|
|
echo -e "- \e[1;32mGenerating\e[0m web report [\e[1;33m$WEB\e[0m]"
|