<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/perl -w
# This file was preprocessed, do not edit!


package Debconf::ConfModule;
use strict;
use IPC::Open2;
use FileHandle;
use Debconf::Gettext;
use Debconf::Config;
use Debconf::Question;
use Debconf::Priority qw(priority_valid high_enough);
use Debconf::FrontEnd::Noninteractive;
use Debconf::Log ':all';
use Debconf::Encoding;
use base qw(Debconf::Base);


my %codes = (
	success =&gt; 0,
	escaped_data =&gt; 1,
	badparams =&gt; 10,
	syntaxerror =&gt; 20,
	input_invisible =&gt; 30,
	version_bad =&gt; 30,
	go_back =&gt; 30,
	progresscancel =&gt; 30,
	internalerror =&gt; 100,
);


sub init {
	my $this=shift;

	$this-&gt;version("2.0");
	
	$this-&gt;owner('unknown') if ! defined $this-&gt;owner;
	
	$this-&gt;frontend-&gt;capb_backup('');

	$this-&gt;seen([]);
	$this-&gt;busy([]);

	$ENV{DEBIAN_HAS_FRONTEND}=1;
}


sub startup {
	my $this=shift;
	my $confmodule=shift;

	$this-&gt;frontend-&gt;clear;
	$this-&gt;busy([]);
	
	my @args=$this-&gt;confmodule($confmodule);
	push @args, @_ if @_;
	
	debug developer =&gt; "starting ".join(' ',@args);
	$this-&gt;pid(open2($this-&gt;read_handle(FileHandle-&gt;new),
		         $this-&gt;write_handle(FileHandle-&gt;new),
			 @args)) || die $!;
		
	$this-&gt;caught_sigpipe('');
	$SIG{PIPE}=sub { $this-&gt;caught_sigpipe(128) };
}


sub communicate {
	my $this=shift;

	my $r=$this-&gt;read_handle;
	$_=&lt;$r&gt; || return $this-&gt;finish;
	chomp;
	my $ret=$this-&gt;process_command($_);
	my $w=$this-&gt;write_handle;
	print $w $ret."\n";
	return '' unless length $ret;
	return 1;
}


sub escape {
	my $text=shift;
	$text=~s/\\/\\\\/g;
	$text=~s/\n/\\n/g;
	return $text;
}


sub unescape_split {
	my $text=shift;
	my @words;
	my $word='';
	for my $chunk (split /(\\.|\s+)/, $text) {
		if ($chunk eq '\n') {
			$word.="\n";
		} elsif ($chunk=~/^\\(.)$/) {
			$word.=$1;
		} elsif ($chunk=~/^\s+$/) {
			push @words, $word;
			$word='';
		} else {
			$word.=$chunk;
		}
	}
	push @words, $word if $word ne '';
	return @words;
}


sub process_command {
	my $this=shift;
	
	debug developer =&gt; "&lt;-- $_";
	chomp;
	my ($command, @params);
	if (defined $this-&gt;client_capb and grep { $_ eq 'escape' } @{$this-&gt;client_capb}) {
		($command, @params)=unescape_split($_);
	} else {
		($command, @params)=split(' ', $_);
	}
	if (! defined $command) {
		return $codes{syntaxerror}.' '.
			"Bad line \"$_\" received from confmodule.";
	}
	$command=lc($command);
	if (lc($command) eq "stop") {
		return $this-&gt;finish;
	}
	if (! $this-&gt;can("command_$command")) {
		return $codes{syntaxerror}.' '.
		       "Unsupported command \"$command\" (full line was \"$_\") received from confmodule.";
	}
	$command="command_$command";
	my $ret=join(' ', $this-&gt;$command(@params));
	debug developer =&gt; "--&gt; $ret";
	if ($ret=~/\n/) {
		debug developer =&gt; 'Warning: return value is multiline, and would break the debconf protocol. Truncating to first line.';
		$ret=~s/\n.*//s;
		debug developer =&gt; "--&gt; $ret";
	}
	return $ret;
}


sub finish {
	my $this=shift;

	waitpid $this-&gt;pid, 0 if defined $this-&gt;pid;
	$this-&gt;exitcode($this-&gt;caught_sigpipe || ($? &gt;&gt; 8));

	$SIG{PIPE} = sub {};
	
	foreach (@{$this-&gt;seen}) {
		my $q=Debconf::Question-&gt;get($_-&gt;name);
		$_-&gt;flag('seen', 'true') if $q;
	}
	$this-&gt;seen([]);
	
	return '';
}


