I’m experimenting with ghettoVCB.sh backup script for ESX(i). In short, it needs netcat to mail the admin the result of a backup. But sending the message bulk via a socket fails when submitting to a smtp server that checks for invalid pipelining (for example Postfix configured basic anti-spam rules refuses to accept the message with an “Improper use of SMTP command pipelining” error). Moreover I don’t like to install netcat on my ESX boxes, if I can avoid it.
So here is a patch that solves both issues. Tested on ESX 3.5. Can not work on ESXi.
--- ghettoVCB.sh.orig 2010-12-20 23:38:09.000000000 +0100
+++ ghettoVCB.sh 2010-12-21 14:40:02.000000000 +0100
@@ -79,7 +79,7 @@
# Email debug 1=yes, 0=no
EMAIL_DEBUG=0
-# Email log 1=yes, 0=no
+# Email log 1=yes via netcat (if available), 2=yes via bash' builtin, 0=no
EMAIL_LOG=0
# Email SMTP server
@@ -162,7 +162,7 @@
echo -e "${TIME} -- ${LOG_TYPE}: ${MSG}" >> "${LOG_OUTPUT}"
fi
- if [ "${EMAIL_LOG}" -eq 1 ]; then
+ if [ "${EMAIL_LOG}" -ne 0 ]; then
echo -ne "${TIME} -- ${LOG_TYPE}: ${MSG}\r\n" >> "${EMAIL_LOG_OUTPUT}"
fi
fi
@@ -249,6 +249,10 @@
echo -ne "From: ${EMAIL_FROM}\r\n" >> "${EMAIL_LOG_OUTPUT}"
echo -ne "To: ${EMAIL_TO}\r\n" >> "${EMAIL_LOG_OUTPUT}"
echo -ne "Subject: ghettoVCB - $(date)\r\n" >> "${EMAIL_LOG_OUTPUT}"
+ elif [[ "${EMAIL_LOG}" -eq 2 ]]; then
+ echo -ne "From: ${EMAIL_FROM}\r\n" >> "${EMAIL_LOG_OUTPUT}"
+ echo -ne "To: ${EMAIL_TO}\r\n" >> "${EMAIL_LOG_OUTPUT}"
+ echo -ne "Subject: ghettoVCB - $(date)\r\n" >> "${EMAIL_LOG_OUTPUT}"
else
EMAIL_LOG=0
fi
@@ -429,7 +433,7 @@
logger "info" "CONFIG - VM_SNAPSHOT_QUIESCE = ${VM_SNAPSHOT_QUIESCE}"
logger "info" "CONFIG - VMDK_FILES_TO_BACKUP = ${VMDK_FILES_TO_BACKUP}"
logger "info" "CONFIG - EMAIL_LOG = ${EMAIL_LOG}"
- if [ "${EMAIL_LOG}" -eq 1 ]; then
+ if [ "${EMAIL_LOG}" -ne 0 ]; then
logger "info" "CONFIG - EMAIL_DEBUG = ${EMAIL_DEBUG}"
logger "info" "CONFIG - EMAIL_SERVER = ${EMAIL_SERVER}"
logger "info" "CONFIG - EMAIL_SERVER_PORT = ${EMAIL_SERVER_PORT}"
@@ -886,12 +890,70 @@
if [ $? -eq 1 ]; then
logger "info" "ERROR: Failed to email log output to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT} to ${EMAIL_TO}\n"
fi
-
- if [ "${EMAIL_DEBUG}" -eq 1 ]; then
- logger "info" "Email log output will not be deleted and is stored in ${EMAIL_LOG_OUTPUT}\n"
+ elif [ "${EMAIL_LOG}" -eq 2 ]; then
+
+ exec 3<>/dev/tcp/${EMAIL_SERVER}/${EMAIL_SERVER_PORT}
+ if [ $? -ne 0 ] ; then
+ ERRSM="Failed to connect to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
else
- rm -rf "${EMAIL_LOG_OUTPUT}"
+ ERRSM=
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ # Read banner
+ read -t 5 resp <&3
+ [[ "$resp" == 2* ]] || ERRSM="Failed reading banner from ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ # send command
+ echo -ne "HELO $(hostname -s)\r\n" >&3
+ # Read answer
+ read -t 5 resp <&3
+ [[ "$resp" == 2* ]] || ERRSM="Failed sending HELO command to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ echo -ne "MAIL FROM: <${EMAIL_FROM}>\r\n" >&3
+ read -t 5 resp <&3
+ [[ "$resp" == 2* ]] || ERRSM="Failed sending MAIL FROM command to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ echo -ne "RCPT TO: <${EMAIL_TO}>\r\n" >&3
+ read -t 5 resp <&3
+ [[ "$resp" == 2* ]] || ERRSM="Failed sending RCPT TO command to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ echo -ne "DATA\r\n" >&3
+ read -t 5 resp <&3
+ [[ "$resp" == 3* ]] || ERRSM="Failed sending DATA command to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ cat "${EMAIL_LOG_OUTPUT}" >&3
+ echo -en "\r\n.\r\n" >&3
+ read -t 5 resp <&3
+ [[ "$resp" == 2* ]] || ERRSM="Failed sending the message body to ${EMAIL_SERVER}:${EMAIL_SERVER_PORT}"
+ fi
+
+ if [ ! "$ERRSM" ] ; then
+ echo -ne "QUIT\r\n" >&3
+ cat <&3 > /dev/null
fi
+
+ if [ "$ERRSM" ] ; then
+ logger "info" "ERROR: ${ERRSM} while sending to ${EMAIL_TO}\n"
+ fi
+ else
+ return
+ fi
+
+ if [ "${EMAIL_DEBUG}" -eq 1 ]; then
+ logger "info" "Email log output will not be deleted and is stored in ${EMAIL_LOG_OUTPUT}\n"
+ else
+ rm -rf "${EMAIL_LOG_OUTPUT}"
fi
}
