Форум сайта python.su
Покажите как можно объединить 2 скрипта
Первый - пингует сервак
import datetime
import socket
import sys
import time
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
while 1:
# Получаем дату и время
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
# Создаёт сокет
s = socket.socket()
s.settimeout(1)
# Попытка подвключится к сокету
try:
s.connect((host, int(port)))
except socket.error:
print timestamp+' '+ host + ':' + port + ' - Неактивен'
else:
s.close
print timestamp+' '+ host + ':' + port + ' - Активен'
time.sleep(1)
import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.ehlo()
msg = "Сообщение"
server.login("ваш@мейл", "ваш@пароль")
server.sendmail("от кого@отправялть", "кому@отправлять", msg)
print "Sended"
server.quit()
Офлайн
Если простенько то - Вынести второй скрипт в функцию и потом при ексепшене вызывать:
def send_notification_mail():
server = smtplib.SMTP('smtp.gmail.com', 587)
...
server.quit()
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
while 1:
...
except socket.error:
print timestamp+' '+ host + ':' + port + ' - Неактивен'
send_notification_mail()
...
Офлайн
Спасибо большое. А как посоветуете модернизировать скрипт, чтобы отправлялось только 1 раз сообщение за событие? Например:
Запустился скрипт
Активен - отправилось сообщение
Активен
Активен
Активен
Активен
Неактивен - отправилось сообщение
Неактивен
Неактивен
Неактивен
Неактивен
Активен - отправилось сообщение
Активен
Активен
Для каждого события создам функцию и также сделаю пинг 1 раз в минуту.
Офлайн
И ещё не могу понять такую штуку. Пользуюсь оболочкой DreamPie
Когда сперва запускаю скрипт отправки, а потом тестирую полностью оба скрипта, то работает и сообщение отправляет. Но когда при открытии оболочки я сразу пытаюсь запустить полностью весь скрипт, то мне выдаёт
Хост:1.1.1.1
Порт:1
Traceback (most recent call last):
File "<pyshell#0>", line 34, in <module>
send_mail()
NameError: name 'send_mail' is not defined
import datetime
import socket
import sys
import time
import smtplib
from email.MIMEText import MIMEText
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
status1 = ' - Неактивен'
status2 = ' - Активен'
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
while 1:
# Получаем дату и время
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
# Создаёт сокет
s = socket.socket()
s.settimeout(1)
# Попытка подвключится к сокету
try:
s.connect((host, int(port)))
except socket.error:
send_mail()
else:
s.close
print timestamp+' '+ host + ':' + port + ' - Активен'
time.sleep(1)
def send_mail():
# отправитель
me = 'user1@gmail.com'
# получатель
you = 'user2@i.ua'
# текст письма
status1 = ' - Неактивен'
status2 = ' - Активен'
text = timestamp+' '+ host + ':' + port + status1
# заголовок письма
subj = host + status1
# параметры SMTP-сервера
server = "smtp.gmail.com"
port = 587
user_name = "user1"
user_passwd = "***"
# формирование сообщения
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
# отправка
s = smtplib.SMTP(server, port)
s.set_debuglevel(1)
s.ehlo()
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(me, you, msg.as_string())
print "Done!"
s.quit()
return
Офлайн
NameError: name ‘send_mail’ is not defined- Объявление функции должно находиться до ее первого вызова .
Спасибо большое. А как посоветуете модернизировать скрипт, чтобы отправлялось только 1 раз сообщение за событие?Можно ввести пару переменных которые за этим будут следить.
import datetime
import socket
import sys
import time
import smtplib
from email.MIMEText import MIMEText
HOST_UP = 1
HOST_DOWN = 2
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
def send_mail(status):
#Передаем статус в функцию
# отправитель
me = 'user1@gmail.com'
# получатель
you = 'user2@i.ua'
# текст письма
if status == HOST_UP:
status_msg = u' - Неактивен'
elif status == HOST_DOWN:
status_msg = u' - Активен'
else:
return
text = timestamp+' '+ host + ':' + port + status_msg
# заголовок письма
subj = host + status1
# параметры SMTP-сервера
server = "smtp.gmail.com"
port = 587
user_name = "user1"
user_passwd = "***"
# формирование сообщения
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
# отправка
s = smtplib.SMTP(server, port)
s.set_debuglevel(1)
s.ehlo()
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(me, you, msg.as_string())
print "Done!"
s.quit()
return
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
status = None
status_changed = False
while 1:
# Получаем дату и время
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
# Создаёт сокет
s = socket.socket()
s.settimeout(1)
# Попытка подвключится к сокету
try:
s.connect((host, int(port)))
except socket.error:
if status != HOST_DOWN:
status_changed = True
status = HOST_DOWN
else:
s.close
if status != HOST_UP:
status_changed = True
status = HOST_UP
print timestamp+' '+ host + ':' + port + ' - Активен'
if status_changed:
send_mail(status)
status_changed = False
time.sleep(1)
Отредактировано (Июль 7, 2011 09:48:26)
Офлайн
А python сильно требователен к синтаксису и пунктуации ?
Офлайн
Когда пытаюсь выполнить скрипт, то он не отвечает. То есть просит ввести Хост и порт и молчит. Если по отдельности выполняю, то всё работает! Подскажите где тут ошибка ? Пунктуацияб синтаксис ? Функцию перенёс верх уже
import datetime
import socket
import sys
import time
import smtplib
from email.MIMEText import MIMEText
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
status1 = ' - Неактивен'
status2 = ' - Активен'
def send_mail():
# отправитель
me = 'a@gmail.com'
# получатель
you = 'u@i.ua'
# текст письма
text = timestamp+status1
# заголовок письма
subj = host + status1
# параметры SMTP-сервера
server = "smtp.gmail.com"
port = 587
user_name = "a"
user_passwd = "******"
# формирование сообщения
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
# отправка
s = smtplib.SMTP(server, port)
s.set_debuglevel(1)
s.ehlo()
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(me, you, msg.as_string())
print "Done!"
s.quit()
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
while 1:
# Получаем дату и время
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
# Создаёт сокет
s = socket.socket()
s.settimeout(1)
# Попытка подвключится к сокету
try:
s.connect((host, int(port)))
except socket.error:
send_mail()
else:
s.close
print timestamp+' '+ host + ':' + port + ' - Активен'
time.sleep(1)
Офлайн
А вот так, работает! Неужели проблема в пунктуации ??
import datetime
import socket
import sys
import time
import smtplib
from email.MIMEText import MIMEText
# Получаем IP и порт для пинга
host = raw_input('Хост:')
port = raw_input('Порт:')
status1 = ' - Неактивен'
status2 = ' - Активен'
def send_mail():
# отправитель
me = 'a'
# получатель
you = 'u'
# текст письма
text = 'test'
# заголовок письма
subj = 'test'
# параметры SMTP-сервера
server = "smtp.gmail.com"
port = 587
user_name = "a"
user_passwd = "******"
# формирование сообщения
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
# отправка
s = smtplib.SMTP(server, port)
s.set_debuglevel(1)
s.ehlo()
s.starttls()
s.login(user_name, user_passwd)
s.sendmail(me, you, msg.as_string())
print "Done!"
s.quit()
# Проверяем правильно ли написан порт
if not port.isalnum():
print 'Введите правильно порт'
sys.exit(1)
while 1:
# Получаем дату и время
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
# Создаёт сокет
s = socket.socket()
s.settimeout(1)
# Попытка подвключится к сокету
try:
s.connect((host, int(port)))
except socket.error:
print timestamp+' '+ host + ':' + port + ' - Неактивен'
send_mail()
else:
s.close
print timestamp+' '+ host + ':' + port + ' - Активен'
time.sleep(1)
Офлайн
Питон очень чувствителен к отступам (и это прекрасно :))
while 1:
# ----------------------------------------------------------------
d = datetime.datetime.now()
timestamp = d.strftime("%Y-%m-%d %H:%M:%S")
s = socket.socket() # - Это блок цикла
s.settimeout(1)
# ----------------------------------------------------------------
# ---------------------------------------------------
try:
s.connect((host, int(port)))
except socket.error:
send_mail() # - А это уже совсем другой блок
else:
s.close
# ---------------------------------------------------
Отредактировано (Июль 7, 2011 12:41:48)
Офлайн
А каким редактором/интерпретатором вы пользуетесь ?
Я не могу понять этот DreamPie - целый скрипт не работает. Я запускаю кусочками - всё проходит.
Потом запускаю полный скрипт и вуаля. Уже не хватает нервов
Офлайн