Использование встроенной базы данных AstDB в Asterisk

AstDB является частью Asterisk  и устанавливается вместе с ним. Это простая БД (Barkley DB версии 1), без всяких заморочек. Если нужно подключить к Asterisk БД MySQL или PosrgreSQL – это тоже можно сделать, но для несложных задач вполне хватит и AstDB.

Предположим, у нас уже настроен GSM-модем в Asterisk – например, как я описывал здесь для модемов Huawei – и мы хотим звонить на мобильные номера наших абонентов (к примеру, в не рабочее время, когда они находятся вне доступа к SIP телефонам).

Хранится информация в БД с помощью трех понятий – семейство, ключ и значение. Семейство – это аналог таблицы, в которой хранятся пары ключ-значение.

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

exten => s,n,Set(DB(mobile/1112)=0991111111)

Здесь мы создаем (или модифицируем, если таковой ключ уже есть) ключ 1112 – SIP-номер для нашего абонента, в моем примере – в семейтве mobile. И присваиваем ему номер мобильного для этого абонента.

Но для большого количества абонентов делать такое не есть хорошо, тем более что БД хранит данные и после перезапуска Asterisk  и после перезагрузки сервера. Потому, целесообразнее – для моего примера – заранее заполнить БД данными из командной строки Asterisk.

Добавление/модификация значений:

database put <семейство> <ключ> <значение>
Пример: database put mobile 1112 0991111111

Для просмотра информации имеем команду:

database get <семейство> <ключ>

а также для просмотра всей БД:

database show

В плане набора (dialplan) пишем следующее:


; Вызываем макрос для дозвона по GSM, передавая ему SIP номер абонента как аргумент
exten => _1XXX,n,Macro(dial-mobile,${EXTEN})
….
[macro-dial-mobile]
; Вытаскиваем из БД значение номера для нужного абонента
; и помещаем в его переменную MobNumber
exten => 1,1(mobile),Set(MobNumber=${DB(mobile/${ARG1})})
; Звоним через GSM-модем
exten => 1,n,Dial(Dongle/dongle0/${MobNumber},100,dmghHtT)

Вот в общем-то и всё. 
http://geckich.blogspot.com/

Как перенаправить порт в Windows встроенными средствами

Перенаправление порта (port forwarding, port mapping) может понадобиться, когда у машины PC1 есть доступ в сеть 1 и сеть 2, а у машины PC1 – только в сеть 1, а ей нужно подключиться к какому-то сервису на машине PC3 в сети 2. В таком случае схема будет примерно такая:

В данном примере необходимо на PC2 открыть CMD с правами администратора и выполнить команду:

netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.1.3 connectport=22 connectaddress=192.168.2.5

Чтобы удалить форвардинг – команда:

netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=192.168.1.3

Ссылки:

http://technet.microsoft.com/en-us/library/cc731068(v=ws.10).aspx#BKMK_1

http://geckich.blogspot.com/

Как получить размер свободного дискового пространства точки монтирования в Python (Linux)

Чтобы получить размер свободного пространства для точки монтирования (или размер свободное место на разделе, где находится указанная папка), необходимо выполнить следующее:

import os
st = os.statvfs("/home")
du = st.f_bsize * st.f_bavail
print(du)

Получим значение в байтах, чтобы получить значение, например, в Мб:

du = st.f_bsize * st.f_bavail / 1024 / 1024
http://geckich.blogspot.com/

Отправка почты (e-mail) из консоли Linux

Иногда необходимо отправить письмо из консоли/скрипта в Linux. Сделать это достаточно просто:

echo “Тело письма” | mail -s “Тема письма” recipient@example.com

или, чтобы вставить содержимое тектового файла как тело письма:

mail -s “Тема письма” recipient@example.com < /var/log/some.log

Параметры команды:

-s subject – тема письма
-c email-address 
– адрес для копии
-b email-address – 
адрес для невидимой копии

http://geckich.blogspot.com/

Linux Out-of-Memory Killer (OOM)

OOM Killer – это компонент ядра Linux, призванный решать проблему недостатка памяти. Известно, что виртуальной памяти может быть бесконечно много (в пределах адресации), а вот физической – вполне конечное число. Ядро выделяет память процессам “с запасом” в сумме превышающую физическую память системы. В основном, всё разруливается нормально (вся выделенная память одновременно редко требуется), но бывает ситуация когда становится нужно памяти больше, чем ее физически есть. И системе тогда нужно завершить какой-то процесс, чтобы продолжить работу. Вот этим и занимается OOM Killer.

Текущая реализация OOM Killer в Linux стремится выбрать наименее важный процесс. Он выбирается среди всех процессов, кроме init и kernel threads, на основе подсчета для всех процессов очков и тот, что набрал больше всех очков – убивается. Алгоритм анализа достаточно сложен и я не буду его приводить здесь.
Бывает, необходимо защитить определенный, важные процессы от “убиения”. В конце подсчета очков для процесса, число возводится в степень приоритета, которая может принимать значения -15…15 или -17. “-17” означает, что процесс не будет принудительно завершен вообще. Значение приоритета хранится в файлике /proc/$PID/oom_adj. Т. е. этот файлик создается для каждого процесса и уничтожается с его завершением.

Соответственно, дабы защитить процесс от “убиения”, необходимо узнать PID этого процесса и записать в его файл oom_adj значение -17. Например, для процесса sshd, можно использовать команду:

pgrep -f “/usr/sbin/sshd” | while read PID; do echo -17 > /proc/$PID/oom_adj; done

Эта команда для всех процессов демона sshd назначает приоритет. Но нужно быть осторожным с приоритетами – система может вести себя непредсказуемо, если защищенный таким образом процесс займет всю память (скорее всего закончится это т. н. kernel panic). Поэтому рекомендуют ставить минимальный приоритет “-15”.
Приведенную выше команду нужно выполнять после запуска процесса, т. е. или в конце стартового скрипта или по cron-у.
Ссылки на более детальную информацию:
http://geckich.blogspot.com/

Ошибка 0x0000005 при запуске практически всех приложений в Windows 7 x64

Бывает, после установки обновлений и последующей перезагрузки появляется ошибка 0x0000005 при запуске практически всех приложений в Windows 7 x64

Причина кроется в обновлениях KB2859537 и KB2872339 (или одном из них) на некоторых системах  Windows 7 x64.

Но апплет Центра обновлений запустить нельзя, т. к. все 32-битные приложения не запускаются в системе. Чтобы удалить обновления, запускаем командную строку с правами Администратора и удалем обновления командами:

wusa.exe /uninstall /kb:2859537
wusa.exe /uninstall /kb:2872339

Перезагружаемся – и система должна работать как раньше.

Кстати, не забываем скрыть эти обновления после перезагрузки дабы потом случайно опять их не поставить (в Центре обновления Windows правой кнопкой на обновлении – Скрыть обновление)

http://geckich.blogspot.com/

Как убрать панель рекламы в KMPlayer 3.7

Неприятное нововведение ожидает поклонников этого очень достойного с технической точки зрения медиа плеера для ОС Windows в версии 3.7. Это – панель с рекламой в правой части окна плеера. Разработчикам надо монетизировать свой продукт, который является бесплатным – безусловно… Но не совсем хороший способ, как по-моему:

Но есть способ убрать эту новую фишку с рекламой.

Запускаем от имени Администратора (Run as administrator) ваш любимый текстовый редактор (Notepad++, например), открываем файл C:WindowsSystem32driversetchosts и дописываем в конец следующее:

127.0.0.1 player.kmpmedia.net

Рекламная панель пропадает.

Update.

Для KMPlayer версии 3.8+ необходимо вместо добавления в hosts добавить адрес сайта в Опасные в Свойствах обозревателя:

Панель управления – Все элементы панели управления – Свойства браузера – Безопасность – Опасные сайты – Сайты – Добавить в зону следующий узел – вставить player.kmpmedia.net – Добавить – Закрыть – ОК

http://geckich.blogspot.com/

Полезные Bash Shell команды и однострочные скрипты

