diff --git a/install.sh b/install.sh index 46a721e6..6731f331 100755 --- a/install.sh +++ b/install.sh @@ -1,12 +1,141 @@ #!/usr/bin/env bash -#Basic install script for Fenrir. -read -rp "This will install Fenrir. Press ctrl+C to cancel, or enter to continue." +# Install script for Fenrir Screen Reader +set -e + +# Check if running as root +if [[ $(whoami) != "root" ]]; then + echo "This script must be run as root" + exit 1 +fi + +# Check Python version +pythonVersion=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") +requiredVersion="3.8" +if ! python3 -c "import sys; exit(0 if sys.version_info >= (3, 8) else 1)" 2>/dev/null; then + echo "Python ${requiredVersion} or higher is required. Current version: ${pythonVersion}" + exit 1 +fi + +echo "Fenrir Screen Reader Installation" +echo "==================================" +read -rp "This will install the Fenrir screen reader. Press Ctrl+C to cancel, or Enter to continue." + +# Check for pip3 +if ! command -v pip3 &> /dev/null; then + echo "pip3 is required but not installed. Please install pip3 first." + exit 1 +fi + +# Function to check dependencies +checkDependencies() { + echo "Checking dependencies..." + if python3 check-dependencies.py; then + return 0 + else + return 1 + fi +} + +# Function to install dependencies with pip +installWithPip() { + echo "Installing Python dependencies with pip..." + pip3 install -r requirements.txt --break-system-packages +} + +# Function to detect package manager and provide instructions +detectPackageManager() { + if command -v apt &> /dev/null; then + echo "apt" + elif command -v dnf &> /dev/null; then + echo "dnf" + elif command -v yum &> /dev/null; then + echo "yum" + elif command -v pacman &> /dev/null; then + echo "pacman" + elif command -v zypper &> /dev/null; then + echo "zypper" + else + echo "unknown" + fi +} + +# Function to show package manager instructions +showPackageInstructions() { + local pm=$1 + echo "Package manager installation instructions:" + case $pm in + "apt") + echo " sudo apt update" + echo " sudo apt install python3-evdev python3-daemonize python3-dbus python3-pyudev python3-pexpect" + echo " sudo apt install python3-pyte python3-setproctitle python3-enchant python3-xdg" + echo " sudo apt install speech-dispatcher espeak-ng sox alsa-utils" + ;; + "dnf"|"yum") + echo " sudo $pm install python3-evdev python3-daemonize python3-dbus python3-pyudev python3-pexpect" + echo " sudo $pm install python3-pyte python3-setproctitle python3-enchant python3-pyxdg" + echo " sudo $pm install speech-dispatcher espeak-ng sox alsa-utils" + ;; + "pacman") + echo " sudo pacman -S python-evdev python-daemonize python-dbus python-pyudev python-pexpect" + echo " sudo pacman -S python-pyte python-setproctitle python-pyenchant python-pyxdg" + echo " sudo pacman -S speech-dispatcher espeak-ng sox alsa-utils" + ;; + "zypper") + echo " sudo zypper install python3-evdev python3-daemonize python3-dbus python3-pyudev python3-pexpect" + echo " sudo zypper install python3-pyte python3-setproctitle python3-enchant python3-pyxdg" + echo " sudo zypper install speech-dispatcher espeak-ng sox alsa-utils" + ;; + *) + echo " Unknown package manager. Please install the dependencies manually." + echo " Required packages: evdev, daemonize, dbus-python, pyudev, pexpect, pyte, setproctitle" + echo " System packages: speech-dispatcher, espeak-ng, sox, alsa-utils" + ;; + esac +} + +# Initial dependency check +echo "Performing initial dependency check..." +if ! checkDependencies; then + echo "" + echo "Some dependencies are missing. You have two options:" + echo "1. Install using pip (not recommended uses --break-system-packages)" + echo "2. Install using your system package manager (recommended assuming I got the package names and package manager syntax right)" + echo "" + + read -rp "Use pip to install Python dependencies? (y/N): " usePip + usePip="${usePip:0:1}" + + if [[ "${usePip^}" == "Y" ]]; then + installWithPip + else + packageManager=$(detectPackageManager) + echo "" + showPackageInstructions "$packageManager" + echo "" + echo "Please install the packages above, then press Enter to continue..." + read -r + fi + + # Check dependencies again + echo "Rechecking dependencies..." + if ! checkDependencies; then + echo "Some dependencies are still missing. Please install them manually." + echo "You can run 'python3 check-dependencies.py' to see which ones are missing." + exit 1 + fi +fi + +echo "All dependencies satisfied!" + +# Install Fenrir application files +echo "Installing Fenrir application files..." # Fenrir main application install -m755 -d /opt/fenrirscreenreader cp -af src/* /opt/fenrirscreenreader ln -fs /opt/fenrirscreenreader/fenrir /usr/bin/fenrir + # tools install -m755 -d /usr/share/fenrirscreenreader/tools cp -af tools/* /usr/share/fenrirscreenreader/tools @@ -43,24 +172,49 @@ if [ -f "/etc/fenrirscreenreader/settings/settings.conf" ]; then fi else install -m644 -D "config/settings/settings.conf" /etc/fenrirscreenreader/settings/settings.conf -fi +fi +# Install systemd service if systemd is available +if command -v systemctl &> /dev/null; then + echo "Installing systemd service..." + + # Detect which service file to use + if [ -f "/etc/arch-release" ] || [ -f "/etc/manjaro-release" ]; then + serviceFile="autostart/systemd/Arch/fenrir.service" + else + serviceFile="autostart/systemd/Debian/fenrir.service" + fi + + if [ -f "$serviceFile" ]; then + install -m644 "$serviceFile" /etc/systemd/system/fenrir.service + systemctl daemon-reload + echo "Systemd service installed. Enable with: sudo systemctl enable fenrir" + else + echo "Warning: Systemd service file not found: $serviceFile" + fi +else + echo "Warning: Systemd not detected. Manual service setup may be required." +fi -# end message +# Final message cat << EOF -Installation complete. -install path:/opt/fenrirscreenreader -settings path:/etc/fenrirscreenreader -To test Fenrir: -sudo fenrir +Installation complete! +============================= +Install path: /opt/fenrirscreenreader +Settings path: /etc/fenrirscreenreader -To have Fenrir start on system boot using systemd: -download service file: https://raw.githubusercontent.com/chrys87/fenrir/master/autostart/systemd/Arch/fenrir.service -move the service file to: /etc/systemd/system/fenrir.service -sudo systemctl enable fenrir +Next steps: +1. Test Fenrir: sudo fenrir +2. Enable autostart: sudo systemctl enable fenrir +3. Configure audio (run both as user and root): + - PulseAudio: /usr/share/fenrirscreenreader/tools/configure_pulse.sh + - PipeWire: /usr/share/fenrirscreenreader/tools/configure_pipewire.sh -Pulseaudio users may want to run -/usr/share/fenrirscreenreader/tools/configure_pulse.sh -once from their user account, then once from the root. +For help: +- Documentation: https://git.stormux.org/storm/fenrir +- Configuration: sudo fenrir --help +- Dependency check: python3 check-dependencies.py + +Fenrir installation successful! EOF diff --git a/requirements.txt b/requirements.txt index 7c22f473..604b9636 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,16 @@ -daemonize -evdev -pexpect -pyenchant -pyperclip -pyte -pyudev -pyxdg -setproctitle +daemonize>=2.5.0 +evdev>=1.4.0 +dbus-python>=1.3.0 +pyperclip>=1.8.0 +pyudev>=0.24.0 +pyte>=0.8.0 +setproctitle>=1.3.0 +setuptools>=65.0.0 +pexpect>=4.8.0 + +# Optional dependencies for enhanced functionality: +# pyenchant>=3.2.0 # For spell checking commands +# pyxdg>=0.28 # For XDG base directory support +# PyGObject>=3.42.0 # For GStreamer sound driver +# pyatspi>=2.40.0 # For AT-SPI input driver +# speechd>=0.11.0 # For speech-dispatcher Python bindings diff --git a/setup.py b/setup.py index 9ab7b8e4..af96f6ce 100755 --- a/setup.py +++ b/setup.py @@ -94,17 +94,17 @@ setup( data_files=dataFiles, # Dependent packages (distributions) - python_requires='>=3.6', + python_requires='>=3.8', install_requires=[ - "evdev>=1.1.2", + "evdev>=1.4.0", "daemonize>=2.5.0", - "dbus-python>=1.2.8", - "pyperclip", - "pyudev>=0.21.0", - "setuptools", - "setproctitle", - "pexpect", - "pyte>=0.7.0", + "dbus-python>=1.3.0", + "pyperclip>=1.8.0", + "pyudev>=0.24.0", + "setuptools>=65.0.0", + "setproctitle>=1.3.0", + "pexpect>=4.8.0", + "pyte>=0.8.0", ], ) @@ -113,12 +113,12 @@ if not forceSettingsFlag: # create settings file from example if not exist if not os.path.isfile('/etc/fenrirscreenreader/settings/settings.conf'): try: - copyfile('config/fenrirscreenreader/settings/settings.conf', '/etc/fenrirscreenreader/settings/settings.conf') + copyfile('config/settings/settings.conf', '/etc/fenrirscreenreader/settings/settings.conf') print('create settings file in /etc/fenrirscreenreader/settings/settings.conf') except OSError as e: print(f"Could not copy settings file to destination: {e}") else: - print('settings.conf file found. It is not overwritten automatical') + print('settings.conf file found. It is not overwritten automatically') print('') print('To have Fenrir start at boot:') diff --git a/src/fenrirscreenreader/fenrirVersion.py b/src/fenrirscreenreader/fenrirVersion.py index 104d931a..f6f628fb 100644 --- a/src/fenrirscreenreader/fenrirVersion.py +++ b/src/fenrirscreenreader/fenrirVersion.py @@ -5,4 +5,4 @@ # By Chrys, Storm Dragon, and contributers. version = "2025.06.16" -codeName = "testing" +codeName = "installation-script-updates"