вторник, 19 февраля 2013 г.

FTP server за 15 минут!

Разворачиваем FTP-server за 15 минут на Ubuntu server 10.04

Ставим необходимые пакеты:
$ sudo apt-get install proftpd

Настраиваем:
$ sudo mcedit /etc/proftpd/proftpd.conf

#Тип сервера (выделенный)
ServerType                    standalone

#Чтобы предотвратить попытку положить или взломать демон proftpd командой "ls */../*/../*/..."
DenyFilter                      \*.*/

#Разрешить перезапись файлов
AllowOverwrite               on

#Разрешить "дозаливку" файлов при ошибках
AllowStoreRestart           on

#Максимальное кол-во подключений с одного хоста + сообщение при превышении ограничения
MaxClientsPerHost          2                     "too many connections by peer"

#Общее максимальное кол-во подключений
MaxInstances                 10

#Мыло админа
ServerAdmin                  admin@my.domen.com

#Имя сервера
ServerName                   "MY FTP SERVER"

#Замыкать всех в каталоге "/mnt/users/ftp"
DefaultRoot                    /mnt/users/ftp

#Удалить данные при прерывании сессии
DeleteAbortedStores       on

#Не показывать файлы пока они полностью не загружены на сервер
HiddenStores                  on

#Маска прав для вновь созданных файлов и каталогов
#первый параметр для файлов (666 - параметр = новый файл)
#второй параметр для каталогов (777 - параметр = новый каталог)
Umask                           022            022

#Root`y логиниться запрещено
RootLogin                       off

#Сообщение при удачном логине
DisplayLogin                   /etc/proftpd/.welcome.msg

#Запретить удаление файлов всем, кроме пользователя alah
<Limit WRITE>
          AllowUser            alah
          DenyAll
          IgnoreHidden       on
</Limit>

#Разрешить всем выкладывать файлы на сервер
<Limit STOR>
          AllowAll
</Limit>

#Глобальные настройки сервера для всех виртуальных
<Global>
           DefaultRoot              /mnt/users/ftp
           DeleteAbortedStores on
           HiddenStores            on
           Umask                     022          022
           RootLogin                 off
           DisplayLogin             /etc/proftpd/.welcome.msg
</Global>

#Настройки анонимных подключений
<Anonymous /mnt/users/ftp>
           #Юзер, от имени которого будем работать
           User                            ftp
           Group                          ftp
           UserAlias                     anonymous         ftp

           #Проверять наличие у юзера оболочки
           RequireValidShell         off

           #Просить пароль у анонимов
           AnonRequirePassword  off

           #Разрешить фнонимам презаписывать файлы
           AllowOverwrite            off

           #Максимальное кол-во анонимов
           MaxClients                  10             "Sorry, max %m users -- try again later"

           #Ограничить логины анонимов с определенных хостов
           <Limit LOGIN>
                      Order allow,deny
                      Allow from all
                      Deny from .microsoft.com, .msn.com
           </Limit>

           #Запретить анонима удалять файлы с сервера
           <Limit WRITE>
                      DenyAll
           </Limit>
</Anonymous>

На папку /mnt/users/ftp нужно дать права 777

Готово! Можно пользоваться.

P.S.

