Consejo para nuevo estándar de empaquetamiento

Estoy creando un nuevo estándar que voy a utilizar para mi próximo proyecto. Os explico qué necesito y me gustaría recibir sugerencias o ideas para mejorarlo.

El nuevo estándar sería para empaquetar ficheros para su posterior instalación. Podéis asociarlo como si fuera un RPM o un DEB. El código ya está escrito, y lo único que necesito definir es el "índice". Dicho índice vendrá definido en lenguaje XML. Dicho índice TIENE QUE TENER toda la información necesaria y que fuera a usarse en el futuro. SÓLO ME FALTA DEFINIR LA ESTRUCTURA DE FICHEROS EN DICHO ÍNDICE.

Os adjunto unos posibles ejemplos de dicho índice (sólo la parte a tratar, la estructura de la información de los ficheros contenidos):
<info>
<files>
  <dir001 type="directory" lastupdate="1221045342" chmod="0755">
   <file001>
    <type>file</type>
    <lastupdate>1221045343</lastupdate>
    <chmod>0644</chmod>
   </file001>
  </dir001>
</files>
</info>

O este otro:
<info>
<files>
  <dir001>
   <type>directory</type>
   <lastupdate>1221045342</lastupdate>
   <chmod>0755</chmod>
  </dir001>
  <dir001/file001>
   <type>file</type>
   <lastupdate>1221045343</lastupdate>
   <chmod>0644</chmod>
  </dir001/file001>
</files>
</info>


¿Algún consejo? ¿Cuál sería más humanamente legible? ¿Cuál sería más computacionalmente correcto?

---
Creo que elegiré esta estructura:
<info>
        <files>
                <dir001>
                        <type>directory</type>
                        <lastupdate>1221066866</lastupdate>
                        <chmod>0755</chmod>               
                </dir001>                                 
                <dir001/dir011>                           
                        <type>directory</type>             
                        <lastupdate>1221066937</lastupdate>
                        <chmod>0755</chmod>               
                </dir001/dir011>                           
                <dir001/dir011/file001>                   
                        <type>file</type>                 
                        <lastupdate>1221066937</lastupdate>
                        <chmod>0644</chmod>               
                        <size>5</size>                     
                        <md5>88e7a50e232d82535bd5c76eccd323d5</md5>
                </dir001/dir011/file001>                           
                <dir001/file001>                                   
                        <type>file</type>                         
                        <lastupdate>1221065838</lastupdate>       
                        <chmod>0644</chmod>                       
                        <size>6</size>                             
                        <md5>cf331f5b274aa189af0735a843d0dc65</md5>
                </dir001/file001>                                 
                <dir002>                                           
                        <type>directory</type>                     
                        <lastupdate>1221065845</lastupdate>       
                        <chmod>0755</chmod>                       
                </dir002>                                         
                <dir002/file001>
                        <type>file</type>
                        <lastupdate>1221065845</lastupdate>
                        <chmod>0644</chmod>
                        <size>4</size>
                        <md5>9f7b08fc691a1108d4c7d90ce62e5375</md5>
                </dir002/file001>
                <file001>
                        <type>file</type>
                        <lastupdate>1221065821</lastupdate>
                        <chmod>0644</chmod>
                        <size>5</size>
                        <md5>8c8432c5523c8507a5ec3b1ae3ab364f</md5>
                </file001>
                <file002>
                        <type>file</type>
                        <lastupdate>1221065825</lastupdate>
                        <chmod>0644</chmod>
                        <size>6</size>
                        <md5>4764b0846460fe8fb4e4d38756ada998</md5>
                </file002>
        </files>
</info>
Pues sí, además al tener la ruta relativa de cada archivo y directorio te puede ser más fácil de implementar.
A simple vista parece más fácilmente legible el 1º (y sin redundancias), pero probablemente con un número grande de archivos y carpetas también sea más fácil de leer el 3º.

Un saludo.
Einy escribió:Pues sí, además al tener la ruta relativa de cada archivo y directorio te puede ser más fácil de implementar.
A simple vista parece más fácilmente legible el 1º (y sin redundancias), pero probablemente con un número grande de archivos y carpetas también sea más fácil de leer el 3º.

Un saludo.

Muchas gracias ^^·
¿Ves alguna otra estructura más factible? (o algún añadido o dato que hiciera falta saber de un determinado fichero o directorio).
Lo complicado de esto, es pensar en el futuro y sus posibles limitaciones.
Te iba a decir que algo para comprobar la integridad, pero he hecho scroll en el código y he visto el md5 XD
Lo único más que se me ocurre sería poner unos campos opcionales para forzar el owner y el group si fuera necesario.

Un saludo.
Varias cosas:

1) Aunque lo parezca, eso no es XML (va información en las propias etiquetas ....)
2) No controlas los enlaces de ningún modo
3) Faltan los xattrs (así como el propietario)

