LINUX.ORG.RU
ФорумAdmin

Freepbx с подключением к внешней базе данных

 , ,


0

1

Устанавливаю астериск+freepbx на centos 7, базы данных использую только для freepbx (астериск без них живет), всегда на локалхосте (mariaDB 5.5). Понадобилось базы держать на отдельном сервере mysql (он в локалке на нестандартном порте).

На сервере mysql созданы две БД (aster, astercdrdb - их по умолчанию требует freepbx), пользователь с правами на эти базы, пароль. Проверяю, есть ли доступ до этих БД через подключение с Heidi. Всё доступно, пароль верен.

При установке freepbx:

 ./install
Database engine [mysql]: 192.168.1.110:33061
Database name [asterisk]: aster
CDR Database name [asteriskcdrdb]: astercdrdb
Database username [root]: aster
Database password: 5245dhdfgx
File owner user [asterisk]:
File owner group [asterisk]:
Filesystem location from which FreePBX files will be served [/var/www/html]:
Filesystem location from which Asterisk configuration files will be served [/etc/asterisk]:
Filesystem location for Asterisk modules [/usr/lib64/asterisk/modules]:
Filesystem location for Asterisk lib files [/var/lib/asterisk]:
Filesystem location for Asterisk agi files [/var/lib/asterisk/agi-bin]:
Location of the Asterisk spool directory [/var/spool/asterisk]:
Location of the Asterisk run directory [/var/run/asterisk]:
Location of the Asterisk log files [/var/log/asterisk]:
Location of the FreePBX command line scripts [/var/lib/asterisk/bin]:
Location of the FreePBX (root) command line scripts [/usr/sbin]:
Location of the Apache cgi-bin executables [/var/www/cgi-bin]:
Directory for FreePBX html5 playback files [/var/lib/asterisk/playback]:
Checking if SELinux is enabled...Its not (good)!
Reading /etc/asterisk/asterisk.conf...Done
Checking if Asterisk is running and we can talk to it as the 'asterisk' user...Done
Preliminary checks done. Starting FreePBX Installation
Checking if this is a new install...Yes (No /etc/amportal.conf file detected)
Database installation checking credentials and permissions..Error!
Invalid Database Permissions. The error was: could not find driver
Нет драйвера. Пакеты
unixodbc unixodbc-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc 
установлены, в файле odbc.ini прописано (изначально файла не было, создан руками):
[MySQL-astercdrdb]
Description=MySQL connection to 'asterisk' database
Driver=MySQL
Server=192.168.1.110
Database=astercdrdb
Port=33061
User=aster
Password=5245dhdfgx
Socket=/var/lib/mysql/mysql.sock
option=3
При проверке коннекта до сервера mysql
echo "select 1" | isql -v MySQL-astercdrdb
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched
SQL> 
Драйвер подключен, но не найден. В параметре Database engine [mysql]: пробовала указывать MySQL-astercdrdb, MySQL, собственно, IP-адрес с портом...

Как правильно указать freepbx сервер с его базами данных?


Ответ на: комментарий от upcFrost

кстати да, если поиском пройтись по скрипт - dsn еще в паре мест есть

а, не, нету. но на 705 строке он что-то пишет во freepbx.conf, да и в еще скриптах 10-15 встречается подобное. в целом хост он съест, то проблем нет, а вот порт... есть мысль что лучше написать $amp_conf['AMPDBHOST'] = '192.168.1.110;port=33061'; вместо явного указания порта и изменения всех dsn. вероятность что прокатит выше

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от upcFrost

Опробовала последний вариант:

 $amp_conf['AMPDBHOST'] = '192.168.1.110;port=33061';
Установщик freepbx ругается так (выделяя красным):
  [Exception]
  SQLSTATE[HY000] [2005] Unknown MySQL server host 
'192.168.1.110%3Bport%3D33061' (2)::SQLSTATE[HY000] [2005]
Unknown MySQL server host '192.168.1.110%3Bport%3D33061' (2)

  [PDOException]
  SQLSTATE[HY000] [2005] Unknown MySQL server host 
'192.168.1.110%3Bport%3D33061' (2)

manik207
() автор топика
Ответ на: комментарий от berrywizard

кстати да, совсем забыл про этот вариант, как-то сбило с толку что скрипт тупо не умеет удаленную базу.

ТС, что если правда вернуть все в зад (ну, просто удалить правки dsn и AMPDBHOST) и перебросить локальный 3306 через iptables? как один из примеров: http://stackoverflow.com/questions/28170004/how-to-do-local-port-forwarding-w...

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Эм... Это всё стоит на centos 7, там firewalld, на iptables - не хотелось бы, не разбираюсь в нем (тапками не кидайте, linux изучала исключительно начиная c Centos 7).

Если правильно поняла, нужно, чтобы запросы, отправляемые на локалхост:3306 перенаправлялись на 192.168.1.110:33061.

А потом принимались обратно, по «зеркальному» правилу - со 192.168.1.110:33061 на локалхост:3306. И разруливает это файрволл...

Нашла firewall-cmd --permanent --zone=public --add-forward-port=port=3306:proto=tcp:toport=33061:toaddr=192.168.1.110

Всё отменять не стала, подняла другую виртуалку, на ней поставила с нуля.

В файрволе:

firewall-cmd --permanent --zone=public --add-forward-port=port=3306:proto=tcp:toport=33061:toaddr=192.168.1.110
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --reload

Установщик freepbx ругается так:

 Error!
Invalid Database Permissions. The error was: SQLSTATE[HY000] [2002] 
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

manik207
() автор топика
Ответ на: комментарий от manik207

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

судя по сырцам эта строка могла взяться только из odbc.ini. ща попробую поднять тестовый полигон, но скорее всего надо просто убрать из этого файла строку про Socket

upcFrost ★★★★★
()
Ответ на: комментарий от manik207

проверю сегодня на двух тестовых виртуалках. сразу скажу что там MariaDB а не мускул, но думаю проблем это не должно добавить (по манам к пыху коннектор 100% совместим). а вообще - народ воет на этот счет, да. и хост-то ладно, там еще с портом прыгать придется

upcFrost ★★★★★
()
Ответ на: комментарий от manik207

все, попробовал, у меня взлетело.

суть - при попытке зацепиться на localhost (строчка в скрипте прямо на PDO) оно цепляется на сокет, а вот если на 127.0.0.1 - тогда по TCP. при пробросе локального 3306 на удаленный 33060 и замене это строки с localhost на 127.0.01 все встало

ну вернее как, все встало, вот только нихрена не заработало потому что у меня в виртуалке PHP 7 который не поддерживается (часть функций deprecated). но с точки зрения базы все встало как надо

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Т.е. правильно ли я поняла, localhost нужно заменить 127.0.0.1 в строке

  $amp_conf['AMPDBHOST'] = '127.0.0.1';
без портов и других серверов, а проброс порта уже делать силами файрвола?

manik207
() автор топика
Ответ на: комментарий от upcFrost

при пробросе локального 3306 на удаленный 33060

Вы пробрасывали через iptables или firewalld? Поделитесь правилом)))

manik207
() автор топика
Ответ на: комментарий от upcFrost

В файле odbc.ini удалила строку с socket, localhost заменила на 127.0.0.1, а всё равно в ошибке фигурирует socket...

Invalid Database Permissions. The error was: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Поиск grep'ом по директории с исходниками не выдал ничего путевого...

