Reemplazar un enlace simbólico con un directorio o un directorio con cualquier tipo de archivo
Debido a una limitación conocida de RPM, no es posible reemplazar un directorio con ningún tipo de archivo o enlace simbólico, ni tampoco es posible reemplazar un enlace simbólico a un directorio con otro directorio sin que RPM produzca errores de conflicto de archivos al intentar instalar el paquete. Para más información sobre los problemas, consulte bug 447156 y bug 646523.
Intenta evitar el problema en el primer lugar
Aunque obviamente no es posible prever todos los casos en los que pueda surgir la necesidad, cuando esta sea previsible, como con las bibliotecas empaquetadas, es mejor usar un enlace simbólico desde el principio, ya que su destino se puede cambiar más fácilmente. Por ejemplo, si tiene una biblioteca libfoo
empaquetada dentro de la estructura de directorios del paquete, colóquela en, por ejemplo, el directorio libfoo.bundled
y cree libfoo como enlace simbólico. Cuando finalmente se elimine la agrupación, solo tendrá que eliminar el directorio y cambiar el enlace simbólico para que apunte al directorio de la biblioteca del sistema correspondiente, sin recurrir a los scriptlets que se describen a continuación.
Solucionarlo con scriptlets
Para solucionar este problema, debe incluir un %pretrans scriptlet que realice manualmente la conversión antes de que RPM intente instalar el paquete.
Tenga en cuenta que los scriptlets '%pretrans' DEBEN escribirse en Lua y, por lo tanto, utilizar '-p <lua>' para funcionar durante la instalación inicial del sistema cuando aún no se ha instalado ningún intérprete.
Utilice cualquiera de los dos fragmentos siguientes que sea necesario en los paquetes que necesitan esta transición, reemplazando /ruta/al/dir
con la ruta al directorio que se está convirtiendo.
Scriptlet para reemplazar un directorio
RPM no puede simplemente eliminar un directorio cuando se reemplaza por un archivo o un enlace simbólico, ya que los usuarios pueden haber añadido o modificado archivos en él. Para evitar la pérdida accidental de datos, DEBE usar el siguiente scriptlet, que renombra el directorio con el sufijo .rpmmoved
para que los usuarios puedan encontrar el directorio respaldado si lo necesitan después de actualizar el paquete. (También añadirá un entero al sufijo en el improbable caso de que el directorio también exista).
%pretrans -p <lua> -- Defina la ruta al directorio que se va a sustituir a continuación. -- NO añada una barra al final. ruta = "/ruta/a/dir" st = posix.stat(ruta) if st and st.type == "directory" then status = os.rename(ruta, ruta .. ".rpmmoved") if not status then suffix = 0 while not status do suffix = suffix + 1 status = os.rename(ruta .. ".rpmmoved", ruta .. ".rpmmoved." .. suffix) end os.rename(ruta, ruta .. ".rpmmoved") end end
Adicionalmente, debe definir el directorio /ruta/al/dir.rpmmoved
como un apunte %ghost
dentro del listado %files
del archivo de especificaciones del paquete, de modo que el directorio no quede completamente huérfano y pueda borrarse si alguna vez se desinstala el paquete y el directorio está vacío.
Scriptlet para sustituir un enlace simbólico a un directorio por un directorio
Reemplazar un enlace simbólico a un directorio por un directorio normal es mucho más sencillo, ya que no existe la posibilidad de eliminar accidentalmente archivos añadidos externamente. El siguiente scriptlet comprueba y elimina el enlace simbólico. No es necesario crear el directorio aquí, ya que RPM lo hará más adelante en la transacción, cuando se instale el paquete.
%pretrans -p <lua> -- Defina la ruta al enlace simbólico siendo remplazado a continuación. ruta = "/ruta/al/dir" st = posix.stat(ruta) if st and st.type == "link" then os.remove(ruta) end
Want to help? Learn how to contribute to Fedora Docs ›