Since when I started using Linux Mint Debian Edition (LMDE), it has become increasingly important to have my apt_preferences set up correctly, so that I could pull packages from Debian testing (currently codenamed “jessie”) if I wanted, but use LMDE packages by default. It took me some time and research to find the right settings.
Once found the right settings, and discovered that I needed to “hardcode” the hostname of the LMDE mirror I was using, there came the problem to have the apt sources and apt preferences in sync. It seemed a nice task for CFEngine, and I started to work on managing my apt preferences. The first solution I had in mind didn’t work properly due to a bug in CFEngine that wasn’t yet fixed in version 3.4.4, the one I’m using. The solution below works. It’s a bit more cumbersome than the one that I had in mind, but it should be useful nonetheless 🙂 It’s an edit_line bundle:
# This bundle is used to compile an apt-preferences file (usually # /etc/apt/preferences, or another file in /etc/apt/preferences.d. # It receives in input the name of an array with the following # structure: # # pin[id][Package] string => "package_identifier" # pin[id][Pin] string => "pin for this package" # pin[id][Prio] string => "priority for this package" # # We use preserve_block in insert_lines, so all the three items must # be present (Package, Prio, and Pin). Besides, it is advisable that # the whole file is managed from a blank state. bundle edit_line apt_preferences(pins) { vars: "n" string => "$(const.n)" ; "ids" slist => getindices("$(pins)") ; insert_lines: "Package: $($(pins)[$(ids)][Package])$(n)Pin: $($(pins)[$(ids)][Pin])$(n)Pin-Priority: $($(pins)[$(ids)][Prio])$(n)", insert_type => "preserve_block" ; }
Put the bundle in one of your libraries, import it, and then you can use it like this:
bundle agent test { vars: "ids" slist => {"lmde","mint","jessie","wheezy"} ; "pin[lmde][Prio]" int => "700" ; "pin[mint][Prio]" int => "700" ; "pin[jessie][Prio]" int => "-1" ; "pin[wheezy][Prio]" int => "1" ; "pin[lmde][Pin]" string => "origin debian.lth.se" ; "pin[mint][Pin]" string => "origin packages.linuxmint.com" ; "pin[jessie][Pin]" string => "release n=jessie" ; "pin[wheezy][Pin]" string => "release n=wheezy" ; "pin[$(ids)][Package]" string => "*" ; files: "/tmp/prefs" create => "yes", edit_defaults => empty, perms => owner("bronto"), edit_line => apt_preferences("test.pin") ; }
The test bundle above will create a file like this:
Package: * Pin: origin debian.lth.se Pin-Priority: 700 Package: * Pin: origin packages.linuxmint.com Pin-Priority: 700 Package: * Pin: release n=jessie Pin-Priority: -1 Package: * Pin: release n=wheezy Pin-Priority: 1
Enjoy!