четверг, 29 августа 2019 г.

Mikrotik R11E - меняем или восстанавливаем IMEI

Мануальчик по замене или восстановлению IMEI на микротиках с модемом R11E. На случай если захотите обмануть жадного оператора или вернуть доблестно удаленный IMEI.


Все делается в консоли

/interface lte at-chat lte1 input="AT*MRD_IMEI=R" - считываем текущий IMEI. Должен выдать строку вида

output: *MRD_IMEI:0,Thu Jan 1 00:00:00 1970,355654091362975
OK

Сохраняем до конца действия.

Идем на https://wpimeigenerator.github.io/ и генерируем IMEI от телефона Nokia Lumia. К примеру получили 351939052122920

Стираем заводской IMEI

/interface lte at-chat lte1 input="AT*MRD_IMEI=D"
output: 1
OK

Теперь главное не отвалиться до следующей команды, иначе SXTR превратится в кирпич! Восстановить можно будет только с ноута

Вписываем новый IMEI ( полученный ранее на сайте):

/interface lte at-chat lte1 input="AT*MRD_IMEI=W,0,01JAN1970,351939055933430"
output: OK

Проверяем что записалось:

/interface lte at-chat lte1 input="AT*MRD_IMEI=R"
output: *MRD_IMEI:0,Thu Jan 1 00:00:00 1970, 351939055933430
OK

В выводе должен быть новый IMEI. Ребутаем SXTR, ждем пока он вернется, проверяем что применился новый imei

/interface lte info lte1 once
pin-status: no password required
functionality: full
registration-status: registered
manufacturer: "MikroTik"
model: "R11e-LTE"
revision: "MikroTik_CP_2.160.000_v008"
current-operator: Tele2
lac: 27920
current-cellid: 7714447
access-technology: 3G HSDPS & HSUPA
session-uptime: 1m
imei: 351939055933430
imsi: 2502074XXXXXXX003
uicc: 8970XXXXXXXX04668
subscriber-number:XXXXXXXXXXXXXXXX
earfcn: 10587 (DL freq 2117.4Mhz)
rssi: -89dBm

В строке IMEI должно быть новое значение

воскресенье, 10 декабря 2017 г.

DX500-MSG1 - SIP-шлюз для АТС DX500

Прямо скажем- я не в восторге от этой поделки. Плата, тупо занимающая один из потоков Е1 станции и конфигурирующаяся посредством скачивания xml-конфига с твоего компа- ну это какой то костыль. Чем это лучше любого шлюза ISDN-SIP - не нашел ни единого аргумента, ну кроме разве что того что плата находится в кассете станции, а не отдельно.
 Окончили пятиминутку ненависти, далее сухая техническая инфа. Плата содержит 3 интерфейса Ethernet (снизу вверх)  и один USB-B, который на самом деле RS-232 и изначально плата конфигурируется через него.
 Ethernet:
1. Менеджмент ( через него можно ломиться телнетом, для Linux-юзеров грабли в виде кодировки iso 8859-1)
2. SIP ( именно он, без RTP)
3. RTP ( только голос)
  Итого при подключении этого мутанта вам понадобятся в VoIP-сети минимум 2 IP- для SIP и для RTP. Менеджмент уж крутите как угодно
  Все три интерфейса имеют раздельные настройки для каждого интерфейса, включая шлюз по умолчанию. Статик маршруты недоступны.
   Первый раз берем проводок из комплекта ( или пилим сами) и цепляемся к плате. Логин по умолчанию admin пасс infotekru.
   Скачиваем конфиг командой get ( скачивается по zmodem,так что его тоже надо настроить). Правим, заливаем обратно командой set. Ребутаем плату командой reset. Если все правильно залили - можете врываться через телнет. Все то же самое, только при скачивании/закачке конфига надо указывать имя файла и запускать у себя на компе FTP ( ну или на том роутере через который вы натитесь на менеджмент интерфейс станции). И тут может быть засада - конфиг сливается именно на тот ip, с которого вы пришли. Потому конфижить лучше из одного сегмента со станцией или же по пути джедая- с нормальной маршрутизацией без богомерзких NAT.
   Далее привожу готовый, проверенный, работоспособный конфиг платы на одну регистрацию с маршрутизацией вызовов на один внутренний номер станции и выплевыванием всех вызовов через один SIP-транк. Проверено на Хуавее Ростелекома и нашем Asterisk. Если что непонятно- смотрим в букварь ( с платой он идет в электронном виде).

<?xml version="1.0" encoding="ISO-8859-1"?>  #стандартный заголовок
<!--MSG-1 configuration version 1.7-->
<Root>
  <IP_config>    #конфиг интерфейсов, думаю все понятно
    <SIP_mask>27</SIP_mask> 

    <SIP_IP>172.16.98.35</SIP_IP>          
<SIP_gateway>172.16.98.33</SIP_gateway>
    <Mng_mask>28</Mng_mask>
    <Mng_IP>10.107.188.75</Mng_IP>
    <RTP_mask>27</RTP_mask>
    <RTP_IP>172.16.98.36</RTP_IP>
    <RTP_gateway>172.16.98.33</RTP_gateway>
  </IP_config>
  <SIP_config> #транспорт для SIP
    <Transport_config>
      <Transport_ID>0</Transport_ID> #порядковый номер
      <Type>0</Type>
#0 - UDP, 1 - TCP 
       <Port>5060</Port>
      <QoS>0</QoS>
    </Transport_config>
    <SIP_route>  #собственно описание SIP-транка
      <SIP_ID>0</SIP_ID>  #просто номер
      <TransportID>0</TransportID> #какой транспорт юзаем, см. выше
      <MiniCom_services>0</MiniCom_services>  #если другая сторона не миником- ставим 0
      <RegEnable>1</RegEnable> #регаться или нет на сервере
      <SIP_proxy>   #описание прокси
        <Proxy_name>sip:10.10.10.10</Proxy_name> #пишем в виде sip:IP_СЕРВЕРА
        <Credential>   #тут у нас логин и пароль
          <Type>0</Type> #всегда ноль
          <Realm/>               #не юзаем
          <Scheme>Digest</Scheme>  #всегда Digest
          <Username>SIPUSER</Username>
          <Password>SIPPASS</Password>
        </Credential>
      </SIP_proxy>
      <RegURI>sip:10.10.10.10</RegURI> #пишем sip:IP_СЕРВЕРА
      <LocalName>sip:SIPUSER@10.10.10.10</LocalName> #пишем sip_логин:IP_СЕРВЕРА
    </SIP_route>
    <Redirect>0</Redirect>    #всегда ноль
  </SIP_config>
  <ISDN_MG_config>  #тут ничего не трогаем- все отлично и так
    <ISDN_ID>0</ISDN_ID>
    <ISDN_interface>
      <Side>0</Side>
      <Codec>0</Codec>
    </ISDN_interface>
    <FALC_config>
      <Synch>1</Synch>
      <FrameCRC4>0</FrameCRC4>
    </FALC_config>
    <MG_config>
      <Amount_of_channels>30</Amount_of_channels>
      <Initial_port>4000</Initial_port>
      <QoS>0</QoS>
      <BAND_limit>3000</BAND_limit>
    </MG_config>
  </ISDN_MG_config>
  <Trunk_config>
    <Trunk>   #описание куда гнать голос
      <Trunk_ID>0</Trunk_ID>  #просто номер по порядку
      <IP_address>10.10.10.10</IP_address> #IP SIP-шлюза
      <Amount_of_channels>30</Amount_of_channels>
      <Port_min>4000</Port_min>
      <Port_max>4059</Port_max>
      <RTP_Timeout>90</RTP_Timeout>
    </Trunk>
  </Trunk_config>
  <Profile_config>  #тоже не трогаем- тут все в порядке. можно разве что кодеки переиграть
    <Profile>
      <Profile_ID>0</Profile_ID>
      <CNG_support>0</CNG_support>
      <LEC_support>1</LEC_support>
      <DTMF_method>1</DTMF_method>
      <Fax_codec>1</Fax_codec>
      <Codec_priority_PCMU>0</Codec_priority_PCMU>
      <Codec_priority_PCMA>70</Codec_priority_PCMA>
      <Codec_priority_G729>0</Codec_priority_G729>
      <BAND_limit>3000</BAND_limit>
    </Profile>
  </Profile_config>
  <Route_config> #маршрутизация вызовов
    <Rule>
      <Rule_ID>0</Rule_ID> #номер по порядку
      <NumberPlan>0</NumberPlan>  #тип набора- открытый или закрытый. юзаем закрытый
      <Comparison_type>0</Comparison_type> #0 - точное совпадение, 1 - шаблон.
      <Direction>1</Direction> #1 - из АТС в SIP, 0 - наоборот
      <Number/>  #поле пустое- значит принимаем все без разбору
      <ISDNID>0</ISDNID> # настройки ISDN
      <SIPID>0</SIPID>  #настройки SIP
      <Number_length>5</Number_length> #не менее скольки цифр должно быть для правила
      <AddressFrom>20.20.20.20</AddressFrom> # что пишем в SIP-заголовке From:
      <AddressTo>172.16.100.21</AddressTo> # что пишем в SIP-заголовке To:
      <ProfileID>0</ProfileID> 
      <TrunkID>255</TrunkID>
