Setting up drupal multisite on localhost (with Apache Alias)

17:47 Рубрика: Drupal

In this blog post I am going to explain about setting up drupal multisite with Apache Alias and it is a continuation of previous blog post where i explained about using single drupal installation to host more than one site with quiz module branches (quiz 3.x and quiz 4.x) as example.

more

Псевдографика в консоли Unix/Linux. Немного больше User Friendly чем вы могли себе позволить

21:57 Рубрика: Linux

Привет! Бывает, хочется забыть о «скучной» консоли, разбавить ее хоть капелькой интерактива, особенно если часто приходиться делать одни и теже операции и тем более если вы пишите для облегчения своей участи скрипты. Итак, псевдографика. За мной читатель, я покажу тебе такую консоль!


Наверняка многие задумывались, запуская make && make install во FreeBSD или apt-get install, например в Debian, как же хорошо было бы использовать подобные диалоги конфигурирования. Они неоправданно забыты и практически вообще не используются в пользовательских скриптах. Очень и очень зря.

Исправить это может замечательная утилита dialog.
Она присутствует во FreeBSD седьмой, восьмой ветки, а в Debian, например, можно сделать apt-get install dialog. Вообще-то, это разные программы.
Во FreeBSD немного попроще версия:

$ dialog

dialog version 0.3, by Savio Lam (lam836@cs.cuhk.hk).
  patched to version 0.4 by Stuart Herbert (S.Herbert@shef.ac.uk)
  Changes Copyright © 1995 by Andrey A. Chernov, Moscow, Russia
  patched by Anatoly A. Orehovsky (tolik@mpeks.tomsk.su)

* Display dialog boxes from shell scripts *

Usage: dialog --clear
       dialog --create-rc <file>
       dialog [--title <title>] [--clear] [--hline <line>] [--hfile <file>]\
              <Box options>

Box options:

  --yesno     <text> <height> <width> [yes|no]
  --msgbox    <text> <height> <width>
  --prgbox    "<command line>" <height> <width>
  --infobox   <text> <height> <width>
  --inputbox  <text> <height> <width> [<init string>]
  --textbox   <file> <height> <width>
  --menu      <text> <height> <width> <menu height> <tag1> <item1>...
  --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --ftree     <file> <FS> <text> <height> <width> <menu height>
  --tree      <FS> <text> <height> <width> <menu height> <item1>...


В Linux-версии возможностей побольше:

$ dialog
cdialog (ComeOn Dialog!) version 1.1-20080316
Copyright 2000-2006,2007 Thomas E. Dickey
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

* Display dialog boxes from shell scripts *

Usage: dialog <options> { --and-widget <options> }
where options are "common" options, followed by "box" options

Special options:
  [--create-rc "file"]
