четверг, 17 ноября 2011 г.

закгразука потаблично дампа мускуль базы

Полезнаю чтука, закгразука потаблично дампа мускуль базы
http://ru-shell.livejournal.com/31675.html

cat dump.sql | awk 'BEGIN {
output = "comments"; } $data ~ /^CREATE TABLE/ {
close(output);
output = substr($3,2,length($3)-2); }
{ print $data >> output }'

На выходе получим по одному файлу на каждую таблицу. Для разбивки такого файла по инсертам можно использовать вот такой скрипт:
awk '/INSERT/{if (n) close(output); output= f n++} n {print >> output }' f=prefix tbl.dump.sql

Затем я запустил for i in prefix*; do mysql --password=****** --database=mydb < $i; echo "$i done"; done

среда, 9 ноября 2011 г.

Как заставить ldapsearch выдвать из Active Directory на русском

Для того чтобы ldapsearch выдавал результаты по русски а не в base64 Надо передать вывод на такой перловый однострочник:
perl -MEncode -MMIME::Base64 -lpe 'if (/::/) { ($attr,$_)=split ; Encode::from_to($_=decode_base64($_),"utf8","utf8") ; $_="$attr : $_" }'

пятница, 23 сентября 2011 г.

Bacula, SATA Диски вместо ленточек

Использую Bacula для резервного копирования. Хранил все резервные копии на RAID массиве, но в один прекрасный момент место на нём стало подходить к концу. Решил попробовать организовать резервное копирование на внешние диски (USB, eSATA, SATA).

О системе: ОСь CentOS 5.6, Bacula 5.0.3 (из репозитория http://www.pramberger.at/ ), vchanger (http://sourceforge.net/projects/vchanger/), autofs, все диски одного объема по 1,5 тБ.

Будем считать что у вас уже имеется настроенная и рабочая система. Если нет, тогда вам сюда: http://wiki.bacula.org, http://www.bog.pp.ru/work/bacula.html

Терминология:
Чейнджер - виртуальное устройство которое создает vchanger
Ленточка - файл в который происходит запись, он же "том" (volume) в бакуле.
Магазин - наш сменный диск с "ленточками"
Количество слотов - сколько ленточек может быть в магазине
Отсеки для магазинов - сколько одновременно магазинов можно использовать.

Настроим autofs, чтобы при обращении к поддиректории в директории /bacula/uuid, происходила попытка смонтировать диск с одноименным UUID:
В файл /etc/auto.master добавим строчку:
/bacula/uuid /etc/auto.uuid --timeout=10

Создадим файл /etc/auto.uuid, добавим туда:
* -fstype=auto,rw :/dev/disk/by-uuid/&

Надо проверить что диск монтируется автоматически.
cd /bacula/uuid/ИдентификаторРазделаДиска
В результате должна появиться папка ИдентификаторРазделаДиска и в неё же подмаонтироваться наш раздел.

Настроим vchanger, программа для эмуляции ленточного ченжера.
Мы будем использовать один ченжер для дисков одинакого объёма.
Создадим файл /etc/bacula/c1500.conf:
# 1500 gb диски
# Использую это имя и в бакуле тоже
changer_name = "c1500"
work_dir = "/var/lib/bacula/c1500"
logfile = "/var/lib/bacula/c1500/c1500.log"
log_level = LOG_EMERG
# Число приводов - сколько одновременно ленточек можно записывать
Virtual_Drives = 4
# Сколько ленточек умещается в магазине, определяем как (объем диска - 15%)/(max volume size из свойств пула в бакуле)
slots_per_magazine = 60
# Сколько одновременно магазинов (дисков) можно использовать, у меня это количество свободных eSATA портов
magazine_bays = 4
# Папка, где будут монтироваться магазины
automount_dir = /bacula/uuid
# Теперь нам нужно перечислить магазины с ленточками которые мы используем
magazine = "UUID:69ceced2-a9ab-4b10-9314-177e912279e7" #1 inc
magazine = "UUID:c83dad52-bd34-49bf-a1dd-fe49e9f6f9bf" #2 diff
# Бывает что по UUID vchanger не может подмонтировать диск, тогда укажем папку.
# В итоге, я настроил все через папки, чтобы было всё единообразно.
magazine = "/bacula/uuid/60182fad-27bc-451f-a4e1-123a619bba2e" #3 full
magazine = "/bacula/uuid/7e68d7be-a98f-47fd-be0d-49d2bea9be24" #4 inc
magazine = "/bacula/uuid/6e834c12-cf8f-4266-8791-4731fdd58207" #5 diff
magazine = "/bacula/uuid/3d4d3dfb-6159-43da-b9d3-75dc802a0e07" #6 full


На этом настройка vchanger завершена. Мы получили виртуальный ченжер с четырьмя приводами для записи ленточек, возможность подключить одновременно 4 магазина с ленточками по 60 ленточек в каждом.

Теперь приступим к настройке бакулы. в конфигурационный файл директора добавляем:
Пулы:
Pool {
Name = "chg-full"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb # Тут определяется максимальный размер каждой ленточки
Volume Retention = 200 days
Recycle = Yes
}

Pool {
Name = "chg-diff"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb
Volume Retention = 60 days
Recycle = Yes
}

Pool {
Name = "chg-inc"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb
Volume Retention = 14 days
Recycle = Yes
}

Обращу ваше вниманеи вот на какой параметр:
Maximum Volume Bytes = 20gb. Тут определяется максимальный размер каждой ленточки, а количество ленточек в магазине (в нашем случае диске) определяется в настройках vchangerа, собственно по этому, если хотим использовать один пул для объединения леточек с дисков разного объёма, мы вынуждены создавать отдельный ченжер для дисков каждого объёма.

Теперь добавим ресурс Storage для нашего виртуальног ченжера:
Storage {
Name = c1500
Address = bacula-sd.local
Password = "123456"
Device = c1500
Media Type = File
Autochanger = yes;
Maximum Concurrent Jobs = 20
}


Создадим расписание расписание для тестирования, Полная копия в 12-05, дифиринциальная в 16-05, и инкрементальные примерно раз в час с 8 до 23. Каждый уровень резервного копирования будет использовать свой пул.
Schedule {
Name = test-gfsCycle
Run = Level=Full Pool=chg-full at 12:05
Run = Level=Differential Pool=chg-diff at 16:05
Run = Level=Incremental Pool=chg-inc at 8:05,9:20,10:20,11:20,14:20,15:20,17:20,18:20,19:20,20:20,21:20,22:20,23:20
}


Для окончательной настройки осталось добавить задания для резервного копирования.
# Сделаем шаблон задания с нашим расписанием и пулом.
JobDefs {
Name = "DefaultJobchg"
Maximum Concurrent Jobs = 20
Type = Backup
Schedule = "test-gfsCycle"
Messages = Standard
Priority = 10
Pool = chg-inc
SpoolData = yes
Spool Size = 300 GB
}
# Сделаем тестовое задание, по шаблону выше
Job {
Name = "at0038-test-job"
JobDefs = "DefaultJobchg"
Write Bootstrap = "/var/lib/bacula/at0038-test.bsr"
Client = at0038-fd
FileSet = "at0038-test-FileSet"
Enabled = Yes
}
# Сделаем набор файлов для архивирования по заданию
FileSet {
Name = "at0038-test-FileSet"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /etc/bacula
}
}


С директором закончили, едем дальше. Настраиваем стораж демон. Создаем авто ченджер с четырьмя приводами и описываем каждый привод.
Autochanger {
Name = c1500
Device = c1500-drive-0
Device = c1500-drive-1
Device = c1500-drive-2
Device = c1500-drive-3
Changer Command = "/usr/local/bin/vchanger %c %o %S %a %d"
Changer Device = "/etc/bacula/c1500.conf"
}

Device {
Name = c1500-drive-0
DriveIndex = 0
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/0/drive0
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/0
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}

Device {
Name = c1500-drive-1
DriveIndex = 1
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/1/drive1
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/1
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}
Device {
Name = c1500-drive-2
DriveIndex = 2
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/2/drive2
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/2
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}

Device {
Name = c1500-drive-3
DriveIndex = 3
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/3/drive3
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/3
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}


Теперь надо подготовить диски, я использую 6 дисков по 1,5 тБ. По два в каждом пуле.
Создаем разделы на всех. Узнаём их идентификаторый и записываем их в конфигурацию vchangera.
Права на раздел должны принадлежать пользователю от которого запускается vchanger. В моем случае это тпользователь bacula.
magazine = "/bacula/uuid/60182fad-27bc-451f-a4e1-123a619bba2e" #3 full
Это значит что на диске нарисована маркером цифра 3, а в бакуле он добавлен в chg-full пул
После этого инифиализируем диск в vchangerе:
vchanger -u bacula -g bacula /etc/bacula/c1500.conf initmag 1

Теперь необходимо применить настройки и промаркировать ленточки в наших маназинах.
В консоле управления бакулы:
label storage=c1500 pool=chg-full slot=1-60 barcodes
label storage=c1500 pool=chg-full slot=121-180 barcodes (если диск, например, в третьем слоте для магазинов)
Обновим информацию о ленточках в слотах магазинов, в консоле:
update slots storage=c1500

