Всмысле использую синтаксис питона, но не его возможности.
Посмотрите, пожалуйста, код. Это скрипт, который получает письма из ящика и взаимодействует с bash скриптами в соответствии с тем, что написано в письме.
Прошу посмотреть код и указать на недочёты.
#!/usr/bin/python
# -*- coding: utf8 -*-
import poplib, email
import hashlib
import sys
import os
password_file = "/etc/securitycenter/.pass"
server = "pop.yandex.ru"
port = "995"
login = "email@example.com"
pop_password = "pass"
#Поучили обьект ящика, номер сообщения.
def get_command(box, msgnum):
#Расковыряли сообщение
(resp, lines, octets) = box.retr(msgnum)
msgtext = "\n".join(lines) + "\n\n"
message = email.message_from_string(msgtext)
answerto = message["from"]
subject = message["subject"]
msglist = msgtext.split('\n')
exit = 0
i = 0
#Тут немного говномагии: чистим текст сообщения от пустых строк и символов начала новой строки
while (i != len(msglist) or not exit):
try:
if (msglist[i] == '' or msglist[i] == '\n'):
msglist.pop(i)
else:
i+=1
except IndexError:
exit = 1
#Мы привязаны к порядку следования строк в тексте. Хуёво, но мыж отпылесосили весь мусор, так что беды быть не должно
password = msglist[-2]
command = msglist[-1]
return (subject, password, command, answerto, msgnum)
#Проверяет правильность пароля. В эталонном файле хранится МД5
def check_pass(password_file, password):
f = open(password_file, 'r')
true_pass_hash = f.readline().split('\n')[0]
f.close()
return hashlib.md5(password).hexdigest() == true_pass_hash
#Это выполняет команду. Принимает (строку с командой, строку с адресом отправителя, тут адрес скрипта, который исполняет команду и скрипт, который отправляет почту)
def run_command(com, ans, executer='/etc/securitycenter/warder.sh', sender='/etc/securitycenter/sendmessage.sh'):
#По требованию с удовольствием проверит, передали ли аргумент к команде
def check_arg(com, ans):
try:
test = command[1]
return True
except IndexError:
os.system('%s simple %s From_emailexecuter %s_need_argument > /dev/null 2>&1' % (sender, ans, command[1]))
return False
#Ещё говномагия: приводим адрес отправителя от вида "Фимоз Мозга <fimozmozga@ololo.com>" к fimozmozga@ololo.com
try:
ans.index('<')
ans = ans.split('<')[1][0:-1]
except ValueError:
pass
#Из строки с командой (вида: команда:аргумент) получаем, собственно, саму команду, и аргументы к ней (если есть)
command = com.split(':')
if command[0] == 'unban':
if check_arg(command, ans):
os.system("%s unban %s > /dev/null 2>&1" % (executer, command[1]))
elif command[0] == 'helpme':
os.system("%s emailhelp %s > /dev/null 2>&1" % (executer, ans))
#Если нет команды, пожалуемся в ответ:
else:
os.system('%s simple %s From_emailexecuter Do_not_know_that_is_%s > /dev/null 2>&1' % (sender, ans, command[0]))
box = poplib.POP3_SSL(server, port)
box.user(login)
box.pass_(pop_password)
messages = []
response, lst, octets = box.list()
j = 0
if len(lst):
for msgnum, msgsize in [i.split() for i in lst]:
messages.append({})
subject, password, command, answerto, msgnum = get_command(box, msgnum)
messages[j]['from'] = answerto
messages[j]['subject'] = subject
messages[j]['password'] = password
messages[j]['command'] = command
j+=1
box.dele(msgnum)
box.quit()
else:
sys.exit(0)
for datablock in messages:
#Проверяется не только пароль,
if check_pass(password_file, datablock['password']):
#Но и тема письма:
if datablock['subject'] == 'com':
run_command(datablock['command'], datablock['from'])