Страница 1 из 1

Проверка серверов с оповещениями на email & SMS

Добавлено: 22 янв 2013, 11:23
Raven
Всегда хорошо быть в курсе дела, знать что происходит с твоими "подопечными". Однако быть в курсе событий не всегда получается, особенно когда находишься где-нибудь вне офиса или дома. Для себя я решил эту проблему (спасибо народу с хабра и форумов dd-wrt), спешу поделиться опытом. Для начала регаемся в гугле и заводим там себе календарь, регаем номер телефона.

Стряпаем скрипт проверки сервера. Логика следующая - проверить хидер ответа и если ответ не получен, или не равен 200 (OK) - оповестить админа.

/usr/local/bin/upcheck

Код: Выделить всё

#!/bin/bash                             
# Проверяем наличие необходимых аргументов
if [ -z $1 ] || [ -z $2 ]; then
        echo "Missing argument"
        exit 1
fi

url=$1 # передаем проверяемый url
name=$2 # имя проверяемого сервиса
dump=/tmp/${name}.dump 
get="/usr/bin/curl"        
send="/usr/sbin/sendmail.exim -t "  # Почту у меня шлет релей на exim. Если его нет - воспользуйтесь ssmtp
file="/usr/local/etc/${name}.msg" 

tm=`date +%H:%M:%S`
dt=`date +%d.%m.%Y`

rm -f $dump
$get ${url} -D ${dump} -o /dev/null

result="`cat ${dump} | grep HTTP | awk '{print $2}'`"

if [ -z ${result} ]; then # если дамп пуст (не получен ответ от сервера)
sleep 60 # ждем минуту и повторяем проверку дабы исключить случайности
rm -f $dump
$get ${url} -D ${dump} -o /dev/null
recheck="`cat ${dump} | grep HTTP | awk '{print $2}'`"
# если повторная проверка подтверждает опасения - орем благим матом:
if [ -z ${recheck} ]; then
cat > ${file} <<EOF
To: raven@domain.tld
From: checker@domain.tld
Subject: Critical error

Network error!
Could not connect to ${name}.
${dt} - ${tm} 
EOF
${send} < ${file} # Пишем на почту
/usr/local/etc/calendarSMS/sendsms Could not connect to ${name} # шлем смс
fi
elif [ ${result} != 200 ]; then # Если соединение успешно, но код http-ответа не равен 200
cat > ${file} <<EOF
To: raven@domain.tld
From: checker@domain.tld
Subject: Alert

${name} is down!
Returned status: ${result}
${dt} - ${tm} 
EOF
${send} < ${file}
/usr/local/etc/calendarSMS/sendsms ${name} down - ${result}
fi
# записать все в лог
cat >> /var/log/services.log <<EOF
$dt -$tm , $name , $result
EOF
fi
Собственно сам SMS-клиент (у меня лежит в папке /usr/local/etc/calendarSMS, хотите положить в другое место - поменяйте все пути)

/usr/local/etc/calendarSMS/sendsms

Код: Выделить всё

#!/bin/sh                                      
PINGRESOURCE=google.com                        
message=""                                     

case $# in 0)
 echo " sendsms [-inet] [-?] [-sync] [сообщ]"
 echo " "                                    
 echo "  -inet  позволяет перед отправкой проверить "
 echo "         доступ к интернету(google.com), "    
 echo "         пока интернет не появится сообщение не отправится"
 echo " "                                                         
 echo "  -?             эта справка"                              
 echo "  -sync  перед отправкой синхронизировать время"           
 echo "  сообщ  сообщение которое будет отправлено"               

exit 3;
;;
esac

