Ранее я разбирал и успешно кстати как поставить пакет Majordomo на Ubuntu Trusty не важного на какое железо, удобнее конечно на ненужный ноутбук (удобно когда есть батарея для резервного питания). Многое в этой системе правда документировано слабо, мало примеров, но когда разберетесь то все просто. Ведь автор этого пакета уже как много лет строит и использует ее, а раз она выложена в публичный доступ значит все возможно. Ну да ладно хорош разглагольствовать, сегодня я покажу, как я сам поставил ее на миникомпьютер Raspberry Pi 3 Model B карта памяти 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-интерфейс управления домашней автоматизацией:
Беглый просмотр возможностей показал, что все же есть ошибка на главной странице почему-то остановлен цикл 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/
Для справки по циклам:
циклы должны запускаться вместе со стартом системы и не закрываться в процессе работы. Инициируются циклы запуском скрипта ./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.