- ferdy
Sip, la estructura que has elegido te daría un montón de problemas en caso de que quisieras implementar una DTD o esquema XML, sería mejor creo yo definir una etiqueta <file>, otra <directory>, <hlink>, <slink>, etc. De ese modo podrías definir qué atributos aceptaría cada elemento, facilitando la validación de la información del paquete.

Por otro lado tampoco dices en ningún sitio que tenga que ser XML, pero podrías basar tu herramienta de administración en un XXML Parser cualquiera, que tambien es una ventaja.
<hlink>


No es muy buena idea tampoco....

- ferdy
¿Que tal este?

<?xml version="1.0" encoding="UTF-8"?>
<info>
   <files>
      <file id="0">
         <name>dir001</name>
         <type>directory</type>
         <path>.</path>
         <lastupdate>1221234041</lastupdate>
         <chmod>0755</chmod>
      </file>
      <file id="1">
         <name>file001</name>
         <type>file</type>
         <path>.</path>
         <lastupdate>1221234041</lastupdate>
         <chmod>0644</chmod>
         <size>23</size>
         <md5>82a894e154f4d5d72c77a23496c30767</md5>
      </file>
      <file id="2">
         <name>file002</name>
         <type>link</type>
         <path>./file001</path>
         <lastupdate>1221234041</lastupdate>
         <chmod>0644</chmod>
      </file>
   </files>
</info>
No veo que controle los hardlinks de ningún modo, ni los xattrs ni tengo muy claro cómo maneja los symlinks.

- ferdy
Los enlaces fuertes o simbólicos, no les iba a dar soporte, pues también tengo que dar soporte para Windows; y este hace poco que los soporta. Lo iba a dejar más para "el instalador"; el cual se encargará de hacer enlaces simbólicos cuando el sistema sea *nix y haya archivos coincidentes (mismos hash, fechas, tamaños, etc); él se encargaría de adaptarlos como enlaces simbólicos en caso que el usuario así lo haya especificado. Por lo que dar soporte a los enlaces para el empaquetador es redundante.
Eso es un grave error. Que dos ficheros sean idénticos no significa que sea seguro hacerlos un enlace simbólico o un hardlink.

- ferdy
Ferdy escribió:Eso es un grave error. Que dos ficheros sean idénticos no significa que sea seguro hacerlos un enlace simbólico o un hardlink.

- ferdy

El instalador creará enlaces simbólicos sólo a los archivo que procesó en el pasado; y los recoge en su base datos. Por supuesto no revisará el filesystem para comprobar si hay ficheros supuestamente idénticos. También soy consciente de las posibles coincidencias y los fallos propios de los hashs; pero eso ya es problema del instalador, no del paquete :). Tengo que seguir un desarrollo "por partes"; ahora el empaquetador, luego el instalador.

Mi objetivo es usar estas especificaciones para el próximo proyecto, que será una aplicación web; por lo que, por ahora, no es importante los enlaces; pero sí quiero controlarlos. La primera versión del "instalador" será otra aplicación web; pero no descarto más tarde desarrollarla como aplicación local o auxiliar o interpretada; más adelante, ya sería cuestión de portar lo creado al lenguaje deseado ;).

Gracias por toda la ayuda :D.
No, la idea es que un paquete puede instalar dos ficheros iguales y, SEMÁNTICAMENTE, ser distintos. Es decir, sin saber si dos ficheros ERAN el mismo (hardlink), no puedes recrear el hardlink, tienes demasiada incertidumbre.

- ferdy
Ferdy escribió:No, la idea es que un paquete puede instalar dos ficheros iguales y, SEMÁNTICAMENTE, ser distintos. Es decir, sin saber si dos ficheros ERAN el mismo (hardlink), no puedes recrear el hardlink, tienes demasiada incertidumbre.

- ferdy

Comparación binaria. ¿No sería suficiente?.

En todo caso, como digo, esto ya iría en la rama de desarrollo del "instalador", pues el "empaquetador" no puede lidiar con el sistema de destino, tan sólo adelantarse a los posibles problemas futuros e intentar remediarlos o darle posibilidad de arreglarlo en el futuro, sin limitar o imponer determinada información. Por ello decidí crear un índice en formato XML, pues así puedo crear futuras revisiones con compatibilidad hacia atrás. El índice le indicará al "instalador" donde se encuentra los archivos en el paquete y las propiedades de los mismos (antes de la extracción). Los añadidos como modificación de ficheros en el sistema de destino, o configuración en el sistema de destino, tiene que ser resuelto por el programa empaquetado, y no por el "empaquetador" o el "instalador". Esas son las bases de desarrollo que sigo; si voy a crear un empaquetador, esa será su función, empaquetar; lo mismo para el instalador. Ni el "empaquetador" ni el "instalador" tienen que hacer las funciones que debería de chequear el "programa" empaquetado o instalado (edición de ficheros en el sistema final, por poner un ejemplo).

