You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
input-remapper/scripts/setup.sh

178 lines
6.9 KiB
Bash

#!/usr/bin/env bash
# Provides commands for installing and uninstalling input-remapper in the system.
# Supports using the system's `/usr/bin/python3` or the local `python3`.
# Provides commands for cleaning up everything.
# Supports installation of the modules in a virtual env.
python=/usr/bin/python3 # python executable used by this script
script="$(readlink -f "$0")" # absolute path of this script
scripts="$(dirname $"$script")" # dir of this script
source="$(dirname "$scripts")" # input-remapper source dir
build="$source/build" # build dir used during installation
bin="$source/bin" # source dir of the binaries
project="$(basename "$source")" # name of the source dir (must be "input-remapper")
# sanity that check we are managing the right source code
if test "$project" = "input-remapper"
then echo "using input-remapper sources in '$source'"
else echo "could not find input-remapper at '$source'"; exit 1
fi
stop_service() {
echo "disabling service"
sudo systemctl stop input-remapper.service 2> /dev/null
sudo systemctl disable input-remapper.service 2> /dev/null
}
start_service() {
echo "starting service"
sudo systemctl enable input-remapper.service
sudo systemctl restart input-remapper.service
input-remapper-control --command autoload
sudo systemctl status input-remapper.service --no-pager -l
}
# install using the defined $python and record which file are installed
system_install() {
echo "install: installing using '$python'"
sudo $python "$source/setup.py" install --record "$build/files.txt"
sudo chown "$USER:$USER" build "$build/files.txt"
echo "install: writing list of install dirs to 'build/dirs.txt'"
grep -o '.*input[-_]*remapper.*/' "$build/files.txt" | sort -r -u > "$build/dirs.txt"
}
# use whatever python3 is currently used even in a virtual env
local_install() {
if test -n "$VIRTUAL_ENV"; then
echo "install: running in virtual env '$VIRTUAL_ENV'"
site_packages="$(find "$VIRTUAL_ENV" -name site-packages)"
echo "install: temporarily ingesting site-packages path '$site_packages' into binaries"
inject_path inject "$site_packages"
fi
echo "install: using local python3"
python=python3 system_install
if test -n "$VIRTUAL_ENV"; then
echo "install: removing temporary site-packages path from binaries"
inject_path uninject
fi
}
# determine which files were installed an then remove them together with any empty target dirs
uninstall() {
echo "uninstall: removing previously recorded installation files"
if test -e "$build/files.txt" -a -e "$build/dirs.txt"; then
echo "uninstall: removing files from build/files.txt"
sudo xargs -I "FILE" rm -v -f "FILE" <"$build/files.txt"
echo "uninstall: removing empty dirs from build/dirs.txt"
sudo xargs -I "FILE" rmdir --parents --ignore-fail-on-non-empty "FILE" <"$build/dirs.txt" 2> /dev/null
return 0
else
echo "uninstall: build/files.txt or build/dirs.txt not found, please reinstall using '$0 install' first"
return 1
fi
}
# basic build file cleanup
remove_build_files() {
echo "clean: removing build files"
sudo rm -rf "$source/build"
sudo rm -rf "$source/input_remapper.egg-info"
}
# manual removal of the main system files
remove_system_files() {
echo "manual removal: cleaning up /usr/bin binaries"
sudo rm -f /usr/bin/input-remapper-gtk
sudo rm -f /usr/bin/input-remapper-service
sudo rm -f /usr/bin/input-remapper-reader-service
sudo rm -f /usr/bin/input-remapper-control
sudo rm -f /usr/bin/key-remapper-gtk
sudo rm -f /usr/bin/key-remapper-service
sudo rm -f /usr/bin/key-remapper-control
echo "manual removal: cleaning up /usr/share and service files"
sudo rm -rf /usr/share/input-remapper
sudo rm -f /usr/share/applications/input-remapper-gtk.desktop
sudo rm -f /usr/lib/systemd/system/input-remapper.service
echo "manual removal: cleaning up /etc, config, and startup files"
sudo rm -f /etc/dbus-1/system.d/inputremapper.Control.conf
sudo rm -f /etc/xdg/autostart/input-remapper-autoload.desktop
sudo rm -f /usr/lib/udev/rules.d/99-input-remapper.rules
}
# find what is installed and print it (returns 1 if anything is found)
check_system_files() {
echo "checking for installed system files"
files="$(
find /usr -name 'input*remapper*' 2> /dev/null
find /etc -name 'input*remapper*' 2> /dev/null
find $HOME/.local -name 'input*remapper*' 2> /dev/null
)"
if test -n "$files"; then
echo -e "system files installed:\n$files"
return 1
fi
}
inject_path() {
case "$1" in
inject)
inject_path="${2:-"$source"}"
echo "inject import path '$inject_path' in bin file sources"
sed -i "s#^import sys\$#import sys; sys.path.append(\"$inject_path\")#" "$bin"/input-remapper*
;;
uninject)
echo "remove extra import path in bin file sources"
sed -i "s#^import sys; sys\\.path\\.append.*#import sys#" "$bin"/input-remapper*
;;
*) echo "usage: $0 inject|uninject [PATH]"; return 1;;
esac
echo "injection result:"
grep --color -E 'import sys$|import sys;.*' "$bin"/*
echo "injection finished"
}
usage() {
cat <<-EOF
usage: $script [COMMAND..]
commands:
help show this help
install install using '$python $source/setup.py' (system python)
local-install install using 'python3 $source/setup.py' (local python)
uninstall uninstall everything
show find and show all installed filles
clean clean up build files
purge find and remove everything that was installed
inject [path] inject a 'sys.path' into the files in '$bin'
uninject undo the path injection
start start the service
stop stop the service
EOF
}
while test $# -gt 0; do case "$1" in
inst*) stop_service; system_install && start_service || exit 1 ;;
local-inst*) stop_service; local_install && start_service || exit 1 ;;
uninst*) stop_service; uninstall && check_system_files || exit 1 ;;
start) start_service ;;
stop) stop_service ;;
show) check_system_files ;;
clean) remove_build_files ;;
inject) if test -e "$2" # check if next arg is a 'path'
then inject_path inject "$2"; shift # use it and remove it
else inject_path inject # use the default path
fi ;;
uninject) inject_path uninject ;;
purge) uninstall; remove_system_files; remove_build_files; check_system_files || exit 1 ;;
help|-h|--help) usage; exit 0 ;;
*) usage; exit 1 ;;
esac; shift; done