Т. к. количество всяких полезный команд и скриптиков для консоли Linux неуклонно растет и всех их не упомнишь, буду записывать сюда что-нибудь эдакое полезное.
Статья будет дополняться.
1. Сделать что-либо со всеми файлами в папке, например, распаковать все zip архивы в текущей папке:
for f in *.zip ; do unzip $f ; done
2. То же самое, только с файлами из поддиректорий текущей. Например, установить rpm пакеты:
for D in *; do [ -d “${D}” ] && yum install ${D}/*.rpm ; done
3. Добавить пользователя в группу:
usermod -a -G group user
4. Как расшарить содержимое папки по протоколу HTTP.
Заходим в нужную папку и выполняем команду:
python -m SimpleHTTPServer 8080
Далее зайдя в браузере по адресу http://ip_of_that_server:8080, мы увидим содержимое с возможностью навигации и скачивания файлов:

5. Получение информации о Virtual Hosts для apache2 в Debian Linux:
apache2ctl -t -D DUMP_VHOSTS
6. Создание файла заданного размера:
truncate -s 14M filename

7. Замена строчек в текстовом файле:
sed -Ei ‘s/foo|bar|baz/foobar/g’ file
Заменить foo, bar или baz на foobar
8. Подмонтировать CD-ROM с указанием типа файловой системы:
mount -t iso9660 /dev/scd0 /media/cdrom
9. Посмотреть параметры загрузки ядра Linux:
cat /proc/cmdline
10. Максимальный уровень компрессии в tar:
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

Анализ падения ядра в Linux (kernel crash dump)

Завалить ядро линукс не так то и просто (если не преднамеренно, конечно), но такое случается… не все баги выловлены, а новые “фишки” приносят новые баги.

Итак, для сохранения дампа при падении ядра в Linux или kernel panic, необходимо настроить сервис kdump и установить несколько дополнительных пакетов.
Сам механизм представляет собой дополнительное маленькое ядро, смысл существования которого состоит в том, чтобы после падения основного ядра системы, перехватить управление, сохранить дамп и перезагрузить систему.

Для Fedora Linux устанавливается всё хозяйство просто командой:

yum install –enablerepo=fedora-debuginfo –enablerepo=updates-debuginfo kexec-tools crash kernel-debuginfo

А вот для Oracle Linux 6.4 чуть сложнее:

yum install crash -y
export DLP=”https://oss.oracle.com/ol6/debuginfo”

wget ${DLP}/kernel-uek-debuginfo-`uname -r`.rpm 
wget ${DLP}/kernel-uek-debuginfo-common-`uname -r`.rpm

rpm -Uhv kernel-uek-debuginfo-`uname -r`.rpm kernel-uek-debuginfo-common-`uname -r`.rpm

Команды приведены для текущего ядра системы. Если нужны пакеты для других версий ядра, то нужно указать версию вместо `uname -r`.

Далее, необходимо добавить в конфиг загрузчика (/boot/grub/grub.conf или /boot/efi/EFI/redhat/grub.conf – зависит от того, используется UEFI при загрузке сервера или нет): параметр ядра “crashkernel=128M“. Цифра указывает, сколько ОЗУ резервируется под резервное ядро. Через @ можно указать так же смещение в памяти, если необходимо. Например 128M@16 – зарезервирует 128 Мб ОЗУ начиная с физического адреса 0x01000000 (16MB).

Находим запись с нужной версией ядра (или можно ко всем добавить) и в итоге получим что-то в виде:
kernel /boot/vmlinuz-2.6.39-400.109.4.el6uek.x86_64 ro root=UUID=<> rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet crashkernel=128M

Теперь надо включить службу kdump для автозагрузки:

chkconfig kdump on

Также можно подредактировать конфиг /etc/kdump, но он и по-умолчанию достаточно хорош.
Теперь перезагрузим сервер, чтобы ядро загрузилось с новым параметром:

shutdown -r now

Проверяем, правильно загрузилось ядро с нашими параметрами:

cat /proc/cmdline

Также проверим, работает ли kdump:

service kdump status
Kdump is operational

Теперь, искусственно вызовем kernel panic командой:

echo c > /proc/sysrq-trigger

При этом будет подгружаться маленькое резервное ядро и сохранит дамп. На сохранение дампа нужнон екторое время, потому в определенный момент может показаться, что ядро подвисло – нужно дождаться окончания процесса.

После перезагрузки, мы сможем найти наши дампы (по-умолчанию) в папке /var/crash. Запускаем анализатор дампа:

crash /var/crash/2009-07-17-10:36/vmcore /usr/lib/debug/lib/modules/`uname -r`/vmlinux

После запуска crash покажет нам некоторую полезную инфу и даст свою командную строку:

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-unknown-linux-gnu”…

      KERNEL: /usr/lib/debug/lib/modules/2.6.39-400.210.2.el6uek.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2013-11-13-12:04:56/vmcore  [PARTIAL DUMP]
        CPUS: 2
        DATE: Wed Nov 13 12:03:52 2013
      UPTIME: 00:21:58
LOAD AVERAGE: 0.23, 0.17, 0.10
       TASKS: 93
    NODENAME: nagios
     RELEASE: 2.6.39-400.210.2.el6uek.x86_64
     VERSION: #1 SMP Thu Oct 17 16:28:13 PDT 2013
     MACHINE: x86_64  (3292 Mhz)
      MEMORY: 2 GB
       PANIC: “Oops: 0002 [#1] SMP ” (check log for details)
         PID: 1902
     COMMAND: “bash”
        TASK: ffff880037a88200  [THREAD_INFO: ffff880037f86000]
         CPU: 1
       STATE: TASK_RUNNING (PANIC)

crash>

Помощь по командам: help или help command

Core dump от любого процесса также можно посмотреть командой: gdb path_to_core
Но, чтобы создавались дампы от процессов необходимо подредактировать файл /etc/limits.conf, например, командой:

sed -i ‘s/.. *soft *core *0/*tsoftttcorettunlimited/g’ /etc/security/limits.conf

Более подробно по командам можно почитать здесь:
http://docs.oracle.com/cd/E37670_01/E41138/html/ch10s02.html

Всем удачи и поменьше багов! 🙂

http://geckich.blogspot.com/

Запуск графических приложений на удаленной Linux-машине с помощью Putty и Xming (export display)

Суть задачи в следующем. Есть у нас сервер, на котором нету X-сервера, только консоль. А нам нужно, к промеру, установить Oracle Solaris Studio и запусктаь ее удаленно. Или какое-то другое приложение, работающее в GUI-режиме.
Для решения этой задачи выполняем следующее.
1. На сервере устанавливаем пакеты xauth и xterm. Например, для Oracle Linux (или другого RHEL):
yum install xauth xterm

2. Также, нужно проверить, включено ли X11 Forwarding в конфигурационном файле SSH-демона:

nano /etc/ssh/sshd_config

X11Forwarding yes

3. Eсли вы заходите с помощью Windows-машины, то вам необходимо установить Xming – X-эмулятор для форточек.  Ну и, собсно, сам Putty – ssh-клиент для Windows.

Установка Xming тривиальна, по типу далее, далее, далее. Только поставить галочку, что мы будем использовать его вместе с Putty. Сам Putty так же устанавливаем.
4. Запускаем Xming, он свернется в трей и после этого запускаем Putty и на вкладке Connection / SSH / X11 отмечаем галочку Enable X11 forwarding, а также дописываем в поле X display location значение localhost:0.

4. Далее подключаемся к удаленному серверу и запускаем наше приложение. Например, Solaris Studio:
/opt/oracle/solarisstudio12.3/bin/solstudio

Когда всё подгрузиться, вы увидите заветное окошко:

Для тех, кто работает в Linux-среде всё еще проще. Запускать приложения на удаленной машине можно, добавляя к подключению по ssh ключ -X.

Если нужно запустить графическое приложение на удаленной машине, не доступной с вашей рабочей, но доступной через третью машину, то на этой третьей машине необходимо сделать форвардинг 22го порта для ssh и 6010 порта (для дисплея localhost:0) TCP.