Common options:
  [--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>]
  [--begin <y> <x>] [--cancel-label <str>] [--clear] [--colors]
  [--cr-wrap] [--default-item <str>] [--defaultno] [--exit-label <str>]
  [--extra-button] [--extra-label <str>] [--help-button]
  [--help-label <str>] [--help-status] [--ignore] [--input-fd <fd>]
  [--insecure] [--item-help] [--keep-tite] [--keep-window]
  [--max-input <n>] [--no-cancel] [--no-collapse] [--no-kill]
  [--no-label <str>] [--no-lines] [--no-ok] [--no-shadow] [--nook]
  [--ok-label <str>] [--output-fd <fd>] [--print-maxsize] [--print-size]
  [--print-version] [--separate-output] [--separate-widget <str>]
  [--shadow] [--single-quoted] [--size-err] [--sleep <secs>] [--stderr]
  [--stdout] [--tab-correct] [--tab-len <n>] [--timeout <secs>]
  [--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
  [--yes-label <str>]
Box options:
  --calendar     <text> <height> <width> <day> <month> <year>
  --checklist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --dselect      <directory> <height> <width>
  --editbox      <file> <height> <width>
  --form         <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --fselect      <filepath> <height> <width>
  --gauge        <text> <height> <width> [<percent>]
  --infobox      <text> <height> <width>
  --inputbox     <text> <height> <width> [<init>]
  --inputmenu    <text> <height> <width> <menu height> <tag1> <item1>...
  --menu         <text> <height> <width> <menu height> <tag1> <item1>...
  --mixedform    <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
  --mixedgauge   <text> <height> <width> <percent> <tag1> <item1>...
  --msgbox       <text> <height> <width>
  --passwordbox  <text> <height> <width> [<init>]
  --passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --pause        <text> <height> <width> <seconds>
  --progressbox  <height> <width>
  --radiolist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --tailbox      <file> <height> <width>
  --tailboxbg    <file> <height> <width>
  --textbox      <file> <height> <width>
  --timebox      <text> <height> <width> <hour> <minute> <second>
  --yesno        <text> <height> <width>



Собственно уже из списка опций понятно, что эта программа позволит сделать, однако для наглядности я продемонстрирую пример.
Бэкап файлов и принудительный сброс на диск дампа выбранной базы (или всех) MySQL:

cat ./xbackup.sh
#!/bin/sh

SRC="/usr/home/dev/"
    SITE="${SRC}_Web/"
    PROJECT="${SRC}_Project/"

# куда будем складывать бэкапы
DST="/usr/home/share/BACKUP/"

# реквизиты для Mysql
SQLLOGIN="root"
SQLPASS="TopSecretPassword"
SQLHOST="localhost"

/* --------------------------------------------------------------------------------------------------------- */
# именовать файлы дампов и архивов будем по дате
DATE=`date "+%Y.%m.%d_%H-%M-%S"`
DSRC=""
# переменная для сохранения выбранного типа бэкапа (база или сайт)
backupType=0

# вызываемая программа для создания диалога
DIALOG=dialog
# временный файл
tempfile=`mktemp /tmp/bkp.XXXXXX`
trap "rm -f $tempfile" 0 1 2 5 15

# функция для вывода информационного окна
InfoDialog() {
    ${DIALOG} --msgbox "$1" 5 70
}

# упаковка файлов из выбранной директории
BackupFiles() {
    if [ ! -d ${2} ]then
        
mkdir -p ${2}
    fi
    
tar -c --gzip -f "${2}${DATE}.tar.gz" "${1}"
    InfoDialog "OK -> ${2}${DATE}.tar.gz"
}

# сохранения дампа базы в файл
BackupMySQL() {
    case ${1} in
        "All_Database")
            mysqldump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" --all-databases > "${tempfile}"
            ;;
        "")
            InfoDialog "Backup has been canceled"
            exit
            ;;
        *)
            mysqldump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" ${DBase} > "${tempfile}"
            ;;
    esac
    
cp "${tempfile}" "${DST}${1}-${DATE}.sql"
    # компрессия gzip, отключено за ненадобностью — распаковывать неудобно
    echo tar -c --gzip -f "${2}${DATE}.dump" "${tempfile}"
    InfoDialog "OK -> ${2}${DATE}.dump"
}

# выбор базы данных из списка существующих на сервере
ChooseDatabase() {
    # получаем листинг баз
    DBases=` echo "SHOW DATABASES" | mysql -u"${SQLLOGIN}" -p"${SQLPASS}" `
    # хитро обеспечиваем опцию All_Database
    List="All_${DBases}"
    # выводим диалог выбора базы из списка
    $DIALOG  --title "Please choose a Database " --tree "FS" "List of existing databases" 14 78 7 ${List} 2> ${tempfile}

    case $? in
    0)
        # выбор сделан
        DBase=`cat ${tempfile}`
        BackupMySQL ${DBase}
        ;;
    1|255)
        # диалог прерван (ескейп например)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac
}