sub command_input {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
	my $priority=shift;
	my $question_name=shift;
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "\"$question_name\" doesn't exist";

	if (! priority_valid($priority)) {
		return $codes{syntaxerror}, "\"$priority\" is not a valid priority";
	}

	$question-&gt;priority($priority);
	
	my $visible=1;

	if ($question-&gt;type ne 'error') {
		$visible='' unless high_enough($priority);

		$visible='' if ! Debconf::Config-&gt;reshow &amp;&amp;
			       $question-&gt;flag('seen') eq 'true';
	}

	my $markseen=$visible;

	if ($visible &amp;&amp; ! $this-&gt;frontend-&gt;interactive) {
		$visible='';
		$markseen='' unless Debconf::Config-&gt;noninteractive_seen eq 'true';
	}

	my $element;
	if ($visible) {
		$element=$this-&gt;frontend-&gt;makeelement($question);
		unless ($element) {
			return $codes{internalerror},
			       "unable to make an input element";
		}

		$visible=$element-&gt;visible;
	}

	if (! $visible) {
		$element=Debconf::FrontEnd::Noninteractive-&gt;makeelement($question, 1);

		return $codes{input_invisible}, "question skipped" unless $element;
	}

	$element-&gt;markseen($markseen);

	push @{$this-&gt;busy}, $question_name;
	
	$this-&gt;frontend-&gt;add($element);
	if ($element-&gt;visible) {
		return $codes{success}, "question will be asked";
	}
	else {
		return $codes{input_invisible}, "question skipped";
	}
}


sub command_clear {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 0;

	$this-&gt;frontend-&gt;clear;
	$this-&gt;busy([]);
	return $codes{success};
}


sub command_version {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &gt; 1;
	my $version=shift;
	if (defined $version) {
		return $codes{version_bad}, "Version too low ($version)"
			if int($version) &lt; int($this-&gt;version);
		return $codes{version_bad}, "Version too high ($version)"
			if int($version) &gt; int($this-&gt;version);
	}
	return $codes{success}, $this-&gt;version;
}


sub command_capb {
	my $this=shift;
	$this-&gt;client_capb([@_]);
	if (grep { $_ eq 'backup' } @_) {
		$this-&gt;frontend-&gt;capb_backup(1);
	} else {
		$this-&gt;frontend-&gt;capb_backup('');
	}
	my @capb=('multiselect', 'escape');
	push @capb, $this-&gt;frontend-&gt;capb;
	return $codes{success}, @capb;
}


sub command_title {
	my $this=shift;
	$this-&gt;frontend-&gt;title(join ' ', @_);
	$this-&gt;frontend-&gt;requested_title($this-&gt;frontend-&gt;title);

	return $codes{success};
}


sub command_settitle {
	my $this=shift;
	
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
	my $question_name=shift;
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "\"$question_name\" doesn't exist";

	if ($this-&gt;frontend-&gt;can('settitle')) {
		$this-&gt;frontend-&gt;settitle($question);
	} else {
		$this-&gt;frontend-&gt;title($question-&gt;description);
	}
	$this-&gt;frontend-&gt;requested_title($this-&gt;frontend-&gt;title);
	
	return $codes{success};
}


sub command_beginblock {
	return $codes{success};
}
sub command_endblock {
	return $codes{success};
}


sub command_go {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &gt; 0;

	my $ret=$this-&gt;frontend-&gt;go;
	if ($ret &amp;&amp; (! $this-&gt;backed_up ||
	             grep { $_-&gt;visible } @{$this-&gt;frontend-&gt;elements})) {
		foreach (@{$this-&gt;frontend-&gt;elements}) {
			$_-&gt;question-&gt;value($_-&gt;value);
			push @{$this-&gt;seen}, $_-&gt;question if $_-&gt;markseen &amp;&amp; $_-&gt;question;
		}
		$this-&gt;frontend-&gt;clear;
		$this-&gt;busy([]);
		$this-&gt;backed_up('');
		return $codes{success}, "ok"
	}
	else {
		$this-&gt;frontend-&gt;clear;
		$this-&gt;busy([]);
		$this-&gt;backed_up(1);
		return $codes{go_back}, "backup";
	}
}