Если FTP-сервер за NAT`ом - необходимо добавить в конфиг следующие опции:

MasqueradeAddress ftp.mydomain.com  # FQDN вашего FTP
MasqueradeAddress 123.45.67.89         # внешний IP

PassivePorts            57000 58000            # диапазон портов для пассивного подключения

и разрешить диапазон портов пассивного подключения в IPTABLES:

# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p tcp --match multiport --dports 57000:58000 -j ACCEPT

ну и пробросить соответствующие порты на шлюзе.

четверг, 14 февраля 2013 г.

Настройка доступа к Firebird/interBase Server через ODBC. Ubuntu 12.04


Вдогонку к "Настройка доступа к Microsoft SQL Server через ODBC. Ubuntu 12.04" решил описать связку Linux->Firebird/InterBase.

Устанавливаем драйвер:

Установка необходимых пакетов:

$sudo apt-get install unixodbc unixodbc-bin unixodbc-dev odbcinst firebird2.5-super libfbclient2

Создаем необходимый симилинк:
#Для i386
$sudo ln -s /usr/lib/libfbclient.so.2 /usr/lib/libfbclient.so

#Для x86_64
$sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so.2 /usr/lib/x86_64-linux-gnu/libfbclient.so


На момент написания статьи последней версией драйвера была 2.0.1.152.
Последнюю версию на текущий момент см. тут

Качаем драйвер и копируем его куда следует:
#Для i386

$wget http://sourceforge.net/projects/firebird/files/firebird-ODBC-driver/2.0.1-Release/OdbcFb-LIB-2.0.1.152.i686.gz
$tar zxvf OdbcFb-LIB-2.0.1.152.i686.gz
$sudo cp -f libOdbcFb.so /usr/lib/odbc/
$sudo chmod +x /usr/lib/odbc/libOdbcFb.so

#Для x86_64
Для 64-битной системы драйвер оказался недоработанным (косяки работы с датой и "съедались" некоторые буквы у char`в). Пришлось собирать из svn свой.
$wget https://dl.dropbox.com/u/61986139/libOdbcFb.so.tar.gz
$tar zxvf libOdbcFb.so.tar.gz
$sudo cp -f libOdbcFb.so /usr/lib/x86_64-linux-gnu/odbc/
$sudo chmod +x /usr/lib/x86_64-linux-gnu/odbc/libOdbcFb.so



Собсна, переходим к конфигурированию...

Настраиваем драйвер:

$sudo mcedit /etc/odbcinst.ini 

и  добавляем секцию для Firebird/InterBase:

#Для i386
[Firebird]
Description = Firebird/InterBase(r) driver
Driver  = /usr/lib/odbc/libOdbcFb.so
Setup  = /usr/lib/odbc/libOdbcFb.so
FileUsage = 1
UsageCount = 4

#Для x86_64
[Firebird]
Description = Firebird/InterBase(r) driver
Driver  = /usr/lib/x86_64-linux-gnu/odbc/libOdbcFb.so
Setup  = /usr/lib/x86_64-linux-gnu/odbc/libOdbcFb.so
FileUsage = 1
UsageCount = 4



Настраиваем непосредственно систему ODBC. Создаем DSN.
Сделать это можно 2-мя способами:

1. Через GUI:

Используя мастер настройки:
$ODBCCreateDataSourceQ4

Используя ODBC администратор:
$ODBCManageDataSourcesQ4


2. Путем редактированию конфигов:

$sudo mcedit /etc/odbc.ini

Добавляем в него соответствующую секцию:

#Для i386
[MixPos]
Description = Firebird/InterBase(r) driver
Driver  = Firebird

#Если сервер Выньдовый, то путь к БД пишется в таком формате
#Dbname = 192.168.10.41:d:\mixpos\data\mixdata.fdb

#Если сервер на Linux, то путь к БД пишется в таком формате
Dbname  = 192.168.10.1:/mnt/base/mixpos/mixdata.fdb

User                                = SYSDBA
Password                         = masterkey
Role                                = 
CharacterSet                   = WIN1251
ReadOnly                        = No
NoWait                           = No
Dialect                            = 3
QuotedIdentifier              = Yes
SensitiveIdentifier           = No
AutoQuotedIdentifier       = No

#Для x86_64
[MixPos]
Description = Firebird/InterBase(r) driver
Driver  = Firebird

#Если сервер Выньдовый, то путь к БД пишется в таком формате
#Dbname = 192.168.10.41:d:\mixpos\data\mixdata.fdb

#Если сервер на Linux, то путь к БД пишется в таком формате
Dbname  = 192.168.10.1:/mnt/base/mixpos/mixdata.fdb

User                                = SYSDBA
Password                         = masterkey
Role                                = 
CharacterSet                   = WIN1251
ReadOnly                        = No
NoWait                           = No
Dialect                            = 3
QuotedIdentifier              = Yes
SensitiveIdentifier           = No
AutoQuotedIdentifier       = No


где:
Description - описание драйвера.
Driver - имя раздела из файла /etc/odbcinst.ini.
Dbname - путь к  базе данных на Firebird/InterBase сервере, к которой нужно получить доступ.
User и Password - пользователь, грантованный на работу с данной БД.
Role - роль, с которой осуществляется подключение к БД.

CharacterSet - кодировка БД.


Конфигурирование завершено...


Устанавливаем параметры драйвера в систему:

$sudo odbcinst -i -d -f /etc/odbcinst.ini

Устанавливаем настройки ODBC в систему:

$sudo odbcinst -i -s -l -f /etc/odbc.ini

