dpkg-maintscript-helper(1)

NAAM
dpkg-maintscript-helper - omzeilt in de scripts van de onderhouder gekende beperkingen van dpkg

OVERZICHT
dpkg-maintscript-helper commando [parameter...] -- onderhouderscriptparameter...

COMMANDO'S EN PARAMETERS

supports commando

rm_conffile configuratiebestand [vorige-versie [pakket]]

mv_conffile oud-configuratiebestand nieuw-configuratiebestand [vorige-versie [pakket]]

symlink_to_dir padnaam oud-doel [vorige-versie [pakket]]

dir_to_symlink padnaam nieuw-doel [vorige-versie [pakket]]

BESCHRIJVING

Dit programma is ontwikkeld om uitgevoerd te worden binnenin onderhouderscripts om sommige taken te verrichten die dpkg (nog) niet alleen kan uitvoeren, ofwel omwille van gemaakte keuzes inzake design ofwel ten gevolge van actuele beperkingen.

Veel van deze taken vereisen gecoördineerde actie van verschillende onderhouderscripts (preinst, postinst, prerm, postrm). Om fouten te vermijden moet gewoon dezelfde aanroep in alle scripts geplaatst worden en het programma zal zijn gedrag automatisch aan passen op basis van de omgevingsvariabele DPKG_MAINTSCRIPT_NAME en de argumenten van de onderhouderscripts die na een dubbel koppelteken opgegeven moeten worden.

GEMEENSCHAPPELIJKE PARAMETERS

vorige-versie
    Definieert de laatste versie van het pakket waarvan de opwaardering de operatie moet uitlokken. Het is belangrijk om vorige-versie correct te berekenen, zodat de operaties correct uitgevoerd worden zelfs in het geval de gebruiker het pakket met een lokaal versienummer herbouwde. Indien vorige-versie leeg of weggelaten is, dan wordt geprobeerd om bij elke opwaardering de operatie uit te voeren (merk op dat het veiliger is om de versie op te geven zodat slechts eenmaal geprobeerd wordt om de operatie uit te voeren). Indien sinds verschillende versies geen configuratiebestand meer meegeleverd werd en u nu de scripts van de pakketonderhouder aan het wijzigen bent om het verouderde bestand op te ruimen, moet vorige-versie ingesteld worden op de versie van het pakket dat u nu aan het voorbereiden bent, niet op de eerste versie van het pakket zonder het configuratiebestand. Dit geldt op dezelfde wijze voor alle andere acties. Voor een configuratiebestand dat in de versie 2.0-1 van een pakket verwijderd werd, moet vorige-versie ingesteld worden op 2.0-1~. Dit heeft tot effect dat het configuratiebestand verwijderd wordt, zelfs als de gebruiker de vorige versie 1.0-1 herbouwde als 1.0-1lokaal1. En in het geval waarin in een pakket een pad eerst een symbolische koppeling was (bij versie 1.0-1) en later een map werd (bij versie 2.0-1), maar u pas in versie 3.0-1 de eigenlijke omschakeling doorvoert in de scripts van de pakketonderhouder, moet vorige-versie ingesteld worden op 3.0-1~.

pakket
    De pakketnaam. Als het pakket “Multi-Arch: same” is, moet deze parameter de architectuurkwalificatie bevatten, anders zou er gewoonlijk geen architectuurkwalificatie in moeten voorkomen (aangezien dit geen cross-grades zou toelaten, of de omschakeling van architectuurspecifiek naar architectuur all en vice versa). Indien de parameter leeg is of weggelaten werd, zullen de omgevingsvariabelen DPKG_MAINTSCRIPT_PACKAGE en DPKG_MAINTSCRIPT_ARCH (zoals die door dpkg ingesteld werden) gebruikt worden om een pakketnaam met architectuurkwalificatie te genereren.

--  Alle parameters van de scripts van de pakketonderhouder moeten doorgegeven worden aan het programma na --.

TAKEN IN VERBAND MET CONFIGURATIEBESTANDEN

Bij het opwaarderen van een pakket zal dpkg niet automatisch een conffile (configuratiebestand) (conffile = een configuratiebestand waarin dpkg door de gebruiker gemaakte aanpassingen moet behouden) verwijderen indien dat niet in de nieuwe versie voorkomt. Daarvoor zijn twee belangrijke redenen. De eerste is dat het configuratiebestand per ongeluk weggevallen kan zijn en dat de volgende versie dit zou kunnen herstellen en dat gebruikers hun aanpassingen niet graag verloren zouden zien gaan. De tweede is om pakketten de mogelijkheid te bieden om over te gaan van een door dpkg onderhouden configuratiebestand naar een bestand dat onderhouden wordt door de scripts van de pakketonderhouder, meestal met behulp van gereedschap zoals debconf of ucf.

