This file is indexed.

/usr/share/doc/debian-policy/debconf_specification.html is in debian-policy 3.9.3.1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
  <meta name="generator" content=
  "HTML Tidy for Linux/x86 (vers 25 March 2009), see www.w3.org">

  <title>Configuration management</title>
  <meta name="GENERATOR" content=
  "Modular DocBook HTML Stylesheet Version 1.79">
</head>

<body class="article" bgcolor="#FFFFFF" text="#000000" link=
"#0000FF" vlink="#840084" alink="#0000FF">
  <div class="ARTICLE">
    <div class="TITLEPAGE">
      <h1 class="title"><a name="AEN2" id="AEN2">Configuration
      management</a></h1>

      <h2 class="subtitle">Protocol version 2.1</h2>

      <h3 class="author"><a name="AEN6" id="AEN6">Wichert
      Akkerman</a></h3>

      <div class="affiliation">
        <span class="orgname">The Debian Project<br></span>

        <div class="address">
          <p class="address"><code class="email">&lt;<a href=
          "mailto:wakkerma@debian.org">wakkerma@debian.org</a>&gt;</code></p>
        </div>
      </div>

      <h3 class="author"><a name="AEN13" id="AEN13">Joey
      Hess</a></h3>

      <div class="affiliation">
        <span class="orgname">The Debian Project<br></span>

        <div class="address">
          <p class="address"><code class="email">&lt;<a href=
          "mailto:joeyh@debian.org">joeyh@debian.org</a>&gt;</code></p>
        </div>
      </div><span class="releaseinfo">Revision 7.1, Debian Policy
      3.9.3.1, 2012-03-13<br></span>

      <p class="copyright">Copyright &copy; 1998, 1999, 2000
      Wichert Akkerman and Joey Hess</p>

      <div class="legalnotice">
        <a name="AEN25" id="AEN25"></a>

        <p>This text is copyright by the authors under the terms of
        the BSD license, sans advertising clause.</p>
      </div>
      <hr>
    </div>

    <div class="TOC">
      <dl>
        <dt><b>Table of Contents</b></dt>

        <dt><a href="#AEN27">Introduction</a></dt>

        <dt><a href="#AEN30">Configuration Data</a></dt>

        <dt><a href="#AEN45">Templates</a></dt>

        <dt><a href="#AEN101">Configuration frontends</a></dt>

        <dt><a href="#AEN106">Communication with the
        frontend</a></dt>

        <dt><a href="#AEN275">Debian install-time
        configuration</a></dt>
      </dl>
    </div>

    <div class="sect1">
      <h2 class="sect1"><a name="AEN27" id=
      "AEN27">Introduction</a></h2>

      <p>Configuration management is quickly becoming a very
      important issue. Having programs which do cool stuff is
      great, but we need to store their configuration as well. We
      see more and more different configuration systems being
      introduced all the time, which is not very practical. This
      text introduces a general configuration management system
      which flexible enough to be used for all kinds of
      applications.</p>
    </div>

    <div class="sect1">
      <hr>

      <h2 class="sect1"><a name="AEN30" id="AEN30">Configuration
      Data</a></h2>

      <div class="sect2">
        <h3 class="sect2"><a name="AEN32" id="AEN32">The
        configuration space</a></h3>

        <p>All configuration information is stored in what I call
        the configuration space. This is a database with a special
        design which resembles the method we look at configuration
        information. This is done by defining a hierarchy of
        information. Each package receives its own space in the
        hierarchy. Each package is free to use a flat space, or
        divide its space further into sub-hierarchies. If multiple
        packages share a common purpose they may use a shared
        toplevel hierarchy, preferably with the same name as a
        shared (virtual) package name (for example, both
        <span class="application">mutt</span> and <span class=
        "application">elm</span> can use <tt class=
        "literal">mail-reader</tt>, <span class=
        "application">strn</span> and <span class=
        "application">nn</span> could use <tt class=
        "literal">news-reader</tt>). This shared tree can also be
        used as a default, ie a variable <tt class=
        "literal">news-reader/nntpserver</tt> can be used by
        <span class="application">strn</span> if <tt class=
        "literal">strn/nntpserver</tt> does not exist.</p>

        <p>Each variable in the configuration space has some
        information associated with it. Most importantly, it has a
        value. It also may have a set of flags and a set of
        substitution data.</p>
      </div>
    </div>

    <div class="sect1">
      <hr>

      <h2 class="sect1"><a name="AEN45" id=
      "AEN45">Templates</a></h2>

      <p>Each variable in the configuration space is associated
      with some meta-data. The minimum meta-data associated with a
      variable is: long and short description, type, and default
      value. The meta-data is essentially static; the protocol
      described below does not allow it to be changed.</p>

      <p>The meta-data exists in a space with similar naming
      properties to the configuration space described above, and
      typically one variable in the configuration space will have
      associated with it metadata with the same name in the
      meta-data space. However, this need not be the case; many
      different variables can all be associated with the same
      meta-data. In effect the meta-data serves as a template for
      the configuration variable.</p>

      <div class="sect2">
        <hr>

        <h3 class="sect2"><a name="AEN49" id="AEN49">Template
        information</a></h3>

        <p>So, what do we need to store in a variable template? Of
        course we need a name to identify the template. Template
        names are made up of components separated by the character
        `/' (slash). Each component is limited to alphanumerics and
        `+' `-' `.' `_' (plus, minus, full stop, underscore).</p>

        <p>A type is also needed so data can be verified. Here is a
        table of common types; implementations are free to make up
        more.</p>

        <div class="table">
          <a name="AEN53" id="AEN53"></a>

          <p><b>Table 1. Available data types</b></p>

          <table border="1" frame="border" class="CALSTABLE">
            <col>
            <col>

            <thead>
              <tr>
                <th>Type</th>

                <th>Description</th>
              </tr>
            </thead>

            <tbody>
              <tr>
                <td>string</td>

                <td>Holds any arbitrary string of data.</td>
              </tr>

              <tr>
                <td>boolean</td>

                <td>Holds "<tt class="literal">true</tt>" or
                "<tt class="literal">false</tt>".</td>
              </tr>

              <tr>
                <td>select</td>

                <td>Holds one of a finite number of possible
                values. These values must be specified in a field
                named <tt class="literal">Choices:</tt>. Separate
                the possible values with commas and spaces, like
                this: <tt class="literal">&#13; Choices: yes, no,
                maybe</tt></td>
              </tr>

              <tr>
                <td>multiselect</td>

                <td>Just like the select data type, except the user
                can choose any number of items from the list. This
                means that the <tt class="literal">Default:</tt>
                field and the actual value of the question may be a
                comma and space delimited list of values, just like
                the <tt class="literal">Choices:</tt> field.</td>
              </tr>

              <tr>
                <td>note</td>

                <td>This template is a note that can be displayed
                to the user. As opposed to text, it is something
                important, that the user really should see. If it
                is not possible to display it, it might be saved to
                a log file or mailbox for them to see later.</td>
              </tr>

              <tr>
                <td>text</td>

                <td>This template is a scrap of text that can be
                displayed to the user. It's intended to be used for
                mostly cosmetic reasons, touching up around other
                questions that are asked at the same time. Unlike a
                note, it isn't treated as something the user should
                definitely see. Less complex frontends may refuse
                to ever display this type of element.</td>
              </tr>

              <tr>
                <td>password</td>

                <td>Holds a password. Use with caution. Be aware
                that the password the user enters will be written
                to a database. You should consider clearing that
                value out of the database as soon as is
                possible.</td>
              </tr>

              <tr>
                <td>title</td>

                <td>Holds a (short) string that can be displayed
                using the SETTITLE command. Only the value of the
                short description will be used.</td>
              </tr>
            </tbody>
          </table>
        </div>

        <p>Of course a default value is useful as well, and finally
        we need a description of the variable. We actually use two
        descriptions: a short one (limited to 50 characters or so)
        and an extended one.</p>

        <p>The extended description may be word-wrapped by the
        FrontEnd. To make separate paragraphs in it, use <tt class=
        "literal">.</tt> on a line by itself to separate them. Text
        in the extended description that is prefaced by additional
        whitespace will not be wordwrapped. Both the description
        and extended description may have substitutions embedded in
        them. Ie, <tt class="literal">${foo}</tt>. These will be
        expanded when the descriptions are displayed.</p>

        <p>This information is stored in a template file that
        consists of stanzas in a rfc-822 compliant format,
        separated by blank lines. Here is an example:</p>
        <pre class="programlisting">
