\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{lun. sept. 9 10:34:54 CEST 2019}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={rpm},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Gestionnaire de paquets pour Red-Hat},
CreationDate={D:20190909103454},
ModDate={D:20190909103454},
Keywords={package manager;rpm}
}}
\begin{document}
 
\begin{center}
{\Huge rpm }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Gestionnaire de paquets pour Red-Hat}
 
\vspace{10mm}
 
\hspace{1mm}  rpm est un gestionnaire de paquet qui peut être utilisé pour construire, installer, requêter, vérifier, mettre à jours des paquets Un paquet consiste en une archive de fichiers et de méta-données utilsés pour installer et effacer les fichiers. Les méta-données incluent des scripts helpers, des attributs de fichier, et d'informations descriptive du paquet.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Options générales }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} --version]{Affiche la vension de rpm}
\item[\hspace{1mm} --quiet]{Affiche seulement les messages d'erreur}
\item[\hspace{1mm} -v, --verbose]{AFfiche plus d'informations}
\item[\hspace{1mm} -vv]{mode encore plus verbeux}
\item[\hspace{1mm} --rcfile FILELIST]{Liste des fichiers de configuration à lire, séparés pas des ':'. Défaut: /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:\textasciitilde/.rpmrc}
\item[\hspace{1mm} --macro FILELIST]{Liste des fichiers macro à charger, séparé par des ':'. Défaut: /usr/lib/rpm/macros:/usr/lib/rpm/macros.d/macros.*:/usr/lib/rpm/platform/\%\verb|{|\_target\verb|}|/macros:/usr/lib/rpm/fileattrs/*.attr:/usr/lib/rpm/redhat/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/\%\verb|{|\_target\verb|}|/macros:\textasciitilde/.rpmmacros}
\item[\hspace{1mm} --pipe CMD]{pipe la sortie de RPM avec la commande spécifiée}
\item[\hspace{1mm} --dbpath DIR]{Utilise la base dans le répertoire spécifié. Défaut: /var/lib/rpm}
\item[\hspace{1mm} --root DIR]{Utilise le répertoire spécifié comme racine pour toutes les opérations. Noter que la base utilisé se trouve dans ce répertoire.}
\item[\hspace{1mm} -D, --define='MACRO EXPR']{Définie la MACRO à la valeur EXPR}
\item[\hspace{1mm} --undefine='MACRO']{indéfini une macro}
\item[\hspace{1mm} -E, --eval='EXPR']{Affiche l'expansion de l'expression}
\item[\hspace{1mm} --predefine='MACRO EXPR']{idem -D, mais avant de charger les fichiers macro}
\item[\hspace{1mm} --color \texttt{[}never|auto|always\texttt{]}]{Utilise les couleurs du terminal}
\item[\hspace{1mm} --nocontexts]{Désactive le plugin SELinux}
\item[\hspace{1mm} --noglob]{N'utilise pas le file globing en installant des fichiers}
\item[\hspace{1mm} --nocaps]{Ne vérifie pas les capabilities des fichiers}
\item[\hspace{1mm} --excludeconfigs, --noconfigs]{N'installe pas les fichiers de configuration}
\item[\hspace{1mm} --nohdrchk]{Ne vérifie pas les en-tête de la base}
\end{description}
 
\vspace{1cm}{\huge Options de debuggage }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -d, --debug]{Mode debug}
\item[\hspace{1mm} --deploops]{Affiche les boucles de dépendance en warning}
\item[\hspace{1mm} --fsmdebug]{Affiche des informations de debuggage du code de gestion du payload}
\item[\hspace{1mm} --rpmfcdebug]{Affiche des informations sur les entrées/sortie de fichier}
\item[\hspace{1mm} --stats]{Affiche des statistics temps-réel sur les fonctions utilisées}
\end{description}
 
\vspace{1cm}{\huge Options d'installation et de mise à jours }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -i, --install]{Install un nouveau paquet}
\item[\hspace{1mm} -U, --upgrade]{Met à jours ou install un paquet}
\item[\hspace{1mm} -F, --freshen]{Met à jours les package, mais seulement ceux qui ont une version précédente installée}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} --reinstall]{Réinstall un précédent paquet}
\item[\hspace{6mm} --allfiles]{Install ou met à jours tous les fichiers missingok dans le paquet, sans regarder s'ils existent}
\item[\hspace{6mm} --badreloc]{avec --relocate, permet la relocation de tous les chemins de fichiers, pas seulement ceux inclus dans OLDPATH}
\item[\hspace{6mm} --excludepath OLDPATH]{N'install pas les fichier dont le nom commence pas OLDPATH}
\item[\hspace{6mm} --excludedocs]{N'install pas les fichiers qui sont marqués comme documentation}
\item[\hspace{6mm} --force]{idem à --replacepkgs --replacefiles et --oldpackage}
\item[\hspace{6mm} -h, --hash]{Affiche 50 hash quand l'archive est dépaquée. avec -v pour un meilleur affichage}
\item[\hspace{6mm} --ignoresize]{Ne vérifie pas l'espace disque du système de fichier avant d'installer ce paquet}
\item[\hspace{6mm} --ignorearch]{install ou met à jour même si l'architecture ne correspond pas}
\item[\hspace{6mm} --ignoreos]{install ou met à jour même si l'os ne correspond pas}
\item[\hspace{6mm} --includedocs]{Install les fichiers de documentation (défaut)}
\item[\hspace{6mm} --justdb]{Met à jour la base de donnée uniquement, pas les fichiers}
\item[\hspace{6mm} --nodigest]{Ne vérifie pas les digest d'en-tête ou du paquet à sa lecture}
\item[\hspace{6mm} --nomanifest]{Ne traite pas les fichiers non-package comme manifests}
\item[\hspace{6mm} --nosignature]{Ne vérifie pas la signature}
\item[\hspace{6mm} --nodeps]{Ne vérifie pas les dépendances à l'installation/mise à jours}
\item[\hspace{6mm} --nocaps]{Ne définis pas les capabilities}
\item[\hspace{6mm} --noorder]{ne réordonne pas les paquets pour une installation. La liste des paquets est normalement réordonnée pour satisfaire les dépendances}
\item[\hspace{6mm} --noplugins]{Ne charge pas les plugins}
\item[\hspace{6mm} --noscripts, --notriggerin, --notriggerun, --notriggerprein, --notriggerpostun]{Désactive l'exécution des scriptlets correspondants}
\item[\hspace{6mm} --oldpackage]{Autorise une mise à jour pour remplacer un paquet avec une version plus ancienne}
\item[\hspace{6mm} --percent]{Affiche un pourcentage à mesure que les fichiers sont dépaqués}
\item[\hspace{6mm} --prefix NEWPATH]{Pour les paquets relogeable, traduit tous les chemins de fichier qui commencent avec le préfixe d'installation avec NEWPATH}
\item[\hspace{6mm} --relocate OLDPATH=NEWPATH]{Pour les paquets relogeable, traduit tous les chemins de fichier qui commencent par OLDPATH avec NEWPATH}
\item[\hspace{6mm} --replacefiles]{Install les paquets même s'ils remplacent des fichiers d'autres paquets déjà installés}
\item[\hspace{6mm} --replacepkgs]{Install les paquets même si certains d'entre eux sont déjà installés dans le système}
\item[\hspace{6mm} --test]{N'install pas le paquet, effectue simplement une vérification et reporte les conflits potentiels}
\end{description}
 
\vspace{1cm}{\huge Options d'effacement }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -e, --erase]{Supprime un paquet}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} --allmatches]{Supprime toutes les versions de paquet correspondant au nom donné. Normalement une erreur est donnée si le nom correspond à plusieurs paquets}
\item[\hspace{6mm} --justdb]{Met à jour la base de données uniquement}
\item[\hspace{6mm} --nodeps]{Ne vérifie pas les dépendance avant de désinstaller les paquets}
\item[\hspace{6mm} --noscripts, --nopreun, --nopostun]{N'execute pas les scriptlets correspondant}
\item[\hspace{6mm} --notriggers, --notriggerun, --notriggerpostun]{N'exécute pas les scriptlets correspondant}
\item[\hspace{6mm} --test]{N'effectue qu'un test, utile avec -vv}
\end{description}
 
\vspace{1cm}{\huge Option de recherche }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -q, --query]{Recherche des paquets}
\item[\hspace{1mm} --qf, --queryformat QUERYFMT]{les formats de recherche sont des versions modifiées du formattage printf(3). Le format est fait de chaînes statiques et de formatteurs type printf(3). Les formats alternatifs avec un tag suivant:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{12mm} :armor]{Ajoute une clé publique en ASCII}
\item[\hspace{12mm} :arraysize]{Nombre d'élément dans les tags}
\item[\hspace{12mm} :base64]{Encode en base64}
\item[\hspace{12mm} :date]{utilise strftime(3) "\%c"}
\item[\hspace{12mm} :day]{utilise strftime(3) "\%a \%b \%d \%Y"}
\item[\hspace{12mm} :depflags]{Formatte l'opérateur de comparaison de dépendance}
\item[\hspace{12mm} :deptype]{Formatte de type de dépendance}
\item[\hspace{12mm} :expand]{Expansion de macro}
\item[\hspace{12mm} :fflags]{Formatte les flags de fichier}
\item[\hspace{12mm} :fstate]{Formatte l'état des fichiers}
\item[\hspace{12mm} :fstatus]{Formatte de status de vérification de fichier}
\item[\hspace{12mm} :hex]{Formatte en hexa}
\item[\hspace{12mm} :octal]{Formatte en octal}
\item[\hspace{12mm} :humaniec]{Nombre human readable en IEC 80000}
\item[\hspace{12mm} :humansi]{Nombre human readable en SI}
\item[\hspace{12mm} :perms]{Formatte les permissions de fichier}
\item[\hspace{12mm} :pgpsig]{Affiche la signature et la date}
\item[\hspace{12mm} :shescape]{Échappe les guillemets simple}
\item[\hspace{12mm} :triggertype]{Affiche le suffix trigger}
\item[\hspace{12mm} :vflags]{Flags de vérification de fichier}
\item[\hspace{12mm} :xml]{Imbrique dans un balisage XML}
\end{description}
 
\vspace{1cm}{\huge Options de sélection de paquet }
 
\
 
\begin{description} \normalsize
\item[\hspace{6mm} PACKAGE\_NAME]{Requête le paquet installé spécifié. Pour spécifier un paquet plus précisemment le paquet peut être suivi pas la version ou version et release, séparés par un ':', ou une architecture séparé par un '.'}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} -a, --all \texttt{[}SELECTOR\texttt{]}]{Requête tous les paquets installés}
\item[\hspace{6mm} --dupes]{Liste les paquets dupliqués}
\item[\hspace{6mm} -f, --files FILE]{Recherche les paquets possedant le fichier spécifié}
\item[\hspace{6mm} --filecaps]{liste les noms de fichier avec las capabilities POSIX1.e}
\item[\hspace{6mm} --fileclass]{Liste les noms de fichier avec leur classes}
\item[\hspace{6mm} --filecolor]{Liste les fichier avec leur couleurs (0 noarch, 1 32bits, 2 64bits)}
\item[\hspace{6mm} --fileprovide]{Liste les noms de fichiers et ce qu'ils fournissent}
\item[\hspace{6mm} --filerequire]{Liste les noms de fichiers et leur requis}
\item[\hspace{6mm} -g, --group GROUP]{Recherche les paquets avec les groupe spécifié}
\item[\hspace{6mm} --hdrid SHA1]{Recherche des paquets contenant un identifiant d'en-tête donné.}
\item[\hspace{6mm} -p, --package PACKAGE\_FILE]{Recherche un paquet désinstallé}
\item[\hspace{6mm} --pkgid MD5]{Recherche un paquet qui contient l'identifiant donné}
\item[\hspace{6mm} --querybynumber HDRNUM]{Recherche le numéro d'entrée dans la base directement}
\item[\hspace{6mm} --specfile SPECFILE]{Recherche SPECFILE comme si c'était un paquet. Permet d'extraire des informations sur les spécificité d'un fichier sans avoir à écrire un parser spécifique}
\item[\hspace{6mm} --tid TID]{Requête les paquets qui ont l'identifiant de transaction spécifié. Un horodatage unix est actuellement utilisé Tous les paquets installé ou effacés dans une seule transaction ont le même identifiant}
\item[\hspace{6mm} --triggeredby PACKAGE\_NAME]{Recherche les paquet qui ont été déclenchés par le paquet spécifié}
\item[\hspace{6mm} --whatobsoletes CAPABILITY]{Recherche les paquets qui obsolètent la capabilitie pour fonctionner correctement}
\item[\hspace{6mm} --whatprovides CAPABILITY]{Recherche les paquets qui fournissent la capabilitie}
\item[\hspace{6mm} --whatrequires CAPABILITY]{Recherche tous les paquet qui nécessitent la capabilitie}
\item[\hspace{6mm} --whatconflicts CAPABILITY]{Recherche tous les paquets qui sont en conflit avec la capabilitie}
\item[\hspace{6mm} --whatrecommends CAPABILITY]{Recherche tous les paquets qui recommandent la capabilitie}
\item[\hspace{6mm} --whatsuggests CAPABILITY]{Recherche tous les paquets qui suggèrent la capabilitie}
\item[\hspace{6mm} --whatsupplements CAPABILITY]{Recherche tous les paquets qui impléments la capabilitie}
\item[\hspace{6mm} --whatenhances CAPABILITY]{Recherche tous les paquets qui améliorent la capabilitie}
\end{description}
 
\vspace{1cm}{\huge Options de recherche de paquet }
 
\
 
\begin{description} \normalsize
\item[\hspace{6mm} -d, --artifactfiles]{Liste seulement les artefacts (implique -l)}
\item[\hspace{6mm} --changelog]{Affiche des informations sur un paquet}
\item[\hspace{6mm} --changes]{Affiche des informations sur un paquet avec horodatages complets}
\item[\hspace{6mm} -c, --configfiles]{Liste seulement les fichiers de configuration (implique -l)}
\item[\hspace{6mm} --conflicts]{Liste les capabilitie qui sont en conflit avec ce paquet}
\item[\hspace{6mm} -d, --docfiles]{Liste seulement les fichiers de documentation (implique -l)}
\item[\hspace{6mm} --dump]{Dump les informations de fichier: path size mtime digest mode owner group isconfig isdoc rdev symlink}
\item[\hspace{6mm} --enhances]{Liste les capabilitie améliorés par ce paquet}
\item[\hspace{6mm} --filesbypkg]{Liste tous les fichiers dans chaque paquet sélectionné}
\item[\hspace{6mm} --filetriggers]{Liste tous les scriptlets filetrigger des paquets}
\item[\hspace{6mm} -i, --info]{Affiche des informations sur le paquet}
\item[\hspace{6mm} --last]{Ordonne les paquets par date d'installation, du plus récent au plus ancien}
\item[\hspace{6mm} -L, --licensefiles]{Liste seulement les fichiers de license (implique -l)}
\item[\hspace{6mm} -l, --list]{Liste les fichiers dans le paquet}
\item[\hspace{6mm} --obsoletes]{Liste les paquets qui obsolètent ce paquet}
\item[\hspace{6mm} --provides]{Liste les capabilities que ce paquet fournis}
\item[\hspace{6mm} --recommends]{Liste les capabilities recommandées par ce paquet}
\item[\hspace{6mm} -R, --requires]{Liste les capabilities dont ce paquet dépend}
\item[\hspace{6mm} --suggests]{Liste les capabilities suggérées par ce paquet}
\item[\hspace{6mm} --supplements]{Liste les capabilitie supplémenté par ce paquet}
\item[\hspace{6mm} --scripts]{Liste les scriptlets spécifique au paquet qui sont utilisés durant l'installation/désinstallation}
\item[\hspace{6mm} -s, --state]{Affiche l'état des fichiers dans le paquet (implique -l): normal, not installed, ou replaced}
\item[\hspace{6mm} --triggers, --triggerscripts]{Affiche les scripts triggers contenus dans le paquet}
\item[\hspace{6mm} --noartifact]{N'affiche pas les fichier artefacts}
\item[\hspace{6mm} --noghost]{N'affiche pas les fichiers fantôme.}
\item[\hspace{6mm} --noconfig]{N'affiche pas les fichiers de configuration}
\item[\hspace{6mm} --xml]{Formatte les en-têtes en XML}
\end{description}
 
\vspace{1cm}{\huge Options de vérification }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -V, --verify]{Vérifie un paquet}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} --nodepts]{Ne vérifie pas les dépendances}
\item[\hspace{6mm} --nodigest]{Ne vérifie pas le hash des en-tête}
\item[\hspace{6mm} --nofiles]{Ne vérifie pas les attributs des fichiers}
\item[\hspace{6mm} --noghost]{Ne vérifie pas le fichiers fantôme}
\item[\hspace{6mm} --noconfig]{Ne vérifie pas les fichiers de configuration}
\item[\hspace{6mm} --noscripts]{N'exécute pas le scriptlet \%verifyscript.}
\item[\hspace{6mm} --nosignature]{Ne vérifie pas le paquet ou les signatures d'en-tête}
\item[\hspace{6mm} --nolinkto]{}
\item[\hspace{6mm} --nofiledigest]{}
\item[\hspace{6mm} --nosize]{}
\item[\hspace{6mm} --nouser]{}
\item[\hspace{6mm} --nogroup]{}
\item[\hspace{6mm} --nomtime]{}
\item[\hspace{6mm} --nomode]{}
\item[\hspace{6mm} --nordev]{Ne vérifie pas ces attributs de fichier}
\item[\hspace{6mm} --nocaps]{Ne vérifie pas les capabilitie des fichiers}
\end{description}
 
\hspace{6mm}  Le format de sortie est une chaîne de 9 caractères, un marqueur possible parmis:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{12mm} c \%config]{Fichier de configuration}
\item[\hspace{12mm} d \%doc]{Fichier documentation}
\item[\hspace{12mm} g \%ghost]{Fichier dont le contenu n'est pas inclus dans le payload du paquet}
\item[\hspace{12mm} l \%license]{Fichier de license}
\item[\hspace{12mm} r \%readme]{Fichier readme}
\end{description}
 
\hspace{6mm}  Depuis l'en-tête du paquet, suivi par le nom du fichier. Chacun des 9 caractères dénote le résultat d'une comparaison des attributs du fichier à la valeur des attributs enregistrés dans la base. Un '.' signifie que le test est passé, '?' indique que le test ne peut pas être effectué. Sinon, un \textbf{B} denote un echecdans le test correspondant:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{12mm} S]{La taille du fichier diffère}
\item[\hspace{12mm} M]{Les permissions diffèrent}
\item[\hspace{12mm} 5]{Le hash md5 diffère}
\item[\hspace{12mm} D]{Le numéro majeur/mineur diffère}
\item[\hspace{12mm} L]{Le chemin du lien diffère}
\item[\hspace{12mm} U]{Le propriétaire diffère}
\item[\hspace{12mm} G]{Le groupe propriétaire diffère}
\item[\hspace{12mm} T]{le mTime diffère}
\item[\hspace{12mm} P]{Les capabilities diffèrent}
\end{description}
 
\vspace{1cm}{\huge Options diverses }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} --showrc]{Affiche les valeurs que prm utilise pour toutes les options, définies dans les fichiers rpmrc et macro}
\item[\hspace{1mm} --setperms, --setugids, --setcaps, --restore]{Définis le éléments spécifiés des fichiers dans le paquet donné. Préférer --restore, qui restaure tout. mutuellement exclusifs}
\end{description}
 
\vspace{1cm}{\huge Options FTP/HTTP }
 
\
 
\hspace{1mm}  rpm peut agir comme client ftp ou http. Les url sont sous la forme:
\vspace{5mm} \\
\hspace{1mm}  \textbf{ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm}
\vspace{5mm} \\
\hspace{1mm}  Si :PASSWORD est omis, il est demandé. Si l'utilisateur et le mot de passe sont omis, utilise ftp anonyme est utilisé. Dans tous les cas, un transfert FTP passif est effectué.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} --ftpproxy HOST]{Spécifie le proxy ftp à utiliser}
\item[\hspace{6mm} --ftpport PORT]{Spécifie le port TCP à utiliser}
\item[\hspace{6mm} --httpproxy HOST]{Spécifie le proxy http à utiliser}
\item[\hspace{6mm} --httpport PORT]{Spécifie le port http à utiliser}
\end{description}
 
\vspace{1cm}{\huge Fichiers }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} /usr/lib/rpm/rpmrc]{}
\item[\hspace{1mm} /usr/lib/rpm/redhat/rpmrc]{}
\item[\hspace{1mm} /etc/rpmrc]{}
\item[\hspace{1mm} \textasciitilde/.rpmrc]{Configuration rpmrc}
\item[\hspace{1mm} /usr/lib/rpm/macros]{}
\item[\hspace{1mm} /usr/lib/rpm/redhat/macros]{}
\item[\hspace{1mm} /etc/rpm/macros]{}
\item[\hspace{1mm} \textasciitilde/.rpmmacros]{configuration macro}
\item[\hspace{1mm} /var/lib/rpm/Basenames]{}
\item[\hspace{1mm} /var/lib/rpm/Conflictname]{}
\item[\hspace{1mm} /var/lib/rpm/Dirnames]{}
\item[\hspace{1mm} /var/lib/rpm/Group]{}
\item[\hspace{1mm} /var/lib/rpm/Installtid]{}
\item[\hspace{1mm} /var/lib/rpm/Name]{}
\item[\hspace{1mm} /var/lib/rpm/Obsoletename]{}
\item[\hspace{1mm} /var/lib/rpm/Packages]{}
\item[\hspace{1mm} /var/lib/rpm/Providename]{}
\item[\hspace{1mm} /var/lib/rpm/Requirename]{}
\item[\hspace{1mm} /var/lib/rpm/Sha1header]{}
\item[\hspace{1mm} /var/lib/rpm/Sigmd5]{}
\item[\hspace{1mm} /var/lib/rpm/Triggername]{Base de données}
\item[\hspace{1mm} /var/tmp/rpm*]{Temporaire}
\end{description}
 
\vspace{1cm}{\huge Format de requêtes }
 
\
 
\hspace{1mm}  rpm permet de spécifie quelles informations afficher et commment les formater. Toutes les informations d'un paquet, hormis les signatures et les fichiers sont des headers. Chaque élément dans le header a un tag associé. La liste des tags peut être obtenue avec \textbf{rpm --querytags}. Un tag consiste d'un élément ou un tableau d'éléments. Chaque élément peut être une chaîne ou un nombre.
\vspace{5mm} \\
\hspace{1mm}  une format de requête est passé après --queryformat similaire à printf(2), mais sans spécifier le type de données à afficher.
\vspace{5mm} \\
 
 
\hspace{6mm} Pour afficher les noms et taille des paquets installés dans le système: \\
\hspace{6mm} \textbf{rpm -qa --queryformat "\%\{NAME\} \%\{SIZE\}\textbackslash{}n"} \\
\hspace{6mm} Pour utiliser les formateurs printf, max 30 caractères du nom et aligner la taille à droite: \\
\hspace{6mm} \textbf{rpm -qa --queryformat "\%-30\{NAME\} \%10\{SIZE\}\textbackslash{}n"} \\
\hspace{6mm} RPM utilise de nombreux tableaux en interne. Par exemple la taille des fichiers et leur nom sont conservés dans des tableaux. Pour itérer dans un jeu de tableaux, utiliser le format: \\
\hspace{6mm} \textbf{rpm -q --queryformat "[\%-50\{FILENAMES\} \%10\{FILESIZES\}\textbackslash{}n]" less} \\
\hspace{6mm} Pour affiche les noms des paquets installés suivis par le nom des fichiers qu'ils contiennt, un par ligne: \\
\hspace{6mm} \textbf{rpm -qa --queryformat "[\%\{NAME\}\textbackslash{}n[ \%-60\{FILENAMES\} \%10\{FILESIZES\}\textbackslash{}n]]"} \\
\hspace{6mm} Pour lister les fichiers d'un paquet, avec pour chaque ligne, le nom du paquet suivi du fichier, utiliser le '=' avant NAME afin d'utiliser toujours le premier item de NAME: \\
\hspace{6mm} \textbf{rpm -qa --queryformat "[\%\{=NAME\} \%\{FILENAMES\}\textbackslash{}n]" less} \\
\hspace{6mm} Une des faiblesses avec les formats de recherche est qu'il ne sait pas afficher le tag INSTALLTIME (entre autre) au format date au lieu d'un nombre. Il est possible de spécifier un autre format: \\
\hspace{6mm} \textbf{rpm -q --queryformat "\%\{NAME\} \%\{INSTALLTIME:date\}\textbackslash{}n" less} \\
\hspace{6mm} \textbf{rpm -q --queryformat "[\%\{FILEMODES:perms\} \%\{FILENAMES\}\textbackslash{}n]" less} \\
\hspace{6mm} \textbf{rpm -q --queryformat "[\%\{REQUIRENAME\} \%\{REQUIREFLAGS:depflags\} \%\{REQUIREVERSION\}\textbackslash{}n]" less} \\
\hspace{6mm} Une simple condition peut être évaluée via les expression, délimités par \%[...]. pour afficher present si un tag est présent, missing sinon: \\
\hspace{6mm} \textbf{\%|SOMETAG?\{present\}:\{missing\}|} \\
 
\vspace{1cm}{\huge Récupération de la base }
 
\
 
\hspace{1mm}  Si une commande rpm bloque ou ne se comporte pas correctement, la première chose à vérifier est l'état des fichiers de lock:
\vspace{5mm} \\
\hspace{1mm}  \textbf{cd /var/lib/rpm \&\& /usr/lib/rpm/rpmdb\_stat -CA}
\vspace{5mm} \\
\hspace{1mm}  Sous les sections Locks grouped by lockers et Locks grouped by object, il ne devrait pas y avoir d'entrée.
\vspace{5mm} \\
\hspace{1mm}  Le format de la base permet à de nombreux processus d'être en concurrence sur la db, donc il n'y a pas de manière sûr pour une commande RPM d'identifier et de supprimer les locks de manière sûre. Les locks sont maintenus par des fichiers nommés avec 2 '\_' initiaux. La meilleurs manière de supprimer les locks est en mode single. Si ce n'est pas possible, utiliser:
\vspace{5mm} \\
\hspace{1mm}  \textbf{lsof | grep /var/lib/rpm}
\vspace{5mm} \\
\hspace{1mm}  pour trouver les programmes qui utilisent la base de données avant de supprimer les locks
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Récupérer une base de données corrompue }
 
\
 
\hspace{1mm} Si la base de données semble corrompue, le fichier qui doit être reconstruit est le fichier /var/lib/rpm/Packages, puis les index doivent être regénérés. Avant d'effectuer une action potentiellement destructrice, toujours backuper la db: \\
\hspace{1mm} \textbf{cd /var/lib \&\& tar zcvf /var/preserve/rpmdb-`date +"\%d\%m\%Y"`.tar.gz rpm} \\
\hspace{1mm} Puis vérifier l'intégrité du fichier Packages: \\
\hspace{1mm} \textbf{cd /var/lib/rpm \&\& rm -f \_\_db* \&\& /usr/lib/rpm/rpmdb\_verify Packages} \\
\hspace{1mm} Si une erreur est reportée, un dump est requis. Une fois le dump effectué, vérifier l'intégrité du nouveau fichier Package: \\
\hspace{1mm} \textbf{mv Packages Packages.orig \&\& /usr/lib/rpm/rpmdb\_dump Packages.orig | /usr/lib/rpm/rpmdb\_load Packages \&\& /usr/lib/rpm/rpmdb\_verify Packages} \\
\hspace{1mm} Si le fichier Packages a passé les vérifications, une vérification supplémentaire vérifie les en-tête dans la db, et recherche tout message envoyés sur stderr: \\
\hspace{1mm} \textbf{rpm -qa 1> /dev/null} \\
\hspace{1mm} Si la requête passe sans afficher de message, il est temps de reconstruire les index: \\
\hspace{1mm} \textbf{rpm -v --rebuilddb} \\
\hspace{1mm} à ce point, la base devrait être fonctionnelle. Dans le cas contraire, un bug doit être reporté \\
 
\vspace{1cm}{\huge Macros }
 
\
 
\hspace{1mm}  RPM supporte les fichiers de macro. Les macro font de la substitution de texte. Les macro paramétrisés incluent un champ options et effectuent un traitement argc/argv. Durant l'expansion de macro, les flags et arguments sont disponibles comme macro et sont supprimés à la fin de l'expansion. Les macros peuvent être utilisé n'importe où dans un fichier spec, et en particulier dans les listes de fichiers inclus (ceux lus en utilisant \textbf{\%files -f <file>}. De plus les macros peuvent être imbriqués.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Définir une macro }
 
\
 
\hspace{1mm}  Pour définir une macro:
\vspace{5mm} \\
\hspace{1mm}  \textbf{\%define <name>[(opts)] <body>}
\vspace{5mm} \\
\hspace{1mm}  Les noms peuvent être composés de caractères alphanumériques et du caractère '\_', 3 caractères minimum. Une macro sans options est simple: une simple expansion récursive est effectuée. Une macro paramétrisée contient le champ options et est passé exactement à getopt(3) pour traiter argc/argv au début de l'appel de la macro. "-" peut être utilisé pour séparer les options des arguments. Durant l'expansion, les macros suivantes sont disponibles:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} \%0]{Le nom de la macro invoqué}
\item[\hspace{6mm} \%*]{Tous les arguments sans les flags traités}
\item[\hspace{6mm} \%**]{Tous les arguments et flags traités}
\item[\hspace{6mm} \%\#]{Le nombre d'arguments}
\item[\hspace{6mm} \%\{-f\}]{Si présent à l'invocation, le flag f lui-même}
\item[\hspace{6mm} \%\{-f*\}]{Si présent à l'invocation, l'argument du flag f}
\item[\hspace{6mm} \%1, \%2]{Les arguments eux-même}
\end{description}
 
\hspace{1mm}  À la fin de l'invocation d'une macro paramétrisée, ces macros sont supprimées
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Écrire une macro }
 
\
 
\hspace{1mm}  Dans le corps d'une macro, il y'a de nombreuses constructions qui permettent de tester la présence de paramètres optionnels. La construction la plus simple, \$\{-f\} s'étend à -f si -f a été mentionnée quand la macro a été invoquée. Il y a également un provisioning pour inclure du texte si le flag est présent \textbf{\%\{-f:X\}}. Cette macro étend à X si le flag est présent. La forme négative est: \textbf{\%\{!-f:X\}}
\vspace{5mm} \\
\hspace{1mm}  En plus de la forme \textbf{\%\{...\}}, l'expansion shell peut être effectuée avec \textbf{\%(shell command)} en utilisant /bin/sh. Par exemple: \textbf{\%(date +\%\%y\%\%m\%\%d)} étend la date.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Macros intégrées }
 
\
 
\hspace{1mm}  Il existe des macro intégrées:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} \%trace]{Affiche des informations de debuggage avant/après l'expansion}
\item[\hspace{6mm} \%dump]{Affiche la table macro active}
\item[\hspace{6mm} \%getncpus]{Nombre de cpu disponibles pour le traitement}
\item[\hspace{6mm} \%verbose]{Si rpm est en mode verbeux}
\item[\hspace{6mm} \%dnl]{ignore la ligne suivante, sans l'étendre}
\item[\hspace{6mm} \%\{echo:...\}]{Affiche ... sur stdout}
\item[\hspace{6mm} \%\{warn:...\}]{Affiche ... sur stderr}
\item[\hspace{6mm} \%\{error:...\}]{Affiche ... sur stderr et génère une erreur}
\item[\hspace{6mm} \%define]{Définis une macro}
\item[\hspace{6mm} \%undefine]{Supprime une macro}
\item[\hspace{6mm} \%global]{Définie une macro dont le corp est disponible dans le contexte global}
\item[\hspace{6mm} \%\{load:...\}]{Charge un fichier macro}
\item[\hspace{6mm} \%\{expand:...\}]{Comme eval, étend ... à <body> et re-étend <body>}
\item[\hspace{6mm} \%\{shrink:...\}]{Supprime tous les espaces blanc et réduit tous les espaces blanc intermédiaire à un seul espace}
\item[\hspace{6mm} \%\{quote:...\}]{Met entre guillemets un argument de macro paramétrique}
\item[\hspace{6mm} \%\{lua:....\}]{Étend avec l'interpréteur lua embarqué}
\item[\hspace{6mm} \%\{uncompress:...\}]{Étend ... au fichier et test pour voir si le fichier compressé. L'expansion est}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{12mm} cat <file>]{si non compressé}
\item[\hspace{12mm} gzip -dc]{Si gzipé}
\item[\hspace{12mm} bzip2 -dc]{Si bzipé}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} \%\{basename:...\}]{similaire à basename(1)}
\item[\hspace{6mm} \%\{dirname:...\}]{similaire à dirname(1)}
\item[\hspace{6mm} \%\{suffix:...\}]{Étend la partie suffixe d'un nom de fichier}
\item[\hspace{6mm} \%\{url2path:...\}]{Convertit une url à un chemin local}
\item[\hspace{6mm} \%\{getenv:...\}]{Étend le répertoire home rpm (défaut: /usr/lib/rpm)}
\item[\hspace{6mm} \%\{S:...\}]{Étend ... au nom de fichier source}
\item[\hspace{6mm} \%\{P:...\}]{Étend ... au nom de fichier patch}
\item[\hspace{6mm} \%\{F:...\}]{Étend ... au nom de fichier file}
\end{description}
 
\hspace{1mm}  Noter que \%define diffère de \%global, pas seulement dans le scope: le corp de \%define est étendu plus simplement, mais le corp de \%global est étendu au moment de la définition. Il est possible d'utiliser \%\%- pour forcer l'expansion de \%global plus simplement.
\vspace{5mm} \\
\hspace{1mm}  Les macros peuvent être automatiquement étendus s'ils sont dans /usr/lib/rpm/macros.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Interpreteur LUA }
 
\
 
\hspace{1mm} rpm embarque un interpréteur LUA et peut être utilisé comme interpréter des scriplets (\%pre, \%post, etc) \\
\hspace{1mm} \textbf{\%pre -p <lua>} \\
\hspace{1mm} \textbf{print('Hello from lua")} \\
\hspace{1mm} Les scriptlets sont traités dans le contexte du processus rpm au lieu de forker un nouveau processus. Celà a un avantage sur un scriptlet /bin/sh: plus rapide, pas de dépendances requise, et il peut créer de nouvelles macros par exemple. \\
\hspace{1mm} À l'initialisation, rpm exécute le script /usr/lib/rpm/init.lua. \\
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} Installer un paquet \\
\hspace{1mm} \textbf{rpm -i less} \\
\hspace{1mm} mettre à jour un paquet \\
\hspace{1mm} \textbf{rpm -U less} \\
\hspace{1mm} Lister tous les paquets installés \\
\hspace{1mm} \textbf{rpm -qa} \\
\hspace{1mm} Savoir si un paquet est installé \\
\hspace{1mm} \textbf{rpm -q vsftpd} \\
\hspace{1mm} Lister les dépendances d'un paquet \\
\hspace{1mm} \textbf{rpm -qR audit} \\
\hspace{1mm} Afficher des informations sur un paquet installé \\
\hspace{1mm} \textbf{rpm -qi audit} \\
\hspace{1mm} Afficher les fichiers installés et leur état \\
\hspace{1mm} \textbf{rpm -qls audit} \\
\hspace{1mm} Pour revenir à une ancienne version d'un paquet: \\
\hspace{1mm} \textbf{rpm -Uvh --oldpackage less} \\
\hspace{1mm} Importer une clé GPG afin de valider les paquets téléchargés \\
\hspace{1mm} \textbf{rpm --import /mnt/cdrom/RPM\_GPGKEY} \\
\hspace{1mm} Voir les clé installées: \\
\hspace{1mm} \textbf{rpm -qa gpg-pubkey*} \\
\hspace{1mm} Vérifier un paquet: \\
\hspace{1mm} \textbf{rpm -K /tmp/audit-2.7.8-1.fc26.x86\_64.rpm} \\
\end{flushleft}
\end{document}
