Många av dessa åtgärder kräver samordnade åtgärder från flera paketskript (preint, postinst, prerm, postrm). För att undvika misstag räcker det att lägga in ett och samma anrop i alla skript, varpå programmet anpassar sitt beteende beroende på miljövariabeln DPKG_MAINTSCRIPT_NAME och på paketskriptets parametrar, vilka du måste vidaresända efter dubbla bindestreck.
Om konffilen inte har sänts med i flera versioner och du nu uppdaterar utvecklarskripten till att städa bort den gamla filen bör tidigare-version baseras på den version av paketet du nu förbereder, inte den första version av paketet som saknade konffilen. Detta gäller på samma sätt för alla andra åtgärder.
Som ett exempel, för en konffil som togs bort i version 2.0-1 av ett paket bör tidigareversion sättas till 2.0-1~. Detta får konffilen att tas bort även om användaren bygger om den tidigare versionen 1.0-1 som 1.0-1local1. Eller ett paket som bytt en sökväg från att vara en symbolisk länk (skeppad i version 1.0-1) till en katalog (skeppad i version 2.0-1), men bara utfört själva ändringen i utvecklarskripten i version 3.0-1, bör sätta tidigareversion till 3.0-1~.
Det innebär att, om paketet menar att byta namn eller ta bort en konfigurationsfil, så måste det göra så explicit, och då kan dpkg-maintscript-helper användas för att implementera en elegant borttagning och flyttning av konffiler i paketscripten.
Om en konffil helt tas bort bör den tas bort från disk, såvida inte användaren har modifierat den. Om det finns lokala ändringar bör de bibehållas. Om paketuppgraderingen avbryts bör inte konffilen som just blev föråldras försvinna.
Allt detta implementeras genom att lägga in följande skalkod i paketskripten preinst, postinst och postrm:
dpkg-maintscript-helper rm_conffile \
conffile prior-version package --- ``$@''
konffil är namnet på konffilen som skall tas bort.
Aktuell implementation: i preinst kontrolleras om konffilen ändrades och i så fall byts namnet på den till antingen konffil.dpkg-remove (om inte modifierad) eller till konffil.dpkg-backup (om modifierad). I postinst byts namnet på den sistnämnda filen till konffil.dpkg-bak och behålls som referens om den innehåller ändringar av användaren, medan den tidigare kommer att tas bort. Om paketuppgraderingen avbryts kommer postrm att ominstallera den ursprungliga konffilen. Vid borttagning kommer postrm även att ta bort .dpkg-bak-filen som behållits fram till dess.
En elegant namnändring kan implementeras genom att lägga in följande skalkod i paketskripten preinst, postinst och postrm:
dpkg-maintscript-helper mv_conffile \
old-conffile new-conffile prior-version package --- ``$@''
gammalkonffil och nykonffil är de gamla och nya namnen på konffilen vars namn skall bytas.
Aktuell implementation: I preinst kontrolleras om konffilen har ändrats, om ja lämnas den kvar på plats, annars byts namnet på den till gammalkonffil.dpkg-remove. Vid konfigurering tar postinst bort gammalkonffil.dpkg-remove och byter namn på gammalkonffil till nykonffil om gammalkonffil fortfarande finns. Vid avbruten uppgradering eller installation byter postrm tillbaka namnet från gammalkonffil.dpkg-remove till gammalkonffil om så behövs.
En elegant namnändring kan implementeras genom att lägga in följande skalkod i paketskripten preinst, postinst och postrm:
dpkg-maintscript-helper symlink_to_dir \
pathname old-target prior-version package --- ``$@''
sökväg är den absoluta sökvägen för den gamla symboliska länken (sökvägen kommer vara en katalog när installationen är färdig) och gammalt-mål är målet på den tidigare symboliska länken i sökväg. Den kan antingen vara absolut eller relativ till katalogen som innehåller sökväg.
Aktuell implementation: I preinst kontrolleras om den symboliska länken finns och pekar på gammalt-mål, om inte lämnas den kvar, i annat fall byts namnet ut mot sökväg.dpkg-backup. Vid konfigurering tar postinst bort sökväg.dpkg-bakcup om sökväg.dpkg-backup fortfarande är en symbolisk länk. Vid avbruten uppgradering eller installation byter postrm tillbaka namnet från sökväg.dpkg-bakcup till sökväg om så behövs.
Ett elegant byte kan implementeras genom att lägga in följande skalkod i paketskripten preinst, postinst och postrm:
dpkg-maintscript-helper dir_to_symlink \
pathname new-target prior-version package --- ``$@''
sökväg är det absoluta namnet på den gamla katalogen (sökvägen kommer vara en symbolisk länk när installationen är färdig) och nytt-mål är målet på den nya symboliska länken i sökväg. Den kan antingen vara absolut eller relativ till katalogen som innehåller sökväg.
Aktuell implementation: I preinst kontrolleras om katalogen finns, inte innehåller konffiler, sökvägar som ägs av andra paket, eller lokalt skapade sökvägar, om inte så kommer den lämnas kvar, annars byts namnet ut mot sökväg.dpkg-backup och en tom samlingsplatskatalog skapas i sökväg, markerad med en fil så att dpkg kan hålla ordning på den. Vid konfigurering slutför postinst växlingen om sökväg.dpkg-backup fortfarande är en katalog och sökväg är samlingsplatskatalogen; den tar bort märkningsfilen, flyttar nyligen skapade filer inuti samlingskatalogen till målet för den symboliska länken nytt-mål/, ersätter den nu tomma samlingskatalogen sökväg med en symbolisk länk till nytt-mål och tar bort sökväg.dpkg-backup. Vid avbruten uppgradering eller installation byter postrm tillbaka namnet från sökväg.dpkg-backup till sökväg om så behövs.
Givet att dpkg-maintscript-helper används i preinst så innebär detta villkorslöst att ett förhandsberoende (``pre-dependency'') krävs för att försäkra att den nödvändiga versionen av dpkg redan har packats upp. Den version som krävs beror på vilket kommando som används, för rm_conffile och mv_conffile är det 1.15.7.2, för symlink_to_dir och dir_to_symlnk är det 1.17.14:
Pre-Depends: dpkg (>= 1.17.14)
Men i många fall är operationen som utförs av programmet inte kritiskt för paketet, och istället för att använda ett förhandsberoende kan vi anropa programmet endast om vi vet att det nödvändiga kommandot stöds av den nu installerade dpkg:
if dpkg-maintscript-helper supports command; then
dpkg-maintscript-helper command ...
fi
Kommandot supports returnerar 0 vid framgång, annars 1. Kommandot supports kontrollerar om miljövariablerna som sätts av dpkg och som krävs av skriptet är närvarande, och kommer anse det som ett fel om miljövariablerna inte är tillräckliga.