&#13;Template: hostname
Type: string
Default: debian
Description: unqualified hostname for this computer
 This is the name by which this computer will be known on the network. It
 has to be a unique name in your domain.

Template: domain
Type: string
Description: domain for this computer
  This is the domain your computer is a member of. Typically it is
  something like "mycompany.com" or "myuniversity.edu".
        
</pre>

        <p>For localization, the description field (and also the
        choices field of a select or multiselect type question, and
        the default field of a string or password type question)
        can be supplemented with versions for other languages.
        These are named <span class="emphasis"><i class=
        "emphasis">Description-ll</i></span>, <span class=
        "emphasis"><i class=
        "emphasis">Description-ll_LL</i></span>, <span class=
        "emphasis"><i class=
        "emphasis">Description-ll_LL.encoding</i></span> and so
        on.</p>
      </div>
    </div>

    <div class="sect1">
      <hr>

      <h2 class="sect1"><a name="AEN101" id="AEN101">Configuration
      frontends</a></h2>

      <p>Of course applications can use the database and
      meta-database directly. But there should be a simple system
      to interact with the user that is simple and modular enough
      to be used with systems ranging from shell-scripts to Fortran
      programs. To do this we define a general frontend that can be
      driven using the simplest and most common form of
      communication: stdin and stdout.</p>

      <p>Using this simple form of communication gives us a great
      advantage: it becomes easy to change the frontend. That means
      the user can switch between a console, a graphical or even a
      web-interface at will.</p>

      <p>Besides being able to switch between types of frontends
      there is another important aspect of a good user interface:
      user friendliness. We have to account for the fact that some
      users know more then others and change the information we
      show or ask from the user. We do this by giving everything a
      priority and giving the user control over what kind of
      questions he wants to see. Experts can request to see
      everything, while novices get the option of only seeing only
      important questions. Finally there is an option to simply
      skip all questions, so it becomes possible to do automatic
      configuration using default values or values that are
      downloaded into the database from a remote location. This
      makes it simple for example to install and manage clusters or
      lab rooms or do installs for dummies.</p>
    </div>

    <div class="sect1">
      <hr>

      <h2 class="sect1"><a name="AEN106" id="AEN106">Communication
      with the frontend</a></h2>

      <p>This communication between the frontend and the
      application should be as simple as possible. Since most IO
      implementations default to line-buffered IO, so we use a
      simple language where each command is exactly one line.</p>

      <p>After sending each command to stdout, the client should
      read one line from stdin. This is the response to the
      command, and it will be in the form of a number followed by
      whitespace and an optional string of text. The number is the
      status code, while the text provides additional
      information.</p>

      <div class="table">
        <a name="AEN110" id="AEN110"></a>

        <p><b>Table 2. Numeric status codes</b></p>

        <table border="1" frame="border" class="CALSTABLE">
          <col>
          <col>

          <thead>
            <tr>
              <th>Range</th>

              <th>Description</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td>0</td>

              <td>success</td>
            </tr>

            <tr>
              <td>1-9</td>

              <td>reserved</td>
            </tr>

            <tr>
              <td>10-19</td>

              <td>invalid parameters</td>
            </tr>

            <tr>
              <td>20-29</td>

              <td>syntax errors</td>
            </tr>

            <tr>
              <td>30-99</td>

              <td>command-specific return codes</td>
            </tr>

            <tr>
              <td>100-109</td>

              <td>internal errors</td>
            </tr>

            <tr>
              <td>110-255</td>

              <td>reserved</td>
            </tr>
          </tbody>
        </table>
      </div>

      <p>Here are the currently supported commands.</p>

      <ul>
        <li>
          <a name="command_version" id="command_version"></a>

          <p>VERSION <code class="parameter">number</code></p>

          <p>This exchanges with the frontend the protocol version
          number that is being used. The current version is 2.1.
          Versions in the 2.x series will be backwards-compatible.
          You may specify the protocol version number you are
          speaking. The frontend will return the version of the
          protocol it speaks. If the version you specify is too
          low, this command will return the numeric return code
          <tt class="literal">30</tt>.</p>
        </li>

        <li>
          <a name="command_capb" id="command_capb"></a>

          <p>CAPB <code class="parameter">capabilities</code></p>

          <p>This exchanges with the frontend a list of supported
          capabilities Capabilities both the frontend and your
          confmodule support may be used; the capabilities
          supported by the frontend are returned by this
          command.</p>

          <div class="table">
            <a name="AEN150" id="AEN150"></a>

            <p><b>Table 3. Currently used capabilities</b></p>

            <table border="1" frame="border" class="CALSTABLE">
              <col>
              <col>

              <thead>
                <tr>
                  <th>capability</th>

                  <th>description</th>
                </tr>
              </thead>

              <tbody>
                <tr>
                  <td>backup</td>

                  <td>Backing up to a previous step is
                  supported.</td>
                </tr>

                <tr>
                  <td>multiselect</td>

                  <td>The multiselect data type is supported. You
                  do not need to check this capability if you
                  depend on any modern version of debconf.</td>
                </tr>
              </tbody>
            </table>
          </div>
        </li>

        <li>
          <a name="command_settitle" id="command_settitle"></a>

          <p>SETTITLE <code class="parameter">template</code></p>

          <p>You can use this command to set a title in the
          frontend. This may appear in different ways, depending on
          the frontend being used, for example it might change the
          title of the frontend's window. If you don't specify
          anything, a title will automatically be generated.</p>

          <p>Using a template has the advantage that titles are
          translatable and that they can be maintained in the same
          place as other text displayed to users.</p>
        </li>

        <li>
          <a name="command_title" id="command_title"></a>

          <p>TITLE <code class="parameter">string</code></p>

          <p>Similar to SETTITLE, but takes a string instead of a
          template as parameter. Consequence is that the title will
          not be translatable, unless some other mechanism (like
          gettext) is used.</p>
        </li>

        <li>
          <a name="command_stop" id="command_stop"></a>

          <p>STOP</p>

          <p>This command tells the frontend you're done talking to
          it. Typically the frontend can detect the termination of
          your program and this command is not necessary.</p>
        </li>

        <li>
          <a name="command_input" id="command_input"></a>

          <p>INPUT <code class="parameter">priority</code>
          <code class="parameter">question</code></p>

          <p>This tells the frontend to display a question (or
          other type of item) to the user. <code class=
          "parameter">question</code> is the name of the item to
          display, all other information about the item is
          retrieved from the templates described previously.
          <code class="parameter">priority</code> is how important
          it is that the user be prompted. The frontend need only
          ask this question if the priority is high enough. The
          question is not displayed until a go command is given.
          This allows us to ask multiple questions in a single
          screen. Once a question has been displayed to the user
          and the user has provided input, the frontend will set
          the <tt class="literal">seen</tt> flag.</p>

          <div class="table">
            <a name="AEN184" id="AEN184"></a>

            <p><b>Table 4. Supported priorities</b></p>

            <table border="1" frame="border" class="CALSTABLE">
              <col>
              <col>

              <thead>
                <tr>
                  <th>Priority</th>

                  <th>Description</th>
                </tr>
              </thead>

              <tbody>
                <tr>
                  <td>low</td>

                  <td>Very trivial items that have defaults that
                  will work in the vast majority of cases.</td>
                </tr>

                <tr>
                  <td>medium</td>

                  <td>Normal items that have reasonable
                  defaults.</td>
                </tr>

                <tr>
                  <td>high</td>

                  <td>Items that don't have a reasonable
                  default.</td>
                </tr>

                <tr>
                  <td>critical</td>

                  <td>Items that will probably break the system
                  without user intervention.</td>
                </tr>
              </tbody>
            </table>
          </div>

          <p>Note that the frontend decides if the user is actually
          prompted or not. If the user has already answered a
          question, they are normally not asked it again even if
          input is called again. And if the user is ignoring low
          priority items, they will not see them. In either of
          these cases, this command returns the numeric return code
          <tt class="literal">30</tt>.</p>
        </li>

        <li>
          <a name="command_beginblock" id="command_beginblock"></a>

          <p>BEGINBLOCK</p>
        </li>

        <li>
          <a name="command_endblock" id="command_endblock"></a>

          <p>ENDBLOCK</p>

          <p>Some frontends are able to display a number of items
          to the user at once. To do this, they need to be given
          blocks of input commands, enclosed in the BEGINBLOCK and
          ENDBLOCK commands. Blocks can be nested and very advanced
          frontends may use this as a user interface hint.</p>

          <div class="note">
            <blockquote class="note">
              <p><b>Note:</b> There is an implicit block around any
              set of INPUT commands that are not enclosed in an
              explicit block.</p>
            </blockquote>
          </div>
        </li>

        <li>
          <a name="command_go" id="command_go"></a>

          <p>GO</p>

          <p>Shows the current set of accumulated items to the user
          and lets them fill in values, etc. If the backup
          capability is supported and the user indicates they want
          to back up a step, this command returns the numeric
          return code <tt class="literal">30</tt>.</p>
        </li>

        <li>
          <a name="command_clear" id="command_clear"></a>

          <p>CLEAR</p>

          <p>Clears the accumulated set of INPUT commands without
          displaying them to the user.</p>
        </li>

        <li>
          <a name="command_get" id="command_get"></a>

          <p>GET <code class="parameter">question</code></p>

          <p>Ask the frontend to tell you how the user answered a
          question. The value is returned to you.</p>
        </li>

        <li>
          <a name="command_set" id="command_set"></a>

          <p>SET <code class="parameter">question</code>
          <code class="parameter">value</code></p>

          <p>Set the answer of a question to a value.</p>
        </li>

        <li>
          <a name="command_reset" id="command_reset"></a>

          <p>RESET <code class="parameter">question</code></p>

          <p>Reset the question to its default value. This includes
          resetting flags to their defaults.</p>
        </li>

        <li>
          <a name="command_subst" id="command_subst"></a>

          <p>SUBST <code class="parameter">question</code>
          <code class="parameter">key</code> <code class=
          "parameter">value</code></p>

          <p>Questions (and other items) can have substitutions
          embedded in their descriptions (and, currently in their
          choices fields). These substitutions look like
          "<tt class="literal">${key}</tt>". When the question is
          displayed, the substitutions are replaced with their
          values. This command can be used to set the value of a
          substitution.</p>
        </li>

        <li>
          <a name="command_fget" id="command_fget"></a>

          <p>FGET <code class="parameter">question</code>
          <code class="parameter">flag</code></p>

          <p>Questions (and other items) can have flags associated
          with them. The flags have a value of "<tt class=
          "literal">true</tt>" or "<tt class="literal">false</tt>".
          This command returns the value of a flag.</p>
        </li>

        <li>
          <a name="command_fset" id="command_fset"></a>

          <p>FSET <code class="parameter">question</code>
          <code class="parameter">flag</code> <code class=
          "parameter">value</code></p>

          <p>This sets the state of a flag on a question. Valid
          states for the flag are "<tt class="literal">true</tt>"
          and "<tt class="literal">false</tt>".</p>

          <p>One common flag is the "<tt class="literal">seen</tt>"
          flag. It is normally only set if a user already seen a
          question. Typically, frontends only display questions to
          users if they have the seen flag set to "false".
          Sometimes you want the user to see a question again -- in
          these cases you can set the seen flag to false to force
          the frontend to redisplay it.</p>

          <p>Note that as a special convenience behavior, frontends
          will redisplay already seen questions if the question was
          first seen by the user in the same confmodule run. This
          makes it easy for a confmodule to back up to previous
          questions without having to reset the seen flag.</p>
        </li>

        <li>
          <a name="command_metaget" id="command_metaget"></a>

          <p>METAGET <code class="parameter">question</code>
          <code class="parameter">field</code></p>

          <p>This returns the value of any field of a question (the
          description, for example).</p>
        </li>

        <li>
          <a name="command_register" id="command_register"></a>

          <p>REGISTER <code class="parameter">template</code>
          <code class="parameter">question</code></p>

          <p>This creates a new question that is bound to a
          template. By default each template has an associated
          question with the same name. However, any number of
          questions can really be associated with a template, and
          this lets you create more such questions.</p>
        </li>

        <li>
          <a name="command_unregister" id="command_unregister"></a>

          <p>UNREGISTER <code class="parameter">question</code></p>

          <p>This removes a question from the database.</p>
        </li>

        <li>
          <a name="command_purge" id="command_purge"></a>

          <p>PURGE</p>

          <p>Call this in your postrm when your package is purged.
          It removes all templates and questions your package has
          generated.</p>
        </li>
      </ul>
    </div>

    <div class="sect1">
      <hr>

      <h2 class="sect1"><a name="AEN275" id="AEN275">Debian
      install-time configuration</a></h2>

      <p>Debian has had an excellent packaging system for a long
      time now. There is one thing missing though: a system to
      handle the configuration of packages so we don't have to stop
      the installation every time a package needs some data from
      the user or wants to show some information.</p>

      <p>We want to make a package which does not break older
      dpkg's, and we want to be able to get the configuration
      information before the package is unpacked. To do this we add
      two new files, config and templates, to the control.tar.gz of
      a .deb package. Since all installation-software (apt,
      dselect, dpkg) download the package before installing it, we
      can extract this before the package is unpacked.</p>

      <p>The templates file lists the templates for variables that
      this package uses. This is done using the format as used in
      the example in the section on templates.</p>

      <p>The config-file contains a new element, which I call the
      configmodule. This is a program that will determine the
      configuration before the package is unpacked. This means it
      is usually run <span class="emphasis"><i class=
      "emphasis">before</i></span> the preinst, and before the
      package is unpacked!</p>

      <div class="note">
        <blockquote class="note">
          <p><b>Note:</b> Please see debconf-devel(7) for
          details.</p>
        </blockquote>
      </div>This is done to make sure that we can use the desired
      configuration in the preinst if necessary.

      <p>How does the configmodule get its information? The
      configmodule needs a way to retrieve information from the
      configuration space, ask the user for information if
      necessary, etc. But we don't want to implement a user
      interface for each package. To solve this we use a separate
      frontend as specified in the section on frontends.</p>
    </div>
  </div>
</body>
</html>