Friday, December 14, 2012

A2Billing. Хочу быть провайдером.

Итак... Захотелось мне стать провайдером, благо дешевую международку я нашел. Теперь с каждой станцией буду давать немного трафика покупателям! И мне несложно, и плюшка приятная. Используется версия 2.0.1
1. LAMP! (+php-gd)
2. Ставим Asterisk с поддержкой realtime (для этого поставить дополнительно mysclclient-dev)
3. Качаем A2Billing и внимательно читаем файл INSTALL.rst и выполняем инструкции (только думая, некоторые пути имеет смысл заменить). Также обратите внимание, в скрипте установки баз MySQL могут быть неправильно прописаны пути для Debian 6. Пароли тоже не стоит ставить дефолтные :)
4. vi /etc/asterisk/res_config_mysql.conf
[general]
dbhost = 127.0.0.1
dbname = mya2billing
dbuser = a2billinguser
dbpass =
dbport = 3306

5. vi /etc/asterisk/extconfig.conf
[settings]
iaxusers => mysql,general,cc_iax_buddies
iaxpeers => mysql,general,cc_iax_buddies
sipusers => mysql,general,cc_sip_buddies
sippeers => mysql,general,cc_sip_buddies

6. Настраиваем провайдеров в /etc/asterisk/sip.conf
[MainProvider](!)
context=NoContext ; DID пока не настраивал
disallow=all
allow=alaw
dtmf=rfc2833
type=peer
canreinvite=no

[Trunk1](MainProvider)
host=XXXXX

[Trunk2](MainProvider)
host=XXXXXX

[Trunk3](MainProvider)
host=XXXXXX


