Después de resolver el problema con el DNS en el equipo de laboratorio tenía varias actualizaciones pendientes de instalar.
Sin embargo, una de las actualizaciones ha fallado por no tener bien resueltas las depedencias:
$ sudo apt upgrade -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
python-samba : Depends: libwbclient0 (= 2:4.5.16+dfsg-1+deb9u1) but 2:4.5.16+dfsg-1+deb9u2 is installed
Depends: samba-libs (= 2:4.5.16+dfsg-1+deb9u1) but 2:4.5.16+dfsg-1+deb9u2 is installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
Siguiendo las instrucciones de la salida del comando, he lanzado sudo apt --fix-broken install
:
$ sudo apt --fix-broken install
...
SyntaxError: invalid syntax
dpkg: error processing archive /var/cache/apt/archives/python-samba_2%3a4.5.16+dfsg-1+deb9u2_amd64.deb (--unpack):
subprocess new pre-removal script returned error exit status 1
Traceback (most recent call last):
File "/usr/bin/pycompile", line 35, in <module>
from debpython.version import SUPPORTED, debsorted, vrepr, \
File "/usr/share/python/debpython/version.py", line 24, in <module>
from ConfigParser import SafeConfigParser
ImportError: No module named 'ConfigParser'
dpkg: error while cleaning up:
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
/var/cache/apt/archives/python-samba_2%3a4.5.16+dfsg-1+deb9u2_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Buscando información sobre el error
A través de Google he encontrado esta entrada en StackExchange: How to remove/install a package that is not fully installed?.
La respuesta indica que el fallo se encuentra en el pre-removal script returned error exit status 1, por lo que lo que hay que hacer es revisar este script y ver qué hace para entenderlo.
Aunque el consejo parece lícito, he perdido un buen rato revisando el script y ejecutando comandos potencialmente peligrosos como root
; el script lista los diferentes scripts en Python que componen el paquete python-samba
y los elimina:
$ cat /var/lib/dpkg/info/python-samba.prerm
#!/bin/sh
set -e
# Automatically added by dh_python2:
if which pyclean >/dev/null 2>&1; then
pyclean -p python-samba
else
dpkg -L python-samba | grep \.py$ | while read file
do
rm -f "${file}"[co] >/dev/null
done
fi
# End automatically added section
Me ha parecido sospechoso el [co]
tras el nombre de fichero, pero después de eliminarlo, obtenía el mismo error.
Cambiando el enfoque
Revisando de nuevo el error me he concentrado en la parte del ImportError
:
$ sudo apt install python-samba --upgrade
...
ImportError: No module named 'ConfigParser'
dpkg: error while cleaning up:
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
/var/cache/apt/archives/python-samba_2%3a4.5.16+dfsg-1+deb9u2_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
En la entrada de StackOverflow: Python 3 ImportError: No module named ‘ConfigParser’ se deja bien claro que ConfigParser
ya no existe en Python 3; ha sido renombrado a configparser
, por lo que el paquete que lo usa no es compatible con Python 3:
In Python 3,
ConfigParser
has been renamed toconfigparser
for PEP 8 compliance. It looks like the package you are installing does not support Python 3.
He comprobado la versión de Python y ¡boom! Python 3:
$ python --version
Python 3.5.3
Solución
Si el problema es que el paquete no es compatible con Python 3, ¿habría alguna manera de ejecutarlo con Python 2?
Por otras instalaciones de Debian que he realizado sabía que en el sistema están instaladas tanto la versión 2 como la 3.
Vamos a comprobarlo:
$ ls -l /usr/bin/python*
lrwxrwxrwx 1 root root 16 May 19 18:08 /usr/bin/python -> /usr/bin/python3
lrwxrwxrwx 1 root root 9 Jan 24 2017 /usr/bin/python2 -> python2.7
-rwxr-xr-x 1 root root 3779512 Sep 26 2018 /usr/bin/python2.7
lrwxrwxrwx 1 root root 9 Jan 20 2017 /usr/bin/python3 -> python3.5
-rwxr-xr-x 2 root root 4751184 Sep 27 2018 /usr/bin/python3.5
-rwxr-xr-x 2 root root 4751184 Sep 27 2018 /usr/bin/python3.5m
lrwxrwxrwx 1 root root 10 Jan 20 2017 /usr/bin/python3m -> python3.5m
De hecho, cuando lanzas el comando python
, en realidad se encuentra el enlace simbólico que desde /usr/bin/python
apunta a /usr/bin/python3
(que a su ver apunta a /usr/bin/python3.5
).
Cambiando la versión de Python usada en el sistema
Para “volver” a Python 2 lo único que tengo que hacer es deshacer el enlace que apunta de /usr/bin/python
a Python 3.5 y hacer que apunte a Python 2.7:
$ sudo unlink /usr/bin/python
$ sudo ln -s /usr/bin/python2.7 /usr/bin/python
Después de validar que python
apunta a la versión 2.7, lanzo de nuevo el comando sudo apt upgrade -y
y ¡esta vez todo funciona correctamente!.
Tras realizar la actualización, de eliminado el enlace a la versión 2.7 y he vuelto a crear el enlace para la versión 3.5.