среда, 25 января 2017 г.

Установка клиента netbackup на linux

После выполнения install.sh скрипта, необходимо:
  1. Открыть порты в брандмауэре.
    Например для centos 6:
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 1556 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 13724 -j ACCEPT
  2. Добавить медиа сервера.
    Если у NetBackup более одного сервера (например мастер + медиа), то в файле /usr/openv/netbackup/bp.conf все они должны быть указаны. Например так:

    SERVER = master.domain.ru
    SERVER = media1.domain.ru
    SERVER = media2.domain.ru
    CLIENT_NAME = client.domain.ru
    CONNECT_OPTIONS = localhost 1 0 2
  3. Если предполагается архивирование/восстановление oracle баз данных, нужно запустить /usr/openv/netbackup/bin/oracle_link (см. article.TECH87072 )

понедельник, 14 ноября 2016 г.

Asterisk cdr viewer + postgresql

config.inc.php
...
$db_type = 'pgsql';
...

Для базы в которой находится таблица cdr:

CREATE OR REPLACE FUNCTION public.unix_timestamp (
  date timestamptz
)
RETURNS double precision AS
$body$
SELECT  date_part('epoch', date)
$body$
LANGUAGE 'sql';

среда, 19 октября 2016 г.

Очередной nway call в asterisk через confbridge

Написано для  Asterisk 13.11.0.

confbridge.conf
...
[nway_menu]
type=menu
1=dialplan_exec(nway-invite,0,1)

features.conf
...
[applicationmap]
nway =>*0,self,AGI(nway.pl),default

extensions.conf
...
[from-internal]
exten = _1XX,1,Set(CHANNEL(language)=ru)
 same = n,Set(__DYNAMIC_FEATURES=nway)
...
[nway-invite]
exten = 0,1,NoOp()
 same = n,Read(DEST,,3)
 same = n,GoSub(subDialString,start,1,(${DEST}))
 same = n,Originate(${GOSUB_RETVAL},exten,dynamic-nway,${CONFNO},1)
exten = i,1,SoftHangup(${BRIDGEPEER})
exten = t,1,SoftHangup(${BRIDGEPEER})

[dynamic-nway]
exten = _X.,1,Answer()
 same = n,Set(__CONFNO=${EXTEN})
 same = n,ConfBridge(${EXTEN},,,nway_menu)

/var/lib/asterisk/agi-bin/nway.pl
#!/usr/bin/perl
use strict;
use warnings;

use Asterisk::AGI;
use Asterisk::AMI;

my $agi = Asterisk::AGI->new();
my $channel = $agi->get_variable('CHANNEL');
my $bridgepeer = $agi->get_variable('BRIDGEPEER');
my ($confno) = split /\./,$agi->get_variable('UNIQUEID');

my $ami = Asterisk::AMI->new(
    PeerAddr => '127.0.0.1',
    PeerPort => '5038',
    Username => 'script',
    Secret => '123456');

my $action = $ami->action({
    Action => 'Redirect',
    Channel => $channel,
    Context => 'dynamic-nway',
    Exten => $confno,
    Priority => 1,
    ExtraChannel => $bridgepeer,
    ExtraContext => 'dynamic-nway',
    ExtraExten => $confno,
    ExtraPriority => 1
     });

$agi->hangup();
exit();

Примечания:
  1. Подпрограмма subDialString создает строку подключения для разных каналов по заданному номеру. Например для unistim USTM/100@100, для sip SIP/101 и т.д. Если все аппараты используют один протокол, строка GoSub не нужна, следующую строку можно изменить на, например, same = n,Originate(SIP/${DEST},exten,dynamic-nway,${CONFNO},1).
  2. В строчке exten = _1XX шаблон должен быть конечно Ваш, как и длина номера в same = n,Read(DEST,,3)
  3. В качестве номер конференции используется часть UNIQUEID для того, чтобы начавший конференцию, мог выйти из нее и начать новую.

Порядок работы:
  1. Если в ходе разговора есть необходимость подключить третьего, нажать *0 (features.conf) при этом разговор преобразуется в конференцию (можеть делать и caller, и callee)
  2. Для подключения дополнительного собеседника нажать 1 (confbridge.conf) и номер (может делать любой участвующий в конференции)
К сожалению, другие способы (более простые?): channelredirect(), agi из macro и прочее у меня не работает. Только agi (ami) из features.conf.

пятница, 9 сентября 2016 г.

При попытке настроить asterisk realtime в связке с postgresql 9.2.13 (через odbc), после создания таблиц (либо через alembic, либо используя /usr/src/asterisk/contrib/realtime/postgresql/postgresql_config.sql) при попытке зарегестрировать sip пользователя (таблица sippeers) получал ошибки несоотвествия типов полей lastms, regseconds... Со стороны сервера это выглядит так: ОШИБКА:  колонка "lastms" имеет тип integer, а выражение - character (символ 136). Т.е регистрация аппарата проходит, но поля ipaddr, port, regseconds, fullcontact и т.д. не заполняются.
Для pjsip пользователей подобные ошибки в таблице ps_contacts. Аппарат так же регистрируется, но данные в ps_contacts не добавляются.
Удаление полей порождающих ошибки и их создание с типом char помогают для таблицы sippeers, но после изменений в ps_contacts asterisk стал перезагружатся с периодом около минуты.
Помогло явное создание неявного преобразования типов в БД :).
Для sippeers достаточно:
create cast (character as integer) with inout as implicit;
Для ps_contacts необходимо добавить:
create cast (character as double precision) with inout as implicit;
create cast (character as bigint) with inout as implicit;
create cast (character as yesno_values) with inout as implicit;


