Найти - Пользователи
Полная версия: Объединить 2 скрипта:ping+send message
Начало » Центр помощи » Объединить 2 скрипта:ping+send message
1 2
afghanetz
Покажите как можно объединить 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()
Я хотел бы чтобы при получении print timestamp+' ‘+ host + ’:' + port + ‘ - Неактивен’ , мне на почту отправлялось письмо.
Подскажите как это реализовать.
Я только начинаю осваивать этот прекрасный язык и не могу понять.
Спасибо
pill
Если простенько то - Вынести второй скрипт в функцию и потом при ексепшене вызывать:
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()
...
Можно в отдельный поток вынести что-б не мешало пинговать…
afghanetz
Спасибо большое. А как посоветуете модернизировать скрипт, чтобы отправлялось только 1 раз сообщение за событие? Например:

Запустился скрипт
Активен - отправилось сообщение
Активен
Активен
Активен
Активен
Неактивен - отправилось сообщение
Неактивен
Неактивен
Неактивен
Неактивен
Активен - отправилось сообщение
Активен
Активен

Для каждого события создам функцию и также сделаю пинг 1 раз в минуту.
afghanetz
И ещё не могу понять такую штуку. Пользуюсь оболочкой 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
pill
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)
Код я не проверял, так что мог где-то нашляпить… но идея думаю понятна
afghanetz
А python сильно требователен к синтаксису и пунктуации ?
afghanetz
Когда пытаюсь выполнить скрипт, то он не отвечает. То есть просит ввести Хост и порт и молчит. Если по отдельности выполняю, то всё работает! Подскажите где тут ошибка ? Пунктуацияб синтаксис ? Функцию перенёс верх уже
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)
afghanetz
А вот так, работает! Неужели проблема в пунктуации ??

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)
pill, спасибо за помощь. Сейчас попробую ваш код добавить в скрипт.
pill
Питон очень чувствителен к отступам (и это прекрасно :))
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
# ---------------------------------------------------
По сути в Питоне отступы заменяют уродливые скобочки из большинства других языков.
http://ru.diveintopython.org/odbchelper_indenting.html
afghanetz
А каким редактором/интерпретатором вы пользуетесь ?
Я не могу понять этот DreamPie - целый скрипт не работает. Я запускаю кусочками - всё проходит.
Потом запускаю полный скрипт и вуаля. Уже не хватает нервов
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB