1
0
Fork 0
mirror of https://gitlab.alpinelinux.org/alpine/aports.git synced 2025-07-23 11:15:13 +03:00
aports/community/mycroft-core/0003-system-wide-setups.patch
2021-06-20 13:39:36 +02:00

476 lines
13 KiB
Diff

From 8418563970aa04fd516e196efc50e6cf58007002 Mon Sep 17 00:00:00 2001
From: Bart Ribbers <bribbers@disroot.org>
Date: Fri, 15 Jan 2021 12:59:25 +0100
Subject: [PATCH] Replace mycroft-{start,stop} with scripts that can launch
properly installed setups
These scripts will work with system-wide setups
(/usr/bin/mycroft-start), user setups (~/.local/bin/mycroft-start) and
virtual environments (.venv/bin/mycroft-start).
A big benefit is that they don't care where they're installed. They'll
launch from a virtual environment, user setups or system-wide setup, in
that order.
Also make sure these scripts are actually installed by setup.py.
These changes should make it possible to create a PyPi package
installable with pip.
---
bin/mycroft-start | 153 +++++++++++++++++++++++++++++++++++++++--
bin/mycroft-stop | 109 +++++++++++++++++++++++++++--
dev_setup.sh | 54 +++------------
requirements/tests.txt | 2 +-
setup.py | 7 +-
5 files changed, 270 insertions(+), 55 deletions(-)
diff --git a/bin/mycroft-start b/bin/mycroft-start
index 65723c2c3734..30cd1ecfdbbb 100755
--- a/bin/mycroft-start
+++ b/bin/mycroft-start
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/sh
# Copyright 2019 Mycroft AI Inc.
#
@@ -14,8 +14,151 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-SOURCE="${BASH_SOURCE[0]}"
-cd -P "$( dirname "$SOURCE" )"/..
-DIR="$( pwd )"
+script=${0}
+script=${script##*/}
-. "$DIR/start-mycroft.sh" $@
+help() {
+ echo "${script}: Mycroft command/service launcher"
+ echo "usage: ${script} [COMMAND] [restart] [params]"
+ echo
+ echo "Services COMMANDs:"
+ echo " all runs core services: bus, audio, skills, voice"
+ echo " debug runs core services, then starts the CLI"
+ echo " audio the audio playback service"
+ echo " bus the messagebus service"
+ echo " skills the skill service"
+ echo " voice voice capture service"
+ echo " enclosure mark_1 enclosure service"
+ echo
+ echo "Tool COMMANDs:"
+ echo " cli the Command Line Interface"
+ echo
+ echo "Options:"
+ echo " restart (optional) Force the service to restart if running"
+ echo
+ echo "Examples:"
+ echo " ${script} all"
+ echo " ${script} all restart"
+ echo " ${script} bus"
+ echo " ${script} voice"
+
+ exit 1
+}
+
+name_to_script_path() {
+ case ${1} in
+ "bus") _module="mycroft.messagebus.service" ;;
+ "skills") _module="mycroft.skills" ;;
+ "audio") _module="mycroft.audio" ;;
+ "voice") _module="mycroft.client.speech" ;;
+ "cli") _module="mycroft.client.text" ;;
+ "enclosure") _module="mycroft.client.enclosure" ;;
+
+ *)
+ echo "Error: Unknown name '${1}'"
+ exit 1
+ esac
+}
+
+require_process() {
+ name_to_script_path "${1}"
+ if ! pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
+ launch_background "${1}"
+ fi
+}
+
+launch_process() {
+ name_to_script_path "${1}"
+
+ # Luanch process in foreground
+ echo "Starting $1"
+ python3 -m ${_module} "$_params"
+}
+
+launch_background() {
+ name_to_script_path "${1}"
+
+ if pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
+ if ($_force_restart); then
+ echo "Restarting: ${1}"
+ mycroft-stop "${1}"
+ else
+ # Already running, no need to restart
+ return
+ fi
+ else
+ echo "Starting background service $1"
+ fi
+
+ # Security warning/reminder for the user
+ if [ "${1}" = "bus" ] ; then
+ echo "CAUTION: The Mycroft bus is an open websocket with no built-in security"
+ echo " measures. You are responsible for protecting the local port"
+ echo " 8181 with a firewall as appropriate."
+ fi
+
+ # Launch process in background
+ # Send logs to XDG Base Directories cache location
+ logdir="${XDG_STATE_HOME:-$HOME/.local/state}/mycroft"
+
+ if [ ! -d "$logdir" ]; then
+ mkdir -p "$logdir"
+ fi
+
+ python3 -m ${_module} "$_params" >> "$logdir/${1}.log" 2>&1 &
+}
+
+launch_all() {
+ echo "Starting all mycroft-core services"
+ launch_background bus
+ launch_background skills
+ launch_background audio
+ launch_background voice
+ launch_background enclosure
+}
+
+_opt=$1
+_force_restart=false
+shift
+if [ "${1}" = "restart" ] || [ "${_opt}" = "restart" ]; then
+ _force_restart=true
+ if [ "${_opt}" = "restart" ]; then
+ # Support "start-mycroft restart all" as well as "start-mycroft all restart"
+ _opt=$1
+ fi
+ shift
+fi
+_params=$*
+
+case ${_opt} in
+ "all")
+ launch_all
+ ;;
+ "bus")
+ launch_background "${_opt}"
+ ;;
+ "audio")
+ launch_background "${_opt}"
+ ;;
+ "skills")
+ launch_background "${_opt}"
+ ;;
+ "voice")
+ launch_background "${_opt}"
+ ;;
+ "debug")
+ launch_all
+ launch_process cli
+ ;;
+ "cli")
+ require_process bus
+ require_process skills
+ launch_process "${_opt}"
+ ;;
+ "enclosure")
+ launch-background "${_opt}"
+ ;;
+ *)
+ help
+ ;;
+esac
diff --git a/bin/mycroft-stop b/bin/mycroft-stop
index b86b0ea65577..289c736959ae 100755
--- a/bin/mycroft-stop
+++ b/bin/mycroft-stop
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/sh
# Copyright 2019 Mycroft AI Inc.
#
@@ -14,8 +14,107 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-SOURCE="${BASH_SOURCE[0]}"
-cd -P "$( dirname "$SOURCE" )"/..
-DIR="$( pwd )"
+script=${0}
+script=${script##*/}
-. "$DIR/stop-mycroft.sh" $@
+help() {
+ echo "${script}: Mycroft service stopper"
+ echo "usage: ${script} [service]"
+ echo
+ echo "Service:"
+ echo " all ends core services: bus, audio, skills, voice"
+ echo " (none) same as \"all\""
+ echo " bus stop the Mycroft messagebus service"
+ echo " audio stop the audio playback service"
+ echo " skills stop the skill service"
+ echo " voice stop voice capture service"
+ echo " enclosure stop enclosure (hardware/gui interface) service"
+ echo
+ echo "Examples:"
+ echo " ${script}"
+ echo " ${script} audio"
+
+ exit 0
+}
+
+process_running() {
+ if [ "$( pgrep -f "python3 (.*)-m mycroft.*${1}" )" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+end_process() {
+ if process_running "$1"; then
+ # Find the process by name, only returning the oldest if it has children
+ pid=$( pgrep -o -f "python3 (.*)-m mycroft.*${1}" )
+ echo "Stopping $1 (${pid})..."
+ kill -SIGINT "${pid}"
+
+ # Wait up to 5 seconds (50 * 0.1) for process to stop
+ c=1
+ while [ $c -le 50 ]; do
+ if process_running "$1"; then
+ sleep 0.1
+ c=$((c + 1))
+ else
+ c=999 # end loop
+ fi
+ done
+
+ if process_running "$1"; then
+ echo "Failed to stop."
+ pid=$( pgrep -o -f "python3 (.*)-m mycroft.*${1}" )
+ echo " Killing $1 (${pid})..."
+ kill -9 "${pid}"
+ echo "Killed."
+ result=120
+ else
+ echo "Stopped."
+ if [ $result -eq 0 ] ; then
+ result=100
+ fi
+ fi
+ fi
+}
+
+result=0 # default, no change
+
+OPT=$1
+shift
+
+case ${OPT} in
+ "all"|"")
+ echo "Stopping all mycroft-core services"
+ end_process "skills"
+ end_process "audio"
+ end_process "speech"
+ end_process "enclosure"
+ end_process "messagebus.service"
+ ;;
+ "bus")
+ end_process "messagebus.service"
+ ;;
+ "audio")
+ end_process "audio"
+ ;;
+ "skills")
+ end_process "skills"
+ ;;
+ "voice")
+ end_process "speech"
+ ;;
+ "enclosure")
+ end_process "enclosure"
+ ;;
+ *)
+ help
+ ;;
+esac
+
+# Exit codes:
+# 0 if nothing changed (e.g. --help or no process was running)
+# 100 at least one process was stopped
+# 120 if any process had to be killed
+exit $result
diff --git a/dev_setup.sh b/dev_setup.sh
index 4290850bda03..7181c82f2ba1 100755
--- a/dev_setup.sh
+++ b/dev_setup.sh
@@ -25,6 +25,12 @@ set -Ee
cd $(dirname $0)
TOP=$(pwd -L)
+if [ -n "${XDG_CACHE_HOME+x}" ]; then
+ logdir="$XDG_CACHE_HOME/mycroft"
+else
+ logdir="$HOME/.cache/mycroft"
+fi
+
function clean_mycroft_files() {
echo '
This will completely remove any files installed by mycroft (including pairing
@@ -34,11 +40,12 @@ Do you wish to continue? (y/n)'
read -N1 -s key
case $key in
[Yy])
- sudo rm -rf /var/log/mycroft
+ rm -rf $logdir
rm -f /var/tmp/mycroft_web_cache.json
rm -rf "${TMPDIR:-/tmp}/mycroft"
rm -rf "$HOME/.mycroft"
sudo rm -rf "/opt/mycroft"
+ ${VIRTUALENV}/bin/pip uninstall .
exit 0
;;
[Nn])
@@ -227,33 +234,6 @@ locally?'
fi
echo
- # Add mycroft-core/bin to the .bashrc PATH?
- sleep 0.5
- echo '
-There are several Mycroft helper commands in the bin folder. These
-can be added to your system PATH, making it simpler to use Mycroft.
-Would you like this to be added to your PATH in the .profile?'
- if get_YN ; then
- echo -e "$HIGHLIGHT Y - Adding Mycroft commands to your PATH $RESET"
-
- if [[ ! -f ~/.profile_mycroft ]] ; then
- # Only add the following to the .profile if .profile_mycroft
- # doesn't exist, indicating this script has not been run before
- echo '' >> ~/.profile
- echo '# include Mycroft commands' >> ~/.profile
- echo 'source ~/.profile_mycroft' >> ~/.profile
- fi
-
- echo "
-# WARNING: This file may be replaced in future, do not customize.
-# set path so it includes Mycroft utilities
-if [ -d \"${TOP}/bin\" ] ; then
- PATH=\"\$PATH:${TOP}/bin\"
-fi" > ~/.profile_mycroft
- echo -e "Type ${CYAN}mycroft-help$RESET to see available commands."
- else
- echo -e "$HIGHLIGHT N - PATH left unchanged $RESET"
- fi
# Create a link to the 'skills' folder.
sleep 0.5
@@ -332,18 +312,15 @@ Please review the following package changes carefully."
fi
}
-
function open_suse_install() {
$SUDO zypper install -y git python3 python3-devel libtool libffi-devel libopenssl-devel autoconf automake bison swig portaudio-devel mpg123 flac curl libicu-devel pkg-config libjpeg-devel libfann-devel python3-curses pulseaudio
$SUDO zypper install -y -t pattern devel_C_C++
}
-
function fedora_install() {
$SUDO dnf install -y git python3 python3-devel python3-pip python3-setuptools python3-virtualenv pygobject3-devel libtool libffi-devel openssl-devel autoconf bison swig glib2-devel portaudio-devel mpg123 mpg123-plugins-pulseaudio screen curl pkgconfig libicu-devel automake libjpeg-turbo-devel fann-devel gcc-c++ redhat-rpm-config jq make
}
-
function arch_install() {
$SUDO pacman -S --needed --noconfirm git python python-pip python-setuptools python-virtualenv python-gobject libffi swig portaudio mpg123 screen flac curl icu libjpeg-turbo base-devel jq pulseaudio pulseaudio-alsa
@@ -356,7 +333,6 @@ function arch_install() {
)
}
-
function centos_install() {
$SUDO yum install epel-release
redhat_common_install
@@ -513,7 +489,7 @@ if ! grep -q "$TOP" $VENV_PATH_FILE ; then
' "$VENV_PATH_FILE"
fi
-# install required python modules
+# Install required python modules
if ! pip install -r requirements/requirements.txt ; then
echo 'Warning: Failed to install required dependencies. Continue? y/N'
read -n1 continue
@@ -537,6 +513,8 @@ fi
if ! pip install -r requirements/tests.txt ; then
echo "Warning: Test requirements failed to install. Note: normal operation should still work fine..."
fi
+# Actually installing Mycroft and it's deps
+pip install .
SYSMEM=$(free | awk '/^Mem:/ { print $2 }')
MAXCORES=$(($SYSMEM / 2202010))
@@ -582,15 +560,5 @@ chmod +x bin/mycroft-say-to
chmod +x bin/mycroft-skill-testrunner
chmod +x bin/mycroft-speak
-# create and set permissions for logging
-if [[ ! -w /var/log/mycroft/ ]] ; then
- # Creating and setting permissions
- echo 'Creating /var/log/mycroft/ directory'
- if [[ ! -d /var/log/mycroft/ ]] ; then
- $SUDO mkdir /var/log/mycroft/
- fi
- $SUDO chmod 777 /var/log/mycroft/
-fi
-
#Store a fingerprint of setup
md5sum requirements/requirements.txt requirements/extra-audiobackend.txt requirements/extra-stt.txt requirements/extra-mark1.txt requirements/tests.txt dev_setup.sh > .installed
diff --git a/requirements/tests.txt b/requirements/tests.txt
index 9e038123e51a..306320db3e8b 100644
--- a/requirements/tests.txt
+++ b/requirements/tests.txt
@@ -5,7 +5,7 @@ pytest-cov==2.8.1
cov-core==1.15.0
sphinx==2.2.1
sphinx-rtd-theme==0.4.3
-git+https://github.com/behave/behave@v1.2.7.dev1
+behave @ git+https://github.com/behave/behave@v1.2.7.dev1
allure-behave==2.8.10
python-vlc==1.1.2
diff --git a/setup.py b/setup.py
index 963c503e4d2f..815fceaa4c65 100644
--- a/setup.py
+++ b/setup.py
@@ -66,6 +66,7 @@ def required(requirements_file):
'mark1': required('requirements/extra-mark1.txt'),
'stt': required('requirements/extra-stt.txt')
},
+ tests_require=required('requirements/tests.txt'),
packages=find_packages(include=['mycroft*']),
include_package_data=True,
@@ -80,5 +81,9 @@ def required(requirements_file):
'mycroft-enclosure-client=mycroft.client.enclosure.__main__:main',
'mycroft-cli-client=mycroft.client.text.__main__:main'
]
- }
+ },
+ scripts=[
+ 'bin/mycroft-start',
+ 'bin/mycroft-stop'
+ ]
)