вторник, 30 апреля 2019 г.

монитор охранника

задача:
- есть сарай и монитор , на нем надо показывать 4 камеры и если что то подвисло перезапустить плеер

2 скрипта
- первый (запускается из под пользователя) просто запускает окошки  плеера (mpv) без рамочек , предварительно померив экран и поделив его на 4 части (за это отвечает xdoottool)
- второй (запускается из под рута) читает первый скрипт цепляет из него ip с которых идет поток и пишет его в файл (если в файле строк меньше чем положено - поток перезапускается)

4mpl.sh 


#!/bin/bash
# тут указываем какие стримы будем вещать
scriptname=4mpl.sh
str1=rtsp://root:passsword@212.191.253.53:554/live/sub
str2=rtsp://root:passsword@212.191.253.61:554/live/sub
str3=rtsp://root:passsword@122.191.253.88:554/live/sub
str4=rtsp://root:passsword@212.191.253.18:554/live/sub
# глядим что за экран у нас, вдруг сменили и пригодиться в положениях плеера
export DISPLAY=':0.0'
xwin=`xdotool getdisplaygeometry | awk {'print $1'}`
ywin=`xdotool getdisplaygeometry | awk {'print $2'}`
# прячим мышку? помоему не работает
xdotool mousemove "$xwin $ywin"
# это статусбар убунту, мешается по умолчанию на 24 пикселя, сука
Barsize=24
# тут мы делем полученый размер экрана на 4 равных части за вычетом бара
let "wsizex=$xwin / 2"
let "wsizey=$ywin / 2 - ($Barsize / 2)"
wsize="$wsizex""x""$wsizey"
let "wsizeyY=$wsizey + $Barsize "
# водим переменные позиций окон
gpos1="+0+$Barsize"
gpos2="+$wsizex+$Barsize"
gpos3="+$wsizex+$wsizeyY"
gpos4="+0+$wsizeyY"
# гавнякаем переменными в syslog - тупо для дебага, можно удалить
logger "$scriptname str1=$str1"
logger "$scriptname str2=$str2"
logger "$scriptname str3=$str3"
logger "$scriptname str4=$str4"
logger "$scriptname xwin=$xwin"
logger "$scriptname ywin=$ywin"
logger "$scriptname wsize=$wsize"
logger "$scriptname gpos1=$gpos1"
logger "$scriptname gpos2=$gpos2"
logger "$scriptname gpos3=$gpos3"
logger "$scriptname gpos4=$gpos4"
# из соседнего скрипта тисипидампим ip переменных str и складываем
# в файл, если в файле меньше 2 х строк - потока нет, перезапускаемся
a=1
b=`cat /home/filalex/dump1 | wc -l `
c=`cat /home/filalex/dump2 | wc -l `
d=`cat /home/filalex/dump3 | wc -l `
e=`cat /home/filalex/dump4 | wc -l `
# тут я не понял как работет $переменная$а_тут_вторая_которая_подставляется_первой поэтому говнокод
if  [ "$b" -gt "$a" ]
    then
    logger "$scriptname поток $str1 в норме, что то прилетело работаем дальше "
    else
    logger "$scriptname поток $str1 упал, перезапускаем плеер"
    mpv -cache=32 -border=no -geometry "$wsize"$gpos1 $str1 &
fi
if  [ "$c" -gt "$a" ]
    then
    logger "$scriptname поток $str2 в норме, что то прилетело работаем дальше "
    else
    logger "$scriptname поток $str2 упал, перезапускаем плеер"
    mpv -cache=32 -border=no -geometry "$wsize"$gpos2 $str2 &
fi
if  [ "$d" -gt "$a" ]
    then
    logger "$scriptname поток $str3 в норме, что то прилетело работаем дальше "
    else
    logger "$scriptname поток $str3 упал, перезапускаем плеер"
    mpv -cache=32 -border=no -geometry "$wsize"$gpos3 $str3 &
fi
if  [ "$e" -gt "$a" ]
    then
    logger "$scriptname поток $str4 в норме, что то прилетело работаем дальше "
    else
    logger "$scriptname поток $str4 упал, перезапускаем плеер"
    mpv -cache=32 -border=no -geometry "$wsize"$gpos4 $str4 &
fi


strdumper.sh 

#!/bin/bash
for i in {1..4}
do
dumphost=`grep str$i /home/filalex/4mpl.sh | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"`
timeout 5 tcpdump -i enp1s0 -n -q host $dumphost > /home/filalex/tdump$i
cp /home/filalex/tdump$i /home/filalex/dump$i`
done


enp1s0 - заменить на свой интерфейс 
filalex - заменить на пользователя 
в корон добавляем 

*/1 * * * * root /home/filalex/strdumper.sh
*/1 * * * * filalex /home/filalex/4mpl.sh

примерно как выглядит строка плеера 
mpv -cache=32 -border=no -geometry 640x512+0+512 rtsp://login:password@ip.190.23.46/1/2

так выглядит в процессах 

а так на мониторе

кому хачу программу чтоб поставить и забыть  - курим сыль
https://securityrussia.com/blog/vms-vs-cms.html  иил гуглим herospeed или iSpy