Dit houdt in dat indien een pakket de bedoeling heeft om een configuratiebestand te hernoemen of te verwijderen, het dit expliciet moet doen en dat dpkg-maintscript-helper kan gebruikt worden in scripts van de pakketonderhouder om het verwijderen en verplaatsen op een elegante manier uit te voeren.

  Een configuratiebestand verwijderen

Indien een configuratiebestand volledig verwijderd wordt, moet het van schijf verwijderd worden, tenzij de gebruiker het aangepast heeft. Indien er lokale aanpassingen aangebracht werden, moeten die behouden blijven. Indien het opwaarderen van het pakket afbreekt, mag het pas in onbruik geraakte configuratiebestand niet verdwijnen.

Dit alles wordt toegepast door het volgende shell-fragment te plaatsen in de scripts preinst, postinst en postrm van de pakketonderhouder:

    dpkg-maintscript-helper rm_conffile \
        configuratiebestand vorige-versie pakket -- "$@"

configuratiebestand is de bestandsnaam van het te verwijderen configuratiebestand.

Huidige toepassing: in het script preinst controleert het of het configuratiebestand gewijzigd werd en hernoemt het ofwel naar configuratiebestand.dpkg-remove (als het niet gewijzigd was) of naar configuratiebestand.dpkg-backup (als het wel gewijzigd was). In het script postinst wordt dit laatste bestand hernoemd naar configuratiebestand.dpkg-bak en het wordt ter referentie behouden vermits het door de gebruiker gemaakte aanpassingen bevat. In het eerste geval (niet gewijzigd configuratiebestand) wordt het bestand verwijderd. Indien de opwaardering van het pakket afbreekt, herinstalleert het script postrm het originele configuratiebestand. Tijdens het uitvoeren van een wisopdracht (purge) zal het script postrm ook het tot dan bewaarde bestand .dpkg-bak verwijderen.

  Een configuratiebestand hernoemen

Indien een configuratiebestand verplaatst wordt van de ene locatie naar een andere, moet u er voor zorgen dat eventuele wijzigingen die de gebruiker maakte mee gaan. Op het eerste gezicht kan dit lijken op een eenvoudige aanpassing aan het script preinst. Dat zal evenwel als resultaat hebben dat de gebruiker door dpkg gevraagd wordt om de aanpassingen aan het configuratiebestand goed te keuren, al heeft hij er in dit geval niets mee te maken.

Een vlotte manier van hernoemen kan gerealiseerd worden door het volgende shell-fragment te plaatsen in de scripts preinst, postinst en postrm van de pakketonderhouder:

    dpkg-maintscript-helper mv_conffile \
        oud-configuratiebestand nieuw-configuratiebestand vorige-versie pakket -- "$@"

oud-configuratiebestand en nieuw-configuratiebestand zijn de oude en de nieuwe naam van het configuratiebestand dat hernoemd moet worden.

Huidige toepassing: het script preinst controleert of het configuratiebestand gewijzigd werd. Indien dat het geval is wordt het gelaten waar het is, anders wordt het hernoemd naar oud-configuratiebestand.dpkg-remove. Bij het configureren verwijdert het script postinst oud-configuratiebestand.dpkg-remove en hernoemt oud-configuratiebestand naar nieuw-configuratiebestand als oud-configuratiebestand nog steeds voorhanden is. Bij abort-upgrade/abort-install (afbreken van de opwaardering/installatie) hernoemt het script postrm zo nodig oud-configuratiebestand.dpkg-remove terug naar oud-configuratiebestand.

OMSCHAKELEN TUSSEN SYMBOLISCHE KOPPELING EN MAP
Bij het opwaarderen van een pakket zal dpkg niet automatisch een symbolische koppeling omzetten naar een map of vice versa. Degradaties worden niet ondersteund en het pad wordt onveranderd gelaten.

  Een symbolische koppeling omzetten naar een map
Indien een symbolische koppeling veranderd wordt naar een echte map, moet u er voor zorgen dat de symbolische koppeling verwijderd wordt voor het uitpakken. Op het eerste gezicht kan dit een eenvoudige wijziging in het script preinst lijken. Nochtans kan dit enige problemen opleveren in het geval de systeembeheerder de symbolische koppeling lokaal aanpaste of bij een degradatie van het pakket.

Een vlotte manier van hernoemen kan gerealiseerd worden door het volgende shell-fragment te plaatsen in de scripts preinst, postinst en postrm van de pakketonderhouder:

    dpkg-maintscript-helper symlink_to_dir \
        padnaam oud-doel vorige-versie pakket -- "$@"

