-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackup-zimbra-rpms.sh
More file actions
executable file
·135 lines (111 loc) · 4.05 KB
/
backup-zimbra-rpms.sh
File metadata and controls
executable file
·135 lines (111 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/bash
set -euo pipefail
# Directory to save RPM backups
BACKUP_DIR=~/zimbra-rpm-backup/$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Zimbra repos to use
ZIMBRA_REPOS=("zimbra" "zimbra-90-oss" "zimbra-90-network")
REPO_FLAGS=$(printf -- "--enablerepo=%s " "${ZIMBRA_REPOS[@]}")
# Output files for tracking
MISSING_LIST="$BACKUP_DIR/missing.txt"
REBUILT_LIST="$BACKUP_DIR/rebuilt.txt"
DOWNLOADED_LIST="$BACKUP_DIR/downloaded.txt"
REBUILD_FAILURES="$BACKUP_DIR/rpmrebuild-failures.log"
TAR_OUTPUT_DIR="$BACKUP_DIR/fallback-tars"
mkdir -p "$TAR_OUTPUT_DIR"
touch "$MISSING_LIST" "$REBUILT_LIST" "$DOWNLOADED_LIST" "$REBUILD_FAILURES"
# Check if rpmrebuild is available
HAS_RPMREBUILD=0
if command -v rpmrebuild >/dev/null; then
HAS_RPMREBUILD=1
else
echo "⚠️ rpmrebuild not installed. Some packages may not be backed up."
fi
# Get all installed zimbra packages
ZIMBRA_PKGS=$(rpm -qa | grep ^zimbra-)
echo "📦 Found $(echo "$ZIMBRA_PKGS" | wc -l) installed Zimbra packages."
echo "📥 Backing up to: $BACKUP_DIR"
echo
for pkg in $ZIMBRA_PKGS; do
echo "🔍 Processing: $pkg"
VERSION=$(rpm -q --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}" "$pkg")
RPM_FILENAME="$VERSION.rpm"
# Try dnf download
if dnf download "$VERSION" --downloaddir="$BACKUP_DIR" --disablerepo="*" $REPO_FLAGS 2>/dev/null; then
echo " ✅ Downloaded from repo: $VERSION"
echo "$VERSION" >> "$DOWNLOADED_LIST"
continue
fi
echo " ⚠️ Not found in repos. Trying cache..."
CACHED=$(find /var/cache/dnf -name "$RPM_FILENAME" 2>/dev/null | head -n 1)
if [[ -f "$CACHED" ]]; then
echo " ✅ Found in cache: $CACHED"
cp "$CACHED" "$BACKUP_DIR/"
echo "$VERSION (from cache)" >> "$DOWNLOADED_LIST"
continue
fi
if [[ "$HAS_RPMREBUILD" -eq 1 ]]; then
echo " 🔧 Attempting rebuild with rpmrebuild..."
TMPDIR=$(mktemp -d)
LOGFILE="$TMPDIR/rpmrebuild.log"
if rpmrebuild -p "$pkg" >"$LOGFILE" 2>&1; then
BUILT_RPM=$(grep -Eo '/tmp/.+\.rpm' "$LOGFILE" | head -n 1)
if [[ -f "$BUILT_RPM" ]]; then
echo " ✅ Rebuilt: $BUILT_RPM"
cp "$BUILT_RPM" "$BACKUP_DIR/"
echo "$VERSION (rebuilt)" >> "$REBUILT_LIST"
rm -rf "$TMPDIR"
continue
else
echo " ❌ rpmrebuild did not produce a .rpm for $VERSION" | tee -a "$REBUILD_FAILURES"
cat "$LOGFILE" >> "$REBUILD_FAILURES"
fi
else
echo " ❌ rpmrebuild failed for $VERSION" | tee -a "$REBUILD_FAILURES"
cat "$LOGFILE" >> "$REBUILD_FAILURES"
fi
rm -rf "$TMPDIR"
else
echo " ❌ rpmrebuild not available for $VERSION"
fi
echo " ❌ Could not save: $VERSION"
echo "$VERSION" >> "$MISSING_LIST"
echo
done
# 🔁 Final fallback: archive files + scripts for missing RPMs
if [[ -s "$MISSING_LIST" ]]; then
echo "📦 Starting fallback archive of missing RPMs..."
while read -r fullpkg; do
name=$(echo "$fullpkg" | sed -E 's/-[^-]+-[^-]+\.[^.]+$//')
echo "📦 Archiving fallback for: $fullpkg ($name)"
FILE_LIST=$(rpm -ql "$name" 2>/dev/null || true)
SCRIPT_DUMP=$(rpm -q --scripts "$name" 2>/dev/null || true)
if [[ -z "$FILE_LIST" && -z "$SCRIPT_DUMP" ]]; then
echo " ⚠️ Package not installed or has no files/scripts: $name"
continue
fi
TAR_PATH="$TAR_OUTPUT_DIR/${fullpkg}.tar.gz"
TMPDIR=$(mktemp -d)
mkdir -p "$TMPDIR/files"
# Copy listed files that exist
for file in $FILE_LIST; do
if [[ -f "$file" || -d "$file" ]]; then
mkdir -p "$TMPDIR/files$(dirname "$file")"
cp -a "$file" "$TMPDIR/files$(dirname "$file")/" 2>/dev/null || true
fi
done
# Save script dump
echo "$SCRIPT_DUMP" > "$TMPDIR/scripts.txt"
# Archive all
tar --exclude='*.sock' -czf "$TAR_PATH" -C "$TMPDIR" .
echo " ✅ Saved: $TAR_PATH"
rm -rf "$TMPDIR"
done < "$MISSING_LIST"
fi
echo ""
echo "✅ Backup complete."
echo " RPMs downloaded: $DOWNLOADED_LIST"
echo " RPMs rebuilt: $REBUILT_LIST"
echo " Missing RPMs: $MISSING_LIST"
echo " Fallback tarballs: $TAR_OUTPUT_DIR"
echo " Rebuild failures: $REBUILD_FAILURES"