sub command_get {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
	my $question_name=shift;
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";

	my $value=$question-&gt;value;
	if (defined $value) {
		if (defined $this-&gt;client_capb and grep { $_ eq 'escape' } @{$this-&gt;client_capb}) {
			return $codes{escaped_data}, escape($value);
		} else {
			return $codes{success}, $value;
		}
	}
	else {
		return $codes{success}, '';
	}
}


sub command_set {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 1;
	my $question_name=shift;
	my $value=join(" ", @_);

	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";
	$question-&gt;value($value);
	return $codes{success}, "value set";
}


sub command_reset {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
	my $question_name=shift;

	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";
	$question-&gt;value($question-&gt;default);
	$question-&gt;flag('seen', 'false');
	return $codes{success};
}


sub command_subst {
	my $this = shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 2;
	my $question_name = shift;
	my $variable = shift;
	my $value = (join ' ', @_);
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";
	my $result=$question-&gt;variable($variable,$value);
	return $codes{internalerror}, "Substitution failed" unless defined $result;
	return $codes{success};
}


sub command_register {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
	my $template=shift;
	my $name=shift;
	
	my $tempobj = Debconf::Question-&gt;get($template);
	if (! $tempobj) {
		return $codes{badparams}, "No such template, \"$template\"";
	}
	my $question=Debconf::Question-&gt;get($name) || 
	             Debconf::Question-&gt;new($name, $this-&gt;owner, $tempobj-&gt;type);
	if (! $question) {
		return $codes{internalerror}, "Internal error making question";
	}
	if (! defined $question-&gt;addowner($this-&gt;owner, $tempobj-&gt;type)) {
		return $codes{internalerror}, "Internal error adding owner";
	}
	if (! $question-&gt;template($template)) {
		return $codes{internalerror}, "Internal error setting template";
	}

	return $codes{success};
}


sub command_unregister {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
	my $name=shift;
	
	my $question=Debconf::Question-&gt;get($name) ||
		return $codes{badparams}, "$name doesn't exist";
	if (grep { $_ eq $name } @{$this-&gt;busy}) {
		return $codes{badparams}, "$name is busy, cannot unregister right now";
	}
	$question-&gt;removeowner($this-&gt;owner);
	return $codes{success};
}


sub command_purge {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &gt; 0;
	
	my $iterator=Debconf::Question-&gt;iterator;
	while (my $q=$iterator-&gt;iterate) {
		$q-&gt;removeowner($this-&gt;owner);
	}

	return $codes{success};
}


sub command_metaget {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
	my $question_name=shift;
	my $field=shift;
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";
	my $lcfield=lc $field;
	my $fieldval=$question-&gt;$lcfield();
	unless (defined $fieldval) {
		return $codes{badparams}, "$field does not exist";
	}
	if (defined $this-&gt;client_capb and grep { $_ eq 'escape' } @{$this-&gt;client_capb}) {
		return $codes{escaped_data}, escape($fieldval);
	} else {
		return $codes{success}, $fieldval;
	}
}


sub command_fget {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
	my $question_name=shift;
	my $flag=shift;
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams},  "$question_name doesn't exist";
		
	return $codes{success}, $question-&gt;flag($flag);
}


sub command_fset {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 3;
	my $question_name=shift;
	my $flag=shift;
	my $value=(join ' ', @_);
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";

	if ($flag eq 'seen') {
		$this-&gt;seen([grep {$_ ne $question} @{$this-&gt;seen}]);
	}
		
	return $codes{success}, $question-&gt;flag($flag, $value);
}


sub command_info {
	my $this=shift;

	if (@_ == 0) {
		$this-&gt;frontend-&gt;info(undef);
	} elsif (@_ == 1) {
		my $question_name=shift;

		my $question=Debconf::Question-&gt;get($question_name) ||
			return $codes{badparams}, "\"$question_name\" doesn't exist";

		$this-&gt;frontend-&gt;info($question);
	} else {
		return $codes{syntaxerror}, "Incorrect number of arguments";
	}

	return $codes{success};
}


