%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /sbin/
Upload File :
Create Path :
Current File : //sbin/update-default-ispell

#!/usr/bin/perl -w

use strict;
use Debian::DictionariesCommon q(:all);
use Debconf::Client::ConfModule q(:all);

dico_checkroot ();

my $triggered;
my $skip_symlinks_setting;
my $class   = "ispell";
my $program = "update-default-$class";
my $debug   = 1 if defined $ENV{'DICT_COMMON_DEBUG'};

# Parse options
foreach my $option ( @ARGV ){
  if ( $option eq "--skip-symlinks" ){
    # Do not try to set symlinks at $linkdir.
    $skip_symlinks_setting++;
  } elsif ( $option eq "--rebuild" ){
    # info is always rebuilt, so this option is not needed.
    # It is preserved as a no-op for old maintainer scripts.
  } elsif ( $option eq "--triggered" ){
    # Do not try to enable update-default-$class} trigger but run the script.
    $triggered++;
  } else {
    die "update-default-$class: Bad option \"$option\". Aborting..."
  }
}

version ('2.0');

updatedb ($class);
my $dictionaries = loaddb ($class);

# Preprocess default symlinks
dico_preprocess_default_symlinks ($class,$dictionaries);

# Enable trigger if needed. Exit cleanly on success.
unless ( $triggered ){
  exit if dico_activate_trigger("update-default-$class");
}

my $manual;
my $question  = "dictionaries-common/default-$class";
my $iquestion = "dictionaries-common/invalid_debconf_value";
my $debconf_dbase_corruption_question = "dictionaries-common/debconf_database_corruption";
my $newflag   = "/var/cache/dictionaries-common/flag-$class-new";

# This flag is intended for remove-default-$class. If we are here we do not
# need it any longer, so we reset for future apt runs by cleaning it.
if ( -f $newflag ){
  print STDERR "$program: Removing $newflag\n" if $debug;
  unlink $newflag
    or print STDERR " $program: Warning: could not remove $newflag\n";
}

my ($ret, $value)  = get ($question);
if ( $ret == 0 && $value ){
  # Question has a value
  if ( $value =~ m/^Manual.*/i ){
    # Question is set to manual mode
    print STDERR "$program: Manual mode for \"$class\"\n" if $debug;
    $manual++;
  } elsif ( not %$dictionaries ) {
    # Question has a value, but no manual mode and no class elements available. Unset value.
    print STDERR "$program: No Manual mode and no $class elements. $question unset.\n" if $debug;
    $value = "";
    set($question,$value);
    $manual++;
  } else {
    # Normal case, question has a value and is set to one of the installed class elements.
    print STDERR "$program: Default is set to \"$value\" for \"$class\"\n" if $debug;
  }
} elsif ( not %$dictionaries ) {
  # Question is empty. No default nor class elements available. Proceed as for manual.
  print STDERR "$program: No \"$class\" elements left.\n" if $debug;
  $manual++;
} else { # Question is empty, but $class elements are installed.

  # This seems to be debconf database corruption. Warn loudly about it.
  my %class_pkgs = ();
  foreach my $lang ( keys %{$dictionaries} ){
    if ( defined $dictionaries->{$lang}->{'package'} ){
      $class_pkgs{$dictionaries->{$lang}->{'package'}}++;
    }
  }
  my $class_packages = join (', ',sort keys %class_pkgs);

  subst($debconf_dbase_corruption_question,"class_packages",$class_packages);
  subst($debconf_dbase_corruption_question,"question",$question);
  fset ($debconf_dbase_corruption_question,"seen","false");
  input("high",$debconf_dbase_corruption_question);
  title ("dictionaries-common: ispell dictionaries");
  go ();

  # Try harder to get a value after default file
  my $dico_sysdefault = dico_getsysdefault($class);
  if ( defined $dico_sysdefault ){ # Not undef. Can be an empty or non-empty string.
    if ( $dico_sysdefault ){ # True: Non-empty string and not 0
      if ( defined $dictionaries->{$dico_sysdefault} ){
	$value = $dico_sysdefault;
	set($question,$value);
	print STDERR "$program: Missing value for \"$question\" question. Using \"$value\"\n";
      }
    } else { # False: The empty string or 0
      $value = "Manual symlinks setting (Forced after default file)";
      set($question,$value);
      $manual++;
    }
  }
}

unless ( $manual ){
  # Handle invalid debconf values
  if ( not exists $dictionaries->{$value} ){
    # This can happen because either an invalid debconf value or a
    # void value due to debconf database corruption. Try after stored
    # values to stay in the safe side.
    my @available_keys = sort {lc $a cmp lc $b} keys %$dictionaries;
    my $choices    = join (', ', sort {lc $a cmp lc $b} @available_keys);
    print STDERR "$program: Trying to get a default value from \"$choices\"\n";
    my $forced_key = $available_keys[0] ||
      die "$program: Selected ispell dictionary" .
	" \"$value\" \n" .
	"does not correspond to any installed package in the system\n" .
	"and no alternative ispell dictionary could be selected.\n";

    # Warn about what might have happened if not debconf database corruption
    if ( $value ){
      subst($iquestion,"value",$value);
      fset ($iquestion,"seen","false");
      input("high",$iquestion);
    }

    # Prepare a selection box to get a default.
    subst ($question, "choices", $choices);  # Put sane values in debconf choices field
    subst ($question, "echoices", $choices); # Put sane values in debconf echoices field
    set ($question, $forced_key);            # Set debconf value to a sane one
    fset ($question,"seen","false");
    input ("critical", $question);
    title ("dictionaries-common: ispell dictionaries");
    go ();
    ($ret, $value) = get ($question);
    die "\n Could not get a valid value for debconf question:\n" .
      "$question\n"
      if ( $ret != 0 ); # This should never be reached

    # Set manual flag if needed to avoid later symlinking
    $manual++ if ( $value =~ m/^Manual.*/i );
  }
}

