LINUX.ORG.RU
ФорумAdmin

Косяк в скрипте на python


0

1

Помогите пожалуйста поправить косяк в скрипте бекапирования, который читает из конфига параметры, и в случае неудачи шлет письмо через указанный сервер. Не могу до конца разобраться с smtplib:

#cat backup.conf

[Dirs]
dirs: /home/amihailov/back
backup_dir : /home/amihailov/backups

[Config]
from_mail: a.mikhailov@myhost.ru
admin_mail: amihailov@gmail.com
mail_server: mail.myhost.ru
delete_after_days: 5
pas: xxx 


~$ cat backup.py
#!/usr/bin/python2

import ConfigParser
import sys, commands, os, datetime
import smtplib
from email.mime.text import MIMEText

def send_mail(from_mail, to_mail, subj, message, server, pas):
	message = MIMEText(message)
	message['Subject'] = subj
	message['From'] = from_mail
	message['To'] = to_mail
	s = smtplib.SMTP(server)
	s.connect(server)
	s.login(from_mail, pas)
	s.sendmail(from_mail, to_mail, message.as_string())
	s.quit()

class BackupConfig:
	def __init__(self, filename):
		self.config = ConfigParser.ConfigParser()
		self.config.read(filename)

	def get(self, section, name):
		return self.config.get(section, name, 0)

def main():

	# Vars:
	config = BackupConfig('backup.conf')
	dirs = config.get('Dirs', 'dirs')
	backup_dir = config.get('Dirs', 'backup_dir')
	from_mail = config.get('Config', 'from_mail')
	admin_mail = config.get('Config', 'admin_mail')
	mail_server = config.get('Config', 'mail_server')
	pas = config.get('Config', 'pas')
	delete_after_days = config.get('Config', 'delete_after_days')
	timestamp = str(datetime.date.today())
	# ---

	# Clean backup dir, delete old files
	os.system("find " + backup_dir + " -mtime +" + delete_after_days + " -exec rm '{}' \;")
	# ---

	dirs = dirs.split(',')
	for directory in dirs:
		code = commands.getstatusoutput('7za a -t7z -mx0 ' + backup_dir + '/' + str(os.path.split(directory)[1]) + '_' + timestamp + '.7z "' + directory + '/"')
		if code[0] != 1:
			print str(code[1])
			send_mail(
				from_mail,
				admin_mail,
				'backup error',
				'Error: 7Zip return error code. Directory: ' + directory + '\n\r Error: ' + str(code[1]),
				mail_server,
				pas
			)


if __name__ == "__main__":
	main()


★★★★★
Ответ на: комментарий от val-amart

Скрипт писал не я, я в питоне нуб. Изначально он слал через локальный сендмейл. Нужно было добавить, чтобы можно было указывать в конфиге, через какой сервер слать письма. Что я вроде как и сделал. Только он вываливается с ошибкой:

~$ ./backup.py 

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)

Scanning

Updating archive /home/amihailov/backups/back_2014-04-18.7z


Everything is Ok
Traceback (most recent call last):
  File "./backup.py", line 61, in <module>
    main()
  File "./backup.py", line 56, in main
    pas
  File "./backup.py", line 15, in send_mail
    s.login(from_mail, pas)
  File "/usr/lib64/python2.7/smtplib.py", line 582, in login
    self.ehlo_or_helo_if_needed()
  File "/usr/lib64/python2.7/smtplib.py", line 542, in ehlo_or_helo_if_needed
    if not (200 <= self.ehlo()[0] <= 299):
  File "/usr/lib64/python2.7/smtplib.py", line 414, in ehlo
    (code, msg) = self.getreply()
  File "/usr/lib64/python2.7/smtplib.py", line 368, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
amihailov@linux-aw14:~$ 

Slack ★★★★★
() автор топика
Ответ на: комментарий от val-amart

хм, странно, то есть в скрипте все верно? С почтарем в принципе все нормально, но перепроверю еще раз.

Slack ★★★★★
() автор топика

при помощи wireshark сравнить обмен через скрипт и через telnet

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.