!!!!ВАЖНО!!!!
Если в /etc/odbc.ini вносятся какие-либо изменения, процедуру установки ностроек ODBC в систему, необходимо повторить (sudo odbcinst -i -s -l -f /etc/odbc.ini)


Проверка установленных DSN:

$odbcinst -s -q

Проверка подключения к БД:

$isql MixPos

видим что то типа:

+---------------------------------------+
| Connected!                                 |
|                                                   |
| sql-statement                             |
| help [tablename]                        |
| quit                                            |
|                                                   |
+---------------------------------------+
SQL> 
 

Чтобы удалить параметры драйвера из системы:
$sudo odbcinst -u -d -n Firebird

Чтобы удалить регистрацию DSN из системы:
$sudo odbcinst -u -s -l -n MixPos

Во избежание конфликтов, лучше удалить локальный настройки ODBC:
$rm /home/name/.odbc.ini


Все, можно работать.

среда, 13 февраля 2013 г.

Настройка доступа к Microsoft SQL Server через ODBC. Ubuntu 12.04

Возникла недавно необходимость получить доступ к M$ SQL базам из Linux через ODBC.

Для организации связки Linux->M$ SQL, в качестве odbc-драйвера, был выбран - FreeTDS.

Установим необходимые пакеты:
$sudo apt-get install tdsodbc unixodbc unixodbc-bin unixodbc-dev odbcinst

Настройка FreeTDS.

$sudo mcedit /etc/freetds/freetds.conf

Добавляем новую секцию для M$ SQL сервера (название секции может быть любым):

[MSSQL]
host = sql.mydomen.ru
port = 1433
tds version = 8.0
client charset = UTF8

где:
host - доменное имя или IP сервера с SQL.
tds version - версия протокола TDS. Версия 8.0 для Microsoft SQL Server 2000 и выше.


Настройка ODBC.

Настраиваем драйвер:

$sudo mcedit /etc/odbcinst.ini 

и  добавляем секцию для FreeTDS:

#Для i386
[FreeTDS]
Description = FreeTDS
Driver  = /usr/lib/odbc/libtdsodbc.so
Setup  = /usr/lib/odbc/libtdsS.so
FileUsage = 1
UsageCount = 4


#Для x86_64
[FreeTDS]
Description = FreeTDS
Driver  = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup  = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
UsageCount = 4



Настраиваем непосредственно систему ODBC. Создаем DSN.
Сделать это можно 2-мя способами:

1. Через GUI:

Используя мастер настройки:
$ODBCCreateDataSourceQ4

Используя ODBC администратор:
$ODBCManageDataSourcesQ4


2. Путем редактированию конфигов:

$sudo mcedit /etc/odbc.ini

Добавляем в него соответствующую секцию:

#Для i386
[MSSQL]
Description = FreeTDS driver
Driver  = FreeTDS
Servername = MSSQL
Database = myDB
UID  = sa
PWD  = sa


#Для x86_64
[MSSQL]
Description = FreeTDS driver
Driver  = FreeTDS
Servername = MSSQL
Database = myDB
UID  = sa
PWD  = sa


где:
Description - описание драйвера.
Driver - имя раздела из файла /etc/odbcinst.ini.
Servername - имя раздела, описывающего сервер БД, из файла /etc/freetds/freetds.conf.
Database - имя базы данных на M$ SQL сервере, к которой нужно получить доступ.
UID и PWD - пользователь, заведенный на M$ SQL сервере и грантованный на работу с данной БД.


Конфигурирование завершено.


Устанавливаем параметры драйвера в систему:

$sudo odbcinst -i -d -f /etc/odbcinst.ini

Устанавливаем настройки ODBC в систему:

$sudo odbcinst -i -s -l -f /etc/odbc.ini

!!!!ВАЖНО!!!!
Если в /etc/odbc.ini вносятся какие-либо изменения, процедуру установки ностроек ODBC в систему, необходимо повторить (sudo odbcinst -i -s -l -f /etc/odbc.ini)


Проверка установленных DSN:

$odbcinst -s -q

Проверка подключения к БД:

$tsql -S MSSQL -U sa -P sa

видим что то типа:

locale is "ru_RU.UTF-8"
locale charset is "UTF-8"
using default charset "UTF8"
1> 

Чтобы удалить параметры драйвера из системы:
$sudo odbcinst -u -d -n FreeTDS

