Как установить Majordomo на Raspberry Pi 3 Model B

Posted by

Ранее я разбирал и успешно кстати как поставить пакет на Ubuntu Trusty не важного на какое железо, удобнее конечно на ненужный ноутбук (удобно когда есть батарея для резервного питания). Многое в этой системе правда документировано слабо, мало примеров, но когда разберетесь то все просто. Ведь автор этого пакета уже как много лет строит и использует ее, а раз она выложена в публичный доступ значит все возможно. Ну да ладно хорош разглагольствовать, сегодня я покажу, как я сам поставил ее на миникомпьютер карта памяти MicroSD и с какими трудностями мне пришлось столкнуться. Просто все что есть в интернете сделанное не самолично не заслуживает доверия, а тем более скачивать сборки других уж извольте. Лучше разбираться в самолично сделанном чем в другом.

Первым делом после записи системы Raspbian на карту памяти и настройки системы по заметке устанавливаю пакет LAMP:

Ну а далее все шаги как развернуть MajorDomo на Raspberry Pi 3 Model B:

pi@raspberrypi:~ $ cat /etc/passwd | grep www-data

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

pi@raspberrypi:~ $ sudo nano /etc/apache2/envvars

export APACHE_RUN_USER=www-data

export APACHE_RUN_GROUP=www-data

pi@raspberrypi:~ $ sudo chown www-data:www-data /var/www

pi@raspberrypi:~ $ sudo chmod 777 /var/www

pi@raspberrypi:~ $ sudo chown www-data:www-data /var/lock/apache2/

pi@raspberrypi:~ $ sudo chown www-data:www-data /var/log/apache2/

pi@raspberrypi:~ $ sudo a2enmod rewrite

pi@raspberrypi:~ $ sudo unlink /etc/apache2/sites-available/000-default.conf

pi@raspberrypi:~ $ sudo unlink /etc/apache2/sites-available/default-ssl.conf

pi@raspberrypi:~ $ sudo unlink /etc/apache2/sites-enabled/000-default.conf

pi@raspberrypi:~ $ sudo rm -Rf /var/www/html/

pi@raspberrypi:~ $ sudo nano /etc/apache2/sites-available/majordomo.conf

<VirtualHost *:80>

DocumentRoot /var/www

<Directory />

Options FollowSymLinks

AllowOverride All

</Directory>

<Directory /var/www/>

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

</Directory>

ServerSignature Off

</VirtualHost>

pi@raspberrypi:~ $ sudo a2ensite majordomo.conf

pi@raspberrypi:~ $ sudo systemctl restart apache2

pi@raspberrypi:~ $ sudo nano /etc/php5/apache2/php.ini

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT

display_errors = On

log_errors = Off

post_max_size = 50M

upload_max_filesize = 50M

short_open_tag = On

max_execution_time = 300

pi@raspberrypi:~ $ sudo nano /etc/php5/cli/php.ini

аналогично /etc/php5/apache2/php.ini

pi@raspberrypi:~ $ sudo service apache2 restart

Скачиваю пакет Majordomo по аналогии, как и для Ubuntu Trusty Server заметки:

pi@raspberrypi:~ $ wget http://majordomo.smartliving.ru/download/_majordomo_linux_100b.tar.gz -P /var/www/

pi@raspberrypi:~ $ sudo tar zxf /var/www/_majordomo_linux_100b.tar.gz -C /var/www/

