Показаны сообщения с ярлыком bash. Показать все сообщения
Показаны сообщения с ярлыком bash. Показать все сообщения

11 ноября 2012

корова говорит fortune

< ta-ta-taaa ta-ta tataaaa >
 --------------------------
   \         __------~~-,
    \      ,'            ,
          /               \
         /                :
        |                  '
        |                  |
        |                  |
         |   _--           |
         _| =-.     .-.   ||
         o|/o/       _.   |
         /  ~          \ |
       (____@)  ___~    |
          |_===~~~.`    |
       _______.--~     |
       \________       |
                \      |
              __/-___-- -__
             /            _ \

мой скрипт в .bashrc для животного говорящего цитаты при открытии терминала.
cowperson=`cowsay -l | sed '1,1d' | sed 's/ /\n/g' | shuf -n 1`
fortune | cowsay -f $cowperson
По порядку:
cowperson - это выбор персонажа по рэндому
cowsay -l список всех персонажей
sed '1,1d' удаление первой служебной строки с расположением папки с файлами .cow
sed 's/ /\n/g' преобразование слов разделенных пробелами в строки (принцип как и в vim команда замены s/ далее чего "пробел" на \n)
shuf -n 1 случайный выбор строки

fortune | cowsay -f $cowperson рисует случайного персонажа с цитатой переданной из фортуне

Иногда случаются довольно забавные сочетания :)

19 декабря 2011

Как поднять demo версию проекта на paster + virtualenv в Debian

Иногда необходимо поднять демо версию своего проекта для тестов. Склонируем наш git проект на сервер где будет демо
git clone --bare ~/myproject ssh://uralbash@myserver/~/my_project.git
Проект склонируется в домашнюю директорию сервера myserver. Ключ --bare означает что клон предназначен только для push или pull т.е. все коммиты мы будем делать у себя локально а потом пушить на сервак. Далее напишем скрипт который будет из нашего bare репозитария создавать проект для запуска демки
rm -r /home/uralbash/my_project
git clone /home/uralbash/my_project.git /home/uralbash/my_project
После этого создаем virtualenv окружение (/home/uralbash/mypythonenv/) и добавляем скрипт запуска в /etc/init.d/my_project.sh
#! /bin/sh
 
### BEGIN INIT INFO
# Required-Start:    $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the paster server
# Description:       starts paster 
### END INIT INFO
 
 
PROJECT=/home/uralbash/my_project
PID_DIR=/var/run/my_project/
PID_FILE=/var/run/my_project/paster.pid
LOG_FILE=/home/uralbash/logs/my_project/paster.log
USER=root
GROUP=root
PROD_FILE=/home/uralbash/demo.ini
RET_VAL=0
 
cd $PROJECT
 
case "$1" in
start)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
start
 
;;
stop)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
stop
 
;;
restart)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
restart
 
 
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
Для того что бы не хранить пароли в репозитарии файл с настройками вынесен отдельно /home/uralbash/demo.ini

И добавляем в крон перезапуск
# выполнять каждый четный час в 00 мин
0 */2 * * *       /etc/init.d/my_project.sh stop > /dev/null
# выполнять каждый четный час в 01 мин
1 */2 * * *       /etc/init.d/my_project.sh start > /dev/null
# выполнять в 9:00
0 9 * * *       /home/uralbash/demo_update.sh > /dev/null

После этого каждый день в 9:00 будет обновляться код и каждые 2 часа перезапускаться сервер (на случай если он полег по какойто причине). Останется только периодически отправлять коммиты.

09 декабря 2011

Срезаем пики в RRD при помощи python

В некоторых случаях на rrd графиках появляются пики, как например после перезагрузки сетевой карты
пики в rrd
Для их удаления нам нужно воспользоваться утилитой dump из rrdtool, которая переводит файл rrd в формат xml. Затем обнулить значение пиков и записать изменения обратно в rrd файл при помощи утилиты restore. На оф. сайте rrdtool можно найти скрипт на perl removespikes и на php для cacti spikekill. removespike работает не всегда корректно, поэтому рассмотрим как можно обрезать графики при помощи скрипта на python
#!/usr/bin/env python
import os
import shutil
from xml.etree import ElementTree as ET
from optparse import OptionParser

__version__ = '0.1'

def get_configuration():
    parser = OptionParser(version="%prog v" + __version__,
                          usage="%prog ")
    parser.add_option("-v", "--verbose", action="count", default=0,
                      help="produce more output")
    parser.add_option('-b', '--border', action ='store', default=10**10,
                 help='Min value of peak. Default 100000')
    options, args = parser.parse_args()

    if not os.path.isfile(args[0]):
        parser.error("Not found file")

    return [ options ] + args

def main():
    options, filename = get_configuration()
    try:
        rrd_dump = os.system("rrdtool dump '%s' > 'old.xml'" % (filename))
    except:
        print "Error RRD file type"
        raise

    if not os.path.exists('rrd_bak'):
        os.makedirs('rrd_bak')
    shutil.copy2(filename, 'rrd_bak')

    tree = ET.parse('old.xml')

    def iterparent(tree):
        for parent in tree.getiterator():
            for child in parent:
                yield parent, child

    for parent, child in iterparent(tree):
        if child.tag == 'v':
            if float(child.text) > options.border:
                print 'peak detect in %s' % filename
                child.text = 'NaN'

    tree.write('new.xml')
    os.unlink(filename)
    os.system("rrdtool restore 'new.xml' '%s'" % filename)
    os.unlink('new.xml')
    os.unlink('old.xml')

if __name__ == '__main__':
    import sys
    sys.exit(main())

Для того что бы парсить параметры командной строки воспользуемся модулем optparse
def get_configuration():
    parser = OptionParser(version="%prog v" + __version__,
                          usage="%prog ")
    parser.add_option("-v", "--verbose", action="count", default=0,
                      help="produce more output")
    parser.add_option('-b', '--border', action ='store', default=10**10,
                 help='Min value of peak. Default 100000')
    options, args = parser.parse_args()

    if not os.path.isfile(args[0]):
        parser.error("Not found file")

    return [ options ] + args
Дампим rrd файл в xml
try:
        rrd_dump = os.system("rrdtool dump '%s' > 'old.xml'" % (filename))
    except:
        print "Error RRD file type"
        raise
На всякий случай копируем старый rrd в папку rrd_bak
if not os.path.exists('rrd_bak'):
        os.makedirs('rrd_bak')
    shutil.copy2(filename, 'rrd_bak')
Функция для получения списока всех элементов из xml
def iterparent(tree):
        for parent in tree.getiterator():
            for child in parent:
                yield parent, child
Записи в xml выглядят так

                         1.2531404050e+041.1760614140e+031.0547667362e+010.0000000000e+000.0000000000e+000.0000000000e+00
                         6.2535788107e+036.5077305135e+025.9844172295e+000.0000000000e+000.0000000000e+000.0000000000e+00
                         7.4349123852e+037.2086196285e+026.7862914917e+000.0000000000e+000.0000000000e+000.0000000000e+00
                         6.6044470194e+036.1316221529e+026.2081965076e+000.0000000000e+000.0000000000e+000.0000000000e+00
                         1.6377377735e+042.8213539887e+031.4662221016e+010.0000000000e+000.0000000000e+000.0000000000e+00
                         1.4991881969e+041.9741971231e+031.3208469357e+010.0000000000e+000.0000000000e+000.0000000000e+00
...

Пробегаем по всем тегам и ищем значения которые больше порогового 10 в степени 10 и записываем нулевое значение(NaN)

for parent, child in iterparent(tree):
        if child.tag == 'v':
            if float(child.text) > options.border:
                print 'peak detect in %s' % filename
                child.text = 'NaN'
Сохраняем xml и импортируем изменения в rrd
tree.write('new.xml')
    os.system("rrdtool restore 'new.xml' '%s'" % filename)
Полученный результат
rrd график без пиков
Скрипт на bash для удаления пиков во всей директории
#!/bin/bash
if [ -a $1 ]
then
    for file in $1*
    do
        echo $file
        python killerpeak.py $file
    done
fi
echo "Don't forget delete directory rrd_bak if all is ok"
exit 0
Запуск скрипта killerpeak.py
sudo ./killerpeak.py data/rrdfile/7890.rrd
peak detect in data/rrdfile/7890.rrd
peak detect in data/rrdfile/7890.rrd
peak detect in data/rrdfile/7890.rrd
peak detect in data/rrdfile/7890.rrd
Запуск скрипта на bash killpeak.sh
./killpeak.sh data/rrdfile

Взять код или поправить можно на github https://github.com/uralbash/rrd_killerpeak

17 октября 2011

Отключить CapsLock

Отключение:
xmodmap -e "clear Lock"
 
Включение:
xmodmap -e "add Lock = Caps_Lock"

или в /usr/share/X11/xkb/keycodes/xfree86 заменить CAPS код 66 на 100500