7. Настраиваем A2Billing (По мотивам http://sysadminman.net/documentation.html)
7.1 Настраиваем Провайдера (PROVIDERS)
7.2 Настраиваем Транки
7.3 Создаем Rate Card (RATES)
7.4 Создаем/Импортируем Rates, привязывая его к Rate Card
7.5 Создаем Сall Plan, привязывая его к Rate Card (Делается при повторном выборе Call Plan) (Тут можно вырезать префикс международки)
7.5 Создаем покупателя, приписываем ему Call Plan (CUSTOMERS)
7.6 Создаем VoIP Profile для пользователя, можно автоматом, только необходимо потом проставить CallerID. Оттуда же делаем Asterisk reload
Работает так:
Покупатель аутентифицируется на нашей платформе. Потом просто звонит на необходимый ему номер. Профит!
Несколько параметров, на которые стоит обратить внимание:

global-base_currency (базовая валюта), после ее смены надо в разделе Billing-Currency List сделать update
agi-conf1-asterisk_version 
global-asterisk_version
agi-conf1-answer_call 
agi-conf1-play_audio
agi-conf1-say_rateinitial 
agi-conf1-say_timetocall
agi-conf1-use_dnid Если YES, то система не будет просить ввести номер, на который звонить, будет использовать присланный.

Monday, October 29, 2012

GnuGk, как замена VBP-E и частично VBP-ST

Итак, зачем покупать VBP, если есть замечательный продукт GnuGk, который умеет все, что серия E и также H.480, что умеет ST-серия.
Далее немного подчищенной копипасты с сорцфорджа.

Собирается с поддержкой H.480.18/.19

=======================================================
Final Method - Installing GNUGK v3.1+ on Debian Squeeze
=======================================================

cd /usr/src
apt-get update
apt-get install flex bison build-essential pkg-config automake libmysqlclient-dev  libmysql++-dev  

libsnmp-base libsnmp-dev libssl-dev
wget http://backports.debian.org/debian-backports/pool/main/libs/libssh/libssh-4_0.5.2-1~bpo60+1_i386.deb
dpkg -i libssh-4_0.5.2-1~bpo60+1_i386.deb
wget http://backports.debian.org/debian-backports/pool/main/libs/libssh/libssh-dev_0.5.2-1~bpo60+1_i386.deb
dpkg -i libssh-dev_0.5.2-1~bpo60+1_i386.deb 
 
(Тут естественно, выбрать свою архитектуру) 
 
 # Get static version download - do not use SVN:

wget 
http://sourceforge.net/projects/opalvoip/files/v3.10%20Luyten/Stable%207/ptlib-2.10.7.tar.bz2
tar -jxf ptlib-2.10.7.tar.bz2
mv ptlib-2.10.7 ptlib

export PTLIBDIR=/usr/src/ptlib
cd /usr/src/ptlib
cat version.h
=======
#define MAJOR_VERSION 2
#define MINOR_VERSION 10
#define BUILD_TYPE ReleaseCode
#define BUILD_NUMBER 7
=======
./configure
make optnoshared

cd /usr/src

# Get from CVS Web Snapshot download:

wget http://h323plus.cvs.sourceforge.net/viewvc/h323plus/h323plus/?view=tar -O h323plus.tar.gz
export OPENH323DIR=/usr/src/h323plus
cd h323plus
cat version.h
====
#define MAJOR_VERSION 1
#define MINOR_VERSION 24
#define BUILD_TYPE    ReleaseCode
#define BUILD_NUMBER 1
====

./configure
make optnoshared


cd /usr/src

# Get from CVS Web Snapshot download:

wget http://openh323gk.cvs.sourceforge.net/viewvc/openh323gk/openh323gk/?view=tar -O gnugk.tar.gz
tar -xzf gnugk.tar.gz
cd openh323gk
cat version.h
===
# define GNUGK_MAJOR_VERSION 3
# define GNUGK_MINOR_VERSION 2
# define GNUGK_BUILD_TYPE ReleaseCode
# define GNUGK_BUILD_NUMBER 0
===

./configure --enable-h46018 --with-large-fdset=8192
make optnoshared 
  
Далее пример моего конфига gatekeeper.ini
 
[Gatekeeper::Main]
Fortytwo=42
Name=GnuGk
TimeToLive=600
StatusPort=7000
StatusTraceLevel=2
UseBroadcastListener=0 

[RoutedMode]
GKRouted=1
H245Routed=1
RemoveH245AddressOnTunneling=0
AcceptNeighborsCalls=1
AcceptUnregisteredCalls=1
SupportNATedEndpoints=1
DropCallsByReleaseComplete=1
CallSignalPort=1720
EnableH46018=1
EnableH46017=1
Enable46018=1

[Proxy]
Enable=1
InternalNetwork=10.10.0.0/255.255.0.0,127.0.0.0/8
T120PortRange=40000-40999
RTPPortRange=50000-59999
ProxyForNAT=1

[RasSrv::RRQFeatures]
AliasTypeFilter=terminal;dialeddigits
AliasTypeFilter=gateway;h323id ; Это для того, чтобы могли регистрироваться Поликомы

[RasSrv::ARQFeatures]
ArjReasonRouteCallToGatekeeper=1
;; RemoveTrailingChar=#
RoundRobinGateways=1

 
 
[RoutingPolicy]
default=explicit,internal,catchall


[Routing::CatchAll]
CatchAllAlias=inbound ; Сюда будут попадать все звонки напрямую на IP гейткипера.
 
;Другой вариант прописывания дефолтного маршрута:
;[RoutingPolicy]
;default=explicit,internal

;[Routing::Explicit]

;внутренний IP адрес=адрес перенаправления
;внешний IP адрес = адрес перенаправления
;тут вообще можно менять звонимые IP на все, что угодно
 

[Gatekeeper::Auth]
default=allow

[RasSrv::RRQAuth]
default=confirm

[GkStatus::Auth]
rule=password
username= some_hash; Тут используется утилита addpasswd. В примере она не собирается,
но можно использовать версию из репозитория

Запускается все командой вида

/usr/src/openh323gk/obj_linux_x86_64_s/gnugk -c gatekeeper.ini -o /tmp/gnugk.log -tt &

Telnet на 7000 порту обеспечит просмотр статуса.


 Небольшое дополнение:
В целях облегчения жизни себе и прочим поднял данный вариант на 92.249.69.203. Так что можете смело регистрироваться. Абсолютно бесплатно :)