Ahora mismo estoy en la rama de desarrollo del "empaquetador", y me falta entre otras cosas, decidir la estructuración del índice; procurando dar soporte para la resolución de posibles problemas futuros que se pudieran dar (como necesitar un paquete previamente instalado, dependencias, etc). Concretamente la estructuración del índice para indicar los archivos que contiene el paquete.
Comparación binaria. ¿No sería suficiente?.


Claro que no. Los ficheros pueden tener el mismo contenido, es decir, ser iguales. Pero pueden ser SEMÁNTICAMENTE distintos. Es decir, el problema de crear un enlace es que realmente ambos ficheros serían lo mismo cuando puede que no necesites eso.

Un ejemplo claro son los ficheros bajo /etc/pam.d

- ferdy
Ferdy escribió:
Comparación binaria. ¿No sería suficiente?.


Claro que no. Los ficheros pueden tener el mismo contenido, es decir, ser iguales. Pero pueden ser SEMÁNTICAMENTE distintos. Es decir, el problema de crear un enlace es que realmente ambos ficheros serían lo mismo cuando puede que no necesites eso.

Un ejemplo claro son los ficheros bajo /etc/pam.d

- ferdy

Ok, gracias; ya entendí el problema ;-) (estoy atontado, mira que no darme cuenta). Ejemplo: puede que el fichero db.conf sea igual que main.cfg (imagina que dichos ficheros estuvieran vacíos o, por alguna casualidad tuvieran el mismo contenido), si el programa "main" modifica su configuración, también se aplicaría a db.conf, cosa que no queremos que pase. Ya comprendí el problema que me expones, gracias. :D

Entonces tendré que pensar en dar soporte nativo a los enlaces al empaquetador, pues no habrá otra forma de aplicarlos. En este caso, creo que el siguiente código para el índice podría resolver el tema de los enlaces (olvidando si son simbólicos o fuertes):

<?xml version="1.0" encoding="UTF-8"?>
<info>
   <files>
      <file id="0">
         <name>file002</name>
         <type>link</type>
         <path>./</path>
         <link>./file001</link>
         <lastupdate>1221234041</lastupdate>
         <chmod>0644</chmod>
      </file>
   </files>
</info>

En este caso, se aplicaría un enlace llamado "file002" al archivo "./file001", y se crearía en la ruta "./". Con esto valdría, ¿no?.
Y con algo como:

<?xml version="1.0" encoding="UTF-8"?>
<info>
   <files>
      <file id="0">
         <name>file002</name>
         <type>file</type>
         <path>./</path>
         <lastupdate>1221234041</lastupdate>
         <chmod>0644</chmod>
      </file>
      <hardlink id="0">
         <name>file003</name>
         <path>./</path>
      </hardlink>
   </files>
</info>


Tendrías soporte para hardlinks. Mira que hardlink usa el id de otro 'file'. Y mira que hardlink no tiene información que no necesita (ya que la comparte con el fichero al que enlaza).

Realmente en el caso de los hardlink no existe el "enlace" y el "enlazado", pero bueno, es lo mejor que puedes hacer con el diseño que tienes.

- ferdy
¿Esto no es reinventar la rueda? cpio, tar, etc.
¿Esto no es reinventar la rueda? cpio, tar, etc.


Depende de lo que esté haciendo, no necesariamente.

- ferdy
jape escribió:¿Esto no es reinventar la rueda? cpio, tar, etc.

Aún así, el objetivo de hacer cosas de estas no tiene por qué ser hacer algo útil, sino aprender. Podrías empaparte entero el código de apt, entender cómo funciona y qué hace cada línea de código, pero no ser capaz de reproducirlo. Si el chico quiere hacer un sistema de empaquetamiento, ¿qué más da que exista o no? así es como mejor se aprende.
Esto no sé yo qué tiene de estándar, más bien lo contrario, pero bueno...
Lo bueno de los standards es que hay muchos para elegir xDD

Saludos:).
bastian escribió:Esto no sé yo qué tiene de estándar, más bien lo contrario, pero bueno...


Obviamente no tiene nada de estándar....
Perdonadme que no responda, Estoy fuera estos días y hasta el Martes no podré continuar con esto. El Martes aclaro las cosas y os explico. Creo que era buena idea PREGUNTAR a las personas qué les gustaría o qué necesitan. Imponer "un estándar" no es crear uno, aunque algunos creáis lo contrario. Creo que lo mejor para crear uno es preguntar a los usuarios qué necesitan o necesitarán.
Al fin y al cabo, ningún estándar es estándar cuando es nuevo, digo yo xD
24 respuestas