#255 -пофиг из какого транка , или же указываем номер      
<DestKSH100>1</DestKSH100>  если другая сторона не DX500- то 1.    
    <Rule_name>to IP-TA</Rule_name>
    </Rule>
    <Rule>
      <Rule_ID>1</Rule_ID>
      <NumberPlan>0</NumberPlan>
      <Comparison_type>1</Comparison_type>
      <Direction>0</Direction>
      <Number>55555</Number> #у нас оператор вызывает 55555
      <ISDNID>0</ISDNID>
      <SIPID>0</SIPID>
      <Number_length>5</Number_length> #накапливаем 5 цифр
      <Cut_before>5</Cut_before> #удаляем 5 цифр,
      <Prefix>201</Prefix>  #вписываем 201 и отправляем в АТС
      <AddressFrom/> #пусто при вызове из sip в АТС
      <AddressTo/>
      <ProfileID>0</ProfileID>
      <TrunkID>255</TrunkID> 
      <DestKSH100>1</DestKSH100> # если другая сторона не DX500- то 1.
      <Rule_name>to DX</Rule_name> #пометка
    </Rule>
  </Route_config>
  <Filter_config>  #файрвол, мы на него забили.
    <FWgenEnable>0</FWgenEnable>
    <FWrtpEnable>0</FWrtpEnable>
    <MAC_filter>
      <!--<MAC_node>-->
      <!--  <MAC></MAC>-->
      <!--</MAC_node>-->
    </MAC_filter>
    <IP_filter>
      <IP_node>
        <IP>10.10.10.10</IP>
        <Protocol>17</Protocol>
        <Port_min>20</Port_min>
        <Port_max>65535</Port_max>
      </IP_node>
      <IP_node>
        <IP>10.0.0.5</IP>
        <Protocol>6</Protocol>
        <Port_min>20</Port_min>
        <Port_max>65535</Port_max>
      </IP_node>
    </IP_filter>
  </Filter_config>
  <VAS_config> #на это тоже забили, это уже рюшечки из ДВО
    <SIPID>0</SIPID>
    <LocalNTU>1</LocalNTU>
    <!--<Host>-->
    <!--  <Host_ID>0</Host_ID>-->
    <!--  <URI></URI>-->
    <!--  <IP></IP>-->
    <!--  <NTU_min>1</NTU_min>-->
    <!--  <NTU_max>1</NTU_max>-->
    <!--  <Termw>0</Termw>-->
    <!--  <Obst>0</Obst>-->
    <!--</Host>-->
  </VAS_config>
</Root>

P.S. Чуть не забыл- на пакеты OPTIONS плата не отвечает, так что QUALIFY в Asterisk обязательно выключаем.

среда, 25 октября 2017 г.

LiquidSoap - швейцарский нож для онлайн-радио

LiquidSoap - это по своей сути не программа, а язык программирования для создания собственных медиапотоков.Умеет все и немножко еще- получать медиа, конвертировать, записывать, проигрывать, отдавать поток и много чего еще. Поскольку использование "Жидкого Мыла"планируется обширное- буду копипастить сюда полезные рецепты.Если кто-то обидится на такую фривольность- не вопрос, пишите в комментах- ссылку обязательно оставлю.

Итак.
1. Записываем эфир с созданием нового файла каждый час

#! /usr/bin/liquidsoap
#строка выше - ша-бэнг. думаю. понятно зачем.если хотите запускать 
#  в фоне- добавьте ключик -d
set("log.file",true)
 #узнаем pid чтобы мониторить пациента
set("init.daemon.pidfile.path","./record.pid")
#и логгируем его
set("log.file.path","/home/asket/mixer.log")"
#подключаем входящий поток для записи
#не пытайтесь слушать- адрес взят от балды.здесь должен быть ваш источник
instream = input.http("http://stream.dcast.ru:8000/heavy")

