SubVersion+PostgreSQL+GMailFS backup

No comments »

За един малък домашен проект ми се наложи да измисля бекъп решение за кодовото хранилище и базата данни. Хрумнаха ми два бързи варианта:

  • Закачам USB памет на щайгата и копирам там всекидневно експорти;
  • Регистрирам в Google потребител за електронната им поща и пускам там бекъп-а по gmailfs.

Разбира се, като всеки уважаващ себе си програмист, нямам резервни USB стърчишки, особено ако трябва да ги завирам в архаична щайга (Celeron 433 MHz / HDD 20GB / RAM 512 MB) за постоянно. Трябва да поясня, че в Wikipedia не препоръчват gmail да се използва за бекъп – имат навика да трият акаунта при прекомерно използване, а и не се знае кога ще сменят API-то и ще угаснат файловете там.

Подминавам предупреждението и давам смело напред. Първо да идентифицирам какво точно ми трябва:

  • Бекъп пространство – поща в gmail, към момента дават 2-3 GB, напълно достатъчно за случая;
  • Скрипт за експорт на кодовите хранилища, по възможност да проверява дали има нови версии и ако няма да прескача стъпката с бекъпа;
  • Скрипт за пълен експорт на PostgreSQL-а;
  • Възможност за добро компресиране и силно криптиране на файловете – използвах 7z, видя ми се подходящ за случая;
  • Пилешки познания по bash scripting (е нека и гурутата да се посмеят сега), обилно гарнирани с крушова водка. Последното е необходимо на автора за да си припомни bash-а, че рядко му се налага да злоупотребява с него…

След известно ръчкане настъпих и първите мотики:

  • Използвам Ubuntu Gutsy Gibbon, към момента е dev версия. gmailfs-а при опит да се mount-не ме наплюва с 400: Bad Request. Това очевидно идва от гугълските сървъри, където някой нещо реже с флекс. По най-грубия възможен начин решавам проблема така: след известно взиране в python кода откривам, че грешката е в libgmail. Отивам на страницата на библиотеката, завирам се в cvs-а, от където измъквам топла-топла последната версия, само на два дена, милата. Грозно намазвам старата библиотека, намираща се в /usr/share/pycentral/python-libgmail/site-packages с тайната надежда, че когато поддържащия ubuntu-джия, обнови пакета, ще имам по-нова версия, ако ли не поне същата.
    Разбира се, номера минава и вече имам достъп до gmail пощата.
  • gmailfs не се mount-на човешки (поне при мен), в резултат на което на нея не можах да използвам примерно mv

След още малко човъркане и двойно повече взиране в man страниците, изковах следните скриптчета:

svn_backup

#!/bin/bash
#Backup svn repos, alex [at] stanev.org
svnbase='/var/svn'
backup_target='/mnt/gmail'
svndump='/tmp/backup'
pass='archive_password'
wd=$PWD
cd $svnbase
for repo in $(ls -d */); do
repo=${repo%/}
svn info file://$svnbase/$repo > $svndump/$repo.curr
touch $svndump/$repo.last
if ! cmp -s $svndump/$repo.curr $svndump/$repo.last ; then
svnadmin dump -q $svnbase/$repo | 7z a -mx=9 -p$pass -si$repo $svndump/$repo.7z
if ! [[ -f $backup_target/$repo.7z ]] ; then
ext='.7z'
elif ! [[ -f $backup_target/$repo.1.7z ]] ; then
ext='.1.7z'
elif [[ $backup_target/$repo.7z -nt $backup_target/$repo.1.7z ]] ; then
ext='.1.7z'
rm $backup_target/$repo$ext
else
ext='.7z'
rm $backup_target/$repo$ext
fi
cp $svndump/$repo.7z $backup_target/$repo$ext
mv -f $svndump/$repo.curr $svndump/$repo.last
rm $svndump/$repo.7z
fi
done
cd $wd

pg_backup

#!/bin/bash
#Backup postgre db, alex [at] stanev.org
backup_target='/mnt/gmail'
pgdump='/tmp/backup'
pass='archive_password'
sudo -u postgres pg_dumpall | 7z a -mx=9 -p$pass -sipostgres $pgdump/postgres.7z
if ! [[ -f $backup_target/postgres.7z ]] ; then
ext='.7z'
elif ! [[ -f $backup_target/postgres.1.7z ]] ; then
ext='.1.7z'
elif [[ $backup_target/postgres.7z -nt $backup_target/postgres.1.7z ]] ; then
ext='.1.7z'
rm $backup_target/postgres$ext
else
ext='.7z'
rm $backup_target/postgres$ext
fi
cp $pgdump/postgres.7z $backup_target/postgres$ext
rm $pgdump/postgres.7z

Накратко, горните упражнения правят следното:

svn_backup обикаля всички хранилища и изтегля информация за HEAD revision. Ако има промени се прави копие към директорията за бекъп. Тъй като в случая с gmailfs използваме отдалечена файлова система, отсреща се пазят по две копия на един и същи файл. При качване на следващия винаги се изтрива по-стария. Това повишава мижавата вероятност са имаме поне един цял файл, ако връзката се разпадне в момента на предаване.

За pg_backup е аналогично, с разликата, че там бекъпа винаги се изпълнява, без да се правят по-специални проверки.

Настройте вашите пътища, сменете паролата и сте почти готови!

Остава двете скриптчета да се назначат за периодично изпълнение и да проследим първите бекъпи.

За накрая пожелавам на никой да не му се налага да си спасява работата. *Винаги* тествайте обратния процес на възстановяване – периодично се уверявайте, че задната вратичка е достатъчно широка, за да можете да се измъкнете, когато се подпали къщичката ;)

Отнасяне

No comments »

ОК, опитвал ли си това:

  • 2l бира и мента (разбира се, класическата пропорция 10:1);
  • Morphine, от крайните албуми, които значат много;
  • Димяща пура, разпръскваща мъгла наоколо;
  • Светлината на лампата осветява и най-слабото движение, разкриващо подръпването от пурата или доливането от бутилка в бутилка.

За какво, на фона на мистиленото небе, би си помислил/сетил/разбрал?

OK, get rid of me…

P.s. Колкото и да е странно, сутринта не започна със залез. Просто трябва да си вярваш :)

Just A Man

No comments »

And every night I shut my eyes
So I don’t have to see the light
Shining so bright
I’ll dream about a cloudy sky, a cloudy sky
And every night I shut my eyes
But now I’ve got them open wide
You’ve fallen into my hands
And now you’re burning me
You’re burning me

Just A Man, Faith No More

Смарткарти

No comments »

Преди малко драснах във вътрешния форум на компанията няколко реда за един колега, който искаше да подкара смарткартите ни под Linux. Реших, че може да свърши работа и на някой друг, затова го пускам тук:

Намерих малко време и направих един бърз експеримент със CCID четец и SetCOS смарткарти, които под windows вървят със SetWEB-а. Резултата е успешен.
Ето какво направих:

0) Хардуер
alex@si:~$ pcsc_scan
PC/SC device scanner
V 1.4.9 (c) 2001-2006, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.4.2
Scanning present readers
0: ACS ACR 38U-CCID 00 00

[snip]

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 9F 94 80 1F C3 00 68 11 44 05 01 46 49 53 45 31 C8 07 90 00 19
3B 9F .. 80 1F C3 00 68 1. 44 05 01 46 49 53 45 31 C8 .. 90 00 ..
Setec SetCOS 4.4.1

1) ОС
alex@si:~$ uname -a
Linux si 2.6.22-10-generic #1 SMP Wed Aug 22 07:42:05 GMT 2007 x86_64 GNU/Linux
alex@si:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=7.10
DISTRIB_CODENAME=gutsy
DISTRIB_DESCRIPTION=”Ubuntu gutsy (development branch)”

2) Пакети
alex@si:~$ sudo aptitude install opensc libccid mozilla-opensc

Към тези пакети най-вероятно ще се задействат dependecies, необходимо е да се потвърдят.

3) Тест
Провери дали работи pcscd и пусни pcsc_scan
Трябва да се върне информация за четеца и картата, както и при вадене/пъхане да се прочита информация за текущата смарткарта.

4) Потребителски софтуер
Ако горните стъпки са ОК, вече разполагаш с работещ подпис под linux. Последно остава да се конфигурира потребителския софтуер. Той трябва да поддържа работа през PKCS#11 интерфейс, което си е стандартно отвсякъде.
Пример за Firefox/Thunderbird:
цъка се на Edit->Preferences->Advanced->Encryption->Security Devices
после Load и се оказва пътя към PKCS#11 библиотеката на openSC:
/usr/lib/opensc/opensc-pkcs11.so

Потвърждава се, инсталират се базовите сертификати на StampIt (незадължително) и това е – вече трябва да можеш да използваш смарткартата за клиентска оторизация.

Уговорки:
горното би трябвало да работи без промяна и на Debian. Въпреки, че съм използвал development версия на Ubuntu (утре излиза Tribe6, ще се пие бира!) +, че е 64 битова системата, вярвам, че ще работи и под други дистрибуции аналогично.

Изобщо, като цяло инсталацията си е stright forward процес, без допълнителни “врътки”.

Edit: пътят към opensc pkcs#11 библиотеката може да е различен във вапата дистрибуция. Например, под Ubuntu 8.10 e /usr/lib/opensc/opensc-pkcs11.so