Как и обещал, расскажу как реализовал управление видеостеной на малине.
Мы имеем: 10 raspberry, воткнутых в телевизоры, они имеют сеть.
Они должны: уметь показывать страничку в браузере либо открывать rdp-сеанс к виндовой тачке, чтобы показывать оттуда (дерьмовое решение, боже упаси кого его использовать), а также удалённо ребутаться.
Нам нужен: удобный интерфейс для управления всем этим хозяйством.
Так как мне надо было дёшево и быстро, решение я сбацал на php. Есть html-страничка, нажатие на кнопки запускает php-скрипты, которые ломятся на нужный raspberry по ssh, авторизуются по ключу и передают интересующий набор команд.
Задача 1 — настройка авторизации.
С помощью утилиты ssh-keygen генерим приватный и публичный ключи на сервере, с которого будем осуществлять управление. Публичный ключик кладём в рутового хомяка в папку .ssh, файл с ключом должен называться authorized_keys
Приватный ключ должен быть на сервере управления с названием id_rsa в общем-то в любом месте.
Задача 2 — открывать заданный URL в браузере raspberry и сохранять его, чтобы эта же страничка открывалась после ребута.
Сделаем формочку для ввода URL в один конкретный raspberry:
Введите URL:
<form action=»script.php» method=»post»>
<INPUT type=hidden name=ip VALUE=»xxx.xxx.xxx.xxx»>
<input type=»text» name=»url» size=»40″><br/>
<input type=»submit» value=»Открыть URL и сохранить»>
</form>
Напишем скриптик, который будет лазить на конкретный raspberry, открывать в его браузере эту страничку и сохранять url.
<?php
$url = $_POST[‘url’];
$ip = $_POST[‘ip’];
system(‘ssh -i /home/dfisher/rasp/id_rsa root@’.$ip.’ «sh ~/run_midori.sh ‘.$url.'»‘);
system(‘ssh -i /home/dfisher/rasp/id_rsa root@’.$ip.’ «echo ‘.$url.’>url»‘);
header(«Location: index.html»);
?>
Здесь мы идём на raspberry, авторизуемся, запускаем скрипт на самом raspberry, передаём ему url. Затем записываем url в файл url.
В конце важная строчка header(«Location: index.html»); — чтобы остаться после выполнения скрипта на странице index.html
Сам файл run_midori.sh на raspberry:
midori $1 >1 2>2 &
sleep 1
midori -e TabCloseOther >1 2>2 &
Задача 3 — рефрешить страницу в браузере.
Делаем формочку:
<form action=»refresh.php» method=»post»>
<INPUT type=hidden name=ip VALUE=»xxx.xxx.xxx.xxx»>
<input type=»submit» name=»refresh» value=»Обновить страницу браузера» />
</form>
Делаем скрипт:
<?PHP
$ip = $_POST[‘ip’];
system(‘ssh -i /home/dfisher/rasp/id_rsa root@’.$ip.’ «sh ~/refresh_midori.sh» ‘);
header(«Location: index.html»);
?>
На самом raspberry refresh_midori.sh:
midori -e Reload >1 2>2 &
Задача 4 — открывать RDP.
Делаем формочку:
<form action=»rdp.php» method=»post»>
<INPUT type=hidden name=ip VALUE=»xxx.xxx.xxx.xxx»>
<INPUT type=hidden name=user VALUE=»xxxxxxx»>
<INPUT type=hidden name=password VALUE=»xxxxxxxxx»>
<INPUT type=hidden name=server VALUE=»xxxxx.ti.ru»>
<input type=»submit» name=»rdp» value=»Открыть RDP xxxxx.ti.ru» />
</form>
Делаем скрипт:
<?php
$ip = $_POST[‘ip’];
$user = $_POST[‘user’];
$password = $_POST[‘password’];
$server = $_POST[‘server’];
system(‘ssh -i /home/dfisher/rasp/id_rsa root@’.$ip.’ «sh ~/run_rdp.sh ‘.$user.’ ‘.$password.’ ‘.$server.'»‘);
header(«Location: index.html»);
?>
Для rdp используем простейшую утилиту xfreerdp, запускаем через run_rdp.sh:
killall midori
killall xfreerdp
xfreerdp -a 32 -u $1 -p $2 -f $3 &
Задача 5 — удалённо перезагружать raspberry.
Делаем формочку:
<form action=»reboot.php» method=»post»>
<INPUT type=hidden name=ip VALUE=»xxx.xxx.xxx.xxx»>
<input type=»submit» name=»reboot» value=»Перезагрузить Raspberry» />
</form>
Делаем скрипт:
<?PHP
$ip = $_POST[‘ip’];
system(‘ssh -i /home/dfisher/rasp/id_rsa root@’.$ip.’ «shutdown -r now» ‘);
header(«Location: index.html»);
?>
Резюмируя, подход хоть и лобовой, но себя оправдал, система успешно выполняет свои задачи уже более года.
Таким образом я могу ходить на малины и заставлять их выполнять любые команды.
Секурность реализована другими средствами, о них умолчу.