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!
It was ten years ago, when the
This post describes how we performed, on a cluster of ours, an upgrade of both the CFEngine policies, and of the CFEngine software itself from 3.3.5 to 3.4.4. The tools we used for the job were an editor and