#и собственно запись. функция mksafe  делает наш источник #100%надежным посредством добавления тишины если он 
#недоступен, иначе запись упадет
output.file(
    %mp3(stereo=true,bitrate=192,samplerate=44100),
    "%Y-%m-%d-%H_%M_%S.mp3",
    reopen_when={0m0s},
    mksafe(instream)
)

2. Захватываем поток AAC
  Сам Liquid этого не умеет, поэтому воспользуемся помощью зала в виде ffmpeg
badgers = input.external("while true; do ffmpeg -i rtsp://aacstreamingserver.com/stream_aac64 -f s16le -acodec pcm_s16le -af volume=+5 -; done")

понедельник, 16 октября 2017 г.

Debian 9 - возвращаем нормальные имена интерфейсам

В Debian 9 много изменений относительно Jessie, и не все лично меня устраивают. К примеру. идиотские имена интерфейсов. И потому я возвращаю прежние человеческие ethX.
 Все просто -
 открываем  /etc/default/grub, ищем строку

GRUB_CMDLINE_LINUX=""
 
и меняем ее на 
 
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
 
После этого применяем изменения -
 
grub-mkconfig -o /boot/grub/grub.cfg.

Все это от root, естественно. 
В /etc/network/interfaces не забываем переименовать интерфейсы в 
соответствии с тем,какими они станут после применения изменений.
Ребутаем. Все.

четверг, 20 августа 2015 г.

Отсылаем письма из консоли через GMail

   Если есть нужда отправлять почтовые уведомления из консоли, и желательно не попадать при этом в спам - можно использовать GMail.
   Все просто. Создаем в корневой папке пользователя файлик .mailrc следующего содержания
account gmail {
    set record=+Sent
    set nss-config-dir=/etc/pki/nssdb
    set smtp-use-starttls
    set smtp=smtp://smtp.gmail.com:587
    set smtp-auth=login
    set smtp-auth-user=ACCOUNT@gmail.com
    set smtp-auth-password="PASSWORD"
    set from="Your Name <ACCOUNT@gmail.com>"
     set ssl-verify=ignore
}

Вместо подчеркнутых значений вставляем свои. Может отличаться путь к nss, найти его можно командой
find / -name nssdb

 Далее любым удобным консольным клиентом отсылаем письмо, пример с mailx -
echo "Проверка отсылки почты" | mailx   -A gmail   -s "Проверка"  recipient@domain.com

где "-A gmail" указание записи в .mailrc , ключ -s  - заголовок письма, recipient@domain.com - ваш получатель.

воскресенье, 16 августа 2015 г.

Realtime config SIP для Asterisk 13

 Я понимаю, что SIP устарел в пользу PJSIP, но задача была именно SIP в реалтайме.
 В Астериске должны присутствовать модули res_odbc.so и res_config_odbc, в системе должны быть unixODBC и mysql-connector-odbc ( или другой, если используется PG или еще что-то другое). 
 Итого - заходим в консоль MySQL, создаем базу для asterisk:

create database asterisk;
grant all privileges on asterisk.* to asterisk@localhost identified by 'PASSWORD';

Заливаем туда таблицу для SIP-

