|
|
|
#!/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
|