Полезные команды Asterisk (буду дополнять)

1. Переполнение памяти SMS
Если нужно принять SMS-ку, а в консоли (asterisk -rvv) пишет следующее:
ERROR[15627]: at_response.c:1420 at_response_smmemfull: [dongle0] SMS storage is full
то, логично – нам необходимо почистить память для смс-ок.

Есть два вида памяти:
  • память SIM
  • память модема
Для очистки памяти SIM применяем в консоли астериска последовательно команды:
dongle cmd <dongle_name> AT+CPMS=”SM”,”SM”,”SM” 
dongle cmd <dongle_name> AT+CMGD=1,4
Для очистки памяти модема применяем в консоли астериска последовательно команды:
dongle cmd dongle_name AT+CPMS=”ME”,”ME”,”ME” 
dongle cmd dongle_name AT+CMGD=1,4
Консолька нам выдасть что-то типа:

[dongle_name] ‘AT+CMGD=1,4’ Command queued for execute
[dongle_name] Got Response for user’s command:’OK’
[Oct 25 07:41:57] NOTICE[15627]: at_response.c:1714 at_response: [dongle_name] Got Response for user’s command:’OK’
Всё прошло гладко. Теперь можно принимать SMS-ки.
2. Прием PDU SMS
Если при приеме SMS в консоль пишет следующее:
WARNING[15638]: at_response.c:1204 at_response_cmgr: [dongle0] Error parsing incoming message ‘+CMGR: 0,,73 <куча HEX цифр>’ at possition 40: Can’t parse OA 
то это значит, что SMS-ка пришла в PDU формате и модуль chan_dongle её самостоятельно разобрать не может.
Здесь нам поможет сайтик http://twit88.com/home/utility/sms-pdu-encode-decode , где в поле Hexadecimal PDU Message вводим нашу непонятную мессагу и нажимаем Convert.
Или здесь: http://www.smartposition.nl/resources/sms_pdu.html
3. Просмотр инфо о GSM модемах в системе
Проверить статус модема можно командочкой в консоли астериска:
dongle show devices
ID           Group   State RSSI   Mode   Submode   Provider Name   Model      Firmware          IMEI             IMSI             Number
<dongle_name>  0     Free  22     0         0       life:)         E173       21.157.71.00.388  <imei_number>  <imsi_number>  <tel_number>
Т. к. библиотека для работы с модемами chan_dongle в Астериске опен сорцная и довольно сырая, то можем иногда зависает и отказывается принимать входящие звонки – сьрасывает сразу их. Тогда статус модема будет не Free а Dialing, причем звонков в этот момент нет.
4. Просмотр статистики звонков
Проверить есть ли сейчас активные звонки и сколько было обработано звонков можно командой:
core show calls
 
0 active calls
5. Перезапуск GSM модема
Чтобы перезагрузить модем не перезагружая всю астериску, нужно выполнить команду в CLI:
dongle restart now <dongle_name>
[<dongle_name>] Restart scheduled
[Oct 25 07:42:05] NOTICE[15627]: chan_dongle.c:417 do_monitor_phone: [<dongle_name>] stopping by restart request
Update.