grep -rl '/var/lib/mysql/mysql.sock' /usr/src/*
/usr/src/asterisk-13.14.0/addons/res_config_mysql.c
/usr/src/asterisk-13.14.0/addons/app_mysql.o
/usr/src/asterisk-13.14.0/addons/app_mysql.so
/usr/src/asterisk-13.14.0/addons/cdr_mysql.o
/usr/src/asterisk-13.14.0/addons/cdr_mysql.so
/usr/src/asterisk-13.14.0/addons/res_config_mysql.o
/usr/src/asterisk-13.14.0/addons/res_config_mysql.so
/usr/src/freepbx/installlib/files/odbc.ini.orig
Последний файл - эт копия, на всякий случай.

Файрвол вроде пробросила, но даже если ошибка в файрволе, не socket должен цепляться, а TCP...

manik207
() автор топика
Ответ на: комментарий от upcFrost

Файл odbc.ini сейчас в таком виде

[MySQL-CDRDBNAME]
Description=MySQL connection to 'CDRDBNAME' database
driver=MySQL
server=127.0.0.1
database=asteriskcdrdb
Port=3306
option=3
Charset=utf8

Но нужно в sysctl включить route local net

По запросу нашла

sysctl -w net.ipv4.conf.eth0.route_localnet=1
Отзыв системы:
net.ipv4.conf.eth0.route_localnet = 1

manik207
() автор топика
Ответ на: комментарий от manik207

ок, тогда серия простых тестов.

  • php --ri pdo - какие драйвера показывает
  • php -r 'try { $test = new \PDO("mysql:host=localhost", "t", "t"); } catch ( PDOException $E ) {echo $E->getMessage();}' - какой эксепшн
  • php -r 'try { $test = new \PDO("mysql:host=127.0.0.1", "t", "t"); } catch ( PDOException $E ) {echo $E->getMessage();}' - тот же вопрос

у меня в первом случае есть дрова на мускул, во втором - No such file (собственно сокет), в третьем - Connection refused (вм с базой выключена). Соответственно если поменять AMPDBHOST на 127.0.0.1 вместо localhost, то оно должно идти по третьем сценарию

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Упс, забыла добавить MariaDB в автозагрузку, добавила, вопрос по socket'у снимается

php --ri pdo

PDO

PDO support => enabled
PDO drivers => mysql, sqlite

php -r 'try { $test = new \PDO(«mysql:host=localhost», «t», «t»); } catch ( PDOException $E ) {echo $E->getMessage();}'

SQLSTATE[28000] [1045] Access denied for user 't'@'localhost' (using password: YES)

php -r 'try { $test = new \PDO(«mysql:host=127.0.0.1», «t», «t»); } catch ( PDOException $E ) {echo $E->getMessage();}'

SQLSTATE[28000] [1045] Access denied for user 't'@'localhost' (using password: YES)

Теперь freepbx приписывает к localhost пользователя mysql:

Error!
Invalid Database Permissions. The error was: SQLSTATE[28000] 
[1045] Access denied for user 'aster'@'localhost' (using password: YES)

А у меня он по-любому будет через @192.168.% или @%. Или нет?

manik207
() автор топика

Эммм. Так а база-то где стоит? А то он почему-то все на localhost щемит. На локальном тоже база есть? Фаервол кстати можно проверить через tcpdump. Чтоб просто убедиться что маршрутизация работает.

У меня он юзера приписывал к реальному адресу, pdo шлет только логин и пароль без уточнения хоста

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Запуталась я со службами mariaDB...

Что есть:

1. Есть сервер, на котором ставлю freepbx. Тут же стоит mariabd, баз в ней нет, но сервер работает. (комп_1)

2. Есть сервер с mariaDB, он отдельный, в локалке, там базы данных есть и пользователь aster@192.168.% (комп_2)

Что на выходе:

1. Если на комп_1 отключаю mariaDB, при установке freepbx ругается на сокет.

2. Если на комп_1 запускаю службу mariaDB, freepbx ругается, что пользователя aster@localhost нет. Так его там и нет.

manik207
() автор топика
Ответ на: Запуталась я со службами mariaDB... от manik207

Если на комп_1 отключаю mariaDB, при установке freepbx ругается на сокет

вот. именно этот момент и надо обойти. если отключить местную базу (желательно совсем, иначе мешает эксперименту) и оставить только ту что в локалке, настроить фаервол и запустить те тестовые однострочники - он во всех случаях в сокет лезет, или в случае 127.0.0.1 все-таки пытается юзать TCP?

Если во всех случаях - если опять же сделать однострочник заменив localhost на адрес внешнего интерфейса, и подбить правила под это дело, куда он будет щемить тогда?

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от upcFrost

Поменяла localhost на 127.0.0.1 и отключила mariaDB - вы правы, стучит не в сокет

Error!
Invalid Database Permissions. The error was: SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111)
Если правильно поняла, то порт переброшен неправильно... Поискала темы с пробросами в firewalld - там капец, работающих правил проброса портов на удаленные компы для этой службы не найдено.

Поделитесь правилами для Iptables, может хоть copy-paste'ом получиться...

manik207
() автор топика
Ответ на: комментарий от manik207
iptables -t NAT -A OUTPUT -p tcp -d 127.0.0.1 --dport 3306 -j DNAT --to 1.2.3.4:33060

вместо 1.2.3.4 - адрес куда надо перекинуть. Проверяется в простейшем случае так. iptables -t nat -L -v до коннекта, смотрим счетчик правила, далее mysql -h 127.0.0.1, отменяем через пару секунд и снова проверяем счетчик куда ушел запрос.

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

забыл, еще одно - iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE

и еще вариант проверки если трафика мало - tcpdump -n -l

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.