У меня есть скрипт ниже, который отлично работает для rsync, этот скрипт на самом деле перетаскивает файлы с удаленного хоста (ов) на сервер, где он работает под dest
Папка.
Однако rsync
работает нормально, но почтовая часть в основном msg = 'message + "rsync process completed"'
не отправляется как электронное письмо.
Почему-то я не понимаю, что не так, я делаю!
import os
import sys
import subprocess
import argparse
import smtplib
#Dir Structure
dst = "/infralogs/external_dns_logs"
rsync_user = "root"
mailFrom = 'robo@helisis.com'
mailTo = 'robo@helisis.com'
mailSub = 'Rsync status'
msg = ""
parser = argparse.ArgumentParser()
parser.add_argument("-n","--hosts",dest="hosts",help="enter remote host/hosts name, comma seperated",metavar="HOSTS")
parser.add_argument("-s","--src",dest="source",help="source file/directory",metavar="SOURCE")
parser.add_argument("-e","--exclude",dest="exclude",help="Exclude files/Directories, comma seperated list",metavar="EXCLUDE")
if len(sys.argv) < 7:
print(len(sys.argv))
parser.print_help()
parser.exit()
args = parser.parse_args()
def sync(host,dst):
exclude = ""
if not os.path.exists(dst):
os.mkdir(dst)
if ',' in args.exclude:
for excl in args.exclude.split(','):
exclude = exclude + " --exclude " + excl
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz %s %s@%s:%s %s/"%(exclude,rsync_user,host,args.source,dst)
else:
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dst)
print(cmd)
message = cmd
p = subprocess.Popen(cmd,shell=True)
p.wait()
print("DONE")
msg = message + "rsync process completed"
mailBody = "From: %s\nTo: %s\nSubject: %s\n\n%s" %(mailFrom,mailTo,mailSub,msg)
if ',' in args.hosts:
for host in args.hosts.split(','):
dest = dst + "/" + host
sync(host,dest)
else:
dest = dst + "/" + args.hosts
sync(args.hosts,dest)
try:
Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
Mail.sendmail(mailFrom,mailTo,mailBody,msg)
print("Mail Sent to %s" %(mailTo))
except:
print("Mail Failed")
Вывод результата на терминал из приведенного выше сценария:
$ ./log_rsync -n remote_Server -s /var/log/infoSec/ -e "null"
bind.log
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=7/9)
default.log
12769 100% 12.18MB/s 0:00:00 (xfer#2, to-check=6/9)
general.log
9553 100% 4.56MB/s 0:00:00 (xfer#3, to-check=5/9)
lame-servers.log
663 100% 129.49kB/s 0:00:00 (xfer#4, to-check=4/9)
network.log
0 100% 0.00kB/s 0:00:00 (xfer#5, to-check=3/9)
notify.log
3286 100% 356.55kB/s 0:00:00 (xfer#6, to-check=2/9)
queries.log
578 100% 47.04kB/s 0:00:00 (xfer#7, to-check=1/9)
query-errors.log
0 100% 0.00kB/s 0:00:00 (xfer#8, to-check=0/9)
sent 176 bytes received 4303 bytes 814.36 bytes/sec
total size is 26849 speedup is 5.99
DONE
Mail Sent to robo@helisis.com
Почтовая служба работает нормально, однако переменная msg
, которая содержит сообщение msg = message + "rsync process completed"
не получается отправить остальное электронное письмо с темой работает, проблема, кажется, с msg
часть, которая не вызывается или открывается неправильно.
просто альтернативный способ!
Хотя я применяю метод ниже, где я включил To
адрес, Subject
и Сообщение, т.е. Rsync Process Completed Successfully.
, который работает и отправляет электронную почту, но реальный вопрос снова остается тем же, если я хочу включить msg
или сказать хотите раскрыть msg
рИскусство здесь, как это могло быть сделано!
EmailSender="robo@localhost.helisis.com"
EmailReceiver="robo@helisis.com"
msgBody='''From: dnsmailer <netrobo@helisis.com>
To: To Person <robo@helisis.com>
Subject: rsync Status from infra-syslog
Rsync Process Completed Succesfully.
'''
if ',' in args.hosts:
for host in args.hosts.split(','):
dest = dst + "/" + host
sync(host,dest)
else:
dest = dst + "/" + args.hosts
sync(args.hosts,dest)
try:
smtpobj=smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
smtpobj.sendmail(EmailSender,EmailReceiver,msgBody)
except Exception as e:
print(e)