6. Прерывание определенных звонков.
Вначале отобразим инфо о текущих звонках:

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
IAX2/IAX_Trunk_to_US (None)               Up      AppDial((Outgoing Line))
SIP/4003-00000a2f    s@macro-dialout-trun Up      Dial(IAX2/IAX_Trunk_to_US/1001
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up      VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up      VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
6 active channels
4 active calls
1553 calls processed

Допустим, мы хотим обрубить звонок пользователю 4003 (выделен). Выполняем команду:

asterisk2*CLI> channel request hangup SIP/4003-00000a2f
Requested Hangup on channel ‘SIP/4003-00000a30’
— Executing [h@macro-dialout-trunk:1] Macro(“SIP/4003-00000a30”, “hangupcall,”) in new stack
— Executing [s@macro-hangupcall:1] GotoIf(“SIP/4003-00000a30”, “1?theend”) in new stack
— Goto (macro-hangupcall,s,3)
— Executing [s@macro-hangupcall:3] ExecIf(“SIP/4003-00000a30”, “0? Set(CDR(recordingfile)=)”) in new stack
— Executing [s@macro-hangupcall:4] Hangup(“SIP/4003-00000a30”, “”) in new stack
== Spawn extension (macro-hangupcall, s, 4) exited non-zero on ‘SIP/4003-00000a30′ in macro hangupcall’
== Spawn extension (macro-dialout-trunk, h, 1) exited non-zero on ‘SIP/4003-00000a30’
— Hungup ‘IAX2/IAX_Trunk_to_US-49’

Теперь можно увидеть, что звонок завершен.

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up       VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up       VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
4 active channels
3 active calls
1554 calls processed

(Источник)
7. Отслеживание активных звонков в Asterisk
В консоли Linux набираем:

watch -n 1 “sudo asterisk -vvvvvrx ‘core show channels’ | grep call”
Информация обновляется каждую секунду.
8. Просмотр структуры базы данных:
database show status
9. Послать USSD-запрос через GSM-модем, работающий с chan_dongle:
dongle ussd dongle0 *111#
10. Показать список каналов, доступных в системе asterisk:
core show channeltypes
Пример вывода:

Проверка доступности портов между двумя Linux-машинами (для Solaris тоже работает)

Бывают ситуации, когда нам необходимо проверить видимость TCP портов одной машины для другой. Казалось бы всё просто – telnet. А если на серверной машине еще не установлено или не запущено приложение, слушающее нужный порт? Я уверен, что существует масса способов, но мне было проще написать 2 маленьких скрипта на Python.

Один скрипт – сервер. Слушает заданный порт и пишет в консоль информацию о клиентах. А второй – клиентский скрипт – стучится по заданному IP в заданный порт и возвращает ответ от сервера (если порт доступен).

Серверный скрипт.

#!/usr/bin/env python
import socket, sys
# Server address and buffer size
TCP_IP = '0.0.0.0'
BUFFER_SIZE = 1024
# Usage string
usage = "server.py PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 2):
print(usage)
sys.exit(0)
TCP_PORT = int(sys.argv[1])
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
# Listen for client connection until Ctrl+C will be pressed
while 1:
c = s.accept()
cli_sock, cli_addr = c
cli_sock.send("Hello, person from %s"%(str(cli_addr)))
cli_sock.close()
print("received data from:", str(cli_addr))


Запуск. Копируем в текстовый файл вышенаписанный код и запускаем:

python server.py <port>

Клиентский скрипт.

#!/usr/bin/env python
import socket, sys
usage = "client.py IP PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 3):
print(usage)
sys.exit(0)
TCP_IP = sys.argv[1]
TCP_PORT = int(sys.argv[2])
BUFFER_SIZE = 1024
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
# Recieving response from the server
data = s.recv(BUFFER_SIZE)
s.close()
print("received data:", data)

Запуск. Копируем в текстовый ф
айл вышенаписанный код и запускаем:

python client.py <server_IP> <server_port>

http://geckich.blogspot.com/

Как сохранить кадр из видео в Linux

В командной строке переходим в нужную папку и выполняем команду:

mplayer -vo png -ss 00:30:00 -frames 1 video-file.mp4

Это даст нам следующее:

-vo png – формат изображения png
-ss 00:25:00 – кадр будет взят из 25й минуты фильма (формат ЧЧ:ММ:СС)
-frames 1 – сохранит только 1 кадр, в текущую директорию.
video-file.mp4 – путь к файлу содержащему видео (кодек видео должен присутствовать в системе)

http://geckich.blogspot.com/

Использование iperf для тестирования мультикаста

Для того, чтобы проверить, приходит ли на наш сервер/рабочую машину/ПК мультикаст, можно использовать и tcpdump:

tcpdump -i bond0.666 udp -nn port 4444

 но он не делает join к мультикаст группе и, в зависимости от настройки сетевого оборудования, вы можете мультикаст и не увидеть.

Лучше использовать утилиту iperf. Она служит для анализа быстродействия сети, и для наших целей отлично подходит.

 
Итак, на Debian устанавливаем просто: 
 
aptitude install iperf
 
А для RHEL дистрибутивов (RedHat, Oracle Linux, CentOS etc.) нужно или добавить репозиторий RepoForge или посмотреть пакет для своей версии ОС тут http://pkgs.repoforge.org/iperf/ и установить, например:
 

yum install http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

или

rpm -Uhv http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

Далее, если адрес мультикаст группы 239.200.1.1, а порт 4444, то делаем команду и смотрим результат:

iperf -s -u -B 239.200.1.1 -i 1 -p 4444

здесь

  • -s -режим сервера, 
  • -u – использовать UDP, 
  • -i 1 – выводить информацию каждую секунду, 
  • -B и -p – адрес нашего мультикаста.
 

Полезные команды для мультикаста:

Посмотреть подписку по группам:

netstat -gn

или

ip maddr show

Дамп по интерфейсу и группе мультикаста:

tcpdump -n -nn -i eth0 host 239.31.82.10
tcpdump -i p1p1.1302 -s0 -vv net 224.0.0.0/4

Иногда необходимо поменять системные перменные:

sysctl -ar '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.em1.rp_filter = 0
net.ipv4.conf.em2.rp_filter = 0
net.ipv4.conf.em3.rp_filter = 0
>net.ipv4.conf.em4.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.p1p1.rp_filter = 0
net.ipv4.conf.p1p1/1302.rp_filter = 0
net.ipv4.conf.p1p1/2202.rp_filter = 0
net.ipv4.conf.p1p2.rp_filter = 0
net.ipv4.conf.p1p2/1402.rp_filter = 0
net.ipv4.conf.p1p2/2202.rp_filter = 0

Изменить значение переменной sysctl:

sysctl -w net.ipv4.conf.em3.rp_filter=0

Включить маршрутизацию пакетов:

sysctl -w net.ipv4.ip_forward=1

Кофиги sysctl могут быть в:

  1. /run/sysctl.d/*.conf
  2. /etc/sysctl.d/*.conf
  3. /usr/local/lib/sysctl.d/*.conf
  4. /usr/lib/sysctl.d/*.conf
  5. /lib/sysctl.d/*.conf
  6. /etc/sysctl.conf

RHEL выключить мультикаст на интерфейсе:

ip link set multicast off dev br0

RHEL включить мультикаст на интерфейсе:

ip link set multicast oт dev br0

Проверить включен ли мультикаст:

ip link show br0
8: br0: mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000

Включить мультикаст на фаерволле (по-умолчанию выключен):

firewall-cmd --zone=zone-name --add-protocol=igmp

Выключить SELinux:

nano /etc/selinux/config

Источники:

  1. https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/
  2. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-enabling_ip_multicast_with_igmp
  3. https://unix.stackexchange.com/questions/299163/app-cannot-receive-multicast-packets-on-centos-7
  4. https://superuser.com/questions/324824/linux-built-in-or-open-source-program-to-join-multicast-group
  5. https://serverfault.com/questions/163244/linux-kernel-not-passing-through-multicast-udp-packets/216568
  6. https://support.citrix.com/article/CTX116493