sub command_progress {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 1;
	my $subcommand=shift;
	$subcommand=lc($subcommand);
	
	my $ret;

	if ($subcommand eq 'start') {
		return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 3;
		my $min=shift;
		my $max=shift;
		my $question_name=shift;

		return $codes{syntaxerror}, "min ($min) &gt; max ($max)" if $min &gt; $max;

		my $question=Debconf::Question-&gt;get($question_name) ||
			return $codes{badparams}, "$question_name doesn't exist";

		$this-&gt;frontend-&gt;progress_start($min, $max, $question);
		$ret=1;
	}
	elsif ($subcommand eq 'set') {
		return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
		my $value=shift;
		$ret = $this-&gt;frontend-&gt;progress_set($value);
	}
	elsif ($subcommand eq 'step') {
		return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
		my $inc=shift;
		$ret = $this-&gt;frontend-&gt;progress_step($inc);
	}
	elsif ($subcommand eq 'info') {
		return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
		my $question_name=shift;

		my $question=Debconf::Question-&gt;get($question_name) ||
			return $codes{badparams}, "$question_name doesn't exist";

		$ret = $this-&gt;frontend-&gt;progress_info($question);
	}
	elsif ($subcommand eq 'stop') {
		return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 0;
		$this-&gt;frontend-&gt;progress_stop();
		$ret=1;
	}
	else {
		return $codes{syntaxerror}, "Unknown subcommand";
	}

	if ($ret) {
		return $codes{success}, "OK";
	}
	else {
		return $codes{progresscancel}, "CANCELED";
	}
}


sub command_data {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 3;
	my $template=shift;
	my $item=shift;
	my $value=join(' ', @_);
	$value=~s/\\([n"\\])/($1 eq 'n') ? "\n" : $1/eg;

	my $tempobj=Debconf::Template-&gt;get($template);
	if (! $tempobj) {
		if ($item ne 'type') {
			return $codes{badparams}, "Template data field '$item' received before type field";
		}
		$tempobj=Debconf::Template-&gt;new($template, $this-&gt;owner, $value);
		if (! $tempobj) {
			return $codes{internalerror}, "Internal error making template";
		}
	} else {
		if ($item eq 'type') {
			return $codes{badparams}, "Template type already set";
		}
		$tempobj-&gt;$item(Debconf::Encoding::convert("UTF-8", $value));
	}

	return $codes{success};
}


sub command_visible {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 2;
	my $priority=shift;
	my $question_name=shift;
	
	my $question=Debconf::Question-&gt;get($question_name) ||
		return $codes{badparams}, "$question_name doesn't exist";
	return $codes{success}, $this-&gt;frontend-&gt;visible($question, $priority) ? "true" : "false";
}


sub command_exist {
	my $this=shift;
	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ != 1;
	my $question_name=shift;
	
	return $codes{success}, 
		Debconf::Question-&gt;get($question_name) ? "true" : "false";
}


sub command_x_loadtemplatefile {
	my $this=shift;

	return $codes{syntaxerror}, "Incorrect number of arguments" if @_ &lt; 1 || @_ &gt; 2;

	my $file=shift;
	my $fh=FileHandle-&gt;new($file);
	if (! $fh) {
		return $codes{badparams}, "failed to open $file: $!";
	}

	my $owner=$this-&gt;owner;
	if (@_) {
		$owner=shift;
	}

	eval {
		Debconf::Template-&gt;load($fh, $owner);
	};
	if ($@) {
		$@=~s/\n/\\n/g;
		return $codes{internalerror}, $@;
	}
	return $codes{success};
}


sub AUTOLOAD {
	(my $field = our $AUTOLOAD) =~ s/.*://;

	no strict 'refs';
	*$AUTOLOAD = sub {
		my $this=shift;
		
		return $this-&gt;{$field} unless @_;
		return $this-&gt;{$field}=shift;
	};
	goto &amp;$AUTOLOAD;
}


sub DESTROY {
	my $this=shift;
	
	$this-&gt;read_handle-&gt;close if $this-&gt;read_handle;
	$this-&gt;write_handle-&gt;close if $this-&gt;write_handle;
	
	if (defined $this-&gt;pid &amp;&amp; $this-&gt;pid &gt; 1) {
		kill 'TERM', $this-&gt;pid;
	}
}


1
</pre></body></html>