Objetivo
Script para actualizar Firefox a partir de Firefox Quantum.
TL;DR: Instalar en /usr/local/sbin
el script
upgrade-firefox.
Historia y motivación
La actualización utilizando sudo
ya no funciona.
Hace tiempo descargué Firefox en /opt
y cada vez que
aparecía el mensaje indicando que Firefox no podía actualizarse
automáticamente (debido a falta de permisos)
realizaba la actualización ejecutando Firefox desde consola con sudo
:
$ mkdir /tmp/asdf
$ sudo /opt/firefox/firefox --no-remote --profile /tmp/asdf
y luego gráficamente yendo a menú > Help > About Firefox. Allí debía esperar
a que Firefox descargara los archivos necesarios y luego reiniciaba la
aplicación.
Por último, al terminar la instalación se eliminaban los archivos generados
durante la actualización con sudo
:
$ sudo rm -fr /tmp/asdf /root/.mozilla
NOTA: el sistema operativo utilizado es debian testing (buster), y los
permisos de /opt/firefox
son root:root
(no modificable por usuarios
normales).
Ahora, a partir de la versión 60.0, los pasos anteriores ya no son posibles
debido al bug 1323302: Disallow Firefox from running as sudo, ya
que se obtiene el siguiente mensaje de error al intentar ejecutar Firefox con
sudo
:
Running Firefox as root in a regular user’s session is not supported. ($XAUTHORITY is /home/XXX/.Xauthority which is owned by XXX.)
Solución: Creación de script para actualizar Firefox
A partir del problema anterior se busca crear un script que permita actualizar Firefox.
Para ello se realizará un cambio en la estructura de directorios utilizada actualmente:
-
En lugar de tener la última versión de Firefox en
/opt/firefox
e ir actualizando dicho directorio, se instalarán las distintas versiones de Firefox en el directorio/opt
, utilizando como sufijo del directorio el número de versión (el contenido del tar de Firefox tiene siempre como directorio raizfirefox
). -
La última versión de Firefox estará disponible en el directorio
/opt/firefox-latest
como un enlace simbólico al directorio de prefijo/opt/firefox-
cuya versión se corresponda a la más reciente.
Para utilizar el script de actualización, al que se llamará upgrade-firefox
,
se deberá descargar manualmente una versión del sitio de Firefox y utilizar
esta con el script. Como ejemplo, si se descarga la versión 62.0.3 hay que
ejecutar el siguiente comando para instalarlo:
$ sudo upgrade-firefox firefox-62.0.3.tar.bz2
Por lo anterior, el script debe instalar el contenido del tar en /opt
y
actualizar el link simbólico /opt/firefox-latest
, lo que se realizará en
las siguientes etapas:
-
Obtener la versión de Firefox del archivo (
$1
corresponde al nombre de archivo):version=$(basename "$1") version=${version#firefox-} version=${version%.tar.bz2}
-
Descomprimir la nueva versión de Firefox en
/opt
:tar xf firefox-$version.tar.bz2 -C /opt/ --transform 's/^firefox/firefox-'$version'/'
-
Actualizar el link simbólico
/opt/firefox-latest
:ln -sf -T firefox-$version /opt/firefox-latest
Para que los pasos anteriores puedan ejecutarse sin problemas debe verificarse previamente que:
-
El script se esté ejecutando con permisos de administrador:
if [ $EUID -ne 0 ]; then echo "Run with root permissions" >&2 exit 1 fi
-
El script sea invocado con un solo parametro, que se corresponde al tar con la nueva versión de Firefox (¡y que el archivo exista!):
if [ $# -ne 1 ] || ! [[ "$1" =~ ^(.*/)?firefox-[0-9.]*.tar.bz2$ ]]; then echo "Usage: upgrade-firefox /path/to/firefox-<version>.tar.bz2" >&2 exit 1 fi if ! [ -f "$1" ]; then echo "File not exist" >&2 exit 1 fi
-
Que la versión a instalar no esté ya instalada:
if [ -d /opt/firefox-$version ]; then echo "This version of Firefox is already installed" >&2 exit 1 fi
-
Que la versión a instalar sea efectivamente más reciente que la ya existente. Aquí se utiliza el comando
dpkg --compare-versions
para comparar las versiones de Firefox ya que al hacer el script para Debian estamos seguros que el comando está disponible:current=$(find /opt -maxdepth 1 | grep -oP '/opt/firefox-\K\d.*' \ | LC_ALL=C sort -rn | head -1) if dpkg --compare-versions $current ge $version; then echo "This version of Firefox is not the latest" >&2 exit 1 fi
Adicionalmente y para evitar que se acumulen distintas versiones de Firefox en
el directorio /opt
cada vez que se instale una nueva versión de Firefox se
eliminarán todas las versiones anteriores excepto la anterior versión más
reciente y todas aquellas que no posean un archivo de nombre CAN-BE-REMOVED
que se creará automáticamente luego de la instalación. Esto es así porque es
posible que se agreguen manualmente versiones específicas de Firefox en un
futuro y no se desea que sean borradas al instalar una nueva versión utilizando
el script.
Para realizar lo anterior se utilizará el siguiente código:
for old in $(find /opt -maxdepth 1 -name 'firefox-[1-9]*' | LC_ALL=C sort -rV | tail +3); do
[ -e "$old/CAN-BE-REMOVED" ] && rm -fr "$old"
done
El script completo se puede descargar del siguiente link.
Nota: el script contiene las modificaciones descriptas en el post Deshabilitando updates en firefox.