Чтобы удалить регистрацию DSN из системы:
$sudo odbcinst -u -s -l -n MSSQL

Во избежание конфликтов, лучше удалить локальный настройки ODBC:
$rm /home/name/.odbc.ini


Все, можно работать.

вторник, 12 февраля 2013 г.

Убрать индикатор раскладки клавиатуры Ubuntu 12.04

Для того, что бы полностью убрать стандартный индикатор раскладки клавиатуры (иконку клавиатуры и обозначение текущей ракладки) необходимо изменить один бит в библиотеке libkeyboard.so.

Делаем резервную копию файла:

$sudo cp /usr/lib/gnome-settings-daemon-3.0/libkeyboard.so /usr/lib/gnome-settings-daemon-3.0/libkeyboard.so.bak

 Открываем файл на редактирование любым HEX-редактором

$sudo ghex /usr/lib/gnome-settings-daemon-3.0/libkeyboard.so

Ищем кусок кода
FF 83 F8 01 0F

и меняем 01 на 02, должно получится так:


Сохраняем файл и перезаходим в сессию.

!!!ВАЖНО!!! Значок не будет отображаться, если у вас меньше 3 вариантов раскладки клавиатуры.

(с) http://help.ubuntu.ru/wiki/трей_в_unity#убираем_индикатор_раскадки_клавиатуры

понедельник, 4 февраля 2013 г.

Login под доменным пользователем Ubuntu 12.04

По-умолчанию unity-greeter в Ubuntu 12.04 позволяет входить в систему только под зарегистрированными пользователями. В случае, когда необходимо ввести Login незарегистрированного пользователя, например доменного, необходимо проделать такие вот манипуляции:

$sudo mcedit /etc/lightdm/lightdm.conf

там должно быть как-то так:

[SeatDefaults]
greeter-show-manual-login=true
user-session=gnome-classic
greeter-session=unity-greeter
autologin-user=

пятница, 1 февраля 2013 г.

isql to xml Linux

Столкнулся давича с необходимостью выгрузки результата консольного запроса к BD Firebird в XML.
Выполнить запрос к FB из консоли можно при помощи утилиты isql.
Оказалось, что линуховый isql штатными средствами этого не умеет (выньдовый, к стати, умеет цуко).

Погуглив вдоволь, нашел 2 варианта решения. Первый, быстрый и универсальный: не зависит от текста запроса и количества строк в результате запроса. Второй, рассчитан только на элементарные тексты запросов и "долгий" , при большом количестве строк в результате запроса.

Итак, вот, собственно, оба решения:


Вариант 1. Воспользоваться утилитой odbcsql (спасибо hellcat) :


Утилиту можно скачать здесь. Утилита кросс-платформенная. Не чувствительна к битности ОС. Инструкция по установке и необходимые драйвера в комплекте.

Принцип работы с qdbcsql такой:

$odbcsql DSN=mydatabaseDSN Query.sql Output.xml Error.log

где
        DSN=mydatabaseDSN  - DSN или строка подключения к БД
        Query.sql - файл, в котором лежит текст SQL-запроса, который необходимо выполнить
        Output.xml - файл, в который необходимо положить результат запроса (в формате XML)
        Error.log - файл, в котором будут лежать логи


Вариант 2. Добавляем в БД две хранимых процедуры (stored procedure):

XML_GENERATOR_FIELDS:


SET TERM ^ ;

CREATE PROCEDURE XML_GENERATOR_FIELDS(
FIELDS VARCHAR(1024),
SQL_RIGHT VARCHAR(1024))
RETURNS (
RECORD INTEGER,
XML_TEXT VARCHAR(1024))
AS
declare variable i integer;
declare variable len integer;
declare variable c char(1);
declare variable field varchar(100);
BEGIN

/* lenght fields */
len = char_length(fields);

/* loop in fields string */
i = 1;
field = ''; /* clear field */
while (i <= len) do
begin

/* current char */
c = substring(fields from :i for 1 );

/* if comma, select values of current field */
if (c = ',') then
begin

/* trim fields */
field = trim(:field);

/* order by record in the sp (xml_generator) */
record = 0;

/* values of current field */
for execute statement
cast( 'select ' || :field || ' from ' ||
:sql_right as varchar(1024))
into :xml_text do
begin