# выбор папки с сайтом (реализованвыбор нужного  из денвероподобной структуры папок с сайтами)
ChooseDomain() {
    Paths=`ls ${1}`
    List=""
    isEmpty=true
    
for dName in ${Paths}
    do
        # выводим только папки внутри которых есть корен сайта или поддомен www (структура реализована совсем как в денвере)
        if [ -d "${1}${dName}/www" ] || [ -d "${1}${dName}/htdocs" ]then
            
List="${List} ${dName}"
            isEmpty=false
        
fi
    done


    # таким образом проверяем что выбран корень сайта и пора всетаки паковать его, иначе выводим список подпапок
    if ${isEmpty}then
        
Count=`echo ${SRC} | wc -c | tr -d ' '`
        DSRC=`echo ${1} | awk "{ print substr($ 1, ${Count}) }"`
        return 0;
    fi

    # собстно вывод список папок внутри выбранной
    $DIALOG  --title "Please choose a path " --tree "FS" "List of existing domains" 14 78 7 ${List} 2> ${tempfile}

    case $? in
    0)
        DName=`cat ${tempfile}`
        ChooseDomain "${1}${DName}/"
        ;;
    1|255)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac

}

ProcessBackup() {
    case $1 in
        Site)
             ChooseDomain ${SITE}
             BackupFiles "${SRC}${DSRC}" "${DST}${DSRC}"
            ;;
        MySQL)
            ChooseDatabase
            ;;
        *)
            ;;
    esac
}

TypeDialog() {
    ${DIALOG} --title "Choose backup type:" --menu "This is backup types" 12 50 4 \
                                            "Site" "backup web-site" \
                                            "MySQL" "Mysql database" 2> ${tempfile}

    case $? in
    0)
        ProcessBackup `cat ${tempfile}`
        TypeDialog
        ;;
    1|255)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac

}

TypeDialog

 



Выглядит это вот так:
Основное меню
Выбор сайта для бэкпап
Выбор базы для бэкапа
База успечно сдампилась


Вот и все. Теперь при работе скрипта можно любоваться интерактивными «окошечками». Таким же образом легко реализовать выполнение любых консольных команд, а сочетая это с запуском putty из командной строки с авторизацией по ключу, можно дать красивый консольный интерфейс для, например, рестарта апачи на дев-сервере(конечно через sudo с жесткими ограничениями), всем разработчикам в команде, даже незнакомым с *nix системами.
Уверен, кому-то изложенные знания пригодятся для того чтобы сделать консоль своего сервера «более User Friendly».

P.S. В процессе написания наткнулся на хорошие примеры http://www.oszone.net/2833/, кое-что оттуда сразу внедрил.

(c)

Далее

Оптимизация jQery

10:17 Рубрика: jQuery

Доклад с coffee'n'code (дополненная)

Open ftp:// links with nautilus

09:31 Рубрика: Linux

You can change the associations in gconf-editor. Expand desktop -> gnome -> url-handlers and find the entry for FTP and change the command to your preferences.

(c)

Download MSI Flash Player Installer

11:25 Рубрика: Ацкий одмин

Here

Автоматическая установка программ в домене Windows

11:21 Рубрика: Ацкий одмин

Автор

Иванов Илья, http://bozza.ru, апрель 2010

Вступление

Если в домене Windows установлен WSUS, админ рад и спокоен - дескать, все, обновления ставятся на автомате, трафик снизился, бегать по компам не надо и пр. В принципе, все осталость то же самое, но ведь не все используют в работе Microsoft Outlook или Internet Explorer (хотя 8-ка очень неплоха). Есть много людей, привыкших работать с почтовиком The Bat!, броузером Opera или Mozilla. Если встает вопрос об обновлениях - либо это головняк админу в виде беготни к каждому компьютеру для обновления всем, скажем, Opera, либо юзеры должны сидеть под админами (пускай и локальными, не доменными).

Естественно, ни первый, ни второй способы - не выход. Значит, надо иметь возможность автоматически устанавливать программы на рабочих станциях, причем желательно делать это до того, как пользователь вошел в систему - ведь если он вошел, он уже не захочет перезагружать машину и т.п. Надо ставить пользователя перед фактом - программа, его любимая Opera, уже обновлена и админа не колбасит, что версия 10.10 почему-то нравится меньше, чем предыдущая. Просто вышло обновление, и его надо применить. Без вариантов.