for p in $*;
 do
  case "$p" in -?)
   echo " sendsms [-inet] [-?] [-sync]  [Сообщение]"
   echo " "
   echo "  -inet        позволяет перед отправкой проверить "
   echo "               доступ к интернету(google.com), "
   echo "               пока интернет не появится сообщение не отправится"
   echo " "
   echo "  -?           эта справка"
   echo "  -sync        перед отправкой синхронезировать время"
   echo "  сообщ        сообщение которое будет отправлено"
   exit 0
  ;;
   -inet)
   while (! ping -c 3 -w 3 -W 2 ${PINGRESOURCE} >/dev/null  2>&1) do
   echo "calendarSMS: Сообщение не отправлено, подключение к интернету не обнаружено!!! "
   logger "calendarSMS: Сообщение не отправлено, подключение к интернету не обнаружено!!! "
   sleep 10s
   done
  ;;

  -sync)
   logger "calendarSMS:  Synchronizing time"
   if (! ntpclient -s -h ntp.mega.kg >/dev/null  2>&1) then
    echo "calendarSMS: Не установлен ntpclient время не будет синхронизировано"
    logger "calendarSMS: Не установлен ntpclient время не будет синхронизировано"
   else
   logger "calendarSMS:  Synchronizing time"
   fi
  ;;

  *)
  message="$message $p"
  ;;
  esac
 done

logger "calendarSMS: стартуем отправку SMS"
log=`/usr/local/etc/calendarSMS/calendarSMS.py --title "$message"`
echo "calendarSMS: $log"
logger "calendarSMS: $log"
/usr/local/etc/calendarSMS/calendarSMS.py

Код: Выделить всё

#!/usr/bin/python                                    
#                                                    
# Copyright (C) 2012 vassio@ukr.net.                 
#                                                    

# -*- coding: utf-8 -*-

__author__ = 'vassio'
__version__ = '3.0'  
import sys, os, re, urllib, getopt, shlex, codecs, locale,time
from ConfigParser import ConfigParser                         
from ConfigParser import DuplicateSectionError                
from gdata.calendar.service import *                          

class CalendarSMS:
  login=''        
  password=''     
  delay=0         
  maxcount=0      
  def __init__(self, email, password,delay,maxcount):
    """.init"""                                      
    try:                                             
        self.login=email;                            
        self.password=password;                      
        self.delay=delay;                            
        self.maxcount=maxcount;                      
    except Exception,v:                              
     print(v)                                        

  def _InsertEvent(self,calendar='', title='', 
      content='', where='',starttime=800,endtime=1200,
      start_time=None, end_time=None, recurrence_data=None):
    """insert event"""                                      
    event = gdata.calendar.CalendarEventEntry()             
    event.title = atom.Title(text=title)                    
    event.content = atom.Content(text=content)              
    event.where.append(gdata.calendar.Where(value_string=where))
    if recurrence_data is not None:                             
      # Set a recurring event                                   
      event.recurrence = gdata.calendar.Recurrence(text=recurrence_data)
    else:                                                               
      if start_time is None:                                            
        # Use current time for the start_time and have the event last 1 hour
        start_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time() + starttime))
        end_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z',                                        
        time.gmtime(time.time() + endtime))                                                       
        event.when.append(gdata.calendar.When(start_time=start_time,                              
        end_time=end_time))                                                                       
    print 'Calendar=%s'%(calendar,)                                                               
    print 'CalendarURL=%s'%('https://www.google.com/calendar/feeds/'+calendar+'/private/full',)   
    if calendar=='':                                                                              
      new_event = self.cal_client.InsertEvent(event,                                              
        '/calendar/feeds/default/private/full')                                                   
    else:                                                                                         
      new_event = self.cal_client.InsertEvent(event,                                              
        'https://www.google.com/calendar/feeds/'+calendar+'/private/full')                        
                                                                                                  
    return new_event                                                                              
                                                                                                  
  def _InsertSingleEvent(self, title='',                                                          
      content='', where='',starttime=800,endtime=1200,                                            
      start_time=None, end_time=None):                                                            
    """Uses the _InsertEvent helper method to insert a single event which                         
    does not have any recurrence syntax specified."""                                             

    new_event = self._InsertEvent(title, content, where,starttime,endtime, start_time, end_time, 
        recurrence_data=None)                                                                    

    print 'New single event inserted: %s' % (new_event.id.text,)
    print '\tEvent edit URL: %s' % (new_event.GetEditLink().href,)
    print '\tEvent HTML URL: %s' % (new_event.GetHtmlLink().href,)

    return new_event

  def _AddReminder(self, event, minutes=10):
    """Adds a reminder to the event."""     

    for a_when in event.when:
      if len(a_when.reminder) > 0:
        a_when.reminder[0].minutes = minutes
      else:                                 
        a_when.reminder.append(gdata.calendar.Reminder(minutes=minutes))
    for a_when in event.when:                                           
      if len(a_when.reminder) > 0:                                      
        a_when.reminder[0].method = 'sms'                               
      else:                                                             
        a_when.reminder.append(gdata.calendar.Reminder(method='sms'))   
    print 'Adding %d minute reminder to event' % (minutes,)             
    return self.cal_client.UpdateEvent(event.GetEditLink().href, event) 

  def _AddExtendedProperty(self, event, 
      name='http://www.example.com/schemas/2005#mycal.id', value='1234'):
    """Adds an arbitrary name/value pair to the event.  """              

    event.extended_property.append(
        gdata.calendar.ExtendedProperty(name=name, value=value))  
    print 'Adding extended property to event: \'%s\'=\'%s\'' % (name, value,)
    return self.cal_client.UpdateEvent(event.GetEditLink().href, event)      

 
  def Run(self,calendar='',textmessage='',texttitle='',starttime=800,endtime=1200,remindertime=10):
    """Runs                                                                                        
    """                                                                                            
    maxcnt=self.maxcount                                                                           
    cnt=0                                                                                          
    while (cnt<maxcnt):                                                                            
        try:                                                                                       
            self.cal_client = CalendarService()                                                    
            self.cal_client.email = self.login                                                     
            self.cal_client.password = self.password                                               
            self.cal_client.source = 'Google-Calendar_SMS-2.2'                                     
            self.cal_client.ProgrammaticLogin()                                                    
            see = self._InsertSingleEvent(calendar,texttitle,'',textmessage,starttime,endtime)     
            see_u_reminder = self._AddReminder(see, minutes=remindertime)                          
            break                                                                                  
        except Exception,e:                                                                        
            print ('Error reminder%d:%s'%(cnt,e))                                                  
            try:                                                                                   
                self.cal_client.DeleteEvent(see.GetEditLink().href)                                
            except Exception,e:                                                                    
                print ('Error Delete Event%d:%s'%(cnt,e))                                          
            cnt=cnt+1                                                                              
        time.sleep(self.delay)                                                                     
def LoadConfig(configFile):                                                                        

    config = ConfigParser()
    config.read(os.path.expanduser(configFile))
    return config                              
                                               
def GetConfig(config, key, default):           

    try:
        value = config.get('sendsms', key)
    except:                               
        value = default                   

    return value
def SetConfig(config, key, value):
    try:                          
     config.add_section('sendsms')
     config.set('sendsms', key,value)   
    except DuplicateSectionError:       
     config.set('sendsms', key,value)    
    config.set('sendsms', key,value)     
def main():                              
  """Runs the CalendarSMS."""            

    
  # parse command line options
  try:                        
    opts, args = getopt.getopt(sys.argv[1:], "", ["user=", "pw=", "text=","title=","starttime=","endtime","remindertime=","config=","cal="])
  except getopt.error, msg:                                                                                                                 
    print (''' calendarSMS [option] command [command args]                                                                                  

Options:   
 --user [username]          google username
                                           
 --pw [password]            password       

 --text [text]              Event Name

 --title [text]             Title text

 --config [configFile]      config file to read
                                               
 --starttime [second]       Time of the beginning of event
                             (concerning current time)    

 --endtime [second]         Time of the termination of event
                             (concerning current time)      
                                                            
 --calendar                 ID Calendar <??????????????????@group.calendar.google.com>
                                                                                      
 --remindertime [minutes]   Time of sending of a sms before event                     

 ''') 
    sys.exit(2)

  user = ''
  pw = ''  
  title='' 
  text=''  
  starttime=0
  endtime=0  
  remindertime=0
  cal=''        
  delay=0       
  maxcount=0    
  # Process options
  for o, a in opts:
    if o == "--user":
      user = a       
    elif o == "--pw":
      pw = a         
    elif o == "--text":
      text = unicode(a, locale.getpreferredencoding())
    elif o == "--title":                              
      title = unicode(a, locale.getpreferredencoding())
    elif o == "--starttime":                           
      starttime = int(a)                               
    elif o == "--endtime":                             
      endtime = int(a)                                 
    elif o == "--delay":                               
      delay = int(a)                                   
    elif o == "--attempt":                             
      maxcount = int(a)                                
    elif o == "--remindertime":                        
      remindertime = int(a)                            
    elif o == "--cal":                                 
      cal =  unicode(a, locale.getpreferredencoding())   
                                                         
  configFile = '/usr/local/etc/calendarSMS/calendarSMS.config' 
  for opt, arg in opts:                                  
   if (opt == "--config"): configFile = arg              

  cfg = LoadConfig(configFile)

  if (user==''):
   user           = GetConfig(cfg, 'user', '')
   SetConfig(cfg, 'user', user)               
                                              
  if (pw==''):                                
   pw           = GetConfig(cfg, 'pw', '')    
   SetConfig(cfg, 'pw', pw)                   
                                              
  if (starttime==0):                          
   starttime      = int(GetConfig(cfg, 'StartTime', '180'))
   SetConfig(cfg, 'StartTime', starttime)                  
                                                           
  if (endtime==0):                                         
   endtime      = int(GetConfig(cfg, 'EndTime', '260'))    
   SetConfig(cfg, 'EndTime', endtime)                      
                                                           
  if (remindertime==0):                                    
   remindertime      = int(GetConfig(cfg, 'ReminderTime', '2'))
   SetConfig(cfg, 'ReminderTime', remindertime)                
                                                               
  if (delay==0):
   delay      = int(GetConfig(cfg, 'delay', '2'))
   SetConfig(cfg, 'delay', delay)

  if (maxcount==0):
   maxcount      = int(GetConfig(cfg, 'attempt', '10'))
   SetConfig(cfg, 'attempt', maxcount)

  if (cal==''):
    cal = GetConfig(cfg, 'calendar', '')
    SetConfig(cfg, 'calendar', cal)

  if user == '' or pw == '':
    print (''' calendarSMS [option] command [command args]

Options:
 --user [username]          google username

 --pw [password]            password

 --text [text]              Event Name

 --title [text]             Title text

 --config [configFile]      config file to read

 --starttime [second]       Time of the beginning of event
                             (concerning current time)

 --endtime [second]         Time of the termination of event
                             (concerning current time)

 --calendar                 ID Calendar <??????????????????@group.calendar.google.com>

 --remindertime [minutes]   Time of sending of a sms before event

 ''')
    sys.exit(2)

  Calendar = CalendarSMS(user, pw,delay,maxcount)
  Calendar.Run(cal,text,title,starttime,endtime,remindertime)