pi@raspberrypi:~ $ sudo cp -rp /var/www/html/* /var/www/

pi@raspberrypi:~ $ sudo cp -rp /var/www/html/.htaccess /var/www

pi@raspberrypi:~ $ sudo rm /var/www/_majordomo_linux_100b.tar.gz

На заметку: либо же установку пакета Majordomo произвести через GIT репозитарий разработчика, что будет наиболее правильно чем скачивание пакета выше, как я делал применительно к Ubuntu Trusty.

pi@raspberrypi:~ $ cd /var/www/

pi@raspberrypi:/var/www $ sudo rm -Rf .config/

pi@raspberrypi:/var/www $ sudo rm -Rf .htaccess

pi@raspberrypi:/var/www $ sudo git clone --depth=1 https://github.com/sergejey/majordomo.git ./

Cloning into '.'...

remote: Counting objects: 3643, done.

remote: Compressing objects: 100% (3074/3074), done.

remote: Total 3643 (delta 566), reused 3186 (delta 469), pack-reused 0

Receiving objects: 100% (3643/3643), 17.03 MiB | 1.70 MiB/s, done.

Resolving deltas: 100% (566/566), done.

pi@raspberrypi:/var/www $ sudo cp config.php.sample config.php

pi@raspberrypi:/var/www $ sudo nano config.php

pi@raspberrypi:/var/www $ sudo chown -R www-data:www-data /var/www

pi@raspberrypi:/var/www $ sudo service apache2 restart

pi@raspberrypi:/var/www $ cd ~/

pi@raspberrypi:~ $ sudo find /var/www/ -type d -exec chmod 0777 {} \;

pi@raspberrypi:~ $ sudo find /var/www/ -type f -exec chmod 0666 {} \;

pi@raspberrypi:~ $ sudo chown -R www-data:www-data /var/www/

pi@raspberrypi:~ $ sudo usermod -aG audio www-data

Теперь создаю базу, пользователя и пароль для этого пользователя:

pi@raspberrypi:~ $ mysql -u root -p712mbddr@ -e "create database db_terminal character set utf8"

pi@raspberrypi:~ $ mysql -u root -p712mbddr@ db_terminal < /var/www/db_terminal.sql

pi@raspberrypi:~ $ mysql -u root -p712mbddr@ -e "create user 'us_majordomo'@'localhost' identified by '612mbddr@'"

pi@raspberrypi:~ $ mysql -u root -p712mbddr@ -e "grant all on db_terminal.* to 'us_majordomo'@'localhost';"

pi@raspberrypi:~ $ mysql -u root -p712mbddr@ -e "flush privileges;"

Теперь нужно подкорректировать конфигурационный файл из скачанного архива на предмет как подключать к базе и под каким пользователем:

pi@raspberrypi:~ $ sudo nano /var/www/config.php

Define('DB_HOST', 'localhost');

Define('DB_NAME', 'db_terminal');

Define('DB_USER', 'us_majordomo');

Define('DB_PASSWORD', '612mbddr@');

Define('SERVER_ROOT', '/var/www');

pi@raspberrypi:~ $ sudo chown -R www-data:www-data /var/www

pi@raspberrypi:~ $ sudo service apache2 restart

Теперь захожу на Web-интерфейс: http://IP&DNS/

получаю ошибку: Fatal error: Cannot declare class error, because the name is already in use in /var/www/lib/errors.class.php on line 21

Как я понял у меня слишком новая версия пакета php (для установки и работы Majordomo нужно чтобы версия php была 5.5 и 5.6, но не 7)

pi@raspberrypi:~ $ php --version

PHP 7.0.19-1 (cli) (built: May 11 2017 14:04:47) ( NTS )

Copyright (c) 1997-2017 The PHP Group

Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

with Zend OPcache v7.0.19-1, Copyright (c) 1999-2017, by Zend Technologies

Если смотреть релиз Ubuntu Trusty где я ставил Majordomo то там версия была 5.5.* и все заработало.

В моем случае пакет php равняется, см. заметку если не читали данную заметку с нуля LAMP.

pi@raspberrypi:~ $ php --version

PHP 5.6.22-2+b3 (cli)

Copyright (c) 1997-2016 The PHP Group

Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

with XCache v3.2.0, Copyright (c) 2005-2014, by mOo

with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

with XCache Optimizer v3.2.0, Copyright (c) 2005-2014, by mOo

with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo

with XCache Coverager v3.2.0, Copyright (c) 2005-2014, by mOo

Далее указываю

  • часовой пояс: Time zone: Europe/Moscow (GMT +3)
  • указываю тип языка: ru ru
  • указываю тему: Light

и нажимаю Continue → и вот сам Web-интерфейс управления домашней автоматизацией:

Web-интерфейс управления домашней автоматизацией

Беглый просмотр возможностей показал, что все же есть ошибка на главной странице почему-то остановлен цикл main (все циклы располагаются в каталоге /var/www/scripts/cycle(*.php))

Сперва нужно проверить, а будут ли работать циклы, ручной режим:

pi@raspberrypi:~ $ php /var/www/cycle.php

Fatal error: Call to undefined function curl_init() in /var/www/modules/objects/objects.class.php on line 426

Ага в моей системе чего-то хватает, опытным путем установил, что нужно в систему до установить нижеследующие пакеты:

pi@raspberrypi:~ $ sudo apt-get install libcurl3 libcurl3-dev php5-curl -y

Проверяю еще раз (ручной режим запуска, прежде чем я настрою на автоматический запуск самой системой):

pi@raspberrypi:~ $ sudo php /var/www/cycle.php

Connecting to database...

CONNECTED TO DB

Running startup maintenance

Checking modules.

Clearing the cache.

Target: /var/www/backup/20170827

Full backup: 0

Checking table [admin_users] ...OK

Checking table [app_quotes] ...OK

Checking table [blockly_code] ...OK

Checking table [cached_values] ...OK

Checking table [calendar_categories] ...OK

Checking table [calendar_events] ...OK

Checking table [classes] ...OK

Checking table [collections] ...OK

Checking table [commands] ...OK

Checking table [country] ...OK

Checking table [elements] ...OK

Checking table [elm_states] ...OK

Checking table [events] ...OK

Checking table [gpsactions] ...OK

Checking table [gpsdevices] ...OK

Checking table [gpslocations] ...OK

Checking table [gpslog] ...OK

Checking table [history] ...OK

Checking table [ignore_updates] ...OK

Checking table [jobs] ...OK

Checking table [layouts] ...OK

Checking table [locations] ...OK

Checking table [log4php_log] ...OK

Checking table [media_favorites] ...OK

Checking table [media_history] ...OK

Checking table [methods] ...OK

Checking table [myblocks] ...OK

Checking table [myblocks_categories] ...OK

Checking table [newsletter] ...OK

Checking table [objects] ...OK

Checking table [patterns] ...OK

Checking table [performance_log] ...OK

Checking table [phistory] ...OK

Checking table [pinghosts] ...OK

Checking table [plugins] ...OK

Checking table [prod_categories] ...OK

Checking table [product_categories] ...OK

Checking table [product_codes] ...OK

Checking table [product_log] ...OK

Checking table [products] ...OK

Checking table [project_modules] ...OK

Checking table [properties] ...OK

Checking table [pvalues] ...OK

Checking table [readit_channels] ...OK

Checking table [readit_urls] ...OK

Checking table [rss_channels] ...OK

Checking table [rss_items] ...OK

Checking table [safe_execs] ...OK

Checking table [scenes] ...OK

Checking table [script_categories] ...OK

Checking table [scripts] ...OK

Checking table [security_rules] ...OK

Checking table [settings] ...OK

Checking table [shoplist] ...OK

Checking table [shopping_list_items] ...OK

Checking table [shoutrooms] ...OK

Checking table [shouts] ...OK

Checking table [system_errors] ...OK

Checking table [system_errors_data] ...OK

Checking table [tdwiki] ...OK

Checking table [terminals] ...OK

Checking table [usbdevices] ...OK

Checking table [userlog] ...OK

Checking table [users] ...OK

Checking table [webvars] ...OK

Starting ./scripts/cycle_ping.php ... OK

Starting ./scripts/cycle_states.php ... OK

Starting ./scripts/cycle_main.php ... OK

Starting ./scripts/cycle_execs.php ... OK

Starting ./scripts/cycle_skype.php ... OK

Starting ./scripts/cycle_websockets.php ... OK

Starting ./scripts/cycle_X101_skype.php ... OK

Starting ./scripts/cycle_connect.php ... OK

Starting ./scripts/cycle_scheduler.php ... OK

Starting ./scripts/cycle_rss.php ... OK

Starting ./scripts/cycle_webvars.php ... OK

ALL CYCLES STARTED

18:22:35 working thread: cycle_skype.php

18:22:35 Closing thread: php -q ./scripts/cycle_skype.php --params "a:0:{}">>/var/www/debmes/log_2017-08-27-cycle_skype.php.txt

18:22:36 working thread: cycle_X101_skype.php

18:22:36 Closing thread: DISPLAY=:101 php ./scripts/cycle_X101_skype.php --params "a:0:{}"

18:22:36 working thread: cycle_connect.php

18:22:36 Closing thread: php -q ./scripts/cycle_connect.php --params "a:0:{}">>/var/www/debmes/log_2017-08-27-cycle_connect.php.txt

Прерываю выполнение по сочетанию клавиш в консоли Ctrl + C

В Web-интерфейсе циклы заработали, а значит могу запихнуть вызов в планировщик:

pi@raspberrypi:~ $ sudo nano /etc/crontab -e

@reboot /usr/bin/php /var/www/cycle.php

pi@raspberrypi:~ $ sudo service apache2 restart

на этот раз ошибок нет.

Теперь создаю скрипт посредством которого можно будет, как вручную запускать так и останавливать работу циклов приложения majordomo:

pi@raspberrypi:~ $ sudo nano /etc/init.d/majordomo

#!/bin/sh

### BEGIN INIT INFO

# Provides: SmartLiving

# Required-Start: $remote_fs $syslog

# Required-Stop: $remote_fs $syslog

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: Start daemon at boot time

# Description: Enable service provided by daemon.

### END INIT INFO
dir="/var/www/"

user="root"

cmd="php /var/www/cycle.php"
name=`basename $0`

pid_file="/var/run/$name.pid"

stdout_log="/var/log/$name.log"

stderr_log="/var/log/$name.err"
get_pid() {

cat "$pid_file"

}
is_running() {

[ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1

}
case "$1" in

start)

if is_running; then

echo "Already started"

else

echo "Starting $name"

cd "$dir"
(while true; do

sudo -u "$user" $cmd

done)>> "$stdout_log" 2>> "$stderr_log" &
echo $! > "$pid_file"

if ! is_running; then

echo "Unable to start, see $stdout_log and $stderr_log"

exit 1

fi

fi

;;

stop)

if is_running; then

echo -n "Stopping $name.."

kill `get_pid`

sudo killall php

for i in {1..10}

do

if ! is_running; then

break

fi
echo -n "."

sleep 1

done

echo
if is_running; then

echo "Not stopped; may still be shutting down or shutdown may have failed"

exit 1

else

echo "Stopped"

if [ -f "$pid_file" ]; then

rm "$pid_file"

fi

fi

else

echo "Not running"

sudo killall php

fi

;;

restart)

$0 stop

if is_running; then

echo "Unable to stop, will not attempt to start"

exit 1

fi

$0 start

;;

status)

if is_running; then

echo "Running"

else

echo "Stopped"

exit 1

fi

;;

*)

echo "Usage: $0 {start|stop|restart|status}"

exit 1

;;

esac
exit 0

pi@raspberrypi:~ $ sudo chmod 0755 /etc/init.d/majordomo

pi@raspberrypi:~ $ sudo update-rc.d majordomo defaults

pi@raspberrypi:~ $ sudo /etc/init.d/majordomo status

Stopped

pi@raspberrypi:~ $ sudo /etc/init.d/majordomo start

Starting majordomo

pi@raspberrypi:~ $ sudo /etc/init.d/majordomo status

Running

pi@raspberrypi:~ $ sudo reboot

pi@raspberrypi:~ $ sudo /etc/init.d/majordomo status

Running

Вот теперь все в норме об этом как раз и свидетельствуют значки Web-интерфейса развернутой системы majordomo: http://IP&DNS/

Полностью работоспособная система MajorDoMo на Raspberry Pi 3 Model B

Для справки по циклам:

циклы должны запускаться вместе со стартом системы и не закрываться в процессе работы. Инициируются циклы запуском скрипта ./cycle.php. Что делает этот скрипт — он смотрит в папке ./scripts/ все файлы с именем cycle_*.php и создаёт параллельные процессы на запуск каждого из этих «дочерних» скриптов. Соответственно, каждый cycle-скрипт самостоятельно определяет, какие именно действия он должен производить.

На данный момент имеются вот такие основные циклы (их количество может меняться в зависимости от конфигурации системы):

  • cycle_main.php — самый базовый цикл системы, обновляет системное время, а так же отвечает за работу объектов класса Timer
  • cycle_scheduler.php — отвечает за выполнение задач, запланированных с помощью функций setTimeOut, AddScheduledJob и им подобных
  • cycle_execs.php — цикл, отвечающий за запуск команд, добавленных через функцию safe_exec
  • cycle_webvars.php — цикл, обеспечивающий обновление веб-переменных
  • cycle_bluetooth.php — цикл сканера bluetooth-устройств
  • cycle_onewire.php , cycle_onewire_starred.php — циклы опроса 1-wire сети
  • cycle_ping.php — цикл опроса устройств online
  • cycle_rss.php — цикл обновления RSS-потоков
  • cycle_skype.php (windows), cycle_X101_skype.php (linux) — цикл/демон скайп-бота
  • cycle_snmp.php — цикл опроса SNMP-устройств
  • cycle_states.php — цикл обновления статусов состояния системы
  • cycle_watchfolders.php — цикл сканирования изменений папок
  • cycle_zwave.php — цикл опроса Z-Wave устройств

Все работает. Итого я для себя разобрал шаги по разворачиванию системы домашней автоматизации Majordomo на Raspberry pi 3 Model и системы:

pi@raspberrypi:~ $ uname -a && lsb_release -a

Linux raspberrypi 4.9.46-v7+ #1032 SMP Wed Aug 30 12:09:14 BST 2017 armv7l GNU/Linux

No LSB modules are available.

Distributor ID: Raspbian

Description: Raspbian GNU/Linux 8.0 (jessie)

Release: 8.0

Codename: jessie

Работает и в ходе всего этого я не мало граблей подчерпнул и обобщил в виде вот такой вот простой заметке/установке на миникомпьютер. В дальнейшем я покажу как я эту систему использую. На этом у меня всё, задача выполнена, с уважением автор блога Олло Александр aka ekzorchik.