home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl -w
- # This file was preprocessed, do not edit!
-
-
- package Debconf::FrontEnd::Dialog;
- use strict;
- use Debconf::Gettext;
- use Debconf::Priority;
- use Debconf::TmpFile;
- use Debconf::Log qw(:all);
- use Debconf::Encoding qw(wrap $columns width);
- use IPC::Open3;
- use POSIX;
- use Fcntl;
- use base qw(Debconf::FrontEnd::ScreenSize);
-
-
- sub init {
- my $this=shift;
-
- $this->SUPER::init(@_);
-
- delete $ENV{POSIXLY_CORRECT} if exists $ENV{POSIXLY_CORRECT};
- delete $ENV{POSIX_ME_HARDER} if exists $ENV{POSIX_ME_HARDER};
-
- if (! exists $ENV{TERM} || ! defined $ENV{TERM} || $ENV{TERM} eq '') {
- die gettext("TERM is not set, so the dialog frontend is not usable.")."\n";
- }
- elsif ($ENV{TERM} =~ /emacs/i) {
- die gettext("Dialog frontend is incompatible with emacs shell buffers")."\n";
- }
- elsif ($ENV{TERM} eq 'dumb' || $ENV{TERM} eq 'unknown') {
- die gettext("Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.")."\n";
- }
-
- $this->interactive(1);
- $this->capb('backup');
-
- if (-x "/usr/bin/whiptail" &&
- (! defined $ENV{DEBCONF_FORCE_DIALOG} || ! -x "/usr/bin/dialog") &&
- (! defined $ENV{DEBCONF_FORCE_XDIALOG} || ! -x "/usr/bin/Xdialog")) {
- $this->program('whiptail');
- $this->dashsep('--');
- $this->borderwidth(5);
- $this->borderheight(6);
- $this->spacer(1);
- $this->titlespacer(10);
- $this->columnspacer(3);
- $this->selectspacer(9);
- $this->hasoutputfd(1);
- }
- elsif (-x "/usr/bin/dialog" &&
- (! defined $ENV{DEBCONF_FORCE_XDIALOG} || ! -x "/usr/bin/Xdialog")) {
- $this->program('dialog');
- $this->dashsep(''); # dialog does not need (or support)
- $this->borderwidth(7);
- $this->borderheight(6);
- $this->spacer(0);
- $this->titlespacer(4);
- $this->columnspacer(2);
- $this->selectspacer(0);
- $this->hasoutputfd(1);
- }
- elsif (-x "/usr/bin/Xdialog" && defined $ENV{DISPLAY}) {
- $this->program("Xdialog");
- $this->borderwidth(7);
- $this->borderheight(20);
- $this->spacer(0);
- $this->titlespacer(10);
- $this->selectspacer(0);
- $this->columnspacer(2);
- $this->screenheight(200);
- }
- else {
- die gettext("No usable dialog-like program is installed, so the dialog based frontend cannot be used.");
- }
-
- if ($this->screenheight < 13 || $this->screenwidth < 31) {
- die gettext("Dialog frontend requires a screen at least 13 lines tall and 31 columns wide.")."\n";
- }
- }
-
-
- sub sizetext {
- my $this=shift;
- my $text=shift;
-
- $columns = $this->screenwidth - $this->borderwidth - $this->columnspacer;
- $text=wrap('', '', $text);
- my @lines=split(/\n/, $text);
-
- my $window_columns=width($this->title) + $this->titlespacer;
- map {
- my $w=width($_);
- $window_columns = $w if $w > $window_columns;
- } @lines;
-
- return $text, $#lines + 1 + $this->borderheight,
- $window_columns + $this->borderwidth;
- }
-
-
- sub showtext {
- my $this=shift;
- my $question=shift;
- my $intext=shift;
-
- my $lines = $this->screenheight;
- my ($text, $height, $width)=$this->sizetext($intext);
-
- my @lines = split(/\n/, $text);
- my $num;
- my @args=('--msgbox', join("\n", @lines));
- if ($lines - 4 - $this->borderheight <= $#lines) {
- $num=$lines - 4 - $this->borderheight;
- if ($this->program eq 'whiptail') {
- push @args, '--scrolltext';
- }
- else {
- my $fh=Debconf::TmpFile::open();
- print $fh join("\n", @lines);
- close $fh;
- @args=("--textbox", Debconf::TmpFile::filename());
- }
- }
- else {
- $num=$#lines + 1;
- }
- $this->showdialog($question, @args, $num + $this->borderheight, $width);
- if ($args[0] eq '--textbox') {
- Debconf::TmpFile::cleanup();
- }
- }
-
-
- sub makeprompt {
- my $this=shift;
- my $question=shift;
- my $freelines=$this->screenheight - $this->borderheight + 1;
- $freelines += shift if @_;
-
- my ($text, $lines, $columns)=$this->sizetext(
- $question->extended_description."\n\n".
- $question->description
- );
-
- if ($lines > $freelines) {
- $this->showtext($question, $question->extended_description);
- ($text, $lines, $columns)=$this->sizetext($question->description);
- }
-
- return ($text, $lines, $columns);
- }
-
- sub startdialog {
- my $this=shift;
- my $question=shift;
- my $wantinputfd=shift;
-
- debug debug => "preparing to run dialog. Params are:" ,
- join(",", $this->program, @_);
-
- use vars qw{*SAVEOUT *SAVEIN};
- open(SAVEOUT, ">&STDOUT") || die $!;
- $this->dialog_saveout(\*SAVEOUT);
- if ($wantinputfd) {
- $this->dialog_savein(undef);
- } else {
- open(SAVEIN, "<&STDIN") || die $!;
- $this->dialog_savein(\*SAVEIN);
- }
-
- $this->dialog_savew($^W);
- $^W=0;
-
- unless ($this->capb_backup || grep { $_ eq '--defaultno' } @_) {
- if ($this->program ne 'Xdialog') {
- unshift @_, '--nocancel';
- }
- else {
- unshift @_, '--no-cancel';
- }
- }
-
- if ($this->program eq 'Xdialog' && $_[0] eq '--passwordbox') {
- $_[0]='--password --inputbox'
- }
-
- use vars qw{*OUTPUT_RDR *OUTPUT_WTR};
- if ($this->hasoutputfd) {
- pipe(OUTPUT_RDR, OUTPUT_WTR) || die "pipe: $!";
- my $flags=fcntl(\*OUTPUT_WTR, F_GETFD, 0);
- fcntl(\*OUTPUT_WTR, F_SETFD, $flags & ~FD_CLOEXEC);
- $this->dialog_output_rdr(\*OUTPUT_RDR);
- unshift @_, "--output-fd", fileno(\*OUTPUT_WTR);
- }
-
- my $backtitle='';
- if (defined $this->info) {
- $backtitle = $this->info->description;
- } else {
- $backtitle = gettext("Ubuntu Configuration");
- }
-
- use vars qw{*INPUT_RDR *INPUT_WTR};
- if ($wantinputfd) {
- pipe(INPUT_RDR, INPUT_WTR) || die "pipe: $!";
- autoflush INPUT_WTR 1;
- my $flags=fcntl(\*INPUT_RDR, F_GETFD, 0);
- fcntl(\*INPUT_RDR, F_SETFD, $flags & ~FD_CLOEXEC);
- $this->dialog_input_wtr(\*INPUT_WTR);
- } else {
- $this->dialog_input_wtr(undef);
- }
-
- use vars qw{*ERRFH};
- my $pid = open3($wantinputfd ? '<&INPUT_RDR' : '<&STDIN', '>&STDOUT',
- \*ERRFH, $this->program,
- '--backtitle', $backtitle,
- '--title', $this->title, @_);
- $this->dialog_errfh(\*ERRFH);
- $this->dialog_pid($pid);
- close OUTPUT_WTR if $this->hasoutputfd;
- }
-
- sub waitdialog {
- my $this=shift;
-
- my $input_wtr=$this->dialog_input_wtr;
- if ($input_wtr) {
- close $input_wtr;
- }
- my $output_rdr=$this->dialog_output_rdr;
- my $errfh=$this->dialog_errfh;
- my $output='';
- if ($this->hasoutputfd) {
- while (<$output_rdr>) {
- $output.=$_;
- }
- my $error=0;
- while (<$errfh>) {
- print STDERR $_;
- $error++;
- }
- if ($error) {
- die sprintf("debconf: %s output to the above errors, giving up!", $this->program)."\n";
- }
- }
- else {
- while (<$errfh>) { # ugh
- $output.=$_;
- }
- }
- chomp $output;
-
- waitpid($this->dialog_pid, 0);
- $^W=$this->dialog_savew;
-
- if (defined $this->dialog_savein) {
- open(STDIN, '<&', $this->dialog_savein) || die $!;
- }
- open(STDOUT, '>&', $this->dialog_saveout) || die $!;
-
- my $ret=$? >> 8;
- if ($ret == 255 || ($ret == 1 && join(' ', @_) !~ m/--yesno\s/)) {
- $this->backup(1);
- return undef;
- }
-
- if (wantarray) {
- return $ret, $output;
- }
- else {
- return $output;
- }
- }
-
-
- sub showdialog {
- my $this=shift;
- my $question=shift;
-
- if (defined $this->progress_bar) {
- $this->progress_bar->stop;
- }
-
- $this->startdialog($question, 0, @_);
- my (@ret, $ret);
- if (wantarray) {
- @ret=$this->waitdialog(@_);
- } else {
- $ret=$this->waitdialog(@_);
- }
-
- if (defined $this->progress_bar) {
- $this->progress_bar->start;
- }
-
- if (wantarray) {
- return @ret;
- } else {
- return $ret;
- }
- }
-
-
- 1
-