Ну вот пожалуй и всё с настройкой.
При эксплуатации выявились некоторые нюансы. Привод не всегда отпускал ленточку после завершения резервного копирования (звучит так как будт-то разговор идёт о реальном приводе :). Пришлось сделать задание с наименьшим прироритетом которое запускается после заданий на резервное копирование и даёт команду освободить приводы. И ещё одна проблема когда вставляешь диск, бакула не знает какая ленточка в каком слоте, для решение также сделал задание в бакуле, с наивысшим приоритетом, который запускается перед всеми остальными и загружает ленточки в слоты.

Добавляем в конфигурацию директора шаблон и задания
JobDefs {
Name = "DefaultJobchgAdmin"
Maximum Concurrent Jobs = 20
Type = Admin
Schedule = "gfsCycle"
Messages = Standard
Priority = 10
Pool = chg-full
Fileset = Default
}

Job {
Name = at0038-updateslots
JobDefs = "DefaultJobchgAdmin"
Client = at0038-fd
RunBeforeJob = "/etc/bacula/scripts/chg_update_slots.sh >> /tmp/chg_update_slots.log"
Priority = 8
}

Job {
Name = at0038-releasestorage
JobDefs = "DefaultJobchgAdmin"
Client = at0038-fd
Schedule = "WeeklyCycleAfterBackup"
RunAfterJob = "/etc/bacula/scripts/chg_release_tapes.sh >> /tmp/chg_release_tapes.log"
Priority = 30
}


Создаем файл chg_release_tapes.sh
#!/bin/bash
bconsole="/usr/bin/bconsole -s -c /etc/bacula/bconsole.conf"
$bconsole <<EOD
release storage=c1500 drive=0
release storage=c1500 drive=1
release storage=c1500 drive=2
release storage=c1500 drive=3
release storage=c500 drive=0
release storage=c500 drive=1
release storage=c500 drive=2
release storage=c500 drive=3
quit
EOD

Создаем Файл chg_update_slots.sh
#!/bin/bash
bconsole="/usr/bin/bconsole -s -c /etc/bacula/bconsole.conf"
$bconsole <<EOD_UPSLOTS
update slots storage=c1500 drive=0
quit
EOD_UPSLOTS


ну вот теперь всё.

Спасибо создателям vchanger, людям на http://wiki.bacula.org, и http://www.bog.pp.ru/work/bacula.html. Неоценимо помогли эти материалы.

пятница, 26 августа 2011 г.

Скрипт резервного копирования настроек роутеров DFL 800, 210, 860e

Генерим SSH ключ для пользователя bacula или root, Открытый ключ загружаем на DFL и добавляем его пользователю admin. На DFLях есть глюк, когда пользователь отличный от admin получает по ssh полномочия auditor. Приходится использовать пользователя admin. разрешаем на DFLе ssh доступ. Вуаля. 


#!/bin/bash
# здесь необходимо указать адреса DFL-ек конфу которых надо бекапить
# в каждой строчке указываю все адреса одной DFLки
DFLSLIST="
222.111.222.111

1.2.3.4
4.5.6.7
"

BACKUPDIR="/tmp/bacula/dfls"
USERNAME=$2
PASSWORD=$3
UP=" --user=$USERNAME --password=$PASSWORD"
LOGFILE="/tmp/bacula/dfls/backupdfls.log"
SCP_PROG="/usr/bin/scp"
SCP_ARGS=" -2 -4 -C -q -B -o ConnectTimeout=5 "
SSH_PROG="/usr/bin/ssh"
SSH_ARGS=" -2 -4 -C -q -o ConnectTimeout=5 "
DATE=`date +%Y%m%d%H%M`

