forked from sezanzeb/input-remapper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup.sh
executable file
·177 lines (155 loc) · 6.86 KB
/
setup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/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