Monday, September 17, 2012

Предача Clid при переводе звонка

Так получилось, что необходимость это сделать переросла из "было бы неплохо" до "надо сделать".
Начальные условия: телефоны делают transfer не средствами станции, а своими. Тот, кому звонят должен как-то увидеть, что звонок переводится.
Сделано для варианта вызова простым Dial, но с очередью проблем быть не должно, просто другая переменная.

Смысл такой: при ответе вызывается макрос, которые заносит номера пары звонящий/ответивший в базу. При завершении разговора эта запись стирается. При вызове ответившего по второй линии (что и делается при переводе) его номер заменяется на номер звонящего (можно с модификациями, типа Перевожу ХХХ).

При использовании очередей также можно использовать этот метод, но надо доработать  macro-StoreCLID на предмет анализа не DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
[macro-StoreCLID]

exten => s,1,NoOp(Answered is = ${DIALEDPEERNUMBER})
exten => s,n,Set(DB(CLIDT/${DIALEDPEERNUMBER})=${ExternalCLID})


[IncomingCallContext]
...
exten => s,n,Set(__ExternalCLID=${CALLERID(num)})
exten => s,n,Dial(${ALLOP},20,M(StoreCLID))
...
exten => h,1,NoOp(${DB_DELETE(CLIDT/${DIALEDPEERNUMBER})})

[InternalCallsContext]

exten => _X,1,Set(TransferredCLID=${DB_DELETE(CLIDT/${CALLERID(num)})})
exten => _X,n,GotoIf($[ "x${TransferredCLID}" = "x"]?ClearCall)
exten => _X,n,Set(CALLERID(num)=${TransferredCLID})
exten => _X,n(ClearCall),.....



При использовании очередей также можно использовать этот метод, но надо доработать  macro-StoreCLID на предмет анализа не только DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа

...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})

...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})

exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...

Вообще таким образом можно получить номер ответившего пира в экстеншене h, что позволяет более правильно организовать записи.

Wednesday, August 22, 2012

VmWare vCenter Converter + info.owner ошибка

Начал переносить машины на новую виртуалку. Причем версия ESXi перешла с 3.5 на 5.0
При использовании VmWare vCenter Converter регулярно на последнем этапе получаю информацию про некорректный info.owner
Машина: WinXPPro SP3, не в домене
Как решать:
1. Установить Converter в режиме Client-Server
2. Завести отдельного пользователя с админскими правами
3. При запуске подключаться не к local server, а по ip + login/password, соответственно localhost, а логин и пароль - новосозданного пользователя.


Friday, April 27, 2012

Учим PHP + Asterisk = Автообзвон

Ввиду некоего стопора в изучении Астериска приходится копать исключительно вглубь. На этот раз мои кривые руки дошли до php.
А так как не раз спрашивали функцию, и вообще это еще тот холивар, то я решил написать систему автозвонилки да так, чтобы из браузера можно было юзать.
Скажу сразу, это первый проект на php, который я пишу. Поэтому говнокод неизбежен.
Также скажу, что использовать его  в продакшене - убийство. Ибо код не факт, что отлажен, так еще и звонит пока только по очереди, никакой мультилинейности. Может, будет потом.


Также небольшой дисклеймер:
Делалось для себя, как учебный проект, поэтому с документацией и комментами плохо. Спамерство - зло, поэтому особо расписывать принципы не буду, в коде все понятно.

Говнокод

upd: Версия 0.02 Добавил мультилинейность. Теперь можно спамить в 30 потоков.

Tuesday, April 24, 2012

Замена r8169 на r8168 или глюки сетевых карт на Linux

