Install improvements
[EVA-2020-02-2.git] / install.sh
... / ...
CommitLineData
1#!/bin/bash
2
3CONFIG=/boot/config.txt
4DATESTAMP=`date "+%Y-%M-%d-%H-%M-%S"`
5CONFIG_BACKUP=false
6APT_HAS_UPDATED=false
7USER_HOME=/home/$SUDO_USER
8RESOURCES_TOP_DIR=$USER_HOME/Pimoroni
9WD=`pwd`
10
11user_check() {
12 if [ $(id -u) -ne 0 ]; then
13 printf "Script must be run as root. Try 'sudo ./install.sh'\n"
14 exit 1
15 fi
16}
17
18confirm() {
19 if [ "$FORCE" == '-y' ]; then
20 true
21 else
22 read -r -p "$1 [y/N] " response < /dev/tty
23 if [[ $response =~ ^(yes|y|Y)$ ]]; then
24 true
25 else
26 false
27 fi
28 fi
29}
30
31prompt() {
32 read -r -p "$1 [y/N] " response < /dev/tty
33 if [[ $response =~ ^(yes|y|Y)$ ]]; then
34 true
35 else
36 false
37 fi
38}
39
40success() {
41 echo -e "$(tput setaf 2)$1$(tput sgr0)"
42}
43
44inform() {
45 echo -e "$(tput setaf 6)$1$(tput sgr0)"
46}
47
48warning() {
49 echo -e "$(tput setaf 1)$1$(tput sgr0)"
50}
51
52function do_config_backup {
53 if [ ! $CONFIG_BACKUP == true ]; then
54 CONFIG_BACKUP=true
55 FILENAME="config.preinstall-$LIBRARY_NAME-$DATESTAMP.txt"
56 inform "Backing up $CONFIG to /boot/$FILENAME\n"
57 cp $CONFIG /boot/$FILENAME
58 mkdir -p $RESOURCES_TOP_DIR/config-backups/
59 cp $CONFIG $RESOURCES_TOP_DIR/config-backups/$FILENAME
60 if [ -f "$UNINSTALLER" ]; then
61 echo "cp $RESOURCES_TOP_DIR/config-backups/$FILENAME $CONFIG" >> $UNINSTALLER
62 fi
63 fi
64}
65
66function apt_pkg_install {
67 PACKAGES=()
68 PACKAGES_IN=("$@")
69 for ((i = 0; i < ${#PACKAGES_IN[@]}; i++)); do
70 PACKAGE="${PACKAGES_IN[$i]}"
71 printf "Checking for $PACKAGE\n"
72 dpkg -L $PACKAGE > /dev/null 2>&1
73 if [ "$?" == "1" ]; then
74 PACKAGES+=("$PACKAGE")
75 fi
76 done
77 PACKAGES="${PACKAGES[@]}"
78 if ! [ "$PACKAGES" == "" ]; then
79 echo "Installing missing packages: $PACKAGES"
80 if [ ! $APT_HAS_UPDATED ]; then
81 apt update
82 APT_HAS_UPDATED=true
83 fi
84 apt install -y $PACKAGES
85 if [ -f "$UNINSTALLER" ]; then
86 echo "apt uninstall -y $PACKAGES"
87 fi
88 fi
89}
90
91user_check
92
93apt_pkg_install python-configparser
94
95CONFIG_VARS=`python - <<EOF
96from configparser import ConfigParser
97c = ConfigParser()
98c.read('library/setup.cfg')
99p = dict(c['pimoroni'])
100# Convert multi-line config entries into bash arrays
101for k in p.keys():
102 fmt = '"{}"'
103 if '\n' in p[k]:
104 p[k] = "'\n\t'".join(p[k].split('\n')[1:])
105 fmt = "('{}')"
106 p[k] = fmt.format(p[k])
107print("""
108LIBRARY_NAME="{name}"
109LIBRARY_VERSION="{version}"
110""".format(**c['metadata']))
111print("""
112PY3_DEPS={py3deps}
113PY2_DEPS={py2deps}
114SETUP_CMDS={commands}
115CONFIG_TXT={configtxt}
116""".format(**p))
117EOF`
118
119if [ $? -ne 0 ]; then
120 warning "Error parsing configuration...\n"
121 exit 1
122fi
123
124eval $CONFIG_VARS
125
126RESOURCES_DIR=$RESOURCES_TOP_DIR/$LIBRARY_NAME
127UNINSTALLER=$RESOURCES_DIR/uninstall.sh
128
129cat << EOF > $UNINSTALLER
130printf "It's recommended you run these steps manually.\n"
131printf "If you want to run the full script, open it in\n"
132printf "an editor and remove 'exit 1' from below.\n"
133exit 1
134EOF
135
136printf "$LIBRARY_NAME $LIBRARY_VERSION Python Library: Installer\n\n"
137
138cd library
139
140printf "Installing for Python 2..\n"
141apt_pkg_install "${PY2_DEPS[@]}"
142python setup.py install > /dev/null
143if [ $? -eq 0 ]; then
144 success "Done!\n"
145 echo "pip uninstall $LIBRARY_NAME" >> $UNINSTALLER
146fi
147
148if [ -f "/usr/bin/python3" ]; then
149 printf "Installing for Python 3..\n"
150 apt_pkg_install "${PY3_DEPS[@]}"
151 python3 setup.py install > /dev/null
152 if [ $? -eq 0 ]; then
153 success "Done!\n"
154 echo "pip3 uninstall $LIBRARY_NAME" >> $UNINSTALLER
155 fi
156fi
157
158cd $WD
159
160for ((i = 0; i < ${#SETUP_CMDS[@]}; i++)); do
161 CMD="${SETUP_CMDS[$i]}"
162 # Attempt to catch anything that touches /boot/config.txt and trigger a backup
163 if [[ "$CMD" == *"raspi-config"* ]] || [[ "$CMD" == *"$CONFIG"* ]] || [[ "$CMD" == *"\$CONFIG"* ]]; then
164 do_config_backup
165 fi
166 eval $CMD
167done
168
169for ((i = 0; i < ${#CONFIG_TXT[@]}; i++)); do
170 CONFIG_LINE="${CONFIG_TXT[$i]}"
171 if ! [ "$CONFIG_LINE" == "" ]; then
172 do_config_backup
173 inform "Adding $CONFIG_LINE to $CONFIG\n"
174 sed -i "s/^#$CONFIG_LINE/$CONFIG_LINE/" $CONFIG
175 if ! grep -q "^$CONFIG_LINE" $CONFIG; then
176 printf "$CONFIG_LINE\n" >> $CONFIG
177 fi
178 fi
179done
180
181if [ -d "examples" ]; then
182 if confirm "Would you like to copy examples to $RESOURCES_DIR?"; then
183 inform "Copying examples to $RESOURCES_DIR"
184 mkdir -p $RESOURCES_DIR
185 cp -r examples/ $RESOURCES_DIR
186 echo "rm -r $RESOURCES_DIR" >> $UNINSTALLER
187 fi
188fi
189
190success "\nAll done!"
191inform "If this is your first time installing you should reboot for hardware changes to tkae effect.\n"
192inform "Find uninstall steps in $UNINSTALLER\n"