Bug#537535: Offer for help, first patch
Hi guys,
I'd like to try and help with the switch to cdebconf as default, and
decided to start by having a look at this bug.
First, I took a stab at implementing debconf-get-selections, see patch
attached. It seems to work, but any feedback would be very welcome. I
added entries to cdebconf.conf-dist for the --installer option, which I
hope is the correct way.
I also had a look at Colin's patch, found a bug in debconf-escape, and
hope to send a working patch very soon. A pointer to test the escape
CAPB would be welcome as well, as I started work on it, based on the
Colin's patch.
Obviously any comment, feedback, or pointer to ways I could help would
be very welcome.
Regis
diff --git a/debian/cdebconf.install b/debian/cdebconf.install
index aa3b8a5..a32582c 100644
--- a/debian/cdebconf.install
+++ b/debian/cdebconf.install
@@ -4,6 +4,7 @@ deb/usr/lib/cdebconf/debconf usr/lib/cdebconf
deb/usr/lib/cdebconf/debconf-communicate usr/lib/cdebconf
deb/usr/lib/cdebconf/debconf-copydb usr/lib/cdebconf
deb/usr/lib/cdebconf/debconf-dumpdb usr/lib/cdebconf
+deb/usr/lib/cdebconf/debconf-get-selections usr/lib/cdebconf
deb/usr/lib/cdebconf/debconf-loadtemplate usr/lib/cdebconf
deb/usr/lib/cdebconf/dpkg-reconfigure usr/lib/cdebconf
deb/usr/lib/cdebconf/frontend/passthrough.so usr/lib/cdebconf/frontend
diff --git a/src/.gitignore b/src/.gitignore
index 4bb4aea..ffeeb89 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -7,6 +7,7 @@ debconf
debconf-communicate
debconf-copydb
debconf-dumpdb
+debconf-get-selections
debconf-loadtemplate
dpkg-reconfigure
debconf.conf
diff --git a/src/Makefile.in b/src/Makefile.in
index e97bbfb..e6319d0 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -13,7 +13,7 @@ CLILIBNAME=$(CLILIB).$(MAJOR).$(MINOR).$(MICRO)
CLISONAME=$(CLILIB).$(MAJOR)
DEBCONF=debconf
TOOLS=debconf-loadtemplate debconf-copydb debconf-communicate \
- debconf-dumpdb \
+ debconf-dumpdb debconf-get-selections \
dpkg-reconfigure #dpkg-preconfigure
BIN=$(DEBCONF) $(TOOLS)
@@ -65,6 +65,7 @@ install:
install -m 755 debconf-copydb debconf-dumpdb $(DESTDIR)${moddir}
ifneq ($(TARGET),udeb)
install -m 755 debconf-communicate $(DESTDIR)${moddir}
+ install -m 755 debconf-get-selections $(DESTDIR)${moddir}
install -m 755 dpkg-reconfigure $(DESTDIR)${moddir}
endif
install -m 644 $(LIBNAME) $(DESTDIR)${moddir}
diff --git a/src/cdebconf.conf-dist.in b/src/cdebconf.conf-dist.in
index 369be94..6036d04 100644
--- a/src/cdebconf.conf-dist.in
+++ b/src/cdebconf.conf-dist.in
@@ -31,6 +31,11 @@ template {
driver "rfc822db";
path "/target/var/cache/debconf/templates.dat";
};
+
+ instance "di_templatedb" {
+ driver "rfc822db";
+ path "/var/log/installer/cdebconf/templates.dat";
+ };
};
config {
@@ -68,5 +73,11 @@ config {
stack { "target_config_gen_db"; "target_config_passwd_db"; };
template "target_templatedb";
};
+
+ instance "di_configdb" {
+ driver "rfc822db";
+ path "/var/log/installer/cdebconf/questions.dat";
+ template "di_templatedb";
+ };
};
diff --git a/src/debconf-get-selections.c b/src/debconf-get-selections.c
new file mode 100644
index 0000000..b5a024c
--- /dev/null
+++ b/src/debconf-get-selections.c
@@ -0,0 +1,105 @@
+/**
+ * @file debconf-get-selections.c
+ * @brief Output contents of debconf database
+ *
+ */
+
+#include "common.h"
+#include "configuration.h"
+#include "database.h"
+#include "question.h"
+#include "template.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <locale.h>
+#include <string.h>
+
+static int installer = 0;
+static struct option g_dpc_args[] = {
+ { "installer", 0, &installer, 'i' },
+ { 0, 0, 0, 0 }
+};
+
+int main(int argc, char **argv)
+{
+ const char *defaultowner = "unknown";
+ struct configuration *config;
+ struct template_db *tdb;
+ struct question_db *qdb;
+ struct question *q;
+ void *iter;
+ int c;
+
+ setlocale(LC_ALL, "");
+
+ config = config_new();
+
+ while ((c = getopt_long(argc, argv, "", g_dpc_args, NULL)) > 0)
+ {
+ switch (c)
+ {
+ case 'i':
+ defaultowner = "d-i";
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* parse the configuration info */
+ if (config->read(config, DEBCONFCONFIG) == 0)
+ DIE("Error reading configuration information");
+
+ /* initialize database modules */
+ if ((tdb = template_db_new(config, installer?"di_templatedb":NULL)) == 0)
+ DIE("Cannot initialize DebConf template database");
+ if ((qdb = question_db_new(config, tdb, installer?"di_configdb":NULL)) == 0)
+ DIE("Cannot initialize DebConf config database");
+
+ /* load database */
+ tdb->methods.load(tdb);
+ qdb->methods.load(qdb);
+
+ iter = 0;
+ while ((q = qdb->methods.iterate(qdb, &iter)) != NULL)
+ {
+ struct questionowner *owner = q->owners;
+ const char *type = q->template->type;
+
+ if ((type == NULL) ||
+ (strcmp(type, "title") == 0) ||
+ (strcmp(type, "text") == 0))
+ continue;
+
+ printf("# %s\n", q_get_description(0, q));
+ if ((strcmp(type, "select") == 0) ||
+ (strcmp(type, "multiselect") == 0))
+ printf("# Choices: %s\n", q_get_choices(0, q));
+
+ if (!owner)
+ {
+ printf("%s\t%s\t%s\t%s\n", defaultowner, q->tag,
+ type, q->value?q->value:"");
+ }
+ else
+ {
+ while (owner)
+ {
+ printf("%s\t%s\t%s\t%s\n", owner->owner, q->tag,
+ type, q->value?q->value:"");
+ owner = owner->next;
+ }
+ }
+ question_deref(q);
+ }
+
+ template_db_delete(tdb);
+ question_db_delete(qdb);
+
+ config_delete(config);
+
+ return 0;
+}
+
Reply to: