home *** CD-ROM | disk | FTP | other *** search
/ ftp.sberbank.sumy.ua / 2014.11.ftp.sberbank.sumy.ua.tar / ftp.sberbank.sumy.ua / incoming / sxtech / l7up.pl < prev    next >
Perl Script  |  2014-08-29  |  5KB  |  269 lines

  1. #!/usr/bin/perl -w
  2. #
  3. # $Header: //depot/equalizer/bugs/bugfix_8.6.1/l7up/l7up.pl#3 $
  4. #
  5. # l7up.pl -     perform upgrade to version supporting l7
  6. #
  7.  
  8. use    Carp;
  9. require "getopts.pl";
  10.  
  11. $opt_P        = "/pub/patches";            # path prefix
  12. $opt_h        = "128.121.100.123";            # host
  13. $opt_u        = "";                # user:passwd override
  14. $opt_v        = "8.6.0";            # product version #
  15. $opt_X        = 0;
  16. $opt_b        = 0;                # batch mode
  17. $opt_k          = 0;                            # keep keys mode
  18. $opt_S          = 0;
  19. $opt_r          = 0;
  20. $opt_C          = 0;
  21. $opt_G          = 0;
  22. $opt_F          = 0;
  23. $opt_l        = 0;
  24. $batch        = "";
  25. $keys           = "";
  26. $snmp           = "";
  27. $reboot         = "";
  28. $clear          = "";
  29. $lic            = "";
  30. $gui            = "";
  31. $upgrade_fw     = "";
  32. $outputfile     = "/var/log/eq_upgrade.log";
  33. #
  34. # usage - print usage info
  35. #
  36.  
  37. sub usage {
  38.  
  39.     print "usage: l7up.pl <opts>\n";
  40.     print "    [-Ppath]          FTP path override ($opt_P)\n";
  41.     print "    [-hhost]          FTP host ($opt_h)\n";
  42.     print "    [-uuser[:passwd]] FTP user/passwd ($opt_u)\n";
  43.     print "    [-vvers]         version number ($opt_v)\n";
  44.     print "    [-b]              batch mode\n";
  45.     print "    [-k]              keep SSH keys\b";
  46.  
  47.     exit 1;
  48. }
  49.  
  50. #
  51. # note - print an informational message
  52. #
  53.  
  54. sub note {
  55.     my $arg = shift || "";
  56.  
  57.     print "$arg\n";
  58. }
  59.  
  60. #
  61. # sis - perform `system' function and croak if non-zero result.
  62. #
  63.  
  64. sub sis {
  65.     my $arg = shift or die "";
  66.  
  67.     #
  68.     # This is perl-ass-backwards, if you can imagine what that is.
  69.     #
  70.     system $arg and die "\n";
  71. }
  72.  
  73. #
  74. # fetch - fetch a file from the remote repository
  75. #
  76.  
  77. sub fetch {
  78.     my $what = shift or die "";
  79.     my $user = "";
  80.     my $path = "$opt_P/eq/upgrade-$opt_v/$what";
  81.  
  82.     $user = "$opt_u" . "@" if $opt_u;
  83.  
  84.     note "/usr/bin/fetch -p -o $what ftp://$user$opt_h$path";
  85.     sis  "/usr/bin/fetch -p -o $what ftp://$user$opt_h$path";
  86. }
  87.  
  88. #
  89. # md5_check - check md5 checksum
  90. #
  91.  
  92. sub md5_check {
  93.     my $what    = shift or die "";
  94.     my $desired = shift or die "";
  95.     my $sum;
  96.  
  97.     chop($sum = `md5 $what`);
  98.  
  99.     $sum =~ s/.* = //;
  100.  
  101.     $sum eq $desired;
  102. }
  103.  
  104. #
  105. # md5_verify - verify md5 checksum
  106. #
  107.  
  108. sub md5_verify {
  109.     my $what    = shift or die "";
  110.     my $desired = shift or die "";
  111.  
  112.     die "$what: md5 mismatch.\n" unless md5_check($what, $desired);
  113. }
  114.  
  115. #
  116. # fix_stupidity
  117. #
  118.  
  119. sub fix_stupidity {
  120.     local *BOM;
  121.     local $cwd;
  122.  
  123.     chop($cwd = `/bin/pwd`);
  124.  
  125.     return unless $cwd ne "/usr/l7up";
  126.     return unless -f "./BoM";
  127.  
  128.     mkdir("/usr/l7up", 0755) unless -d "/usr/l7up";
  129.     
  130.     open BOM, "< ./BoM";
  131.  
  132.     while (<BOM>) {
  133.     chop;
  134.  
  135.     if (/^md5 /) {
  136.         my ($ign, $md5, $uid, $gid, $mode, $path) = split;
  137.  
  138.         next unless -f "./$path";
  139.         
  140.         sis "mv ./$path /usr/l7up/$path";
  141.     }
  142.     }
  143.  
  144.     close BOM;
  145.  
  146.     sis "mv ./BoM /usr/l7up/BoM";
  147.     sis "mv ./BoM.md5 /usr/l7up/BoM.md5";
  148.     sis "mv ./l7up.pl /usr/l7up/l7up.pl";
  149. }
  150.  
  151. #
  152. # setup - perform necessary setup.
  153. #
  154.  
  155. sub setup {
  156.  
  157.     select(STDOUT); $| = 1;
  158.     select(STDERR); $| = 1;
  159.  
  160.     &Getopts('Xh:u:p:v:P:bkSrClGF');
  161.  
  162.     if ($opt_X) {
  163.     fix_stupidity();
  164.     exit 0;
  165.     } 
  166.  
  167.     if ($opt_b) {
  168.     $batch = " -b";
  169.     }
  170.  
  171.     if ($opt_k) {
  172.     $keys = " -k";
  173.     }
  174.  
  175.     if ($opt_S) {
  176.     $snmp = " -S";
  177.     }
  178.  
  179.     if ($opt_C) {
  180.     $clear = " -C";
  181.     }
  182.     
  183.     if ($opt_l) {
  184.     $lic = " -l";
  185.     }
  186.     
  187.     if ($opt_r) {
  188.     $reboot = " -r";
  189.     }
  190.     
  191.     if ($opt_F) {
  192.     $upgrade_fw = " -F";
  193.     }
  194.     
  195.     if ($opt_G) {
  196.     $gui = " -G";
  197.         open( STDOUT, '>>'.$outputfile ) or die $!;
  198.         open( STDERR, '>>'.$outputfile ) or die $!;
  199.         select(STDOUT); $| = 1;
  200.         select(STDERR); $| = 1;
  201.     
  202.     }
  203.     #
  204.     # We must be in the designated directory.
  205.     #
  206.  
  207.     mkdir("/usr/l7up", 0755) unless -d "/usr/l7up";
  208.     chdir "/usr/l7up";
  209.     unlink "./.phase1";
  210.  
  211.     fetch "BoM" unless -f "./BoM";
  212.     fetch "BoM.md5" unless -f "./BoM.md5";
  213.  
  214.     "Invalid BoM" unless md5_check("./BoM", `cat ./BoM.md5`);
  215. }
  216.  
  217. #
  218. # bom_suck - suck down the files in the BoM
  219. #
  220.  
  221. sub bom_suck {
  222.     local *BOM;
  223.  
  224.     open BOM, "<./BoM" or die "$!: ./BoM";
  225.  
  226.     while (<BOM>) {
  227.     chop;
  228.  
  229.     if (/^\# EQVERS=([^:]+)/) {
  230.         my $v = $1;
  231.  
  232.         die "Version mismatch: $opt_v != $v\n" unless $v eq $opt_v;
  233.  
  234.         next;
  235.     }
  236.  
  237.     if (/^md5 /) {
  238.         my ($ign, $md5, $uid, $gid, $mode, $path) = split;
  239.  
  240.         note "verifying file $path";
  241.  
  242.         fetch $path unless -f "./$path";
  243.         md5_verify($path, $md5);
  244.  
  245.         sis "chown $uid:$gid $path";
  246.         chmod $mode, $path or die "$!: chmod $path";
  247.     } elsif (/^exe echo "(.*)"$/) {
  248.         note "$1";
  249.     } elsif (/^exe (.*)$/) {
  250.         my $todo = $1;
  251.  
  252.         note "executing `$todo$batch$keys$snmp$clear$reboot$gui$upgrade_fw$lic'";
  253.  
  254.         sis "$todo$batch$keys$snmp$clear$reboot$gui$upgrade_fw$lic";
  255.     } else {
  256.         warn "unexpected BoM entry: $_\n";
  257.     }
  258.     }
  259.  
  260.     close BOM;
  261. }
  262.  
  263. sub main {
  264.     &setup;
  265.     &bom_suck;
  266. }
  267.  
  268. &main;
  269.