home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / lib / dpkg / methods / apt / setup < prev    next >
Text File  |  1999-07-08  |  8KB  |  287 lines

  1. #!/usr/bin/perl -w
  2. #                              -*- Mode: Perl -*- 
  3. # setup.pl --- 
  4. # Author           : Manoj Srivastava ( srivasta@tiamat.datasync.com ) 
  5. # Created On       : Wed Mar  4 15:11:47 1998
  6. # Created On Node  : tiamat.datasync.com
  7. # Last Modified By : Manoj Srivastava
  8. # Last Modified On : Tue May 19 11:25:32 1998
  9. # Last Machine Used: tiamat.datasync.com
  10. # Update Count     : 87
  11. # Status           : Unknown, Use with caution!
  12. # HISTORY          : 
  13. # Description      : 
  14. # This file is designed to go into /usr/lib/apt/methods/setup
  15.  
  16. #use strict;
  17. #use diagnostics;
  18. #printf STDERR "DEBUG: Arguments $ARGV[0];$ARGV[1];$ARGV[2];\n";
  19.  
  20.  
  21. # Handle the arguments
  22. my $vardir=$ARGV[0];
  23. my $method=$ARGV[1];
  24. my $option=$ARGV[2];
  25. my $config_file = '/etc/apt/sources.list';
  26.  
  27. my $boldon=`setterm -bold on`;
  28. my $boldoff=`setterm -bold off`;
  29.  
  30. my @known_types           = ('deb');
  31. my @known_access         = ('http', 'ftp', 'file');
  32. my @typical_distributions = ('stable', 'unstable', 'frozen', 'non-US');
  33. my @typical_components    = ('main', 'contrib', 'non-free');
  34.  
  35. my %known_access           = map {($_,$_)} @known_access;
  36. my %typical_distributions  = map {($_,$_)} @typical_distributions;
  37.  
  38. # Read the config file, creating source records
  39. sub read_config {
  40.   my %params = @_;
  41.   my @Config = ();
  42.   
  43.   die "Required parameter Filename Missing" unless
  44.     $params{'Filename'};
  45.   
  46.   open (CONFIG, "$params{'Filename'}") ||
  47.     die "Could not open $params{'Filename'}: $!";
  48.   while (<CONFIG>) {
  49.     chomp;
  50.     my $rec = {};
  51.     my ($type, $urn, $distribution, $components) = 
  52.       m/^\s*(\S+)\s+(\S+)\s+(\S+)\s*(?:\s+(\S.*))?$/o;
  53.     $rec->{'Type'}          = $type;
  54.     $rec->{'URN'}           = $urn;
  55.     $rec->{'Distribution'}  = $distribution;
  56.     $rec->{'Components'}    = $components;
  57.     push @Config, $rec;
  58.   }
  59.   close(CONFIG);
  60.   
  61.   return @Config;
  62. }
  63.  
  64. # write the config file; writing out the current set of source records
  65. sub write_config {
  66.   my %params = @_;
  67.   my $rec;
  68.   my %Seen = ();
  69.   
  70.   die "Required parameter Filename Missing" unless
  71.     $params{'Filename'};
  72.   die "Required parameter Config Missing" unless
  73.     $params{'Config'};
  74.   
  75.   open (CONFIG, ">$params{'Filename'}") ||
  76.     die "Could not open $params{'Filename'} for writing: $!";
  77.   for $rec (@{$params{'Config'}}) {
  78.         my $line = "$rec->{'Type'} $rec->{'URN'} $rec->{'Distribution'} ";
  79.     $line .= "$rec->{'Components'}" if $rec->{'Components'};
  80.     $line .= "\n";
  81.     print CONFIG $line unless $Seen{$line}++;
  82.   }
  83.   close(CONFIG);
  84. }
  85.  
  86. # write the config file; writing out the current set of source records
  87. sub print_config {
  88.   my %params = @_;
  89.   my $rec;
  90.   my %Seen = ();
  91.   
  92.   die "Required parameter Config Missing" unless
  93.     $params{'Config'};
  94.   
  95.   for $rec (@{$params{'Config'}}) {
  96.     next unless $rec;
  97.     
  98.     my $line = "$rec->{'Type'} " if $rec->{'Type'};
  99.     $line .= "$rec->{'URN'} " if $rec->{'URN'};
  100.     $line .= "$rec->{'Distribution'} " if $rec->{'Distribution'};
  101.     $line .= "$rec->{'Components'}" if $rec->{'Components'};
  102.     $line .= "\n";
  103.     print $line unless $Seen{$line}++;
  104.   }
  105. }
  106.  
  107. # Ask for and add a source record
  108. sub get_source {
  109.   my %params = @_;
  110.   my $rec = {};
  111.   my $answer;
  112.   my ($type, $urn, $distribution, $components);
  113.   
  114.   if ($params{'Default'}) {
  115.     ($type, $urn, $distribution, $components) = 
  116.       $params{'Default'} =~ m/^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S.*)$/o;
  117.   }
  118.  
  119.   $type         = 'deb';
  120.   $urn          = "http://http.us.debian.org/debian" unless $urn;
  121.   $distribution = "stable" unless $distribution;
  122.   $components   = "main contrib non-free" unless $components;
  123.  
  124.     
  125.   $rec->{'Type'} = 'deb';
  126.   $| = 1;
  127.  
  128.   my $done = 0;
  129.   
  130.   while (!$done) {
  131.     print "\n";
  132.     print "$boldon URL [$urn]: $boldoff";
  133.     
  134.     $answer=<STDIN>;
  135.     chomp ($answer);
  136.     $answer =~ s/\s*//og;
  137.     
  138.     if ($answer =~ /^\s*$/o) {
  139.       $rec->{'URN'} = $urn;
  140.       last;
  141.     }
  142.     else {
  143.       my ($scheme) = $answer =~ /^\s*([^:]+):/o;
  144.       if (! defined $known_access{$scheme}) {
  145.     print "Unknown access scheme $scheme in $answer\n";
  146.     print "    The available access methods known to me are\n";
  147.     print join (' ', @known_access), "\n";
  148.     print "\n";
  149.       }
  150.       else {
  151.     $rec->{'URN'} = $answer;
  152.     last;
  153.       }
  154.     }
  155.   }
  156.  
  157.   print "\n";
  158.   
  159.   print " Please give the distribution tag to get or a path to the\n";
  160.   print " package file ending in a /. The distribution\n";
  161.   print " tags are typically something like:$boldon ";
  162.   print join(' ', @typical_distributions), "$boldoff\n";
  163.   print "\n";
  164.   print "$boldon Distribution [$distribution]:$boldoff ";
  165.   $answer=<STDIN>;
  166.   chomp ($answer);
  167.   $answer =~ s/\s*//og;
  168.   
  169.   if ($answer =~ /^\s*$/o) {
  170.     $rec->{'Distribution'} = $distribution;
  171.     $rec->{'Components'}   = &get_components($components);
  172.   }
  173.   elsif ($answer =~ m|/$|o) {
  174.     $rec->{'Distribution'} = "$answer";
  175.     $rec->{'Components'}   = "";
  176.   }
  177.   else {
  178.     # A distribution tag, eh?
  179.     warn "$answer does not seem to be a typical distribution tag\n"
  180.       unless defined $typical_distributions{$answer};
  181.     
  182.     $rec->{'Distribution'} = "$answer";
  183.     $rec->{'Components'}   = &get_components($components);
  184.   }
  185.  
  186.   return $rec;
  187. }
  188.  
  189. sub get_components {
  190.   my $default = shift;
  191.   my $answer;
  192.   
  193.   print "\n";
  194.   print " Please give the components to get\n";
  195.   print " The components are typically something like:$boldon ";
  196.   print join(' ', @typical_components), "$boldoff\n";
  197.   print "\n";
  198.   print "$boldon Components [$default]:$boldoff ";
  199.   $answer=<STDIN>;
  200.   chomp ($answer);
  201.   $answer =~ s/\s+/ /og;
  202.   
  203.   if ($answer =~ /^\s*$/o) {
  204.     return $default;
  205.   }
  206.   else {
  207.     return $answer;
  208.   }
  209. }
  210.  
  211. sub get_sources {
  212.   my @Config = ();
  213.   my $done = 0;
  214.  
  215.   my @Oldconfig = ();
  216.   
  217.   if (-e $config_file) {
  218.     @Oldconfig = &read_config('Filename' => $config_file)
  219.   }
  220.  
  221.   print "\t$boldon Set up a list of distribution source locations $boldoff \n";
  222.   print "\n";
  223.  
  224.   print " Please give the base URL of the debian distribution.\n";
  225.   print " The access schemes I know about are:$boldon ";
  226.   print join (' ', @known_access), "$boldoff\n";
  227. #  print " The mirror scheme is special  that it does not specify the\n";
  228. #  print " location of a debian archive but specifies the location\n";
  229. #  print " of a list of mirrors to use to access the archive.\n";
  230.   print "\n";
  231.   print " For example:\n";
  232.   print "              file:/mnt/debian,\n";
  233.   print "              ftp://ftp.debian.org/debian,\n";
  234.   print "              http://ftp.de.debian.org/debian,\n";
  235. #  print " and the special mirror scheme,\n";
  236. #  print "              mirror:http://www.debian.org/archivemirrors \n";
  237.   print "\n";
  238.  
  239.   my $index = 0;
  240.   while (!$done) {
  241.     if ($Oldconfig[$index]) {
  242.       push (@Config, &get_source('Default' => $Oldconfig[$index++]));
  243.     }
  244.     else {
  245.       push (@Config, &get_source());
  246.     }
  247.     print "\n";
  248.     print "$boldon Would you like to add another source?[y/N]$boldoff ";
  249.     my $answer = <STDIN>;
  250.     chomp ($answer);
  251.     $answer =~ s/\s+/ /og;
  252.     if ($answer =~ /^\s*$/o) {
  253.       last;
  254.     }
  255.     elsif ($answer !~ m/\s*y/io) {
  256.       last;
  257.     } 
  258.   }
  259.   
  260.   return @Config;
  261. }
  262.  
  263. sub main {
  264.   if (-e $config_file) {
  265.     my @Oldconfig = &read_config('Filename' => $config_file);
  266.     
  267.     print "$boldon I see you already have a source list.$boldoff\n";
  268.     print "-" x 72, "\n";
  269.     &print_config('Config' => \@Oldconfig);
  270.     print "-" x 72, "\n";
  271.     print "$boldon Do you wish to change it?[y/N]$boldoff ";
  272.     my $answer = <STDIN>;
  273.     chomp ($answer);
  274.     $answer =~ s/\s+/ /og;
  275.     exit 0 unless $answer =~ m/\s*y/io;
  276.   }
  277.   # OK. They want to be here.
  278.   my @Config = &get_sources();
  279.   #&print_config('Config' => \@Config);
  280.   &write_config('Config' => \@Config, 'Filename' => $config_file);  
  281. }
  282.  
  283. &main();
  284.  
  285.  
  286.