ghettoVCB mail without netcat

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
 }

Comments are closed.