вторник, 21 апреля 2015 г.

Заполнение поля Media Management Settings в Enterprise Manager для архивирования Oracle через NetBackup

Если для настройки архивирования БД Oracle на ленту\с использованием Media Manager (NetBackup) используется Enterprise Manager, то поле Media Management Vendor Library Parameters (Availability - Backup Settings) следует заполнить следующим образом:

SBT_LIBRARY=/usr/openv/netbackup/bin/libobk.so64, ENV=(NB_ORA_SERV=master.domain.ru, NB_ORA_CLIENT=client.domain.ru)

Понятно, что master.domain.ru - мастер сервер вашей инсталяции NetBackup, client.domain.ru - сервер на которой установлен БД Oracle.

Если клиент NetBackup уже связан с oracle ( запущен oracle_link из /usr/openv/netbackup/bin/ ) и создана политика (обязательно тип Oracle - Application Backup - указан клиент), то после нажатия кнопки Test Tape Backup не должно выдаваться сообщений об ошибках, а в консоли управления NetBackup можно будет увидеть два выполненных задания с этого клиента - backup и restore.

четверг, 19 февраля 2015 г.

Ошибка "The requested lookup key was not found in any active activation context"

MS SQL 2000 (32 бит) на Win 2003 r2 (64 бит) + symantec netbackup (у меня - 7.5.0.6)
Решение есть по ссылке http://blogs.msdn.com/b/psssql/archive/2009/02/26/you-encounter-error-message-the-system-cannot-find-the-file-specified-when-attempting-to-perform-backups-using-sqlvdi.aspx.
 У меня:
  •  x86 библиотека  - версия 2000.85.1054.0, размер 119 296 байт
  • x64 библиотека - версия 2000.85.1054.0, размер 156 160 байт
 С x86 библиотекой после установки SP4 ( версия 2000.80.2039.0, размер 43 008 байт ) не заработало.
Перезагрузка не нужна.

Предварительное создание файлов БД при восстановлении ms sql 2000

При тестовых восстановлениях БД MS SQL 2000 через symantec netbackup получил несколько ошибок связанных с таймаутами:
  1. Created VDI object for SQL Server instance "instance". Connection timeout is "300" seconds.
  2. Client read timeout.
Обе ошибки были в принципе излечимы:
  1.  Установить VDITIMEOUTSECONDS в скрипте восстановления
  2. Установить нужный timeout в свойствах мастер сервера symantec netbackup.
Однако они не решали еще одной проблемы - восстановление идет очень долго. Причем большую часть времени занимает не запись данных из архива, а создание файлов БД и заполнение их нулями (zero initialization). Поскольку в sql 2000 нет возможности instant file initialization, то создание "пустышки" для 300 ГБт базы данных становилось оченььььь долгим делом. Ситуацию также усугубляло то, что разбалованный Windows 2008 R2, я в созданной виртуальной машине Windows 2003 не выровнял диски.
Существует однако простая замена instant file initialization на "педальном" приводе:
  1. Создаем пустые файлы для данных и логов нужного размера. Можно посмотреть текущие и сделать несколько больше (перед копированием данных они будут подрезаны в нужный размер). Я использовал для этого  fsutil file createnew filename length. Например: fsutil file createnew XXX_data.MDF 300000000000
  2. Запускаем задание восстановления с перемещением. Для symantec netbackup скрипт может выглядеть как то так
OPERATION RESTORE
OBJECTTYPE DATABASE
RESTORETYPE MOVE
DATABASE "XXX"
MOVE  "XXX_Data"
TO  "d:\DATA\XXX_data.MDF"
MOVE  "XXX_Log"
TO  "d:\DATA\XXX_Log.LDF"
#
# The following image is type: Full
NBIMAGE "srv-sql01.MSSQL7.SRV-SQL01.db.XXX.~.7.001of001.20150217180955..C"
SQLHOST "srv-stend12"
NBSERVER "SRV-BCK01"
BROWSECLIENT "srv-sql01"
MAXTRANSFERSIZE 6
BLOCKSIZE 7
RESTOREOPTION REPLACE
RECOVEREDSTATE NOTRECOVERED
NUMBUFS 2
ENDOPER TRUE

OPERATION RESTORE
OBJECTTYPE DATABASE
DUMPOPTION INCREMENTAL
RESTORETYPE MOVE
DATABASE "XXX"
# The following image is type: Full database differential
NBIMAGE "srv-sql01.MSSQL7.SRV-SQL01.inc.XXX.~.7.001of001.20150218180207..C"
SQLHOST "srv-stend12"
NBSERVER "SRV-BCK01"
BROWSECLIENT "srv-sql01"
MAXTRANSFERSIZE 6
BLOCKSIZE 7
RESTOREOPTION REPLACE
RECOVEREDSTATE RECOVERED
NUMBUFS 2
ENDOPER TRUE

 Где XXX_data.MDF, XXX_Log.LDF - созданные ранее файлы.

Судя по perfmon файл лога обнуляется, а основной файл нет. В моем случае время начала заливки данных сократилась с нескольких часов до пары минут.