create_backup() {

   if [ ! -d $BACKUPDIR ]
       then
           mkdir -p $BACKUPDIR
   fi

   for DFL in $DFLSLIST
   do
       # echo $SCP_PROG $SCP_ARGS $1@$DFL:config.bak $BACKUPDIR/$DFL-`date +%Y%m%d%H%M`-config.bak
# узнаем по SNMP имя системы, задается в настройках удалённого доступа на DFL
       SYSNAME=`snmpget -Ovq -c public -v 2c $DFL 1.3.6.1.2.1.1.5.0 2>/dev/null`
       if [ $SYSNAME ]; then
           FILENAME=$BACKUPDIR/$SYSNAME-`date +%Y%m%d%H%M`
       else
           FILENAME=$BACKUPDIR/$DFL-`date +%Y%m%d%H%M`
       fi
       if [ ! -f $FILENAME-config.bak ]; then
           echo --- `date +%Y%m%d%H%M` start backing up Name:$SYSNAME Address:$DFL config >> $LOGFILE
           $SCP_PROG $SCP_ARGS $USERNAME@$DFL:config.bak $FILENAME-config.bak >> $LOGFILE 2>&1
       fi
       if [ -f $FILENAME-config.bak ]
       then
           echo --- `date +%Y%m%d%H%M` succes backing up Name:$SYSNAME Address:$DFL config.bak >> $LOGFILE
           echo --- `date +%Y%m%d%H%M` succes backing up Name:$SYSNAME Address:$DFL config.bak
       else
           echo --- `date +%Y%m%d%H%M` error backing up Name:$SYSNAME Address:$DFL config.bak >> $LOGFILE
           echo --- `date +%Y%m%d%H%M` error backing up Name:$SYSNAME Address:$DFL config.bak
       fi
       if [ ! -f $FILENAME-full.bak ]; then
           echo --- `date +%Y%m%d%H%M` start backing up Name:$SYSNAME Address:$DFL full >> $LOGFILE
           $SCP_PROG $SCP_ARGS $USERNAME@$DFL:full.bak $FILENAME-full.bak >> $LOGFILE 2>&1
       fi
       if [ -f $FILENAME-full.bak ]
       then
           echo --- `date +%Y%m%d%H%M` succes backing up Name:$SYSNAME Address:$DFL full.bak >> $LOGFILE
           echo --- `date +%Y%m%d%H%M` succes backing up Name:$SYSNAME Address:$DFL full.bak
       else
           echo --- `date +%Y%m%d%H%M` error backing up Name:$SYSNAME Address:$DFL full.bak >> $LOGFILE
           echo --- `date +%Y%m%d%H%M` error backing up Name:$SYSNAME Address:$DFL full.bak
       fi
       # $SSH_PROG $SSH_ARGS $1@$DFL "shutdown 15 -reboot"
       # $SSH_PROG $SSH_ARGS $1@$DFL "ls -al" > /dev/null
       # echo $DFL DON
   done
}

delete_backup() {
#    for DFL in $DFLSLIST
#       do
#           echo $SCP_PROG $SCP_ARGS $1@$DFL:config.bak $BACKUPDIR/$DFL-`date +%Y%m%d%H%M`-config.bak
#           $SCP_PROG $SCP_ARGS $USERNAME@$DFL:config.bak $BACKUPDIR/$DFL-`date +%Y%m%d%H%M`-config.bak
#           $SCP_PROG $SCP_ARGS $USERNAME@$DFL:full.bak $BACKUPDIR/$DFL-`date +%Y%m%d%H%M`-full.bak
#           $SSH_PROG $SSH_ARGS $USERNAME@$DFL "shutdown 15 -reboot"
#           $SSH_PROG $SSH_ARGS $USERNAME@$DFL "shutdown 2 -reboot" > /dev/null 2>/dev/null
#           echo $DFL DON
#    done
   rm -rf $BACKUPDIR
}

case "$1" in
create)
       create_backup
       ;;

delete)
       delete_backup
      ;;

*)
       echo "Usage: backup_dfls.sh [create|delete] username password "
       exit 1
       ;;
esac
exit 0

вторник, 28 июня 2011 г.

Скрипт для отчистки каталога бакулы и файловой системы

#!/bin/bash
# Удаляем файлы если том в пуле Scratch
# Удаляем тома из каталога если нет этих файлов
# Удаляем файлы если про них нет информации в каталоге
# СДЕЛАТЬ БЕКАП КАТАЛОГА! :) Чтобы потом не было мучительно больно.
DEVDIR=/bacula/devices # Тут лежат все "ленточки"
POOLS='Scratch Default fullbackup-pool diffbackup-pool incbackup-pool full-pool diff-pool inc-pool' #
MYSQL_CMD="mysql --skip-column-names -u bacula -plna bacula" #
BCONSOLE="/usr/bin/bconsole -s -c /etc/bacula/bconsole.conf" #


for POOL in $POOLS
do
    POOLID=`$MYSQL_CMD -e "select PoolId FROM Pool WHERE Name=\"$POOL\""`
    VOLLIST=`$MYSQL_CMD -e "select VolumeName FROM Media WHERE PoolId=\"$POOLID\";"`
    for VOL in $VOLLIST
    do
        # echo $POOLID " " $POOL " " $VOL
        # echo "Ищем $VOL"
        FILE=`find -P $DEVDIR -name "$VOL"`
        if [ "$FILE" = "" ]
        then
            echo "Файл $VOL не найден удаляем из каталога "