/* formatting the xml line */
/* <field>value</field>    */
xml_text = '<' || :field || '>' ||
:xml_text || '</' || :field || '>';

/* order by in xml_generator */
record = record + 1;
suspend;

end

/* clear field */
field = '';

end

else

/* char by char... */
field = field || c;

/* next char */
i = i + 1;

end

END^

SET TERM ; ^

XML_GENERATOR:

SET TERM ^ ;SET TERM ^ ;

CREATE PROCEDURE XML_GENERATOR(
PHEADER VARCHAR(1024),
PSQL VARCHAR(1024))
RETURNS (
XML_TEXT VARCHAR(1024))
AS
declare variable field varchar(30);
declare variable fields varchar(1024);
declare variable fields_begin smallint;
declare variable fields_end smallint;
declare variable from_end smallint;
declare variable sql_end smallint;
declare variable sql_right varchar(1024);
declare variable i integer;
declare variable records integer;
declare variable table_name varchar(30);
BEGIN

/* uppercase and trim psql parameter */
psql = upper(trim(psql));

/* extract fields from psql parameter */
fields_begin = position(' ',:psql)+1;
fields_end = position(' FROM ', psql);
fields = substring(psql from :fields_begin
for :fields_end-:fields_begin) ||
','; /* for extract the last field */

/* extract table name, where, order by, etc... */
from_end = fields_end + 6;
sql_end = char_length(psql)-from_end+1;
sql_right = substring(psql from :from_end for sql_end) || ' ';

/* extract only table name for "all fields" and */
/* open/close tags in xml */
table_name = substring(sql_right from 1
for position(' ',sql_right)-1);

/* if fields = '*', fields = "all fields" of the table */
if (fields = '*,') then
begin
fields = '';
for select trim(rdb$field_name) from rdb$relation_fields
where rdb$relation_name = :table_name order by rdb$field_id
into :field do fields = fields || :field || ',';
end

/* if pheader xml isnull... */
if (:pheader is null) then
pheader = '<?xml version="1.0" encoding="UTF-8" ?>';

/* returns pheader to client... */
xml_text = :pheader;
suspend;

/* open table */
xml_text = '<' || :table_name || '>';
suspend;

/* record count... */
execute statement
cast('select count(*) from ' || :sql_right as varchar(1024))
into :records;

/* fields from another stored procedure */
/* loop first to last record */
i = 1;
while ( i <= records ) do
begin

/* open record */
xml_text = '<RECORD>';
suspend;

/* fields and values in another stored procedure */
for select xml_text from xml_generator_fields(:fields, :sql_right)
where record = :i into :xml_text do
suspend;

/* close record */
xml_text = '</RECORD>';
suspend;

/* next record */
i = i + 1;

end

/* close table */
xml_text = '</' || :table_name || '>';
suspend;

END^

SET TERM ; ^

Собственно эти две процедуры генерируют нам на выходе результат запроса уже в готовой XML схеме.

Выгружаем результат запроса в XML:

Создаем SQL-скрипт и пишем в него запрос:
$touch Script.sql
$echo "SELECT XML_TEXT FROM XML_GENERATOR('<?xml version="1.0" encoding="windows-1251" ?>',' select a from ADMINUSERS' )"

Здесь, параметр 1 ('<?xml version="1.0" encoding="windows-1251" ?>') - это загаловок нашего XML-файла, а параметр 2 (' select a from ADMINUSERS') - это интересующий нас запрос

Далее даем шыйд команду на выполнение нашего запроса и сохранение его результатов в файл:
$isql MixPos -b -x0x0A < Script.sql > Result.xml

где

- "MixPos" - это DSN для нашей БД

- параметр "-b" отключает лишние комментарии командной строки isql, чтоб остался только результат запроса без дополнительной служебной информации

- параметр "-x0x0A" заменяет разделитель колонок в результате запроса на "Enter"

- "Script.sql" - это файл, где лежит тест запроса

- "Result.xml" - это необходимы нам XML-файл, куда вернется результат запроса



Проверим выполнение:

$isql MixPos -b -x0x0A < Script.sql > Result.xml

Получим такой вот Result.xml:
<ADMINUSERS>
         <RECORD>
                <ADMIN_ID>1</ADMIN_ID>
                <PASSWD>********</PASSWD>
                <PUBLISHED>P</PUBLISHED>
                <LOGIN>admin</LOGIN>
         </RECORD>
</ADMINUSERS>