Advertisement
Guest User

Untitled

a guest
Jul 1st, 2014
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.27 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use feature 'switch';
  5. use Term::ANSIColor ':constants';
  6. use File::Copy 'cp';
  7. use IO::Pty::Easy;
  8. use subs qw/ask_action full_update kernels_in_usr parse_version pipeprint update_world update update_kernel/;
  9.  
  10. die exec 'sudo',$^X,$0,@ARGV if $<; #exec perl $0 @ARGV as root if we are UID != 0
  11.  
  12. my ($NOSYNC,$CONFIGURE_KERNEL) = (0,0);
  13. my @remove;
  14. my $opts = "-uND --with-bdeps=y ";
  15. $opts .= $ENV{EXTRA_OPTS} if defined $ENV{EXTRA_OPTS};
  16.  
  17. for (my $i = 0; $i <= $#ARGV+1; $i++)
  18. {
  19.     if ($i > $#ARGV) { full_update }
  20.     else
  21.     {
  22.         given ($ARGV[$i])
  23.         {
  24.             when ('--nosync')      { printf "setting \$NOSYNC to '%s'\n",$NOSYNC=1 }
  25.             when (/--(\w+)config/) { printf "setting \$CONFIGURE_KERNEL to '%s'\n",$CONFIGURE_KERNEL="${1}config" }
  26.             default                { update $ARGV[$i] }
  27.         }
  28.     }
  29. }
  30.  
  31. system 'etc-update';
  32. system 'elogv';
  33.  
  34. print "\n\n";
  35. if (+@remove)
  36. {
  37.     print "Please remove leftover files/folders:\n";
  38.     print "rm -fr @remove\n";
  39. }
  40.  
  41. sub full_update
  42. {
  43.     system qw/layman -S/ unless $NOSYNC;
  44.     system qw/eix-sync/ unless $NOSYNC;
  45.     my @extra_update = update_world;
  46.     system qw/smart-live-rebuild/;
  47.     system qw/emerge -ca/;
  48.     update @extra_update;
  49.     system 'logrotate -v /etc/logrotate.conf';
  50. }
  51.  
  52. sub kernels_in_usr
  53. {
  54.     opendir my $DH,'/usr/src';
  55.     my @ret;
  56.    
  57.     for my $i (readdir $DH)
  58.     {
  59.         push @ret,$1 if $i =~ /linux-(.+-gentoo(-r[1-9][1-9]?)?)/;
  60.     }
  61.    
  62.     closedir $DH;
  63.     return sort {parse_version($b) <=> parse_version($a)} @ret;
  64. }
  65.  
  66. sub parse_version
  67. {
  68.     my ($arg) = @_;
  69.     $arg =~ s/^(.+)-gentoo/$1/ or die "sanity check failed on $arg"; #3.6.10-gentoo => 3.6.10
  70.     $arg =~ s/-r([0-9][0-9]?)/.$1/g; #3.6.10-r1 => 3.6.10.1
  71.     my @components = split /\./,$arg; # 3.6.10.1 => 3, 6, 10, 1
  72.     $components[3] = 0 if +@components<4; #3, 6, 10 => 3, 6, 10, 1
  73.     die "parse_version: error: string @components consists of ".@components." parts!\n" if +@components != 4;
  74.  
  75.     my $ret;
  76.     for (my $i = 0; $i <= 3; $i++)
  77.     {
  78.         $components[$i] *= 10**(3-$i);
  79.         $ret += $components[$i];
  80.     }
  81.     return $ret;
  82. }
  83.  
  84. sub pipeprint
  85. {
  86.     open my $h,'|less -r';
  87.     print $h @_;
  88.     close $h;
  89. }
  90.  
  91. sub update_world
  92. {
  93.     my @emerge_cmd = ( q/emerge/,split(/\s+/,$opts),qw/-va --color=y @world @system/ );
  94.     print BOLD,GREEN,"\nCalculating update path...\n",RESET,"(command line is: @emerge_cmd)\n";
  95.    
  96.     my $pty = IO::Pty::Easy->new;
  97.     $pty->spawn(@emerge_cmd);
  98.    
  99.     my $line;
  100.     my $emerge_data = q//;
  101.     while ($line = $pty->read)
  102.     {
  103.         print $line;
  104.         $emerge_data .= $line;
  105.         last if $line =~ /Total:/;
  106.     }
  107.    
  108.     my @pkglist;
  109.     # We need a smart way to parse the data:
  110.     # - extract all packages that are going to be operated upon
  111.     # - return those (push @ret)
  112.     for my $i (split /\n/,$emerge_data)
  113.     {
  114.         # first, remove *relevant* escape sequences by building a regex for them
  115.         $i =~ s/(\[32;01m)|(\[32m)|(\[39;49;00m)//g;
  116.         # now extract the packages that are going to be acted upon
  117.         $i =~ m!^\[.+?\] (.+?)/(.+?) ! or next;
  118.         my $pkg = "$1/$2";
  119.         # now strip off version
  120.         if ($pkg =~ /(^.+)-r[0-9]+/) { $pkg = $1 }
  121.         $pkg =~ /^(.+)\/(.+)-.+?$/ or die "$pkg does not match regex";
  122.         $pkg = "$1/$2";
  123.         push @pkglist,$pkg;
  124.     }
  125.     print BOLD,scalar @pkglist," packages will be affected (full list: @pkglist).\n";
  126.    
  127.     for (;;)
  128.     {
  129.         print BOLD,WHITE,"\nProceed? ",RED,"[ynrsS]",WHITE,"\n  (r = rerun this step; s = break into shell;\n\t S = scroll output) ",RESET;
  130.         given (<STDIN>)
  131.         {
  132.             when ("y\n") { last                   }
  133.             when ("n\n") { die "Exiting.\n"       }
  134.             when ("r\n") { return update_world    }
  135.             when ("s\n") { system 'bash'; next    }
  136.             when ("S\n") { pipeprint $emerge_data }
  137.             default      { print "What?\n"        }
  138.         }
  139.     }
  140.     $pty->write("y\n");
  141.     while ($pty->is_active)
  142.     {
  143.         my $data = $pty->read;
  144.         print $data if defined $data;
  145.     }
  146.     $pty->close;
  147.     return @pkglist;
  148. }
  149.  
  150. sub update
  151. {
  152.     for my $arg (@_)
  153.     {
  154.         given ($arg)
  155.         {
  156.             when ('dev-lang/perl' )             { system qw/perl-cleaner --reallyall/ ; push @remove,"those random perl dirs" }
  157.             when ('dev-lang/python' )           { system qw/python-updater/ }
  158.             when ('sys-kernel/gentoo-sources' ) { update_kernel }
  159.             when ('sys-apps/manpages' )         { system qw/makewhatis -u/ }
  160.             when ('sys-devel/gcc' )             { system qw|emerge -1 sys-devel/libtool| }
  161.             when ('dev-libs/icu')               { system qw|emerge -1 dev-qt/qtcore| }
  162.             when ('dev-lang/ocaml')             { system qw|emerge -1 /usr/lib64/ocaml| }
  163.             when ('dev-libs/glib')              { system qw|emerge -1 gobject-introspection dev-libs/dbus-glib| }
  164.             when ('media-gfx/splashutils')      { system qw|splash_geninitramfs -g /boot/initramfs.cpio.gz -r 1280x1024 -v livedvd-12.0| }
  165.             when ('stop')                       { die "Stopped as requested.\n" }
  166.             #default: package does not require special care => do nothing
  167.         }
  168.     }
  169. }
  170.  
  171. sub update_kernel
  172. {
  173.     my @usr = kernels_in_usr;
  174.     push @remove,"/usr/src/linux-$_","/lib/modules/$_","/boot/*$_" for @usr[2..$#usr];
  175.    
  176.     chdir '/usr/src/linux';
  177.     cp "/usr/src/linux-$usr[1]/.config",'.config';
  178.     system qw/make -j4 oldconfig/;
  179.     system qw/make -j4/,$CONFIGURE_KERNEL if $CONFIGURE_KERNEL;
  180.     system qw/make -j4/;
  181.     system qw/make -k modules_install install/;
  182.     system qw|grub-mkconfig -o /boot/grub/grub.cfg|;
  183.     system qw/emerge -1 vhba vmware-modules ati-drivers/;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement