среда, 18 апреля 2012 г.

Проверка доступности сервера.

Есть у меня один сервер, который ведет себя не по-мужски, отваливается и не сообщает об этом. Поэтому надо его мониторить.
Уверен, что поиск даст 100500 вариантов мониторинга, но мне надо было сделать быстро и чтоб работало.
Итак, снова питон:

from ftplib import FTP
import smtplib

try :
    ftp = FTP('hostname.com')
    ftp.close()
except :
    print ('error')
    server = smtplib.SMTP('smtpserver.com')
    server.set_debuglevel(1)
    msg = 'Subject: ALARM!\nFrom: alert@smtpserver.com\n
    To: arakelov.az@smtpserver.com\n\n'
    server.sendmail('alert@smtpserver.com',
    'arakelov.az@smtpserver.com', msg+'\nServer is not responding')
    server.quit()


Если не получается зайти по FTP, то шлем письмо, что не отвечает.
Тут используется отправка почты без аутентификации, ну у меня так и есть.
Скрипт в кроне отрабатывает каждый час.

четверг, 12 апреля 2012 г.

Создание полной структуры каталогов

Наконец-то!
Как же давно я хотел написать эту функцию!
Функция создает полную структуру каталогов из входной строки. Допустим, мы собираемся копировать файл из папки C:\temp в папку D:\dir1\dir2\dir3\ а на диске D нет даже dir1
Итак, вот она


def makedirectory (dirname):
        start = dirname.find('\\')+1 #здесь мы пропускаем название диска
        i = 1
        while i < dirname.count('\\') :
                try :
                        os.mkdir (dirname[0:dirname.find('\\',start)])
                except :
                        print ('exists')
                finally :
                        start = dirname.find('\\',start)+1
                        i = i + 1

пятница, 25 ноября 2011 г.

nginx и imagecache

Мало кто знает что я помимо своих Баз и кое-какого программирования занимаюсь еще и администрированием web-сервера.
Там много чего крутится и хостится, и настал такой случай, который описан и решен не раз и не одним мной.

Итак, фронтэнд - nginx, бэкэнд - apache2, на сайте установлен Drupal. Когда imagecache должен генерить картинки и выдавать их, nginx воспринимает их как статику, пытается найти и не может. Соответственно, в логах куча ошибок, а в интерфейсе пусто, вместо картинок.

Решается все следующим образом: когда nginx не может найти что-то, он выдает ошибку 404. Ну вот мы и сделаем, чтоб он вместо своей 404 ошибки он перенаправлял запросы в апач, а тот уже разберется сам:

# то, что будет отдавать nginx
                location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ {
                        root /var/www/vhosts/example.com/www;
                        error_page 404 = @backend;
                }
# запрещаем доступ к .ht - файлам
                location ~ /\.ht {
                        deny  all;
                }
# описываем наш бэкэнд
                location @backend {
                        proxy_pass http://example.com:8888;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $remote_addr;

                        proxy_connect_timeout 120;
                        proxy_send_timeout    120;
                        proxy_read_timeout    180;
                }
# все что не попало в предыдущие правила уходит на бэкэнд
                location / {
                        try_files $uri @backend;
                }

пятница, 14 октября 2011 г.

Запуск приложения с параметрами. Python

Столкнулся с интересной особенностью (хотя какая к черту особенность, баг это) при запуске приложений через spawnl Есть приложение callbuilder, которому надо передать параметры '/O1' чтоб не спрашивал оператора при запуске, '/c' чтоб закрывался после обработки файла и сам файл. Пишу

import os
callbuilder = 'c:\\callbuilder\\SMPCallBuilder.exe'
filename = 'c:\\CDR\\comlog_14_10_2011.tfs'
os.spawnl (os.P_WAIT, callbuilder, '/c', '/O1', filename)

Запускается, не спрашивает оператора при старте, но не закрывается.
Меняю на os.spawnl (os.P_WAIT, callbuilder, '/O1', '/c', filename) спрашивает при старте, но закрывается как отработает.
Пишу os.spawnl (os.P_WAIT, callbuilder, '/1', '/c', '/O1', filename) Все ок.
В итоге получается, что первый ключ, который я прописываю после имени исполняемого файла - не используется. Почему - не знаю.

вторник, 9 августа 2011 г.

Распаковываю большой файл. Python

Есть у меня коллекторы, где собираются и обрабатываются flow-потоки с оборудования. Их надо обрабатывать, считать кто сколько и куда байтов послал/получил.
С изменением сети, объемы растут и наступил такой момент, что мой старый скрипт отказался распаковывать 850 метровый архив с ошибкой "Memory Error".
Спасибо, что добрый человек (Гриша, привет!) подсказал как справиться с этим. Ну и спасибо, конечно stackowerflow.com
Итак код:

def read_by_pieces(file_object, piece_size = 1048576): ## 1Mb
    while True:
        data = file_object.read(piece_size)
        if not data:
            break
        yield data

if __name__ == '__main__':
    import gzip
    gz = gzip.open ('d:\\2011-08-07_04.txt.gz') # largefile ~ 850 Mb
    ungz = open ('d:\\2011-08-07_04.txt', 'wb')
    for piece in read_by_pieces(gz, 10485760): ## 10 Mb
        ungz.write(piece)


В результате, распаковывается 850 Mb файл в 3.5 Гб файл за примерно 5 минут.
Я думаю, можно добиться и лучших результатов, но мне сейчас нужно именно такое наколенное решение.

понедельник, 8 августа 2011 г.

Параметры для скрипта. Python

Таких постов сотни, но я ж для себя пишу, правильно?
Передаем параметры из командной строки нашему скрипту


from optparse import OptionParser

parser = OptionParser()
parser.add_option("-r", "--remotehost", dest = "ftphost", help = "FTP host")
parser.add_option("-l", "--login", dest = "ftpu", help = "FTP login")
parser.add_option("-p", "--password", dest = "ftpp", help = "FTP password")
parser.add_option("-d", "--directory", dest = "ftpdir", 
help = "FTP directory", default = "\pub\")
(options, args) = parser.parse_args()

# read options
ftpdir = options.ftpdir
ftphost = options.ftphost
ftpu = options.ftpu
ftpp = options.ftpp



А теперь из ini-файла
Сначала пишем

import configparser
config = configparser.RawConfigParser ()
config.add_section('mail')
config.set ('mail', 'server', 'smtp.server.local')
config.set ('mail', 'from', 'user1@server.local')
config.set ('mail', 'to', 'user2@server.local')
with open('settings.ini', 'w') as cfile:
    config.write (cfile)




Теперь читаем


import configparser 
cfg = configparser.RawConfigParser ()
cfg.read ('settings.ini')
print (cfg.get ('mail', 'server'))
print (cfg.get ('mail', 'from'))
print (cfg.get ('mail', 'to'))

четверг, 14 июля 2011 г.

find

Саша!
Запомни как пишется print в команде find:


find /var/ftp/ -ctime +1 -name "*_in.wav" -printf 'Name: %f Date: %TY-%Tm-%Td %TT\n'