home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / lib / dpkg / methods / ftp / setup < prev    next >
Text File  |  1998-12-28  |  6KB  |  245 lines

  1. #!/usr/bin/perl 
  2. # -*-perl-*-
  3.  
  4. #use strict;
  5. #use diagnostics;
  6.  
  7. use Net::FTP;
  8. use Debian::DpkgFtp;
  9.  
  10. # deal with arguments
  11. my $vardir = $ARGV[0];
  12. my $method = $ARGV[1];
  13. my $option = $ARGV[2];
  14.  
  15. if ($option eq "manual") {
  16.     print "Manual package installation.\n";
  17.     exit 0;
  18. }
  19. #print "vardir: $vardir, method: $method, option: $option\n";
  20.  
  21. $::ftpsite="";
  22. $::passive=1;
  23. $::username="anonymous";
  24. my $logname=`logname`;
  25. chomp $logname;
  26. my $hostname=`/bin/cat /etc/mailname || /bin/dnsdomainname`;
  27. chomp $hostname;
  28. my $email=$logname . '@' . $hostname;
  29. $::password=$email;
  30. $::ftpdir="/pub/debian";
  31. $::distribs="dists/stable/main dists/stable/non-free dists/stable/contrib";
  32. my $arch=`dpkg --print-installation-architecture`;
  33. $arch='i386' if $?;
  34. chomp $arch;
  35. $::dldir="debian";
  36.  
  37. # authenticated FTP proxy
  38. $::use_auth_proxy = 0;
  39. $::proxyhost = "";
  40. $::proxylogname = $logname;
  41. $::proxypassword = "";
  42.  
  43. # get info from control file if available
  44. -f "$vardir/methods/ftp/vars" and do "$vardir/methods/ftp/vars";
  45.  
  46. chdir "$vardir/methods/ftp";
  47. if (! -d "debian") {
  48.     mkdir "debian", 0755;
  49. }
  50. # get info from user 
  51. print <<EOM;
  52.  
  53. You must supply an ftp site, use of passive mode, username, password,
  54. path to the debian directory,list of distributions you are interested
  55. in and place to download the binary package files to (relative to
  56. /var/lib/dpkg/methods/ftp).
  57.  
  58. Supply "?" as a password to be asked each time you connect.
  59.  
  60. Eg:      ftp site: ftp.debian.org
  61.           passive: y
  62.          username: anonymous
  63.          password: $email
  64.           ftp dir: /debian
  65.     distributions: dists/stable/main dists/stable/contrib
  66.      download dir: debian
  67.  
  68. If you are using a non-us mirror, you may want to try something like
  69. "../debian-non-US/hamm" or "dists/stable/non-us" in distributions.
  70.  
  71. You may have to use an authenticated FTP proxy in order to reach the
  72. FTP site:
  73.  
  74. Eg:  use auth proxy: y
  75.               proxy: proxy.isp.com
  76.       proxy account: $::proxylogname
  77.      proxy password: ?
  78. EOM
  79.  
  80.  
  81. print "\nEnter ftp site [$::ftpsite]: ";
  82. my $ans=<STDIN>;
  83. chomp $ans;
  84. $::ftpsite = $ans if $ans ne "";
  85.  
  86. if($::passive) {
  87.     print "\nUse passive mode [y]: ";
  88. } else {
  89.     print "\nUse passive mode [n]: ";
  90. }
  91. $ans=<STDIN>;
  92. chomp $ans;
  93. if($ans ne "") {
  94.     if($ans =~ /^[Yy]/) {
  95.     $::passive=1;
  96.     } else {
  97.     $::passive=0;
  98.     }
  99. }
  100.  
  101. print "\nEnter username [$::username]: ";
  102. $ans=<STDIN>;
  103. chomp $ans;
  104. $::username = $ans if $ans ne "";
  105.  
  106. print <<EOM;
  107.  
  108. If you are using anonymous ftp to retrieve files, enter your email
  109. address for use as a password.  Otherwise enter your password,
  110. or "?" if you want dpkg-ftp to prompt you each time.
  111.  
  112. EOM
  113.  
  114. print "Enter password [$::password]: ";
  115. $ans=<STDIN>;
  116. chomp $ans;
  117. $::password = $ans if $ans ne "";
  118.  
  119. print "\nEnter debian directory [$::ftpdir]: ";
  120. $ans=<STDIN>;
  121. chomp $ans;
  122. $::ftpdir = $ans if $ans ne "";
  123.  
  124. $::use_auth_proxy = yesno($::use_auth_proxy ? "y":"n", "Go through an authenticated FTP proxy");
  125.  
  126. if ($::use_auth_proxy) {
  127.     print "\nEnter proxy hostname [$::proxyhost]: ";
  128.     my $ans=<STDIN>;
  129.     chomp $ans;
  130.     $::proxyhost = $ans if $ans ne "";
  131.  
  132.     print "\nEnter proxy logname [$::proxylogname]: ";
  133.     my $ans=<STDIN>;
  134.     chomp $ans;
  135.     $::proxylogname = $ans if $ans ne "";
  136.  
  137.     print "\nEnter proxy password [$::proxypassword]: ";
  138. #    system("stty", "-echo");
  139.     my $ans=<STDIN>;
  140.     chomp $ans;
  141. #    print "\n";
  142. #    system("stty", "echo");
  143.     $::proxypassword = $ans if $ans ne "";
  144. }
  145. print <<EOM;
  146.  
  147. Note: order here is important.  Package files are scanned in order so
  148. later distributions will override earlier ones.
  149.  
  150. So put stable before unstable.
  151.  
  152. EOM
  153. print "Enter space seperated list of distributions to get\n";
  154. print "[$::distribs]: ";
  155. $ans=<STDIN>;
  156. chomp $ans;
  157. $::distribs = $ans if $ans ne "";
  158.  
  159. print "\nEnter directory to download binary package files to\n(relative to /var/lib/dpkg/methods/ftp/)\n";
  160. DLLOOP: while (1) {
  161.     print "[$::dldir]: ";
  162.     $ans=<STDIN>;
  163.     chomp $ans;
  164.     if( $ans =~ m#/$# ) { $ans = substr($ans, 0, -1); }
  165.     $::dldir = $ans if $ans ne "";
  166.     if( ! -d $::dldir ) {
  167.     print "$::dldir is not a directory.\n";
  168.     } else {
  169.     last DLLOOP;
  170.     }
  171. my $problem=0;
  172. my $exit=0;
  173.  
  174.  
  175. sub download() {
  176.     $ftp = do_connect ($::ftpsite,$::username,$::password,$::ftpdir,$::passive,
  177.                $::useproxy,$::proxyhost,$::proxylogname,$::proxypassword);
  178.  
  179.     my @dists = split(/ +/, $::distribs);
  180.     
  181.     my $dist;
  182.     foreach $dist (@dists) {
  183.     my $dir = "$dist/binary-$arch";
  184.     print "Checking $dir...\n";
  185. #    if(!$ftp->pasv()) { print $ftp->message . "\n"; die "error"; }
  186.     my @dirlst = $ftp->ls("$dir/");
  187.     my $got_pkgfile = 0;
  188.     my $line = "";
  189.     foreach $line (@dirlst) {
  190.         if($line =~ /Packages/) {
  191.         $got_pkgfile=1;
  192.         }
  193.     }
  194.     if( !$got_pkgfile) {
  195.         print "Warning: Could not find a Packages file in $dir\n",
  196.         "This may not be a problem if the directory is a symbolic link\n";
  197.         $problem=1;
  198.     }
  199.     }
  200.     print "Closing ftp connection...\n";
  201.     $ftp->quit();
  202. }
  203.  
  204. # download stuff (protect from ^C)
  205. print "\nUsing FTP to check directories...(stop with ^C)\n\n";
  206. eval {
  207.     local $SIG{INT} = sub {
  208.     die "Interrupted!\n";
  209.     };
  210.     download();
  211. };
  212. if($@) {
  213.     print "FTP ERROR - ";
  214.     if ($@ eq "connect") {
  215.     print "config was untested\n";
  216.     } else {
  217.     print "$@\n";
  218.     }
  219.     $exit = 1;
  220. };
  221.  
  222. # output new vars file
  223. open(VARS, ">$vardir/methods/ftp/vars") or 
  224. die "Could not open file $vardir/methods/ftp/vars: $!, stopped";
  225. print VARS "\$ftpsite='$::ftpsite';\n";
  226. print VARS "\$passive=$::passive;\n";
  227. print VARS "\$username='$::username';\n";
  228. print VARS "\$password='$::password';\n";
  229. print VARS "\$ftpdir='$::ftpdir';\n";
  230. print VARS "\$distribs='$::distribs';\n";
  231. print VARS "\$dldir='$::dldir';\n";
  232. print VARS "\$use_auth_proxy=$::use_auth_proxy;\n";
  233. print VARS "\$proxyhost='$::proxyhost';\n";
  234. print VARS "\$proxylogname='$::proxylogname';\n";
  235. print VARS "\$proxypassword='$::proxypassword';\n";
  236. print VARS "1;\n";              # necessary for "do vars" to succeed at any time
  237. close VARS;
  238. system ("chmod", "600", "$vardir/methods/ftp/vars");
  239. if($problem) {
  240.     print "Press return to continue\n";
  241.     <STDIN>;
  242. }
  243. exit $exit;
  244.