-
Notifications
You must be signed in to change notification settings - Fork 2
/
install_nodejs.sh
327 lines (293 loc) · 14.1 KB
/
install_nodejs.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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
#!/bin/bash
numSubStepMax=9 #the maximum number of different step this script will run (could be less with conditionnals)
#init arguments
forceUpdateNPM=0 #force to update NPM to the latest version
while [[ "$#" -gt 0 ]]; do
case $1 in
--forceNodeVersion) forceNodeVersion="$2"; shift ;;
--firstSubStep) firstSubStep=$2; shift ;;
--lastSubStep) lastSubStep=$2; shift ;;
--forceUpdateNPM) forceUpdateNPM=1 ;;
*) echo "$(t "Option Inconnue"): $1"; tryOrStop false ;;
esac
shift
done
subStep "$(t "Prérequis")"
#ipv4 first for dns (like before nodejs 18)
export NODE_OPTIONS="--dns-result-order=ipv4first"
#prioritize nodesource nodejs : just in case
sudo bash -c "cat >> /etc/apt/preferences.d/nodesource" << EOL
Package: nodejs
Pin: origin deb.nodesource.com
Pin-Priority: 600
EOL
subStep "$(t "Installation des packages nécessaires")"
# apt-get update should have been done in the calling file
try sudo DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::ForceIPv4=true install -y lsb-release build-essential apt-utils git gnupg
subStep "$(t "Vérification du système")"
arch=`arch`;
#jessie as libstdc++ > 4.9 needed for nodejs 12+
lsb_release -c | grep -q jessie
if [ $? -eq 0 ]; then
today=$(date +%Y%m%d)
if [[ "$today" > "20200630" ]]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "ATTENTION Debian 8 Jessie n'est officiellement plus supportée depuis le 30 juin 2020, merci de mettre à jour votre système en version plus récente de Debian !!!")" >> $TMPFOLDER/errorLog.$$
post
exit 1
fi
fi
#stretch doesn't support nodejs 18+
lsb_release -c | grep -q stretch
if [ $? -eq 0 ]; then
today=$(date +%Y%m%d)
if [[ "$today" > "20220630" ]]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "ATTENTION Debian 9 Stretch n'est officiellement plus supportée depuis le 30 juin 2022, merci de mettre à jour votre système en version plus récente de Debian !!!")" >> $TMPFOLDER/errorLog.$$
post
exit 1
fi
fi
#end of support buster except smart
lsb_release -c | grep -q buster
buster=$?
if [ $buster -eq 0 ] && [ "${noSupport:-false}" != true ]; then
if [ ! -f /media/boot/multiboot/meson64_odroidc2.dtb.linux ]; then
today=$(date +%Y%m%d)
if [[ "$today" > "20240630" ]]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "ATTENTION Debian 10 Buster n'est officiellement plus supportée depuis le 30 juin 2024, merci de mettre à jour votre système en version plus récente de Debian !!!")" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "Les dépendances sont bloquées afin d'éviter tout problème, soit") $PLUGIN $(t "fonctionne et donc on y touche plus tant qu'il tourne, soit il ne fonctionne plus et donc il faut mettre à jour votre système en version plus récente de Debian.")" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "Jeedom 4.4.17 est passé à NodeJS 20 qui est incompatible avec Debian 10. PLUS AUCUN SUPPORT NE PEUT ÊTRE FAIT !!! Migrez donc au plus vite !")" >> $TMPFOLDER/errorLog.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
post
exit 1
fi
else
if [[ "$today" > "20241031" ]]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "ATTENTION Debian 10 Buster n'est officiellement plus supportée depuis le 30 juin 2024, merci de mettre à jour votre système en version plus récente de Debian !!!")" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "Les dépendances sont bloquées afin d'éviter tout problème, soit") $PLUGIN $(t "fonctionne et donc on y touche plus tant qu'il tourne, soit il ne fonctionne plus et donc il faut mettre à jour votre système en version plus récente de Debian.")" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "Jeedom 4.4.17 est passé à NodeJS 20 qui est incompatible avec Debian 10. PLUS AUCUN SUPPORT NE PEUT ÊTRE FAIT !!! Migrez donc au plus vite !")" >> $TMPFOLDER/errorLog.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
post
exit 1
else
echo "$HR"
echo "== [WARNING] == $(t "A VERIFIER AU PLUS VITE")"
echo
echo "$HR"
echo "== [WARNING] $(t "ATTENTION Debian 10 Buster n'est officiellement plus supportée depuis le 30 juin 2024, cependant l'image Debian 11 de la Smart a été finalisée par Jeedom (consultez le blog).")"
echo "== [WARNING] $(t "Les dépendances vont quand même se lancer (mais aucun support ne sera fait si celles-ci ne fonctionnent pas !), surveillez les nouvelles de Jeedom afin de mettre à jour en Debian 11 au plus vite quand ils auront sorti leur nouvelle image.")"
fi
fi
fi
if [ $buster -eq 0 ] && [ "${noSupport:-false}" != false ]; then
echo "== [WARNING] $(t "Vous avez refusé le support, Vous utilisez toujours Debian 10 Buster, L'installation des dépendances va se lancer mais il est possible que ça ne fonctionne pas...")"
echo "== [ERROR] $(t "Jeedom 4.4.17 passe à NodeJS 20 qui est incompatible avec Debian 10. PLUS AUCUN SUPPORT N'EST FAIT !!! Migrez donc au plus vite !")"
fi
#x86 32 bits not supported by nodesource anymore
bits=$(getconf LONG_BIT)
if { [ "$arch" = "i386" ] || [ "$arch" = "i686" ]; } && [ "$bits" -eq "32" ]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "$HR" >> $TMPFOLDER/errorLog.$$
echo "== [ERROR] $(t "ATTENTION Votre système est x86 en 32bits et NodeJS n'y est pas supporté, merci de passer en 64bits !!!")" >> $TMPFOLDER/errorLog.$$
post
exit 1
fi
subStep "$(t "Vérification de la version de NodeJS installée")"
if [ -z "$forceNodeVersion" ]; then
requiredNodeVersion=$(jq -r ".engines.node" ${BASEDIR}/package.json)
requiredNodeOperator=$(echo "$requiredNodeVersion" | grep -o "^[<>=]*")
requiredNodeVersion=$(echo "$requiredNodeVersion" | grep -o "[0-9.]*$")
else
requiredNodeVersion=$forceNodeVersion
requiredNodeOperator="=="
fi
NODE_MAJOR=$( [[ $requiredNodeVersion == *.* ]] && echo $requiredNodeVersion | cut -d'.' -f1 || echo $requiredNodeVersion )
if [ -z "$NODE_MAJOR" ]; then
echo 1 > $TMPFOLDER/hasError.$$
echo "== [ERROR] $(t "NODE_MAJOR est vide")" >> $TMPFOLDER/errorLog.$$
echo "$(t "Contenu de") ${BASEDIR}/package.json:" >> $TMPFOLDER/errorLog.$$
cat "${BASEDIR}/package.json" >> $TMPFOLDER/errorLog.$$
echo "$(t "Version de node trouvée requiredNodeVersion"): $requiredNodeVersion" >> $TMPFOLDER/errorLog.$$
if ! command -v jq &> /dev/null; then
echo "$(t "jq n'est pas installé.")" >> $TMPFOLDER/errorLog.$$
fi
post
exit 1
fi
silent type node
if [ $? -eq 0 ]; then actual=`node -v`; else actual='Aucune'; fi
testVer=$(php -r "echo version_compare('${actual}','v${requiredNodeVersion}','${requiredNodeOperator}');")
echo -n "[$(t "Vérification Version NodeJS actuelle") : ${actual} : "
if [[ $testVer == "1" ]]; then
echo_success
new=$actual
else
echo "$(t "Correction...")"
subStep "$(t "Installation de NodeJS") $NODE_MAJOR"
#if npm exists
silent type npm
if [ $? -eq 0 ]; then
npmPrefix=`npm prefix -g`
else
npmPrefix="/usr"
fi
silent sudo DEBIAN_FRONTEND=noninteractive apt-get -y --purge autoremove npm
silent sudo DEBIAN_FRONTEND=noninteractive apt-get -y --purge autoremove nodejs
if [[ $arch == "armv6l" ]]; then
#version to install for armv6 (to check on https://unofficial-builds.nodejs.org/download/release/)
if [[ $NODE_MAJOR == "12" ]]; then
armVer="12.22.12"
elif [[ $NODE_MAJOR == "14" ]]; then
armVer="14.21.3"
elif [[ $NODE_MAJOR == "16" ]]; then
armVer="16.20.2"
elif [[ $NODE_MAJOR == "18" ]]; then
armVer="18.20.2"
elif [[ $NODE_MAJOR == "20" ]]; then
armVer="20.12.2"
fi
echo "$(t "Jeedom Mini ou Raspberry 1, 2 ou zéro détecté, non supporté mais on essaye l'utilisation du paquet non-officiel") v${armVer} $(t "pour") armv6l"
try wget -4 https://unofficial-builds.nodejs.org/download/release/v${armVer}/node-v${armVer}-linux-armv6l.tar.gz
try tar -xvf node-v${armVer}-linux-armv6l.tar.gz
cd node-v${armVer}-linux-armv6l
try sudo cp -f -R * /usr/local/
cd ..
silent rm -fR node-v${armVer}-linux-armv6l*
silent ln -s /usr/local/bin/node /usr/bin/node
silent ln -s /usr/local/bin/node /usr/bin/nodejs
#upgrade to recent npm
forceUpdateNPM=1
else
echo "$(t "Utilisation du dépot officiel")"
#new method
sudo mkdir -p /etc/apt/keyrings
silent sudo rm /etc/apt/keyrings/nodesource.gpg
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
silent sudo rm /etc/apt/sources.list.d/nodesource.list
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | silent sudo tee /etc/apt/sources.list.d/nodesource.list
try sudo apt-get -o Acquire::ForceIPv4=true update
try sudo DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::ForceIPv4=true install -y nodejs
fi
silent npm config set prefix ${npmPrefix}
new=`node -v`;
echo -n "[$(t "Vérification Version NodeJS après install") : ${new} : "
testVerAfter=$(php -r "echo version_compare('${new}','v${requiredNodeVersion}','${requiredNodeOperator}');")
if [[ $testVerAfter != "1" ]]; then
echo_failure -n
echo " -> $(t "relancez les dépendances")"
else
echo_success
fi
fi
silent type npm
if [ $? -ne 0 ]; then
subStep "$(t "Installation de npm car non présent")"
try sudo DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::ForceIPv4=true install -y npm
forceUpdateNPM=1
fi
npmver=`npm -v`;
echo -n "[$(t "Vérification Version NPM") : ${npmver} : "
echo $npmver | grep "8.11.0" &>/dev/null
if [ $? -eq 0 ]; then
echo_failure
forceUpdateNPM=1
else
if [[ $forceUpdateNPM == "1" ]]; then
echo "[ $(t "MàJ demandée") ]"
else
requiredNPMVersion=$(jq -r ".engines.npm" ${BASEDIR}/package.json)
requiredNPMOperator=$(echo "$requiredNPMVersion" | grep -o "^[<>=]*")
requiredNPMVersion=$(echo "$requiredNPMVersion" | grep -o "[0-9.]*$")
if [[ $requiredNPMVersion =~ ^[0-9]+(\.[0-9]+)+$ ]]; then
testNPMVer=$(php -r "echo version_compare('${npmver}','${requiredNPMVersion}','${requiredNPMOperator}');")
if [[ $testNPMVer == "1" ]]; then
echo_success
else
echo "[ $(t "MàJ demandée") ]"
forceUpdateNPM=1
fi
else
echo_success
fi
fi
fi
if [[ $forceUpdateNPM == "1" ]]; then
subStep "$(t "Mise à jour de npm")"
try sudo -E npm install -g npm
fi
silent type npm
if [ $? -eq 0 ]; then
npmPrefix=`npm --silent prefix -g`
npmPrefixSudo=`sudo npm --silent prefix -g`
npmPrefixwwwData=`sudo -u www-data npm --silent prefix -g`
echo -n "[$(t "Vérification") $(t "Prefixe") : $npmPrefix $(t "et") sudo $(t "prefixe") : $npmPrefixSudo $(t "et") www-data $(t "prefixe") : $npmPrefixwwwData : "
if [[ "$npmPrefixSudo" != "/usr" ]] && [[ "$npmPrefixSudo" != "/usr/local" ]]; then
echo_failure
if [[ "$npmPrefixwwwData" == "/usr" ]] || [[ "$npmPrefixwwwData" == "/usr/local" ]]; then
subStep "$(t "Réinitialisation prefixe") ($npmPrefixwwwData) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix $npmPrefixwwwData
else
if [[ "$npmPrefix" == "/usr" ]] || [[ "$npmPrefix" == "/usr/local" ]]; then
subStep "$(t "Réinitialisation prefixe") ($npmPrefix) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix $npmPrefix
else
[ -f /usr/bin/raspi-config ] && { rpi="1"; } || { rpi="0"; }
if [[ "$rpi" == "1" ]]; then
subStep "$(t "Réinitialisation prefixe") (/usr) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix /usr
else
subStep "$(t "Réinitialisation prefixe") (/usr/local) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix /usr/local
fi
fi
fi
else
if [[ "$npmPrefixwwwData" == "/usr" ]] || [[ "$npmPrefixwwwData" == "/usr/local" ]]; then
if [[ "$npmPrefixwwwData" == "$npmPrefixSudo" ]]; then
echo_success
else
echo_failure
subStep "$(t "Réinitialisation prefixe") ($npmPrefixwwwData) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix $npmPrefixwwwData
fi
else
echo_failure
if [[ "$npmPrefix" == "/usr" ]] || [[ "$npmPrefix" == "/usr/local" ]]; then
subStep "$(t "Réinitialisation prefixe") ($npmPrefix) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix $npmPrefix
else
[ -f /usr/bin/raspi-config ] && { rpi="1"; } || { rpi="0"; }
if [[ "$rpi" == "1" ]]; then
subStep "$(t "Réinitialisation prefixe") (/usr) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix /usr
else
subStep "$(t "Réinitialisation prefixe") (/usr/local) $(t "pour") npm `sudo whoami`"
sudo npm config set prefix /usr/local
fi
fi
fi
fi
fi
subStep "$(t "Nettoyage")"
# on nettoie la priorité nodesource
silent sudo rm -f /etc/apt/preferences.d/nodesource
# ADDING ERROR HANDLERS
# fix npm cache integrity issue
add_fix_handler "EINTEGRITY" "" "sudo npm cache clean --force"
# fix npm cache permissions
add_fix_handler "npm \(ERR\!\|error\) fatal: could not create leading directories of '/root/.npm/_cacache/tmp/" "*code 128" "sudo chown -R root:root /root/.npm"
# check for ENOTEMPTY error in both /usr and /usr/local
add_fix_handler "npm \(ERR\!\|error\) dest /usr/\(local/\)\?lib/node_modules/\.homebridge-config-ui-x-" "*ENOTEMPTY local config-ui-x" "sudo rm -fR /usr/local/lib/node_modules/.homebridge-config-ui-x-* &>/dev/null;sudo rm -fR /usr/lib/node_modules/.homebridge-config-ui-x-* &>/dev/null;"
add_fix_handler "npm \(ERR\!\|error\) dest /usr/\(local/\)\?lib/node_modules/\.homebridge-alexa-" "*ENOTEMPTY local alexa" "sudo rm -fR /usr/local/lib/node_modules/.homebridge-alexa-* &>/dev/null;sudo rm -fR /usr/lib/node_modules/.homebridge-alexa-* &>/dev/null;"
add_fix_handler "npm \(ERR\!\|error\) dest /usr/\(local/\)\?lib/node_modules/\.homebridge-gsh-" "*ENOTEMPTY local gsh" "sudo rm -fR /usr/local/lib/node_modules/.homebridge-gsh-* &>/dev/null;sudo rm -fR /usr/lib/node_modules/.homebridge-gsh-* &>/dev/null;"
# fix when sometimes node source is not correct
#add_fix_handler "deb.nodesource.com/node_.x" "" "sudo sed -i 's|node_.x|node_${$NODE_MAJOR}.x|' /etc/apt/sources.list.d/nodesource.list"
#add_fix_handler "deb.nodesource.com/node_.x" "" "sudo sed -i 's|node_.x|node_18.x|' /etc/apt/sources.list.d/nodesource.list"
postSubScript