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
|
#!/usr/bin/perl -w
=head1 NAME
Debconf::FrontEnd::Editor - Edit a config file to answer questions
=cut
package Debconf::FrontEnd::Editor;
use strict;
use Debconf::Encoding q(wrap);
use Debconf::TmpFile;
use Debconf::Gettext;
use base qw(Debconf::FrontEnd::ScreenSize);
my $fh;
=head1 DESCRIPTION
This FrontEnd isn't really a frontend. It just generates a series of config
files and runs the users editor on them, then parses the result.
=head1 METHODS
=over 4
=cut
sub init {
my $this=shift;
$this->SUPER::init(@_);
$this->interactive(1);
}
=item comment
Displays a comment, word-wrapped.
=cut
sub comment {
my $this=shift;
my $comment=shift;
# $Text::Wrap::break=q/\s+/;
print $fh wrap('# ','# ',$comment);
$this->filecontents(1);
}
=item separator
Displays a divider bar; a line of hashes.
=cut
sub divider {
my $this=shift;
print $fh ("\n".('#' x ($this->screenwidth - 1))."\n");
}
=item item
Displays an item. First parameter is the item's name, second is its value.
=cut
sub item {
my $this=shift;
my $name=shift;
my $value=shift;
print $fh "$name=\"$value\"\n\n";
$this->filecontents(1);
}
=item go
Items write out data into a temporary file, which is then edited with the
user's editor. Then the file is parsed back in.
=cut
sub go {
my $this=shift;
my @elements=@{$this->elements};
return 1 unless @elements;
# End the filename in .sh because it is basically a shell
# format file, and this makes some editors do good things.
$fh = Debconf::TmpFile::open('.sh');
$this->comment(gettext("You are using the editor-based debconf frontend to configure your system. See the end of this document for detailed instructions."));
$this->divider;
print $fh ("\n");
$this->filecontents('');
foreach my $element (@elements) {
$element->show;
}
# Only proceed if something interesting was actually written to the
# file.
if (! $this->filecontents) {
Debconf::TmpFile::cleanup();
return 1;
}
$this->divider;
$this->comment(gettext("The editor-based debconf frontend presents you with one or more text files to edit. This is one such text file. If you are familiar with standard unix configuration files, this file will look familiar to you -- it contains comments interspersed with configuration items. Edit the file, changing any items as necessary, and then save it and exit. At that point, debconf will read the edited file, and use the values you entered to configure the system."));
print $fh ("\n");
close $fh;
# Launch editor.
my $editor=$ENV{EDITOR} || $ENV{VISUAL} || '/usr/bin/editor';
# $editor may possibly contain spaces and options
system "$editor ".Debconf::TmpFile->filename;
# Now parse the temporary file, looking for lines that look like
# items. Figure out which Element corresponds to the item, and
# pass the text into it to be processed.
# FIXME: this isn't really very robust. Syntax errors are ignored.
my %eltname=map { $_->question->name => $_ } @elements;
open (IN, "<".Debconf::TmpFile::filename());
while (<IN>) {
next if /^\s*#/;
if (/(.*?)="(.*)"/ && $eltname{$1}) {
# Elements can override the value method to
# process the input.
$eltname{$1}->value($2);
}
}
close IN;
Debconf::TmpFile::cleanup();
return 1;
}
=item screenwidth
This method from my base class is overridden, so after the screen width
changes, $Debconf::Encoding::columns is updated to match.
=cut
sub screenwidth {
my $this=shift;
$Debconf::Encoding::columns=$this->SUPER::screenwidth(@_);
}
=back
=head1 AUTHOR
Joey Hess <joeyh@debian.org>
=cut
1
|