Исходные данные:
Имеем linux c настроенным icecast как в статье Запись нескольких радиостанций. Хотя конечно можно брать любой источник звука.
Задача:
Посылать письма при пропадании и появлении сигнала.
Решение:
liquidsoap
Читаем про liquidsoap и устанавливаем:
sudo apt install liquidsoap
В целом liquidsoap позволяет делать кучу всего со звуковыми потоками, но нас интересует детектор тишины, не буду мучать вот скрипт silent_detector_radio.liq:
# Описываем источник
s = input.http("http://air-control:8000/radio")
# Функция которая будет выполнятся когда когда будет обнаружена тишина
def silentscript()
system("/home/liq-script/liquidsoap-script/silentscript.sh Пропал звук. Внимание на Радио пропал звук.")
end
# Функция которая будет выполнятся когда когда будет вновь появится звук
def noisescript()
system("/home/liq-script/liquidsoap-script/silentscript.sh Вернулся звук. На Радио вернулся звук.")
end
# Собственно оборачивание потока встроенной функцией on_blank которая реагирует на тишину
source = blank.detect(track_sensitive=false, max_blank=5., on_noise=noisescript, silentscript, s)
source = mksafe(source)
# Вывод в несуществующий выход
# (может быть и реальный выход и вообще возможно подавать звук с другого источника, но это не та история)
output.dummy(source)
Файл отправки писем silentscript.sh:
#!/bin/bash
# Скрипт отправляет строку параметров на почту и sms
# Принимает первый параметр станция без пробелов
# Второй и третий параметр - это событие (пропал звук, звук восстановлен)
# sms - отправляет только три первых параметров
# на почту первые три памаметра уходит в тему, все остальные параметры в тело письма
#echo $* - все параметры
FROM="alarm@i-rrv.ru"
TO="alarm@i-rrv.ru"
SMS="+79230000000@sms.megafonsib.ru"
DATE=`date +%Y.%m.%d_%H:%M`
# Отправка на почту
(echo "From: "${FROM}; echo "To: "${TO}; echo "Subject: "$1" "$2" "$3; echo; echo $*" "${DATE}) | /usr/sbin/ssmtp ${TO}
# Перевод в латиницу если будет нужно
#rus=`echo ЭАБДЕФГХИКЛМНОПРСТУВВЗЙабдефгхиклмнопрстуввзйэ | iconv -f 'utf8' -t 'cp1251'`
#en=`echo EABDEFGHIKLMNOPRSTUVWZYabdefghiklmnoprstuvwzye | iconv -f 'utf8' -t 'cp1251'`
#sub=`echo $1" "$2" "$3 | iconv -f 'utf8' -t 'cp1251' | tr ${rus} ${en} | iconv -f 'cp1251' -t 'utf8'`
# Перевод в кодировку koi8r (Для мегафона)
sub=`echo $1" "$2" "$3 | iconv -f 'utf8' -t 'koi8r'`
# Отправка SMS через Прием электронной почты в виде SMS (это у Мегафон, у МТС есть подобное)
(echo "From: "${FROM}; echo "To: "${TO}; echo "Subject: "${sub}; echo; echo ${DATE}) | /usr/sbin/ssmtp ${SMS}
liquidsoap-daemon
Ну в целом это все будет работать, но для того что бы контролировать несколько источников (у меня несколько радиостанций) требуется воспользоватся liquidsoap-daemon. С помощью liquidsoap-daemon возможно запуск нескольких скриптов liquidsoap в виде служб, без дополнительных усилий.
Установка: Создаем пользователя, качаем в домашний каталог liquidsoap-daemon с github и распаковываем. Если не установлен sudo, то ставим и настраиваем. Далее кратко, как это делал я, более подробная инструкция читайте в документации проекта.
Поместите скрипт который требуется запускать как демон сюда:
/liquidsoap-daemon/script/.liq
Запустите:
daemonize-liquidsoap.sh
от текущего пользователя, это создаст требуемые файлы.
Запуск как службы:
sudo systemctl start -liquidsoap
Остановка службы:
sudo systemctl stop -liquidsoap
Удаление:
mode=remove [init_type=] ./daemonize-liquidsoap.sh
В целом все 🙂
а параметры 1, 2 и три откуда он их берет?
Ну параметры передаются при запуске скрипта, он у меня используется для отправки и других сообщений
Если посмотреть в скрипте выше вызывается скрипт:
system(«/home/liq-script/liquidsoap-script/silentscript.sh Пропал звук. Внимание на Радио пропал звук.»)
В параметрах будет:
$1 Пропал
$2 звук.
$3 Внимание
$* Пропал звук. Внимание на Радио пропал звук.