%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Debian Package internals									%
% Esta presentación trata de ilustrar un poco sobre como funcionan los paquetes			%
% .deb, cualquier comentario, modificación o parche es bienvenido 				%
% este documento se encuentra disponible en: http://rmayorga.org/talks				%
% Copyright (C) 2008 René Mayorga <rmayorga@debian.org.sv>					%
% Este documento se encuentra bajo licencia GPLv2 o mayor según su elección			%
% una copia de la licencia se encuentra en el archivo GPL en las fuentes			%
% o en Debian en el directorio /usr/share/common-licenes/GPL.					%
%												%
% Los diagramas para Maintainer Scripts:							%
% Copyright (C) Margarita Manterola <marga@debian.org>						%
% Estos diagramas se encuentran también bajo la licencia GPL					%
%												%
% El autor de este documento modifico dichos diagramas que se encuentran bajo 			%
% las modificaciones se encuentran bajo la misma licencia que proporciono la autora		%
% original.											%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[hyperref={colorlinks=true}]{beamer}
\usepackage[spanish]{babel}
\usepackage{graphicx}
\parskip 10.9pt

\usetheme{CambridgeUS}
\title{Debian package internals}
\author[rmayorga]{Ren\'e Mayorga \\ \texttt{rmayorga@debian.org.sv}}
\institute{Comunidad de usuarios Debian de El Salvador}
\begin{document}

\begin{frame}
	\titlepage
\end{frame}

		
\begin{frame}{Esquema}
	\tableofcontents
\end{frame}

\section{Introducci\'on}
\begin{frame}[fragile]
\frametitle{?`Qu\'e es un paquete .deb?}
	\centering
	?`Ideas?
	\pause
	?`Aparte de ser un el tipo de paquetes usado en Debian?
	\pause
	\begin{block}{contenedores ar}
		Los archivos .deb son b\'asicamente \alert{contenedores ar},
		(\href{http://es.wikipedia.org/wiki/Ar_(Unix)}{mas informaci\'on sobre ar
		en la entrada de wikipedia})
		Estos contienen dentro varios archivos como debian-binary,
		control.tar.gz, y data.tar.gz.
	\end{block}
	\pause
	\centering
	Estos contenedores de archivo b\'asicamente tienen archivos pre-compilados(binarios)
	para la arquitectura hu\'esped, tambi\'en contienen archivos de control y configuraci\'on
	utilizados por el sistema de paqueter\'ia
\end{frame}

\section{Tipos de paquetes .deb}
\begin{frame}
\frametitle{tipos de paquetes .deb}
	\centering
	\begin{itemize}
		\pause
		\item \alert{Single-binaries}, Contienen un solo binario con su
			documentaci\'on y archivos
		\pause
		\item \alert{Multiple-binaries}, El Source Package genera varios
			paquetes individuales partiendo de un mismo \alert{tarball}
		\pause
		\item \alert{Meta Packages}, Instalan varios paquetes, el paquete original
			solamente contiene dependencias a los paquetes que instalara.
		\pause
		\item \alert{Source packages}
			El Paquete \alert{fuente}, compuesto de \alert{orig.tar.gz}, 
			\alert{.diff.gz}, y {.dsc}
	\end{itemize}
\end{frame}

\section{Versiones de los .deb}
\begin{frame}
\frametitle{Versiones de los .deb}
	\centering
	Entendiendo las versiones
	\pause
	\begin{figure}
		\centering
		\includegraphics[width=3.9in]{deb-version-pre.eps}
		\caption{Versiones de un .deb}
	\end{figure}
	\pause
	?`Alguna idea sobre que significan todos esos n\'umeros y letras?
\end{frame}

\begin{frame}
\frametitle{Versiones de los .deb}
	\centering
	Veamos esto a detalle
	\pause
	\begin{figure}
		\centering
		\includegraphics[width=3.9in]{deb-version.eps}
		\caption{Versiones de un .deb}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Versiones de los .deb}
	\centering
	Entandamos un poco mejor los t\'erminos usados
	\pause
	\begin{figure}
		\centering
		\includegraphics[width=3.2in]{deb-version-post.eps}
		\caption{Versiones de un .deb}
	\end{figure}
	\begin{quote}
		Debian policy 5.6.12
	\end{quote}
\end{frame}

\begin{frame}[fragile]
\frametitle{Tips para descifrar las versiones}
	\centering
	Las versiones de los paquetes son usadas por dpkg para resolver sus dependencias
	muchos paquetes pueden declarar relaciones de versiones para evitar conflictos o depender
	directamente de versiones especificas.

	Con dpkg --compare-versions podemos ver como dpkg entiende las versiones:
	\pause
	\begin{verbatim}
		alias co='dpkg --compare-versions'
		$ co 5.2.0 gt 5.2.1 && echo true || echo false
		false

		$ co 5.2+dfsg-1.1+b1 gt 5.2+dfsg-2 && echo true || echo false
		false
	\end{verbatim}
\end{frame}

\section{Contenido de un paquete .deb}
\begin{frame}
\frametitle{Contenido de un paquete .deb}
	\centering
	Ok, pasemos entonces a los contenidos del .deb
	
	\pause

	?`Alguna pregunta respecto a las versiones?
\end{frame}

\begin{frame}
\frametitle{Contenido de un paquete .deb?}
	\centering
	\begin{figure}
		\centering
		\includegraphics[width=3.9in]{debian-contenido.eps}
		\caption{Contenido de un fichero .deb}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Contenido de un paquete .deb?}
	\centering
	\begin{figure}
		\centering
		\includegraphics[width=3.9in]{deb-file-cont.eps}
		\caption{Un poco más digerible}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Contenido de un paquete .deb}
	\begin{figure}
		\includegraphics[width=3.9in]{deb-contenido-1.eps}
		\caption{control.tar.gz}
	\end{figure}
\end{frame}

\begin{frame}[fragile]
\frametitle{Contenido de un paquete .deb}
	\centering
	Sin dibujitos control.tar.gz se ve as\'i:
	\begin{verbatim}
		@sui:/tmp/deb$ tar -tvzf control.tar.gz 
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./
		-rwxr-xr-x root/root       272 2008-06-20 21:23 ./prerm
		-rw-r--r-- root/root        44 2008-06-20 21:23 ./conffiles
		-rwxr-xr-x root/root       363 2008-06-20 21:23 ./postrm
		-rwxr-xr-x root/root      1527 2008-06-20 21:23 ./postinst
		-rwxr-xr-x root/root       839 2008-06-20 21:23 ./config
		-rw-r--r-- root/root      8200 2008-06-20 21:23 ./templates
		-rw-r--r-- root/root       676 2008-06-20 21:23 ./control
		-rw-r--r-- root/root       592 2008-06-20 21:23 ./md5sums
		@sui:/tmp/deb$ 
	\end{verbatim}

\end{frame}

\begin{frame}[fragile]
\frametitle{Contenidos de control.tar.gz}
	\centering
		Los que fueron observadores en el slide
		anterior notaron que algunos archivos tienen permisos de ejecuci\'on
		y tambi\'en que \alert{todos} los archivos tienen como propietario a root
	
	?`Por que?
	\pause
	\centering
		Los archivos con permisos de ejecuci\'on son los \alert{Maintainer scripts}
	\begin{quote}
		Debian Policy 6
	\end{quote}
\end{frame}

\begin{frame}
\frametitle{Detallando el contenido de control.tar.gz}
	\centering
	\begin{itemize} 
		\pause
		\item \alert{conffiles}, Esta es una lista de los archivos de configuraci\'on
			estos archivos los designa el maintainer para que \alert{dpkg}
			los mantenga y pregunte si deben ser sobreescritos en las actualizaciones
			(Debian policy 10.7.3)
		\pause
		\item \alert{control file}, Este archivo muestra las dependencias y mucha m\'as 
			informaci\'on del paquete
		\pause
		\item \alert{debconf}, conserva partes como \alert{templates} y el archivo
			\alert{config}, los templates mantienen las traducciones para 
			las preguntas de debconf y el config es el script que genera las acciones
			y preguntas.
		\pause
		\item \alert{Maintainer Scripts}, son los encargados de configurar el paquete
			en actualizaciones instalaciones y desinstalaciones del mismo.
			Estos son:
				\begin{itemize}
					\pause
					\item prerm
					\pause
					\item postrm
					\pause
					\item preinst
					\pause
					\item postinst
				\end{itemize}
	\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Contenido de contro.tar.gz}
	\centering
	?`Preguntas sobre control.tar.gz?

	\centering
	\pause
	Los Maintainer scripts se explican a fondo luego :)
\end{frame}

\begin{frame}[fragile]
\frametitle{Contenido de data.tar.gz}
	\centering
		\alert{data.tar.gz} contiene todos los archivos que se instalan con el paquete
	\pause
	\begin{verbatim}
		@sui:/tmp/deb$ tar -tvzf data.tar.gz 
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./etc/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./etc/init.d/
		-rwxr-xr-x root/root      2826 2008-06-20 21:23 ./etc/init.d/darkstat
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./etc/darkstat/
		-rw-r--r-- root/root       346 2008-06-20 21:23 ./etc/darkstat/init.cfg
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./var/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./var/lib/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./var/lib/darkstat/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/sbin/
		-rwxr-xr-x root/root    103848 2008-06-20 21:23 ./usr/sbin/darkstat
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/share/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/share/doc/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/share/doc/darkstat/
		-rw-r--r-- root/root       598 2007-02-09 07:55 ./usr/share/doc/darkstat/README
		-rw-r--r-- root/root      3617 2008-06-20 21:23 ./usr/share/doc/darkstat/copyright
		-rw-r--r-- root/root       418 2007-09-26 02:22 ./usr/share/doc/darkstat/NEWS.gz
		-rw-r--r-- root/root       837 2008-06-20 21:23 ./usr/share/doc/darkstat/README.Debian
		-rw-r--r-- root/root       732 2008-05-27 04:24 ./usr/share/doc/darkstat/AUTHORS
		-rw-r--r-- root/root      2819 2008-06-20 21:23 ./usr/share/doc/darkstat/changelog.Debian.gz
		-rw-r--r-- root/root       759 2007-09-15 22:48 ./usr/share/doc/darkstat/THANKS
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/share/man/
		drwxr-xr-x root/root         0 2008-06-20 21:23 ./usr/share/man/man8/
		-rw-r--r-- root/root      3452 2008-06-20 21:23 ./usr/share/man/man8/darkstat.8.gz
	\end{verbatim}
\end{frame}

\begin{frame}
\frametitle{contenido de data.tar.gz}
\centering
	en base a estos archivos se genera el archivo \alert{/var/lib/dpkg/info/paquete.list}

	El cual contiene la lista de todos los archivos instalados por dicho paquete.
\end{frame}

\section{Proceso de instalaci\'on}

\begin{frame}[fragile]
\frametitle{Intalaci\'on de un paquete}
	\begin{figure}
		\includegraphics[width=4.3in]{apt-get-decargando.eps}
		\caption{proceso realizado por APT}
	\end{figure}
\end{frame}

\begin{frame}[fragile]
\frametitle{Instalaci\'on de un paquete}
	\centering
	El Archivo usado por \alert{apt} para encontrar los paquetes se encuentra
	en \alert{/var/lib/apt/lists} los listados de paquetes son almacenados
	con la siguiente convenci\'on de nombres:
	\begin{verbatim}
		 ftp.debian.org_debian_dists_unstable_main_binary-amd64_Packages
		 ~~~~~~~~~~~~~~~ ====== ~~~~~~~~~~~~~~ ==== ~~~~~~ =====
		      Mirror     direc.    rama        Secc. Tipo   Arquitectura
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Instalaci\'on de un paquete}
	\centering
	¿Com\'o busco un paquete disponible?
	\pause
	Todos sabemos :), apt-cache

	Pero tambi\'en existe grep-dctrl(1)
	El antes mencionado mantiene la informaci\'on que luego mostrara apt-cache o grep-dctrl
	\pause
	\begin{verbatim}
		$ grep-aptavail darkstat
		Package: darkstat
		Priority: optional
		Section: net
		Installed-Size: 240
		Maintainer: Rene Mayorga <rmayorga@debian.org.sv>
		Architecture: amd64
		Version: 3.0.708-1
		Depends: libc6 (>= 2.7-1), libpcap0.8 (>= 0.9.3-1), zlib1g
		 (>= 1:1.1.4), debconf (>= 0.5) | debconf-2.0
		Filename: pool/main/d/darkstat/darkstat_3.0.708-1_amd64.deb
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Entendiendo un poco m\'as}
	\begin{verbatim}
		Package: darkstat - Nombre del paquete binario 
	\end{verbatim}
	\pause
	\begin{verbatim}
		Depends: libc6 (>= 2.7-1), libpcap0.8 (>= 0.9.3-1)
	\end{verbatim}
		Dependencias del paquete con versiones especificas 
	\pause
	\mbox{ Suggests: - Sugerencias de paquetes extra (no instalado por defecto) }
	\pause
	\mbox{ Recommends: - Paquetes recomendados (instalado por defecto en lenny/sid) }
	\pause
	\mbox { Conflicts: - Declara conflictos con alguna versi\'on de un paquete }
	\pause
	\mbox { Provides: - Provee un paquete virtual }
	\pause
	\mbox { Replaces: - Remplaza un paquete especifico}
	\begin{quote}
		Debian Policy 7.2
	\end{quote}
\end{frame}

\begin{frame}[fragile]
\frametitle{De nuevo la imagen}
	\begin{figure}
		\includegraphics[width=4.3in]{apt-get-decargando.eps}
		\caption{proceso realizado por APT}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Entendiendo apt}
	\centering
	?`Preguntas sobre APT ?
	\pause
	?`No?!
	\centering
	Seguimos con dpkg......
\end{frame}


\begin{frame}
\frametitle{Termino APT ahora es el turno de DPKG}
	\begin{figure}
		\includegraphics[width=4.3in]{dpkg-instalando.eps}
		\caption{proceso realizado por DPKG}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{?`Estados? eh!}
	\centering
	Los estados de los paquetes son almacenados en \alert{/var/lib/dpkg/status}
	estos son:
	\begin{itemize}
		\pause
		\item \alert{not-installed} - Paquete no instalado
		\pause
		\item \alert{config-files} - en el sistema solo existen los archivos de configuraci\'on
		\pause
		\item \alert{half-installed} - La instalaci\'on del paquete no se completo
		\pause
		\item \alert{unpacked} - Los archivos fueron desempacados, pero no se encuentra
			configurado
		\pause
		\item \alert{half-configured} - La configuraci\'on fallo
		\pause
		\item \alert{installed} - el paquete esta instalado correctamente
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Estados}
	\centering 
	Puedo verificar los estados de un paquete con el comando dpkg
	\begin{verbatim}
		$ dpkg --status darkstat
		Package: darkstat
		Status: install ok installed
		Priority: optional
		Section: net
		Installed-Size: 240
		Maintainer: Rene Mayorga <rmayorga@debian.org.sv>
		Architecture: amd64
	\end{verbatim}