Суть в чем - есть сервак с 2мя гигабитными карточками 
Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02).
Нагрузка - порядка 2000 звонков в сутки, в пиковые часы - 10-15 одновременных звонков (alaw). Вроде и немного, просто на нем же лежит FTP на который складываются записи. Так вот, повадился сервер этот пропадать из сети, причем в логах - все отлично, но просто не пингуется и все. Периодичность - где-то раз в 2-3 дня. Помогает только перезагрузка, но при этом локально на консоль попасть можно.
Проблема оказалась известной, просто как-то на сетевую обратили внимание не сразу, искали другие причины. А проблема в кривости реализации драйвера r8169. Падает он под большими нагрузками. Совет один - заменить его на r8168.


Проверить, какой драйвер используется можно через 


lsmod

А заменять его на Debian 6.0 так:

aptitude install build-essential linux-headers-`uname -r`
 
Потом получить исходный код:
http://download.hetzner.de/drivers/r8168-8.028.00.tar.bz2
http://code.google.com/p/r8168/
 
tar xjf r8168-8.ХХХ.00.tar.bz2
cd r8168-8.ХХХ.00
make all
 
depmod -a
echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
echo "r8168" >> /etc/initramfs-tools/modules
update-initramfs -v -u -k `uname -r`
 
reboot 

Monday, March 12, 2012

Система совместной работы PHProjekt

Возникла проблема учета оборудования, которое находится в ремонте, тесте... Да и вообще чтобы сотрудники были в курсе, что вообще происходит на работе. А то тех. отдел в своем соку, менеджеры в своем, а потом куча криков, что кому и когда обещал. Такая себе корпоративная записная книжка.

До этого пользовались phpcollab, но она как-то с русским не особо. Точнее, дружит, но не utf8. Смотрел еще на некоторые, на тот же Microsoft Project, но нужно было веб-ориентированное.

В общем, выбор пал на PHProjekt. На данный момент стабильная версия 6.0.6, ее и поставил на отдельной виртуалке.

В принципе, все это описано в руководстве и на сайте, но как-то все в разных местах.

Система - Debian Lenny 6.0

Собсно, ставим все необходимое:

# apt-get install mysql-server mysql-client apache2 php5 libapache2-mod-php5 php5 php5-mysql php5-gd php5-ps php5-cgi zlibc

Создаем базу и пользователя для MySQL:

# mysql -u root -p
      mysql> CREATE DATABASE phprojekt;
      mysql> GRANT ALL PRIVILEGES ON phprojekt.* TO 'phprojekt'@'localhost'
      mysql> IDENTIFIED BY 'password' WITH GRANT OPTION;

Создаем каталог для некоторых данных :) Туда сохраняются файлы, кэш:

# chmod -R 0755 /var/www
# mkdir /srv/private/phprojekt
#chmod -R 0770 /srv/private/phprojekt/

Копируем phprojekt в папку и запускаем в браузере настройку.

Теперь к некоторой настройке: настраиваем оповещение через мыло. Я завел специальный ящик на ЖМыле, чтобы было проще фильтры настраивать.

/var/www/configuration.php

mailTransport = 0

smtpAuth     = "login"
smtpUser     = "@gmail.com"
smtpPassword = ""
; You may specify SSL and Port, if the SMTP server of your choice requires them.
smtpSsl      = "tls"
smtpPort     = "587"

front.notificationEnabledByDefault = true


Вот, собственно и все. Дальше чисто вопрос настроек. Я прибил диаграммы Гранта (ну не нужны они мне), оставил по самому минимуму. Зато теперь если кто-то что-то делает, об этом сразу узнают все участвующие в проекте люди.

Система простая, как угол дома. Вопрос в привыкании, да и уведомления очень приятны. Хотя и часть проектов по привычке в ГуглоДоках ведется.

В случае всяческого ремонта - очень полезно. Не звонить в техотдел и не вспоминать, кто, что, когда, и починил ли вообще....