# Set default value for ispell dictionaries and wordlists
if ( $manual ){
  dico_setsysdefault ($class,"");
} else {
  dico_setsysdefault ($class,$value);
}

# This here is only for ispell, not wordlist
my $emacsen_default      = "nil";
my $cache_dir            = "/var/cache/dictionaries-common";
my $emacsen_default_file = "$cache_dir/emacsen-ispell-default.el";
my $ispell_dicts_list    = "$cache_dir/ispell-dicts-list.txt";

unless ( $manual ){

  # Get ispell default dict for emacsen
  if ( exists $dictionaries->{$value}{"emacs-display"}
       and lc($dictionaries->{$value}{"emacs-display"}) eq "no" ){
    $emacsen_default = "nil";
  } elsif ( exists $dictionaries->{$value}{"emacsen-name"} ){
    $emacsen_default = "\"" . $dictionaries->{$value}{"emacsen-name"} . "\"";
  } elsif( exists $dictionaries->{$value}{"hash-name"} ){
    $emacsen_default = "\"" . $dictionaries->{$value}{"hash-name"} . "\"";
  }
}

# Printing a plain list with installed ispell dictionaries,
open (IDICTS,"> $ispell_dicts_list") ||
  die "Could not open $ispell_dicts_list for writing\n";
print IDICTS ""; # Make sure this is void if no dictionaries available.
foreach ( sort keys %{$dictionaries} ){
  print IDICTS "$_\n";
}
close (IDICTS);

# Printing the default ispell dictionary under emacs
open (EMISDEFAULT,"> $emacsen_default_file");
print EMISDEFAULT ";; File automatically generated by update-default-ispell
;;
;; Do not manually edit!! Use select-default-ispell script instead

(set-variable \'debian-ispell-dictionary $emacsen_default)\n";
close EMISDEFAULT;

# Autobuild hashes and emacsen/jed/squirrelmail stuff where appropriate.
print STDERR "update-default-$class: Calling ispell-autobuildhash\n" if $debug;
system ("ispell-autobuildhash --triggered") == 0
  or die "$program: Error running ispell-autobuildhash\n";

build_emacsen_support ();
build_jed_support ();
build_squirrelmail_support ();

# Clean orphaned remove files and its contents.
dico_clean_orphaned_removefiles($class,$dictionaries);
# -- End of specific ispell support 

# Set default symlink(s) and complain if not possible.
# For ispell dictionaries using auto-buildhash this should not be done
# from dictionaries-common postinst, but from ispell dictionaries postinst.
# Otherwise this is called before hashes are autobuild and will fail.
# d-c.postinst will call update-default-ispell with --skip-symlinks option.
unless ( $skip_symlinks_setting or $manual ) {
 dico_set_default_symlink($class,$value);
}

# Local Variables:
#  perl-indent-level: 2
# End:

__END__

=head1 NAME

update-default-ispell - update default ispell dictionary

=head1 SYNOPSIS

 update-default-ispell [--skip-symlinks] [--triggered]

=head1 DESCRIPTION

WARNING: Not to be used from the command line unless you know very well what you are doing.

This program is intended to be called from ispell dictionary package postinst,
from B<select-default-ispell> or
from dictionaries-common postinst.

When called under dpkg control with the B<--trigger> option the
script is run normally, otherwise the dictionaries-common
B<update-default-ispell> trigger is enabled
for later run.

With the B<--skip-symlinks> option the symlinks setting is skipped.
This is needed for B<update-default-ispell> when called from
dictionaries-common postinst, since autobuilt hashes may not yet
be available.

When run normally (from the command line or with B<--trigger>)
this script rebuilds the info at
F</var/cache/dictionaries-common/ispell.db>
after files under F</var/lib/dictionaries-common/ispell>,
reads the system default from the debconf database and
unless disabled, set default symlinks in F</etc/dictionaries-common>
pointing to the appropriate files in
F</usr/lib/ispell/>.

For ispell this script also updates the system-wide setting
F</etc/dictionaries-common/ispell-default> and the emacsen,
jed, and SquirrelMail support after known info.

=head1 OPTIONS

 --skip-symlinks  Do not try to set symlinks at /etc/dictionaries-common dir.
 --triggered      Run all the code instead of trying to enable
                  update-default-ispell trigger

=head1 SEE ALSO

The dictionaries-common policy document

=head1 AUTHORS

Rafael Laboissiere,
Agustin Martin Domingo

=cut

Zerion Mini Shell 1.0