CREATE TABLE `sip_peers` (
`id` int(11) NOT NULL auto_increment,
`accountcode` varchar(20) default NULL,
`disallow` varchar(100) default 'all',
`allow` varchar(100) default 'g729;ilbc;gsm;ulaw;alaw',
`allowoverlap` enum('yes','no') default 'yes',
`allowsubscribe` enum('yes','no') default 'yes',
`allowtransfer` varchar(3) default NULL,
`amaflags` varchar(13) default NULL,
`autoframing` varchar(3) default NULL,
`auth` varchar(40) default NULL,
`buggymwi` enum('yes','no') default 'no',
`callgroup` varchar(10) default NULL,
`callerid` varchar(80) default NULL,
`cid_number` varchar(40) default NULL,
`fullname` varchar(40) default NULL,
`call-limit` int(8) default 0,
`callingpres` varchar(80) default NULL,
`canreinvite` char(6) default 'yes',
`context` varchar(80) default NULL,
`callbackextension` varchar(80) default NULL,
`defaultip` varchar(15) default NULL,
`dtmfmode` varchar(7) default NULL,
`fromuser` varchar(80) default NULL,
`fromdomain` varchar(80) default NULL,
`fullcontact` varchar(80) default NULL,
`g726nonstandard` enum('yes','no') default 'no',
`host` varchar(31) NOT NULL default '',
`insecure` varchar(20) default NULL,
`ipaddr` varchar(15) NOT NULL default '',
`language` char(2) default NULL,
`lastms` varchar(20) default NULL,
`mailbox` varchar(50) default NULL,
`maxcallbitrate` int(8) default 384,
`mohsuggest` varchar(80) default NULL,
`md5secret` varchar(80) default NULL,
`musiconhold` varchar(100) default NULL,
`name` varchar(80) NOT NULL default '',
`nat` varchar(5) NOT NULL default 'no',
`outboundproxy` varchar(80) default NULL,
`deny` varchar(95) default NULL,
`permit` varchar(95) default NULL,
`pickupgroup` varchar(10) default NULL,
`port` varchar(5) NOT NULL default '',
`progressinband` enum('yes','no','never') default 'no',
`promiscredir` enum('yes','no') default 'no',
`qualify` char(3) default NULL,
`regexten` varchar(80) NOT NULL default '',
`regseconds` int(11) NOT NULL default '0',
`rfc2833compensate` enum('yes','no') default 'no',
`rtptimeout` char(3) default NULL,
`rtpholdtimeout` char(3) default NULL,
`secret` varchar(80) default NULL,
`sendrpid` enum('yes','no') default 'yes',
`setvar` varchar(100) NOT NULL default '',
`subscribecontext` varchar(80) default NULL,
`subscribemwi` varchar(3) default NULL,
`t38pt_udptl` enum('yes','no') default 'no',
`trustrpid` enum('yes','no') default 'no',
`type` varchar(6) NOT NULL default 'friend',
`useclientcode` enum('yes','no') default 'no',
`username` varchar(80) NOT NULL default '',
`usereqphone` varchar(3) NOT NULL default 'no',
`videosupport` enum('yes','no') default 'yes',
`vmexten` varchar(80) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `name_2` (`name`)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;


Выходим из консоли MySQL. Открываем /etc/odbcinst.ini и проверяем чтобы драйвер MySQL был включен. В моем случае в CentOS 7 это выглядит так-

[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1


Открываем /etc/odbc.ini и описываем в нем подключение к базе

[asterisk]
Driver=MySQL
SERVER=localhost
PORT=3306
DATABASE=asterisk
USER=asterisk
PASSWORD= PASSWORD


Далее, открываем /etc/asterisk/res_odbc.conf и опишем в нем подключение к ODBC ( в данном случае dsn- это название секции в odbc.ini, username и password прежние )

[sql]
enabled => yes
dsn => asterisk
username => asterisk
password => PASSWORD
pooling => no
pre-connect => yes

Следущим шагом настроим подключение конфигурации к ODBC. Открываем /etc/asterisk/extconfig.conf (  если у вас в системе валяется res_config_odbc.conf - удаляйте, он устарел).

[settings]
sipusers => odbc,sql,sip_peers
sippeers => odbc,sql,sip_peers


Здесь первое значение это драйвер ( mysql или odbc), второе- название подключения в res_odbc.conf, третье- название таблицы в базе.

Теперь осталось включить конфигурацию. Откроем /etc/asterisk.modules.conf. Ищем строчки ( если их нет - пишем )
preload = res_odbc.so
preload = res_config_odbc.so

Заходим в консоль Asterisk и передергиваем модули
module unload res_config_odbc.so
module unload res_odbc.so
module load res_odbc.so
module load res_config_odbc.so

Если не ругнулось - проверяем

CLI> odbc show all

ODBC DSN Settings
-----------------

  Name:   sql
  DSN:    asterisk
    Last connection attempt: 1969-12-31 18:00:00
  Pooled: No
  Connected: Yes


Последняя строчка говорит что все нормально, есть подключение.
На всякий случай передергиваем SIP

sip reload

Если не ругнулось на неправильно настроенный realtime- значит все нормально.

После этого  можно заводить SIP-учетки в базе, к примеру так ( в консоли MySQL)-

INSERT INTO asterisk.sip_peers ( NAME, username, secret, context, HOST, nat, qualify, TYPE) VALUES ('1001', '1001', 'USERPASSWORD', 'USERCONTEXT', 'dynamic', 'yes', 'no', 'friend');

Реалтайм-абоненты в sip show peers не отображаются. Единственный известный мне способ вытащить их на свет это внести в sip.conf в секцию general строчку

rtcachefriends=yes

После первого подключения телефона он появится в списке SIP-пиров.