if __name__ == '__main__':
  try:
    main()
  except Exception,e:
    print ('error sendsms ',e)
/usr/local/etc/calendarSMS/calendarSMS.config

Код: Выделить всё

[sendsms]
user: email пользователя календаря
pw: пароль
starttime: 120
endtime: 180
remindertime: 1
calendar: название календаря
attempt:11
delay:5
Далее забиваем все в крон (url должен быть полным, дабы избежать редиректов, иначе статус всегда будет 30(1|2)

Код: Выделить всё

*/5 * * * * /usr/local/bin/upcheck http://domain.tld/page.php resource_name
Все, можем спокойно ехать пить пиво - скрипт скажет если что не так. Главное не забыть ноут)))

Re: Проверка серверов с оповещениями на email & SMS

Добавлено: 22 янв 2013, 22:29
Gen1us2k
йопт. Системы мониторинга отменили? %)

Re: Проверка серверов с оповещениями на email & SMS

Добавлено: 23 янв 2013, 01:00
Raven
Ага, а ты заведи заббикс на тачку с другого конца света. будешь доолго ржать над рваными графиками! Мои "подопечные" в Чикаго базируются, а до туда канал ой какой ни айс.

Re: Проверка серверов с оповещениями на email & SMS

Добавлено: 28 янв 2013, 23:51
Gen1us2k
хз. У меня нагиос %)

Re: Проверка серверов с оповещениями на email & SMS

Добавлено: 12 фев 2013, 18:12
wass
Итак проблем хватает, когда я дома, я ни для кого не доступен по работе %)