summaryrefslogtreecommitdiff
path: root/beagle/debian-rfs/usr/share/debconf/fix_db.pl
diff options
context:
space:
mode:
Diffstat (limited to 'beagle/debian-rfs/usr/share/debconf/fix_db.pl')
-rwxr-xr-xbeagle/debian-rfs/usr/share/debconf/fix_db.pl79
1 files changed, 79 insertions, 0 deletions
diff --git a/beagle/debian-rfs/usr/share/debconf/fix_db.pl b/beagle/debian-rfs/usr/share/debconf/fix_db.pl
new file mode 100755
index 0000000..abe80a3
--- /dev/null
+++ b/beagle/debian-rfs/usr/share/debconf/fix_db.pl
@@ -0,0 +1,79 @@
+#!/usr/bin/perl -w
+# This file was preprocessed, do not edit!
+use strict;
+use Debconf::Db;
+use Debconf::Log q{warn};
+
+Debconf::Db->load;
+
+if (! @ARGV || $ARGV[0] ne 'end') {
+ my $fix=0;
+ my $ok;
+ my $counter=0;
+ do {
+ $ok=1;
+
+ my %templates=();
+ my $ti=$Debconf::Db::templates->iterator;
+ while (my $t=$ti->iterate) {
+ $templates{$t}=Debconf::Template->get($t);
+ }
+
+ my %questions=();
+ my $qi=Debconf::Question->iterator;
+ while (my $q=$qi->iterate) {
+ if (! defined $q->template) {
+ warn "question \"".$q->name."\" has no template field; removing it.";
+ $q->addowner("killme",""); # make sure it has one owner at least, so removal is triggered
+ foreach my $owner (split(/, /, $q->owners)) {
+ $q->removeowner($owner);
+ }
+ $ok=0;
+ $fix=1;
+ }
+ elsif (! exists $templates{$q->template->template}) {
+ warn "question \"".$q->name."\" uses nonexistant template ".$q->template->template."; removing it.";
+ foreach my $owner (split(/, /, $q->owners)) {
+ $q->removeowner($owner);
+ }
+ $ok=0;
+ $fix=1;
+ }
+ else {
+ $questions{$q->name}=$q;
+ }
+ }
+
+ foreach my $t (keys %templates) {
+ my @owners=$Debconf::Db::templates->owners($t);
+ if (! @owners) {
+ warn "template \"$t\" has no owners; removing it.";
+ $Debconf::Db::templates->addowner($t, "killme","");
+ $Debconf::Db::templates->removeowner($t, "killme");
+ $fix=1;
+ }
+ foreach my $q (@owners) {
+ if (! exists $questions{$q}) {
+ warn "template \"$t\" claims to be used by nonexistant question \"$q\"; removing that.";
+ $Debconf::Db::templates->removeowner($t, $q);
+ $ok=0;
+ $fix=1;
+ }
+ }
+ }
+ $counter++;
+ } until ($ok || $counter > 20);
+
+ if ($fix) {
+ Debconf::Db->save;
+ exec($0, "end");
+ die "exec of self failed";
+ }
+}
+
+foreach my $templatefile (glob("/var/lib/dpkg/info/*.templates")) {
+ my ($package) = $templatefile =~ m:/var/lib/dpkg/info/(.*?).templates:;
+ Debconf::Template->load($templatefile, $package);
+}
+
+Debconf::Db->save;