Самый распространенный вариант ответа на вопрос - КАК? - Конечно, через Active Directory! - скажет вам любой специалист или просто сисадмин. А как через AD? - спросите вы. А вам скажут - ?! Вы не знаете, как через AD? Да там же просто, через policy! - но больше вам скорее сего ничего не скажут, потому что для большинства советчиков этот вопрос такой же неясный, как и для вас. И вам ничего не останется, как гуглить до потери пульса, потому что найти огромный фолиант на тему "как развернуть office 2007" в сети корпорации не проблема, а вот просто и в двух словах - редко что найдете. Не без гордости могу сказать, что данная статья как раз одна из немногих кратких и "без наворотов", попадавшихся мне.

Установка программ из MSI

Все изложенное далее относится к работе с инсталляционными пакетами типа MSI (расширение .msi). Файлы MSI есть (или их можно извлечь) для многих программ (Adobe Acrobat, The Bat, Opera, Firefox и пр.).

Предположим, мы хотим автоматически установить (а по мере выхода обновлений, устанавливать обновления) броузер Firefox. Файл msi для Firefox можно взять здесь (в новом окне).

Настройку шаблона .adm я пропущу, т.к. далеко не всегда это нужно, а еще чаще этот шаблон фиг найдешь. В итоге - дефолтные настройки (либо, если будем ставить поверх старой версии - настройки будут сохранены). Шаблон .adm нам не нужен.

Распределяем права доступа

Предполагаю, что все учетные записи компьютеров (кроме контроллеров домена) находятся в OU "OU Office Computers".

Примечание 1:

Почему лучше не использовать исходное размещение компьютеров (Computers - Компьютеры домена в оснастке Active Directory Users and Computers)? Мне удобнее в дальнейшем управлять политиками для групп компьютеров. К тому же, когда я посещал курсы Microsoft, я видел, что на контроллерах доменов в тестовых системах и в "боевых", настроенных специалистами Microsoft, используются практически только отдельно созданные OU, а не базовые. Я для себя решил повторять опыт специалистов. Пока мне от этого только удобнее. Естественно, ИМХО.

Примечание 2:

Не всем пользователям нужен Firefox (как не всем нужен The Bat, Opera и пр.). Поэтому создадим в "OU Office Computers" отдельную группу компьютеров, на которые будет установлен Firefox. Для ясности назовем группу GFirefoxComputers. Отмечу, что это будет именно группа, а не вложенное OU!

Расшариваем какую-либо папку на сервере (на рисунке это SoftwareDistibution, а не Mozilla Firefox, как может показаться) и даем группе GFirefoxComputers доступ на чтение, админу - полный доступ (не компьютеру админа, а пользователю - все-таки вы должны иметь возможность по сети заливать на шару файлы ;)).

Вообще, для проверки того, как все вообще работает, можно обойтись и без группы GFirefoxComputers. Просто для того, чтобы сразу не усложнять себе жизнь, и не пенять на групповые политики, если что пойдет не так ;)

Копируем Firefox MSI в расшаренную папку на сервере

Политика правит миром! 

На контроллере домена запускаем редактор групповой политики GPMC.MSC:

Редактор групповой политики GPMC

... и создаем связанную только с нашим OU "OU Office Computers" групповую политику под названием "Firefox 3.6.3 rus":

... редактируем нашу политику "Firefox 3.6.3 rus":

Готовим дистрибутив Firefox для развертывания в сети

В разделе "User Configuration" -> "Software settings" -> "Software Installation" щелкаем правой мышкой и создаем новый объект для установки - наш будущий инсталлятор Firefox.

Выбираем файл MSI, заботливо положенного чьими-то руками в расшаренную папку. Важно: выбирать надо сетевой путь до файла, а не локальный, ведь юзера будут получать доступ к вашей инсталляшке не локально на сервере, а по сети.

