свободное ПО

warning: Creating default object from empty value in /usr/data/www/drupal6/modules/taxonomy/taxonomy.pages.inc on line 33.

Глюки ZFS с мелкими последствиями.

Жил был мой сервер, в основном, с моими фотками (ну и еще по мелочи). ZFS с двумя 2-х ТБ дисками в зеркале, все дела.

Т.к. нашел программы удовлетворяющие моим требованиям для синхронизации файлов мастер-мастер, соответственно попытался прикрутить к своему хранилищу.

При попытке засинхронизироваться сервер рассказал, что не может прочитать часть файлов и у них не сростаются cheksum. Запустил scrubbing, он рассказал, что на обоих винтах одинаковые ошибки, и как оказалось в дальнейшем, часть файлов еще и частично посыпалось без каких-либо комментариев. Т.е. читаются нормально, но картинки открываются с артефактами.

Хоть и верю я в рейд и ZFS, но изредка делаю бекап на отдельный диск - мало ли что.

Те файлики, про которые ZFS смогла что-то плохое рассказать перезалил ручками. Про остальные кривые файлы рассказал Syncthing, т.к. он считает  checksum файлов, а на сервере и внешнем носители они оказались разными, то он их перелил, создав отдельную копию старых файлов.

Из неудобств: индексация 250Gb фоток и видео занимала несколько часов и синхронизация не очень шустрая. Если задача залить на пустой ресурс большой объем из "облака", то проще сначала все засинкать через rsync, а потом уже запускать Syncthing.

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

0
Your rating: Нет

Авторизация на компьютере с Ubuntu по usb флешке или Bloetooth устройству

Было скучно, читал интернеты и наткнулся на статью "Посторонним вход воспрещен", более коротко - "Аутентификация при помощи Bluetooth телефона или USB Flash в Debian/Ubuntu Linux"

Проверил сначала авторизацию через флэшку -  нормально работает, вопрос, конечно, что будет с примонтированным разделом, если так лихо флэшку дергать.

Начал разбираться с авторизацией по блютуз устройсту - заходить без пароля, если рядом валяется телефон - это удобно, вроде тоже нормально отработало.

Как позжее выяснилось есть пара мелких подводных булыжников.

  1. Если используется шифрование домашнего каталога, то он остается не подмонтированным и его нужно монтировать вручную, соответственно вводя пароль.
  2. Приложение Ключи и пароли, так же требует отдельной авторизации. Некоторые умельцы просто снимают с нее пароль, но это не безопасно.

Далее стало интересно, как сделать, чтобы компьютер автоматически блокировался при исчезновении телефона.

Сначала нашел BlueProximit, но он у меня как-то не стабильно работал и мобила постоянно дергалась с целью установить сопряжение.

В итоге нарисовал свой скрипт, который ищет имя устройства по маку, когда находит, сверяет с тем, что имеется в конфиге и если находит, то выполняет какие-то действия.

Плюсы:

0
Your rating: Нет

Полезные команды в консоли Астериска

Некоторые полезные команды в CLI интерфейсе астериска

asterisk -rvvv - подключиться к консоли

core show channels - посмотреть статус каналов
sip show users - посмотреть пользователей сервера (пользователь, пароль, контекст)
sip show peers - посмотреть пиров сервера (пользователь, ip адрес, порт, статус)
sip show registry - посмотреть статус регистраций, т.е. как сервер зарегистрировался
 

Стырено тут.

0
Your rating: Нет

Автонастройка (auto provision) VoIP телефонов в Астериске

Т.к. потихоньку движется проект по мегапереходу на VoIP телефонию, начал разбираться с автонастройкой телефонов. Т.к. у меня планируются все телефоны Panasonic, соответственно, разбирался под них.

Астериск умеет сам генерировать файлы автоматической конфигурации клиентов. У него есть два модуля - http и phoneprov.

http - отвечает за то, чтобы asterisk мог работать web-сервером, а phoneprov - за автоматическое создание файлов конфигурации.

Чего нормально не могу придумать, так это защиту от несанкционированного получения параметров. Вроде, есть идея прогонять через nginx с его авторизацией, но это пока в процессе размышления. Человек, по статье которого делал, пишет, что после запуска всех телефонов, оно отключал http, но я не уверен, что панасоники вспомнят автоматические настройки после перезагрузки при отсутствии сервера.
(P.S. После получения настроек - телефоны их сохраняют и сервер не требуется. Соответственно, после того как телефоны получили настройки, можно спокойно у пользователя отключать провижен.)

Для получения файлов автоконфигурации нам нужно включить оба модуля.

1. Включаем http, для этого в файле http.conf пишем:

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

2. Настраиваем автоматиское создание файлов конфигурации телефонов - phoneprov.conf.

0
Your rating: Нет

Подготовка звуковых файлов для Asterisk

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

  1. Сначала нормализуем файл, чтобы громкость была правильная
  2. Конвертируем файл в нужные форматы

#!/bin/sh

file=$1
file_ext=${file##*.}
file_name=${file%.*}
ffmpeg_cmd="ffmpeg -loglevel quiet -i "
edit_file=/tmp/${file_name}_$$.wav
#echo ${edit_file} ${file_ext} ${file_name}

${ffmpeg_cmd} $1 ${edit_file}
normalize ${edit_file}
mkdir out
${ffmpeg_cmd} ${edit_file} -acodec pcm_s16le -ar 8000 -ac 1 -y out/${file_name}.wav
${ffmpeg_cmd} ${edit_file} -ar 8000 -ac 1 -ab 64 -f alaw -y out/${file_name}.alaw
${ffmpeg_cmd} ${edit_file} -ar 8000 -ac 1 -ab 64 -f mulaw -y out/${file_name}.ulaw
rm ${edit_file}

Вроде работает. wink

Соответственно, запускаем sound2asterisk.sh имя_файла, после выполнения в каталоге out забираем результат.

0
Your rating: Нет

прослушивание линий в Asterisk

Иногда возникает задача прослушивание телефонных разговоров. На астериске это решается достаточно просто, несколькими строками в

exten => 115001,1,Answer()
exten => 115001,n,ChanSpy(SIP/extension,q)

Где extension - канал, который нужно прослушивать. Если не указать или указать общую часть для нескольких каналов (например 10, для телефонов 101, 102, 103), то будут прослушиваться все каналы совпадающие. При этом переключаться между каналами можно с помощью #.

q - означает, не оповещать о том, что канал прослушивается.

Набор: # циклически изменяет уровень звукового сигнала.
Набор: * останавливает контроль за одним абонентом и ищет другой подходящий канал для контроля.
Набор последовательности цифр, завершенный нажатием кнопки #, создает имя канала, которое будет добавлено к параметру
(например, выполните Chanspy(Agent) и наберите 1234#, в процессе контроля, тогда вы перейдете на канал Agent/1234)

0
Your rating: Нет

Grandstream gxw4232, asterisk и перевод звонков

В связи с переездом одного офиса перевел его на IP телефонию. Т.е. получаю телефонию по SIP от Билайна, разруливаю все на астериске, часть SIP телефонов Panasonic KX-UT133, часть телефонов обычных подключеных через FXS шлюз grandstream GXW4232.

С обычными телефонами возникла проблема - входящий звонок не получалось перевести на другой телефон. Астериск писал:

No compatible codecs, not accepting this offer!

После долгих мучений, гуглений и т.д. в тщетных попытках как-то вылечить кроме кодека alaw (который использует билайн),разрешил в астериске кодек ulaw, после чего все завелось.

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

0
Your rating: Нет

PianoBooster - обучение игре на клавишных инструментах.

Искал софтину, которая помогала бы освоиться с нотами, нашел классную штуку для обучения игры на клавишах по нотам - PianoBooster.

Грузишь мидишку - она рисует нотный стан, гонит музыку и позволяет/заставляет в правильное время жать правильные кнопочки, как мартышку. Если все делаешь правильно, то получаешь банан, в виде нормально звучащей композиции.

Для нормального использования, таки требуется MIDI клава, т.к. с обычной клавой как-то вообще не ассоциируется у меня.

Нашел отсюда.

0
Your rating: Нет

Asterisk: Лимитирование звонков по каналу.

Т.к. некоторые SIP/VoIP провайдеры далют халяву с некоторыми ограничениями (на пример sipnet) на количество звонков и их общую продолжительность, захотелось этим воспользоваться, но при этом не попадать на деньги.

Нарисовал 2-а макроса. Первый для учета количества звонков и их длительности, второй для выбора  необходимого транка.

1. Учет звонков.

Учитываем только отвеченные

[macro-count_dial_from_trunk]
exten => s,1,NoOp(${CDR(duration)} ${CDR(billsec)})

; Enable call limit control ?
exten => s,n,GotoIf($[${DB(trunk/${NAME_TRUNK}/day/limit-enable)} = 1 ]?:noanswer)
exten => s,n,GotoIf($[${DIALSTATUS} = ANSWER ]?:noanswer)

exten => s,n,Set(foo=${CUT(CDR(dstchannel),,1)})
exten => s,n,Set(foo=${CUT(foo,/,2)})

exten => s,n,GotoIf($[${ISNULL(${DB(trunk/${foo}/day/call-time)})}]?:continue_call-time)
exten => s,n,Set(DB(trunk/${foo}/day/call-time)=0)
exten => s,n(continue_call-time),Set(DB(trunk/${foo}/day/call-time)=$[${DB(trunk/${foo}/day/call-time)}+${CDR(billsec)}])

exten => s,n,GotoIf($[${ISNULL(${DB(trunk/${foo}/day/call)})}]?:continue_call)
exten => s,n,Set(DB(trunk/${foo}/day/call)=0)
exten => s,n(continue_call),Set(DB(trunk/${foo}/day/call)=$[ ${DB(trunk/${foo}/day/call)} + 1 ])

exten => s,n(noanswer),Verbose(4,Call count:${DB(trunk/${foo}/day/call)} - time(s):${DB(trunk/${foo}/day/call-time)})

2. Проверка превышения лимита

0
Your rating: Нет

Оповещение пользователей Asterisk о звонке на почту и jabber

Захотелось извещать пользователей Asterisk о поступающих им звонках. Наваял такой макрос:

[macro-notice_by_call]
exten => s,1,Verbose(4,Starting notification macros)
exten => s,n,Set(TIME_STRING=${STRFTIME($EPOCH,,%d %B %Y -  %T)})
exten => s,n,Set(SUBJECT_STRING=You call from ${CALLERID(name)} (${CALLERID(number)}))
exten => s,n,Set(MESSAGE_STRING=You call from ${CALLERID(name)} (${CALLERID(number)}). Time: ${TIME_STRING})

exten => s,n,GotoIf($[${ISNULL(${DB(abonent/${MACRO_EXTEN}/notyfication_jabber)})}]?skip_jabber_notification)
exten => s,n,GotoIf($[${DB(abonent/${MACRO_EXTEN}/notyfication_jabber)}=0]?skip_jabber_notification)
exten => s,n,jabbersend(asterisk,${DB(abonent/${MACRO_EXTEN}/jabber)},${MESSAGE_STRING})
${STRFTIME($EPOCH,,${TIME_STRING})})
exten => s,n(skip_jabber_notification),NoOp(No need jabber notification)
 
exten => s,n,GotoIf($[${ISNULL(${DB(abonent/${MACRO_EXTEN}/notyfication_email)})}]?skip_email_notification)
exten => s,n,GotoIf($[${DB(abonent/${MACRO_EXTEN}/notyfication_email)}=0]?skip_email_notification)
exten => s,n,system(echo "${MESSAGE_STRING}" | mail -s "${SUBJECT_STRING}" ${DB(abonent/${MACRO_EXTEN}/email)});
exten => s,n(skip_email_notification),NoOp(No need email notification)

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

0
Your rating: Нет
Ленты новостей