raspberry_verwaltung

Как и обещал, расскажу как реализовал управление видеостеной на малине.

Мы имеем: 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»);
?>

Резюмируя, подход хоть и лобовой, но себя оправдал, система успешно выполняет свои задачи уже более года.

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

Секурность реализована другими средствами, о них умолчу.