$BCONSOLE <<EOD_1
delete volume=$VOL yes
quit
EOD_1
        else
            if [ $POOL = "Scratch" ]
            then
                echo "Удаляем том $VOL пула $POOL"
                rm -fv `find -P $DEVDIR -name $VOL`
            else
                echo "Том $VOL в пуле $POOL"
            fi
        fi
    done
for FILE in $DEVDIR/*/*
do
    MEDIA=`echo "$FILE" | cut -d'/' -f5`
    VOL=`$MYSQL_CMD -e  "select VolumeName FROM Media WHERE VolumeName=\"$MEDIA\";"`
    if [ "$VOL" = "" ]
    then
        rm -fv  $FILE
        echo $FILE have no correspondig volume $VOL removed
#    else
#       echo $FILE have corresponfig volume $VOL in catalog
    fi
done

понедельник, 6 июня 2011 г.

IPSEC Linux Ubuntu 10.04 DFL-800 DFL-210

Все оказалось достаточно просто, но понадобилась одна хитрость :) 
192.168.7.0/24 - ДЦ (eth0)
y.y.y.y - ДЦ (eth1)
x.x.x.x - ЦО 

И так, всё делаем по мануалу:

/etc/ipsec-tools.conf
#!/usr/sbin/setkey -f
flush;
spdflush;
spdadd 192.168.7.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/y.y.y.y-x.x.x.x/require;
spdadd 192.168.1.0/24 192.168.7.0/24 any -P in ipsec esp/tunnel/x.x.x.x-y.y.y.y/require;

racoon.conf:
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
sainfo anonymous
{
        pfs_group 2;
        lifetime time 1 hour ;
        encryption_algorithm aes, 3des, blowfish 448, rijndael ;
        authentication_algorithm  hmac_md5, hmac_sha1 ;
        compression_algorithm deflate ;
}
include "/etc/racoon/x.x.x.x.conf";
include "/etc/racoon/z.z.z.z.conf";

x.x.x.x.conf:
remote x.x.x.x
{
        exchange_mode aggressive, main;
        my_identifier address;
        initial_contact on;
        proposal {
                encryption_algorithm aes;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2 ;
        }
}

Ну а теперь хитрость :) 
пакеты с самого сервера в тунель не попадали, хотя тунель фунциклировал, и между хостами в сетях связь была.
С самого IPSEC сервера Пинг проходил только если явно указать интерфейс ping -I eth0. Иначе все отправлялось на маршрут по умолчанию
Если добавить маршрут
ip route add 192.168.1.0/24 via 192.168.7.1 src 192.168.7.1 - вообще все переставало работать
ip route add 192.168.1.0/24 dev eth0 - тотже эффект, в общем не буду перечислять все варианты, укажу сразу тот что заработал:
ip route add 192.168.1.0/24 dev eth1 src 192.168.7.1
Добавил строчку в rc.local

Казалось бы мелочь ... а времени отняло ... 

вторник, 31 мая 2011 г.

Nikon D5100

Так я и не пойму, что же все так сокрушаются по кнопке ISO в Nikon D5100.
Там есть замечательный автоматический выбор ISO.
Я настроил его так, чтобы он увеличивал ISO если выдержка начинает быть длиннее 1/30 секунды.
Вот прошел уже месяц, я ни разу не пожалел о том что пропала кнопка ISO. 

вторник, 17 мая 2011 г.

Nikon D5100 LiveView и объективы Tamron и Sigma

Суть такая - Nikon d5100 в режиме LiveView не может автофокусироваться со сторонними объективами. Опробованно на Tamron SP 28-70 XR DI ... и Sigma 50 1,4. В тоже время с объективами от Nikon всё ок. Ну и фазовый автофокус пашет отлично. В тех поддержке Nikona вежливо послали с этой проблемой в Тамрон :). Чесно говоря это не сильно ущемляет, но портит общее впечатление от долгожданной покупки :). 

пятница, 4 февраля 2011 г.

Сварганил себе стойку для сетевого оборудования:
Купил в леруамерлен:
Рельс несущий - 379 р. (он в самом верху)
Направляющая вертикальная - 2х398 р.
Кронштейны - 6х139
Сетчатая полка - 379
Итого: 2388 р.
Получилось дороже чем хотелось бы, но результат мне нравится.
4 дюбеля + 4 самореза
Ножовка по металлу
Сетчатую полку поделил на три равных части.
DIR-320 со стандартной прошивкой. Принтер 1012 подключен к DIR-320. Старый упс + "пилот" с вилкой для упса. Принтер воткнут в розетку.