-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathFirefox-updater
145 lines (119 loc) · 5.14 KB
/
Firefox-updater
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
#! /bin/bash
#----------------------------------------------------------------------
# Description: the official Linux x86-64 Firefox distribution updater
# Allows you to update Firefox from command line/CLI/terminal
#
# Author: Artem S. Tashkinov
# Created at: Wed Dec 20 13:50 2017
# 2019-05-29 15:08:05 Firefox 68 fix?
# 2022-12-17 01:47:32 Firefox 108 fix
# Computer: localhost.localdomain
# System: Linux 4.14.3-300.fc27.x86_64 on x86_64
#
# Copyright (c) 2017-2022 Artem S. Tashkinov All rights reserved.
#----------------------------------------------------------------------
# Comment out to disable or set the number to add an iptables rule for the OUTPUT chain
# firewall=6
diewithmsg()
{
echo "ERROR: $1"
exit 1
}
sanitychecker()
{
test -z "$1" && diewithmsg "Empty version string. Perhaps this script needs to be updated or wget failed."
result=`echo "$1" | sed 's/\.//g;s/b//;s/[0-9]//g;s/esr//'`
test -n "$result" && diewithmsg "The version string [$1] is wrong."
}
normalize()
{
# Add .0 for XX.0 releases, i.e. 60.0 becomes 60.0.0; remove esr; remove beta; awk: 60.1.2 -> 60 000 000 + 1000 + 2
# will fail to upgrade beta to release
echo "$1" | sed 's/^[0-9]*\.0$/\0.0/;s/esr//;s/b/\./' | awk -F "." '{print $1*1000000+$2*1000+$3}'
}
extractversion()
{
# Firefox 108+ fix
datasrc=modules/AppConstants.jsm
unzip -p "$1/omni.ja" "$datasrc" &> /dev/null || datasrc=modules/AppConstants.sys.mjs
unzip -p "$1/omni.ja" "$datasrc" 2>/dev/null | egrep "MOZ_APP_VERSION_DISPLAY|MOZ_UPDATE_CHANNEL|INSTALL_LOCALE" | sed 's/: /=/;s/,//'
# Firefox 68 fix
flocale=`unzip -p "$1/omni.ja" "$datasrc" 2>/dev/null | grep INSTALL_LOCALE`
test -z "$flocale" && echo "INSTALL_LOCALE=`unzip -p "$1/omni.ja" update.locale 2>/dev/null`"
}
fetch()
{
wget --progress=dot:giga -O update.mar "$1"
}
unzip -v &> /dev/null || diewithmsg "Please install unzip first!"
wget -V &> /dev/null || diewithmsg "Please install wget first!"
bc -v &> /dev/null || diewithmsg "Please install bc first!"
test -z "$2" && diewithmsg "Usage is: `basename "$0"` user_for_update firefox_installation_directory forced_new_version[optional]"
grep -qw "$1" /etc/passwd || diewithmsg "Unable to find the user '$1'"
test -f "$2/firefox" || diewithmsg "'$2' is not a valid Firefox installation directory"
id=`id -u` || diewithmsg "id failed!"
if [ "$id" == "0" ]; then
if [ -n "$firewall" ]; then
if [ -z "`iptables-save | grep uid-owner\ $1`" ]; then
echo -n "Adding iptables rule number $firewall for the user $1 ... "
iptables -I OUTPUT "$firewall" -p tcp -m owner --uid-owner "$1" -j ACCEPT && echo OK || diewithmsg "Failed"
else
echo "An iptables rule is already active"
fi
fi
# Change files/directories ownership unconditionally
echo -n "Applying permissions $1:$1 for '$2' ... "
chown -Rc "$1:$1" "$2" && echo OK || diewithmsg "This mustn't happen."
echo -n "Dropping root privileges ... "
sudo -u "$1" "$0" "$1" "$2" "$3"
exit $?
fi
echo "OK"
echo "Running as user '`id -un`'."
source <(extractversion "$2")
versionhave="$MOZ_APP_VERSION_DISPLAY"
echo "Locale: $INSTALL_LOCALE"
if [ "$MOZ_UPDATE_CHANNEL" == "beta" ]; then
echo "Selected the BETA update channel"
channel="-beta"
elif [ "$MOZ_UPDATE_CHANNEL" == "esr" ]; then
echo "Selected the ESR update channel"
channel="-esr"
versionhave="${versionhave}esr"
else
echo "Selected the STABLE update channel"
channel=""
fi
echo -n "Installed version: "
sanitychecker "$versionhave"
echo "$versionhave"
echo -n "Available version: "
versionnext="$3"
if [ -z "$3" ]; then
versionnext=`wget --spider --timeout=5 "https://download.mozilla.org/?product=firefox$channel-latest&os=linux64&lang=$INSTALL_LOCALE" 2>&1 | grep Location | sed 's/.*releases\/\(.*\)\/linux.*/\1/'`
fi
sanitychecker "$versionnext"
echo "$versionnext"
test "$versionhave" == "$versionnext" && echo "You're up to date. Exiting." && exit 0
norm_vershave=`normalize "$versionhave"`
norm_versnext=`normalize "$versionnext"`
# bc: the result of all boolean operations are 0 and 1 (for false and true) as in relational expressions.
test "`echo "$norm_vershave > $norm_versnext" | bc -l`" -eq 1 && diewithmsg "The installed version is newer than the available update! Perhaps you've updated manually."
workdir=`mktemp -d`
test -d "$workdir" || diewithmsg "Unable to create a working directory"
cd "$workdir" || diewithmsg "Unable to enter a working directory"
url_base="https://ftp.mozilla.org/pub/firefox/releases/$versionnext/update/linux-x86_64/$INSTALL_LOCALE"
upd_incr="firefox-$versionhave-$versionnext.partial.mar"
upd_full="firefox-$versionnext.complete.mar"
url_incr="$url_base/$upd_incr"
url_full="$url_base/$upd_full"
echo -e "\nTrying to download delta from $versionhave to $versionnext ... "
if ! fetch "$url_incr"; then
echo "Trying to download full update to $versionnext ... "
fetch "$url_full" || diewithmsg "Cannot download neither update"
fi
echo "Applying update ..."
LD_LIBRARY_PATH="$2" "$2/updater" "$workdir" "$2" "$2"
echo -n "Cleaning up ... "
rm -rf "$workdir" && echo OK
echo "All done"