Выбираем "Assigned" (Назначенный):

На этом работа с веткой "Software Installation" закончена.

Готовый пакет Firefox 3.6.3 для автоматической установки на компьютеры домена

Закрываем все открытые окна на сервере (если не помешает другим задачам, естественно), Пуск -> Выполнить -> gpupdate /force

Установка на рабочих станциях

Далее достаточно просто перезагрузить рабочие станции, чтобы автоматически установился Firefox ДО того, как появится окно для ввода логина/пароля. Иными словами, пользователь будет не в силах чего-то не установить, забыть и пр. Поэтому этот способ так хорош. Вы удаленно решаете, что будет установлено / обновлено на рабочих станциях.

Windows XP бывает не с первой перезагрузки "принимает" нове политики, поэтому можно подойти к юзеру, выполнить команду "gpupdate /force" (не обязательно под админом) и перезагрузить его компьютер.

Обязательно проверьте установку на своем / тестовом компьютере ДО того, как юзеры придут следующим утром, включат компьютеры... а вдруг косяк? Поэтому хотя бы первый раз сначала испытайте на себе.

Дополнительно

Теперь на любой новый компьютер, введенный в состав подразделения OU Office Computers будет установлена последняя версия броузера Firefox. Вам даже не придется ничего делать. Просто и очень полезно. Таким же образом можно устанавливать практически любой софт, включая Adobe Reader, Adobe Flash Player (которые в обычной ситуации требуют административных прав для установки), The Bat... да мало ли софта у вас в локальной сети, поддерживать который в актуальном состоянии одна из обязанностей системного администратора.

Нюанс: если вы уже установили какой-либо пакет, в нашем случае Firefox 3.6.3 rus, а через некоторое время вам потребуется его обновить (т.к. рано или поздно выйдет новая версия броузера), сначала удалите политику по установке Firefox 3.6.3, после чего создайте новую. Потом "gpudate /force" и вперед!

(c)

Далее

RightJS - Правая JavaScript библиотека

10:34 Рубрика: Web Development

RightJS создан для server-side разработчиков работающих с динамическими языками и представляет собой простую но хорошо структурированную систему, где все небоходимое всегда быстро доступно и легко изменяемо.

С одной стороны RightJS имеет очень простой, легко понятный синтаксис, доступный даже новичкам. С другой, RightJS поддерживает несколько парадигм разработки, имеет расширенные возможности для объектно-ориентированного и функционального программирований, а так же множество прочих продвинутых вещей способных осчастливить любого профессионала.

быстрый старт

Как прижать footer к низу страницы

10:30 Рубрика: Web Development

В этой статье я продемонстрирую один из способов как прижать footer к низу страницы.
Существует много способов это сделать, но большинство из них используют либо дополнительные хаки, либо дополнительное, не нужное количество html тегов. Этот метод для размещения footer внизу страницы имеет ряд преймуществ над другими методами. Во-первых, используется всего лишь 15 строк css и минимальное количество html тегов. Во-вторых, css код полностью валидный и корректно работает IE5++, Firefox, Safari, Opera.

Далее

How To настроки репликации в MySQL с помощью шифрования SSL на Debian Lenny

23:39 Рубрика: Linux

Это руководство описывает, как настроить репликацию базы данных в MySQL с использованием SSL соединение для шифрования.
MySQL репликация синхронизирует базу данных, что позволяет иметь точную копию БД на другом сервере. Все обновления БД на главном сервере автоматически реплицируются на другой сервер, что позволяет защитить базу от аппаратных сбоев. В этой статье будет показано, как реализовать репликации БД exampledb с сервера server1.example.com(ip адресом 192.168.0.100) на сервер server2.example.com(ip адресом 192.168.0.101) с использованием SSL соединения


Оба сервера работают на Debian Lenny но конфигурация может применяться практически на всех дистрибутивах без изменений. БД exampledb с таблицами и данными уже существующих только на главном. Все команды выполняются с привилегиями пользователя root.
Если на обоих серверах не установлен сервер MySQL то приступим к инсталляции, выполнив на главном и на вторичном сервере команду:

aptitude install mysql-server mysql-client


Вам будет предложено ввести пароль root для MySQL, как на главном так и на вторичном сервере.
Теперь проверим поддержку соединения по протоколу SSL с MySQL. Давайте войдем в MySQL и введем команду в командной строке MySQL:

mysql -u root -p

mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+---------------+----------+
7 rows in set (0.00 sec)

mysql>quit;


Если вывод выглядит следующим образом то это означает что MySQL был скомпилирован с поддежкой SSL, но в у нас как видно из таблици have_openssl DISABLED и have_ssl DISABLED не активен.

Что бы включить поддержку SSL нужно отредактировать файл my.cnf который расположен в /etc/mysql/

vi /etc/mysql/my.cnf


Найдите строки * Security Features и добавьте строку ssl

[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
[...]


Перезапустим MySQL:

/etc/init.d/mysql restart


и проверим активена ли поддержка ssl

mysql -u root -p

show variables like '%ssl%';

mysql> show variables like '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
| have_ssl      | YES   |
| ssl_ca        |       |
| ssl_capath    |       |
| ssl_cert      |       |
| ssl_cipher    |       |
| ssl_key       |       |
+---------------+-------+
7 rows in set (0.00 sec)

mysql>quit;


Вывод показывает что ssl включен.
Далее настроить MySQL для прослушивался на всех интерфейсах, закоментировав строчку bind-address = 127.0.0.1 в /etc/mysql/my.cnf:
server1:

vi /etc/mysql/my.cnf

[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]


рестар MySQL:

/etc/init.d/mysql restart


Теперь посмотрим что висит у нас на портах:

netstat -tap | grep mysql

server1:~# netstat -tap | grep mysql
tcp        0      0 *:mysql                 *:*                     LISTEN      3771/mysqld
server1:~#


Видимо что MySQL транслируется на всех интерфейсах.
Теперь нам необходимо создать CA, серверов и клиентских сертификатов, для SSL соединений. Я создаю их обычно в каталоге /etc/mysql/newcerts
Создадим каталог newcerts:

mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts


Убедимся что OpenSSL унас установлен:

aptitude install openssl


Создаем CA сертификат:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem


Далее создаем сертификат для сервера…:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem


и для клиента:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem


Вывод должен выглядеть следующим образом:

ls -l
server1:/etc/mysql/newcerts# ls -l
total 32
-rw-r--r-- 1 root root 1346 2010-08-18 20:13 ca-cert.pem
-rw-r--r-- 1 root root 1675 2010-08-18 20:13 ca-key.pem
-rw-r--r-- 1 root root 1099 2010-08-18 20:14 client-cert.pem
-rw-r--r-- 1 root root 1675 2010-08-18 20:14 client-key.pem
-rw-r--r-- 1 root root 956 2010-08-18 20:14 client-req.pem
-rw-r--r-- 1 root root 1099 2010-08-18 20:14 server-cert.pem
-rw-r--r-- 1 root root 1679 2010-08-18 20:14 server-key.pem
-rw-r--r-- 1 root root 956 2010-08-18 20:14 server-req.pem
server1:/etc/mysql/newcerts#


Теперь мы должны передать сертификаты ca-cert.pem, client-cert.pem и client-key.pem на второй сервер. Создадим директорию на втором сервере:
server2:

mkdir /etc/mysql/newcerts


Вернемся на server1 и передадим сертификаты следующим образом:
server1:

scp /etc/mysql/newcerts/ca-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem root@192.168.0.101:/etc/mysql/newcerts


Далее откроем на server1 /etc/mysql/my.cnf и внесем изменения в область * Security Features раскоментировав строки ssl-ca, ssl-cert и ssl-key:

vi /etc/mysql/my.cnf

[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem
[...]


Перезапустим MySQL:

/etc/init.d/mysql restart


Теперь мы создадим slave_user пользователя репликации, который будет использоваться на server2, для доступа к базе данных на server1

mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;


Сторока REQUIRE SSL не является обязательной, если Вы оставите ее, slave_user будет разрешено подключатся через зашифрованное и не зашифрованное соединение. При использовании SSL разрешено будет только зашифрованное соединение.

(Если пользователь репликации уже создан и нужно указать только SSL соединение то нужно изменить пользователя следующим образом:

GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;


)

FLUSH PRIVILEGES;
quit;


Кроме того мы должны MySQL указать где хранить наши логи для репликации, а также укащать какой сервер является главным а какой репликационным:

vi /etc/mysql/my.cnf

[...]
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = exampledb
[...]


Рестарт MySQL

/etc/init.d/mysql restart


Далее нам нужно провести несколько операций:
1. Заблокировать базу exampledb на server1
2. Узнать master status server1
3. Создать дамп SQL exampledb (для импорта на server2)
4. Разблокировать нашу базу

mysql -u root -p
USE exampledb;
FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |       98 | exampledb    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql>


Теперь не выходя из консоли mysql(т.к. блокировка бд будет удалена) мы сделаем бекап и перенесем его на server2
server1:

cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp


После проделаной операции можно смело разблокировать нашу БД
server1:

UNLOCK TABLES;
quit;


На этом настройка server1 завершена. Приступим к настройке server2 открыв конфиг мускуля:
server2:

vi /etc/mysql/my.cnf


убедимся что у нас есть следующие настройки строки(если их нет то добавим):

[...]
server-id=2
master-connect-retry=60
replicate-do-db=exampledb
[...]


Значение server-id=2 уникальное и оно должно отличатся от значения которое на server1

Перезапустим MySQL:

/etc/init.d/mysql restart


Прежде чем начать настройку репликации создадим пустую БД:

mysql -u root -p

CREATE DATABASE exampledb;
quit;


Теперь можно импортировать на server2 дамп базы snapshot.sql

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql


Заходим в MySQL и выполним команду, что бы server2 был вторичным сервером, а server1 определялся как первычный сервер:

mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98, MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/newcerts/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/newcerts/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/newcerts/client-key.pem';


* MASTER_HOST — ip адрес или имя хоста в нашем случае это ip
* MASTER_USER — пользователь репликации для первичного сервера
* MASTER_PASSWORD — Пароль пользователя
* MASTER_LOG_FILE — Значение Лог файла на server1 которое мы узнали выполним команду SHOW MASTER STATUS;
* MASTER_LOG_POS — Значение полученное при выполнении команды SHOW MASTER STATUS;
* MASTER_SSL — Создает соединение главного и вторичного сервера с использованием SSL
* MASTER_SSL_CA — Путь к сертификату CA (server2)
* MASTER_SSL_CERT — Путь к сертификату client-cert.pem (server2)
* MASTER_SSL_KEY — Путь к сертификату client-key.pem (server2)

И наконец

START SLAVE;


Теперь проверим статус server2

SHOW SLAVE STATUS \G

mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.0.100
                Master_User: slave_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: exampledb
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: Yes
         Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
         Master_SSL_CA_Path:
            Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem
          Master_SSL_Cipher:
             Master_SSL_Key: /etc/mysql/newcerts/client-key.pem
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

mysql>


После этого можно выйти с MySQL:

quit;


Вот и все, настройка серверов закончена. Если Вы сделали все верно то репликация настроена правильно и работоспособна.

Большое спасибо за внимание!
P.S. Если вы нашли очепятку или не правильно сформулированное предложение сообщите пожалуйста в ЛС.

(c)

Далее

Setting the Background on Nautilus Special Places' Headers

10:37 Рубрика: Linux

To change the background color of the special headers in Search and CD-Creator put something like the following in your gtkrc:  

style "extra-view-widgets"
{
# Fx. The special header in Nautilus Search and CD Creator
bg[NORMAL] = "#CD6127"
}

widget "*.nautilus-extra-view-widget" style:highest "extra-view-widgets"

(c)