#!/usr/bin/perl ################################################################################ # Mdkupdate # # # # Copyright (C) 2002 MandrakeSoft # # # Daouda Lo # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License Version 2 as # # published by the Free Software Foundation. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ################################################################################ use POSIX; use Digest::MD5 qw(md5 md5_hex md5_base64); use HTTP::Request; use HTTP::Request::Common; use LWP::UserAgent; use Net::HTTPS; #for https connections use MIME::Base64 qw(encode_base64); use lib qw(/usr/lib/libDrakX); use common; BEGIN { unshift @::textdomains, 'mdkupdate' } my $logfile = "/var/log/mdkupdate.log"; my $url_upload_diff = "https://www.mandrakeonline.net/online_dif.php"; my $url_get_rpms = "https://www.mandrakeonline.net/online_update.php"; my $rpms_rep = "/root/tmp/"; my $VERSION = "0.17"; my $security = grep { /^-?-security$/ } @ARGV; my $update = grep { /^-?-update$/ } @ARGV; sub usage { print STDERR N("mdkupdate version %s Copyright (C) 2002 MandrakeSoft. This is free software and may be redistributed under the terms of the GNU GPL. usage: ", $VERSION) . N(" --help - print this help message. ") . N(" --security - use only security media. ") . N(" --update - update all information. ") . N(" -v - verbose mode. "); exit(0); } grep { $_ !~ /^-?-(v|update|security)$/ } @ARGV and usage; -s "/root/.mdkupdate" or die N("No /root/.mdkupdate file found. Run mdkonline wizard first"); my %o = getVarsFromSh("/root/.mdkupdate"); update_rpms($o{LOGIN},$o{PASS},$o{BOX},$o{CURRENTKEY}); rpm_qa("/root/rpm_qa_installed_after"); my %new = getVarsFromSh("/root/.mdkupdate"); if (! -s "/root/.mdkupdate.rpms" || $update) { #- send configuration and get back key to use... $new{CURRENTKEY} = send_config($new{LOGIN},$new{PASS},$new{BOX}); delete $new{OLDKEY}; #- save back keys. setVarsInSh("/root/.mdkupdate", \%new); } else { #- this can safely be ignored if new configuration is sent. send_rpm_dif($new{LOGIN},$new{PASS},$new{BOX},$new{OLDKEY}); } clean_dir(); ################################################################################ # taken from mdkonline to perform complete update of rpm list (by diff), it has # been decided to do exactly what mdkonline does the first time to update the db. ################################################################################ sub report_config { my ($file) = @_; sub header { " ******************************************************************************** * $_[0] ********************************************************************************"; } open (FILE,"> $file") || die "Couldn't open $file : $!"; map { chomp; print FILE "$_\n" } header("scsi"), cat_("/proc/scsi/scsi"), header("lsmod"), cat_("/proc/modules"), header("cmdline"), cat_("/proc/cmdline"), header("pcmcia: stab"), cat_("$prefix/var/lib/pcmcia/stab") || cat_("$prefix/var/run/stab"), header("usb"), cat_("/proc/bus/usb/devices"), header("partitions"), cat_("/proc/partitions"), header("cpuinfo"), cat_("/proc/cpuinfo"), header("install.log"), cat_("$prefix/root/drakx/install.log"), header("fstab"), cat_("$prefix/etc/fstab"), header("lilo.conf"), cat_("$prefix/etc/lilo.conf"), header("menu.lst"), cat_("$prefix/boot/grub/menu.lst"), header("/etc/modules.conf"), cat_("$prefix/etc/modules.conf"), header("rpm -qa"), join ('', sort `rpm -qa`), header("mandrake version"), cat_('/etc/redhat-release'); close(FILE); } sub send_config { # When we arrive here, we're sure the login/passwd is correct my ($login, $passwd, $box_name) = @_; # print STDERR "Sending config\n"; my $result = -1; report_config("/root/$login.$passwd.$box_name.online.log"); `/usr/bin/bzip2 \\\-9 \\\-f /root/$login.$passwd.$box_name.online.log`; # Turn the binary file into a uuencoded ascii file open (FILE, "/root/$login.$passwd.$box_name.online.log.bz2") or die "$!"; my ($chunk, $buffer); while (read(FILE, $chunk, 60*57)) { $buffer .= $chunk; } close (FILE); open (FILEOUT, "> /root/$login.$passwd.$box_name.online.log.bz2.uue") or die "$!"; print FILEOUT encode_base64($buffer); close (FILEOUT); my $ua = LWP::UserAgent->new; $ua->agent("MdkOnlineAgent/$VERSION" . $ua->agent); my $response = $ua->request(POST 'https://www.mandrakeonline.net/wizard.php', Content_Type => 'form-data', Content => [submit => "upload_wizard", wizard => ["/root/$login.$passwd.$box_name.online.log.bz2.uue"] ]); # Check the outcome of the response #print "REPONSE: ".$response->content."\n"; if ($response->is_success) { $result = ($response->content =~ /TRUE(.*)/) ? 0 : -1; #print("key is $1\n"); $key = $1; #- update local copy now. unlink "/root/.mdkupdate.rpms"; rename "/root/rpm_qa_installed_after", "/root/.mdkupdate.rpms"; } else { # pb with the connection ? $result = -1; } unlink "/root/$login.$passwd.$box_name.online.log.bz2"; unlink "/root/$login.$passwd.$box_name.online.log.bz2.uue"; $result == 0 && $key; } ################################################################################ sub update_rpms { my ($login,$password,$box_name,$curkey) =@_; my $result = -1; my $string; if ($login && $password && $login !~ /\s+/ && $password !~ /\s+/) { my $ua = LWP::UserAgent->new; $ua->agent("MdkUpdateAgent/$VERSION" . $ua->agent); my $request = HTTP::Request->new(GET => $url_get_rpms.'?log='.$login.'&pass='.$password.'&host='.$box_name.'&key='.$curkey); my $response = $ua->request($request); $string = $response->content; print " \n\n ***** Response from update_rpms is : \n $string \n end update_rpms answer **********\n\n"; if ($response->is_success) { $result = ($response->content =~ /TRUE/) ? 0 : -1; } else { log_i(N("Connection problem")."\n" . N("MandrakeUpdate could not contact the site, we will try again.")); clean_dir(); exit 1; } } else { $result = -1; } # if correct, return 0 if (! $result) { @str_m = split '\n', $string; my %l = getVarsFromSh "/root/.mdkupdate"; if ($str_m[0] eq 'TRUE') { setVarsInSh("/root/.mdkupdate", { OLDKEY => $str_m[2], CURRENTKEY => $str_m[1], MIRROR => $l{MIRROR}, VER => $l{VER}, BOX => $l{BOX}, PASS => $l{PASS}, LOGIN => $l{LOGIN} , }); my @junk= splice(@str_m,0,3); my $mir_full = "ftp://$l{MIRROR}/$l{VER}/RPMS/"; update_packages($mir_full, @str_m); } else { log_i("problem occur $str_m\n"); } } else { log_i(N("Your login or password may be wrong") . "\n" . N("You need to have an account on MandrakeOnline, or update your subscription.")."\n" . N("For any problem send an e-mail to support\@mandrakeonline.net\n")); clean_dir(); exit 1; } } sub update_packages { my ($mir, @str) = @_; @str or return; eval { system "/usr/sbin/urpmi.removemedia", "mdkupdate"; system "/usr/sbin/urpmi.addmedia", "mdkupdate", $mir; $? == 0 or die N("Unable to create mdkupdate medium.\n"); system "/usr/sbin/urpmi", "--auto", "--media", "mdkupdate", map { /^(.*)\.rpm$/ && $1 } @str; $? == 0 or die N("Unable to update packages from mdkupdate medium.\n"); }; $@ and die "Problem upgrading with urpmi"; } sub send_rpm_dif { my ($login,$password,$box_name,$oldkey) =@_; #`sdiff -s /root/rpm_qa_installed_after /root/rpm_qa_installed_before >/root/$login.$password.$box_name.$oldkey.dif`; `sdiff -s /root/rpm_qa_installed_after /root/.mdkupdate.rpms >/root/$login.$password.$box_name.$oldkey.dif`; -s "/root/$login.$password.$box_name.$oldkey.dif" or die N("System is up to date"); my $ua = LWP::UserAgent->new; $ua->agent("MdkOnlineAgent/$VERSION" . $ua->agent); my $response = $ua->request(POST "https://www.mandrakeonline.net/online_dif.php", Content_Type => 'form-data', Content => [submit => "upload_dif", dif_file => ["/root/$login.$password.$box_name.$oldkey.dif"] ]); #- update .mdkupdate.rpms with newer version just sent. if ($response->content =~ /TRUE/) { unlink "/root/.mdkupdate.rpms"; rename "/root/rpm_qa_installed_after", "/root/.mdkupdate.rpms"; } else { print "REPONSE: " . $response->content . "\n"; } } sub clean_dir { system("rm -f /root/*.dif /root/rpm_qa_installed_before /root/rpm_qa_installed_after"); } sub rpm_qa { my ($file) = @_; open (FILE,"> $file") || die "Couldn't open $file : $!"; map { chomp; print FILE "$_" } join('', sort `rpm -qa`); close FILE; } sub log_i { local *LOG; open LOG, ">>/var/log/mdkupdate.log" or die "can't output to log file\n"; print LOG @_; close LOG; } sub fatal { my ($comment)=@_; printf STDERR "%s\n", $comment; exit($_[0]); }