diff --git a/save_config.sh b/save_config.sh index 1930f90..2e06339 100644 --- a/save_config.sh +++ b/save_config.sh @@ -1,109 +1,161 @@ -#!/bin/sh - -rundate=$(date) - -################################################# -# Backup the FreeNAS configuration file -################################################# - -# Optional: specify your email address here if you want to receive notification -email="" - -# Optional: specify the short name of your ESXi host if you are running FreeNAS -# as a VM and you want to back up the ESXi host's configuration -esxihost="" - -# Specify the dataset on your system where you want the configuration files copied. -# Don't include the trailing slash. - -# Example: configdir=/mnt/tank/sysadmin/config - -configdir="" - -# Remove this code once you've defined configdir above... :-) - -if [ -z ${configdir} ]; then - echo "Edit script and specify the target directory ('configdir') before using $0" - exit 2 -fi - -freenashost=$(hostname -s) - -fnconfigdest_version=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n') -fnconfigdest_date=$(date +%Y%m%d%H%M%S) -fnconfigdest="${configdir}"/"${freenashost}"-"${fnconfigdest_version}"-"${fnconfigdest_date}".db - -echo "Backup FreeNAS configuration database file: ${fnconfigdest}" - -iscorral=$(< /etc/version grep "Corral" | awk {'print $1'}) - -if [ ! -z "${iscorral}" ]; then - # FreeNAS Corral: make a CLI call: - cli -e "system config download path=${fnconfigdest}" -else - # FreeNAS 9.x: Copy the source to the destination: - cp /data/freenas-v1.db "${fnconfigdest}" -fi - -l_status=$? - -################################################# -# Backup the VMware ESXi host configuration: -################################################# - -if [ ! -z "${esxihost}" ]; then - esxihostname=$(ssh root@"${esxihost}" hostname) - esxiversion=$(ssh root@"${esxihost}" uname -a | sed -e "s|VMkernel ||;s|$esxihostname ||") - esxiconfig_url=$(ssh root@"${esxihost}" vim-cmd hostsvc/firmware/backup_config | awk '{print $7}' | sed -e "s|*|$esxihostname|") - esxiconfig_date=$(date +%Y%m%d%H%M%S) - esxiconfig_file="${configdir}"/"${esxihost}"-configBundle-"${esxiconfig_date}".tgz - - echo "Downloading $esxiconfig_url to $esxiconfig_file" - wget --no-check-certificate --output-document="${esxiconfig_file}" "${esxiconfig_url}" -fi - -################################################# -# Send email notification if indicated: -################################################# - -if [ ! -z "${email}" ]; then - freenashostuc=$(hostname -s | tr '[:lower:]' '[:upper:]') - freenashostname=$(hostname) - freenasversion=$(cat /etc/version) - logfile="/tmp/save_config.tmp" - if [ $l_status -eq 0 ]; then - subject="FreeNAS configuration saved on server ${freenashostuc}" - else - subject="FreeNAS configuration backup failed on server ${freenashostuc}" - fi - ( - echo "To: ${email}" - echo "Subject: ${subject}" - echo "Content-Type: text/html" - echo "MIME-Version: 1.0" - printf "\r\n" - echo "
"
- if [ $l_status -eq 0 ]; then
- echo "Configuration file saved successfully on ${rundate}"
- else
- echo "Configuration backup failed with status=${l_status} on ${rundate}"
- fi
- echo ""
- echo "FreeNAS:"
- echo "Server: ${freenashostname}"
- echo "Version: ${freenasversion}"
- echo "File: ${fnconfigdest}"
- if [ ! -z "${esxihost}" ]; then
- echo ""
- echo "ESXi:"
- echo "Server: ${esxihostname}"
- echo "Version: ${esxiversion}"
- echo "File: ${esxiconfig_file}"
- fi
- echo ""
- ) > ${logfile}
- sendmail ${email} < ${logfile}
- rm ${logfile}
-fi
-
-
+#!/bin/sh
+
+#####
+# Backup the TrueNAS/FreeNAS configuration database and password secret encryption files
+#####
+
+# REQUIRED: Specify the dataset on your system where you want the configuration files copied.
+# Don't include the trailing slash.
+
+# Example: configdir="/mnt/tank/sysadmin/config"
+
+configdir=""
+
+# Remove this code once you've defined configdir above... :-)
+
+if [ -z "${configdir}" ]; then
+ echo "Edit script and specify the target directory ('configdir') before using $0"
+ exit 2
+fi
+
+# Optional: Set non-zero 'd0_tar' flag to have both files stored in a tarball as typically
+# needed when restoring a configuration.
+do_tar=1
+
+# Optional: specify your email address here if you want to receive a notification message.
+notifyemail=""
+
+# Optional: specify the short name of your ESXi host if you are running FreeNAS
+# as a VM and you want to back up the ESXi host's configuration
+esxihost=""
+
+# Get the date and version of TrueNAS/FreeNAS:
+
+rundate=$(date)
+
+osvers=$(grep -i truenas /etc/version)
+if [ -z "${osvers}" ]; then
+ osvers=$(grep -i freenas /etc/version)
+ if [ -z "${osvers}" ]; then
+ osvers="UNKNOWN"
+ else
+ osvers="FreeNAS"
+ fi
+else
+ osvers="TrueNAS"
+fi
+
+# Form a unique, timestamped filename for the backup configuration database and tarball
+
+P1=$(hostname -s)
+P2=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n')
+P3=$(date +%Y%m%d%H%M%S)
+fnconfigdest_base="$P1"-"$P2"-"$P3"
+fnconfigdestdb="${configdir}"/"${fnconfigdest_base}".db
+fnconfigtarball="${configdir}"/"${fnconfigdest_base}".tar
+
+# Copy the source database and password encryption secret key to the destination:
+
+echo "Backup ${osvers} configuration database file: ${fnconfigdestdb}"
+
+cp -f /data/pwenc_secret "$configdir"
+/usr/local/bin/sqlite3 /data/freenas-v1.db ".backup main '${fnconfigdestdb}'"
+l_status=$?
+
+# Validate the configuration file and create tarball:
+
+if [ $l_status -eq 0 ]; then
+ dbstatus=$(sqlite3 "$fnconfigdestdb" "pragma integrity_check;")
+ printf 'sqlite3 status: [%s]\n' "${dbstatus}"
+ if [ "${dbstatus}" = "ok" ]; then
+ l_status=0
+ if [ $do_tar -ne 0 ]; then
+ # Save the config DB w/ its original name in the tarball -- makes restoring them easier:
+ cp -f "${fnconfigdestdb}" "${configdir}"/freenas-v1.db
+ tar -cvf "${fnconfigtarball}" -C "${configdir}" freenas-v1.db pwenc_secret
+ l_status=$?
+ printf 'tar status: [%s]\n' "${l_status}"
+ fi
+ else
+ l_status=1
+ fi
+fi
+
+if [ $l_status -eq 0 ]; then
+ echo "Success backing up configuration files to directory ${configdir}"
+else
+ echo "Error backing up configuration files to directory ${configdir}"
+fi
+l_status=$?
+
+# Backup the VMware ESXi host configuration:
+
+if [ -n "${esxihost}" ]; then
+ esxihostname=$(ssh root@"${esxihost}" hostname)
+ esxiversion=$(ssh root@"${esxihost}" uname -a | sed -e "s|VMkernel ||;s|$esxihostname ||")
+ esxiconfig_url=$(ssh root@"${esxihost}" vim-cmd hostsvc/firmware/backup_config | awk '{print $7}' | sed -e "s|*|$esxihostname|")
+ esxiconfig_date=$(date +%Y%m%d%H%M%S)
+ esxiconfig_file="${configdir}"/"${esxihost}"-configBundle-"${esxiconfig_date}".tgz
+
+ echo "Downloading $esxiconfig_url to $esxiconfig_file"
+ wget --no-check-certificate --output-document="${esxiconfig_file}" "${esxiconfig_url}"
+fi
+
+# Send email notification if indicated:
+
+if [ -n "${notifyemail}" ]; then
+ freenashostuc=$(hostname -s | tr '[:lower:]' '[:upper:]')
+ freenashostname=$(hostname)
+ freenasversion=$(< /etc/version sed -e 's/)//;s/(//;s/ /-/' | tr -d '\n')
+ boundary="===== MIME boundary; ${osvers} server ${freenashostname} ====="
+ logfile="/tmp/save_config.tmp"
+ if [ $l_status -eq 0 ]; then
+ subject="${osvers} configuration saved on server ${freenashostuc}"
+ else
+ subject="${osvers} configuration backup failed on server ${freenashostuc}"
+ fi
+
+ printf "%s\n" "To: ${notifyemail}
+Subject: ${subject}
+Mime-Version: 1.0
+Content-Type: multipart/mixed; boundary=\"$boundary\"
+
+--${boundary}
+Content-Type: text/html; charset=\"US-ASCII\"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+" > ${logfile}
+
+(
+ if [ $l_status -eq 0 ]; then
+ echo "Configuration file saved successfully on ${rundate}"
+ else
+ echo "Configuration backup failed with status=${l_status} on ${rundate}"
+ fi
+ echo ""
+ echo "--- ${osvers} ---"
+ echo "Server: ${freenashostname}"
+ echo "Version: ${freenasversion}"
+ echo "Files:"
+ echo " ${fnconfigdestdb}"
+ echo " ${configdir}/pwenc_secret"
+ if [ "$do_tar" -ne 0 ]; then
+ echo " ${fnconfigtarball}"
+ fi
+ if [ -n "${esxihost}" ]; then
+ echo ""
+ echo "--- ESXi ---"
+ echo "Server: ${esxihostname}"
+ echo "Version: ${esxiversion}"
+ echo "File: ${esxiconfig_file}"
+ fi
+) >> ${logfile}
+
+ printf "%s\n" "
+--${boundary}--" >> ${logfile}
+
+ sendmail -t -oi < ${logfile}
+ rm ${logfile}
+fi
+
+