padnaam is de absolute naam van de oude symbolische koppeling (op het einde van de installatie zal het pad een map zijn) en oud-doel is de naam van het doel van de vroegere symbolische koppeling in padnaam. Die kan ofwel absoluut zijn ofwel relatief ten opzichte van de map die padnaam bevat.

Huidige toepassing: het script preinst gaat na of de symbolische koppeling bestaat en verwijst naar oud-doel. Is dit niet het geval dan wordt ze gerust gelaten. Anders wordt ze hernoemd naar padnaam.dpkg-backup. Tijdens het configureren verwijdert het script postinst padnaam.dpkg-backup indien padnaam.dpkg-backup nog steeds een symbolische koppeling is. Bij een abort-upgrade/abort-install (afbreken van de opwaardering/installatie) hernoemt het script postrm padnaam.dpkg-backup zo nodig terug naar padnaam.

  Een map omzetten naar een symbolische koppelling
Indien een echte map omgezet wordt naar een symbolische koppeling, moet u ervoor zorgen dat de map verwijderd wordt voor het uitpakken. Dit kan op het eerste gezicht een eenvoudige aanpassing aan het script preinst lijken. Nochtans kan dit enige problemen opleveren in het geval de map configuratiebestanden (conffiles) bevat, padnamen die eigendom zijn van andere pakketten of lokaal aangemaakte padnamen, of in het geval het pakket gedegradeerd wordt.

Een elegante omschakeling kan gerealiseerd worden door het volgende shell-fragment op te nemen in de scripts preinst, postinst en postrm van de pakketonderhouder:

    dpkg-maintscript-helper dir_to_symlink \
        padnaam nieuw-doel vorige-versie pakket -- "$@"

padnaam is de absolute naam van de oude map (het pad zal op het einde van de installatie een symbolische koppeling zijn) en nieuw-doel is het doel van de nieuwe symbolische koppeling in padnaam. Dit kan ofwel absoluut of relatief zijn ten opzichte van de map die padnaam bevat.

Huidige toepassing: het script preinst controleert of de map bestaat en geen configuratiebestanden, padnamen die eigendom zijn van andere pakketten of lokaal aangemaakte padnamen bevat. Is dat niet het geval, dan wordt ze gerust gelaten. Anders wordt ze hernoemd naar padnaam.dpkg-backup en wordt een lege voorlopige map padnaam aangemaakt die met een bestand gemarkeerd wordt, zodat dpkg ze kan opvolgen. Tijdens het configureren beëindigt het script postinst de overgang indien padnaam.dpkg-backup nog steeds een map is en padnaam de voorlopige map. Het verwijdert het bestand dat de voorlopige map markeert en verplaatst de zopas in de map aangemaakte bestanden naar het doel van de symbolische koppeling nieuw-doel/, vervangt de nu lege voorlopige map padnaam door een symbolische koppeling naar nieuw-doel en verwijdert padnaam.dpkg-backup. In geval van abort-upgrade/abort-install (afbreken van de opwaardering/installatie) hernoemt het script postrm zo nodig padnaam.dpkg-backup terug naar padnaam.

DE INTEGRATIE IN PAKKETTEN

Gelieve bij het gebruiken van een hulpmiddel voor het verpakken na te gaan of er geen systeemeigen integratie in dpkg-maintscript-helper van bestaat, wat het leven voor u makkelijker zou maken. Zie bijvoorbeeld dh_installdeb(1).

Gegeven het feit dat dpkg-maintscript-helper gebruikt wordt in het script preinst, houdt een onvoorwaardelijk gebruik ervan een voorafgaande vereiste in om te kunnen garanderen dat de benodigde versie van dpkg voordien uitgepakt werd. De benodigde versie hangt af van het gebruikte commando. Voor rm_conffile en mv_conffile is dat 1.15.7.2. Voor symlink_to_dir en dir_to_symlink is dat 1.17.14:

    Pre-Depends: dpkg (>= 1.17.14)

Maar in veel gevallen is de operatie die door het programma uitgevoerd wordt, niet kritiek van aard voor het pakket en in plaats van een voorafgaande vereiste te gebruiken, kunnen we ook het programma pas aanroepen als we weten dat het benodigde programma ondersteund wordt door de huidige geïnstalleerde versie van dpkg:

    if dpkg-maintscript-helper supports commando; then
        dpkg-maintscript-helper commando ...
    fi

Het commando supports geeft in geval van succes een 0 terug en anders een 1. Het commando supports gaat na of de omgevingsvariabelen die ingesteld worden door dpkg en die het script nodig heeft, voorhanden zijn. Indien de omgeving niet voldoet, zal dit als een mislukking beschouwd worden.

ZIE OOK
dh_installdeb(1).