\end{frame}

\begin{frame}
\frametitle{?`Como llegan los paquetes a tener esos estados?}
	\centering
	Los estados son asignados dentro del proceso interno de instalaci\'on 
	es posible para un usuario instalar un paquete con \alert{dpkg -i} que ejecuta
	todo el proceso autom\'atico; o usar dpkg con diferentes opciones
	para instalar el paquete por partes, es decir, unpacked, configure, etc.

	\centering
	Los estados de configuraci\'on son especificados en base a la salida de los
	\alert{Maintainer scripts}.

\end{frame}

\section{Maintainer Scrips}

\begin{frame}
\frametitle{Ahora s\'i!!, como es eso de los maintscripts}
	\centering
	Los Maintainer scripts son POSIX scripts, los cuales se ejecutan
	en diferentes f\'ases del proceso de instalaci\'on.

	\pause
	\centering
	Estos scripts reciben varios argumentos: como 
		\begin{itemize}
			\pause
			\item install
			\pause
			\item configure
			\pause
			\item remove
			\pause
			\item upgrade
			\pause
			\item purge
		\end{itemize}
	Los argumentos dependen de la etapa en la cual el script es llamado
\end{frame}

\begin{frame}
\frametitle{Analicemos enotonces}
	\centering
	Entonces veamos las etapas sencillas y las m\'as complejas.-

	En una instalaci\'on de un paquete nuevo:
	\begin{itemize}
		\item \alert APT encuentra y descarga
		\pause
		\item \alert DPKG descomprime y ejecuta el primer \alert{maintscript}
	\end{itemize}
	veamos un diagrama :)
\end{frame}

\begin{frame}[fragile]
\frametitle{Una insatalaci\'on exitosa}
	\begin{figure}
		\includegraphics[width=4.3in]{install-marga-ok.eps}
		\caption{Paquete nuevo instalado sin ning\'un problema}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{Pero no todo es perfecto}
	\pause
	Si algo falla, dpkg puede tomar acciones en base a los maint-scritps
	\pause
	\begin{figure}
		\includegraphics[width=4.3in]{install-marga.eps}
		\caption{Paquete nuevo instalado sin ning\'un problema}
	\end{figure}
\end{frame}


\begin{frame}
\frametitle{Maintainer scripts}
	\centering
	?`Pero que hace un maintainer script?
	\pause
	\centering
	Por lo general estos scripts hacen tareas requeridas para el funcionamiento del paquete
	por ejemplo:
		\begin{itemize}
			\pause
			\item Crear/eliminar usuarios
			\pause
			\item Detener/Ejecutar servicios
			\pause
			\item Fijar Permisos de archivos
			\pause
			\item Crear bases de datos
			\pause
			\item etc
		\end{itemize}
	Cada acci\'on se eval\'ua y retorna 0 o 1 para evaluar si el proceso termino adecuadamente
\end{frame}

\begin{frame}
\frametitle{Maintainer scripts}
	\centering
	Analicemos el proceso de desinstalaci\'on de un paquete
	\begin{figure}
		\includegraphics[width=3.3in]{remove-marga.eps}
		\caption{desinstalando foo}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Maintainer scripts}
	\centering
	?`Por que el estado final no es not-installed ?

	\pause
	\centering
	En Debian cuando un paquete se desinstala con la opci\'on 'remove' en apt, dpkg u otros
	el paquete simplemente elimina sus binarios.
	Pero los archivos marcados como 'conffiles' se mantienen; este es el Estado "config-files"
	\pause

	Para eliminar estos archivos es necesario especificar la opci\'on --purge
\end{frame}

\begin{frame}
\frametitle{Maintainer scrips}
	\centering
	Ahora veamos el proceso con todo y --purge 
	\begin{figure}
		\includegraphics[width=3.4in]{remove-purge-marga.eps}
		\caption{desinstalando y purgando foo}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Maintainer scripts}
	\centering
	Ahora veamos el proceso m\'as complejo, el upgrade
	\begin{figure}
		\includegraphics[width=2.4in]{upgrade-marga-ok.eps}
		\caption{Actualizando y todo OK}
	\end{figure}
\end{frame}


\begin{frame}
\frametitle{Maintainer scripts}
	\centering
	DPKG permite entonces ser una opci\'on inteligente para lograr que su instalaci\'on
	o acualizaci\'on aunque falle no deje el sistema operativo inoperable.
	\pause

	Cuando usted ve errores como: \alert{dpkg devolvio el stado blah en postproceso de bleh}
	el maint-script de ese paquete fallo.
	\pause

	Esto es un \alert{bug} de paqueter\'ia y deber\'ia de ser reportado a Debian
\end{frame}

\begin{frame}
\frametitle{Maintainer scripts}
	\centering 
	Ahora veamos el proceso completo de upgrade, incluyendo fallos
	\begin{figure}
		\includegraphics[width=2.9in]{upgrade-marga-full.eps}
		\caption{Actualizando}
	\end{figure}
\end{frame}

\begin{frame}
\frametitle{Gracias}
	\centering
	Gracias a todos por su atenci\'on :)
	\pause

	\centering
	mi correo de nuevo \texttt{rmayorga@debian.org.sv}

	\centering
	Este documento es libre; lo pueden encontrar en:
	\centering
	\texttt{http://rmayorga.org/talks/}

	Para informaci\'on de licencia por favor revisar los comentarios en el source
	son bienvenidos parches, comentarios, etc.
	los diagramas de los maintainer scripts fueron gracias a Margarita Manterola
	\texttt{marga@debian.org}.
\end{frame}
\end{document}


