diff options
-rw-r--r-- | Makefile | 8 | ||||
-rwxr-xr-x | mdkapplet | 15 | ||||
-rwxr-xr-x | mdkonline | 302 | ||||
-rw-r--r-- | mdkonline.pm | 132 | ||||
-rw-r--r-- | mdkonline.spec | 28 | ||||
-rwxr-xr-x | mdkupdate | 190 |
6 files changed, 292 insertions, 383 deletions
@@ -1,6 +1,6 @@ PACKAGE = mdkonline -VERSION:=$(shell rpm -q --qf %{VERSION} --specfile $(PACKAGE).spec) -RELEASE:=$(shell rpm -q --qf %{RELEASE} --specfile $(PACKAGE).spec) +VERSION:=$(shell rpm -q --qf '%{VERSION}\n' --specfile $(PACKAGE).spec|head -n 1) +RELEASE:=$(shell rpm -q --qf '%{RELEASE}\n' --specfile $(PACKAGE).spec|head -n 1) TAG := $(shell echo "V$(VERSION)_$(RELEASE)" | tr -- '-.' '__') NAME = mdkonline @@ -14,6 +14,7 @@ ICONSDIR = $(DATADIR)/icons PIXDIR = $(DATADIR)/$(NAME) SBINDIR = $(PREFIX)/usr/sbin BINDIR = $(PREFIX)/usr/bin +FBLIBDIR = $(PREFIX)/usr/lib/libDrakX/drakfirsttime SYSCONFDIR = $(PREFIX)/etc/sysconfig SBINREL = ../sbin @@ -32,7 +33,7 @@ clean: install: all $(MAKE) -C po $@ - install -d $(PREFIX)/usr/{sbin,bin,share/{$(NAME)/pixmaps,autostart,icons/{mini,large}}} + install -d $(PREFIX)/usr/{sbin,bin,share/{$(NAME)/pixmaps,autostart,icons/{mini,large}},lib/libDrakX/drakfirsttime} install -m755 $(NAME) $(SBINDIR) install -m755 $(MDKUPDATE) $(SBINDIR) install -m755 $(MDKAPPLET) $(BINDIR) @@ -41,6 +42,7 @@ install: all install -m644 icons/$(NAME)48.png $(ICONSDIR)/large/$(NAME).png install -m644 pixmaps/*.png $(PIXDIR)/pixmaps install -m644 mdkapplet.desktop $(PREFIX)/usr/share/autostart/ + install -m644 mdkonline.pm $(FBLIBDIR) for d in $(SUBDIRS); do ( cd $$d ; make $@ ) ; done # rules to build a test rpm @@ -21,10 +21,13 @@ ################################################################################ use strict; -use lib qw(/usr/lib/libDrakX); +use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use common; +use mdkonline; + use Digest::MD5; + BEGIN { unshift @::textdomains, 'mdkonline' } use Gtk2::TrayIcon; @@ -208,19 +211,11 @@ sub silentCheck { my $link = "http://www.mandrakeonline.net/online3_RemoteAction.php" . '?action=UpdateList'; my %h = getVarsFromSh($conffile); my $u; - require LWP::UserAgent; - require HTTP::Request::Common; - require HTTP::Request; logIt(N("Computing new updates...\n")); - my $ua = LWP::UserAgent->new; - $ua->agent("MdkAppletAgent/0.1" . $ua->agent); - $ua->env_proxy; - # my $request = HTTP::Request->new(GET => $link . '&log=' . "ayomigration" . '&host=' . "online"); - my $request = HTTP::Request->new(GET => $link . '&log=' . $h{LOGIN} . '&host=' . $h{MACHINE}); my $lnk = $link . '&log=' . $h{LOGIN} . '&host=' . $h{MACHINE}; logIt(N("Connecting to") . " $lnk ...\n"); gtkflush(); go2State('busy'); gtkflush(); - my $response = $ua->request($request); + my $response = mdkonline::get_from_URL($link, 'MdkAppletAgent/0.1'); my $ct = $response->content; # print "\nCONTENTS = $ct\n"; # logIt(N("Response from MandrakeOnline server\n") . "$ct"); @@ -22,30 +22,25 @@ ################################################################################ use strict; -use lib qw(/usr/lib/libDrakX); +use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use common; use standalone; use interactive; use lang; +use ugtk2 qw(:all); + +use mdkonline; +use comdialog; +use data; BEGIN { unshift @::textdomains, 'mdkonline', 'drakfw' } use Config; #use LWP::Debug qw(+); -use LWP::UserAgent; -use Net::HTTPS; -use HTTP::Request::Common; -use HTTP::Request; use Digest::MD5 qw(md5 md5_hex md5_base64); -use MIME::Base64 qw(encode_base64); -use Sys::Hostname; -use ugtk2 qw(:all); - -use lib qw(/usr/lib/libDrakX/drakfirsttime); -use comdialog; -use data; my $confdir = '/root/.MdkOnline'; +my $conffile = "$confdir/mdkupdate"; add_icon_path("/usr/share/drakfirsttime/pixmaps/"); @@ -53,15 +48,11 @@ my $in = 'interactive'->vnew('su', 'default'); my $VERSION = '1.0'; my ($create_account, $auto_update) = (0, 1); -my $linkAccount = "http://www.mandrakeexpert.com/index2.php"; -my $wideconf = '/etc/sysconfig/mdkonline'; - my ($o, $p); #for compatibilities mkdir_p($confdir) if !-d $confdir; -mvfiles("/root/.mdkupdate", "$confdir/mdkupdate"); -#mvfiles("/root/.mdkonline", "$confdir/mdkonline"); +mdkonline::mv_files("/root/.mdkupdate", "$conffile"); $o->{mw} = ugtk2->new("MandrakeOnline" . " " . $VERSION, center => 1); gtkset_size_request($o->{mw}{window}, 580, 470); @@ -69,42 +60,35 @@ $o->{mw}{rwindow}->set_position('center'); $o->{mw}{window}->signal_connect( "delete_event", sub { Gtk2->main_quit} ); $o->{nb} = Gtk2::Notebook->new; $o->{nb}->set_show_tabs(0); $o->{nb}->set_show_border(0); +$o->{bottomHbox} = Gtk2::HBox->new; my %stage = ( - 0 => sub { if ($o->{account_cb}->get_active) { subsOnline() } else { $o->{nb}->next_page} }, - 1 => sub { $o->{nb}->next_page(); setEntryWithConf() }, - 2 => sub { testPasswd() }, - 3 => sub { log::l("[mdkonline] Sending configuration to remote server"); sendConfig() }, - 4 => sub { log::l("[mdkonline] Writing local configuration dir"); setConf() } + 0 => sub { if ($o->{account_cb}->get_active) { subs_online() } else { $o->{nb}->next_page} }, + 1 => sub { $o->{nb}->next_page(); set_entry_with_conf() }, + 2 => sub { check_passwd() }, + 3 => sub { log::l("[mdkonline] Sending configuration to remote server"); send_conf_online() }, + 4 => sub { log::l("[mdkonline] Writing local configuration dir"); set_conf() } ); -$o->{bottomHbox} = create_okcancel(my $w = - { - cancel_clicked => \&mainQuit, - ok_clicked => sub { - $p = $o->{nb}->get_current_page; - $stage{$p}->(); - $p <= 0 and $o->{Prev}->set_sensitive(1); - $p == 4 and mainQuit() - }, - }, - undef, undef, '', - [ "gtk-go-back", sub { - $p = $o->{nb}->get_current_page; - $o->{nb}->prev_page(); - $p <= 1 and init(0) - }, - 0, 1, - ], - ); -$w->{cancel}->set_label(N("Skip Wizard")); -$o->{Next} = $w->{ok}; -$o->{SkipWiz} = $w->{cancel}; - -$w->{ok}->set_label("gtk-go-forward"); -$w->{ok}->set_use_stock(1); - -$o->{Prev} = $w->{buttons}{'gtk-go-back'}; -$o->{Prev}->set_use_stock(1); - +$o->{actions} = { + Next => sub { + $p = $o->{nb}->get_current_page; + $stage{$p}->(); + $p <= 0 and $o->{Prev}->set_sensitive(1); + $p == 4 and main_quit() + }, + SkipWiz => sub { + main_quit() + }, + Prev => sub { + $p = $o->{nb}->get_current_page; + $o->{nb}->prev_page(); + $p <= 1 and init(0) + } + }; +foreach my $l (['Next', 'gtk-go-forward', 'stock'], ['SkipWiz', N("Skip Wizard")], ['Prev', 'gtk-go-back', 'stock']) { + $o->{$l->[0]} = $l->[2] ? Gtk2::Button->new_from_stock($l->[1]) : Gtk2::Button->new(" " . $l->[1] . " "); + $l->[2] ? $o->{bottomHbox}->pack_end($o->{$l->[0]}, 0, 0, 1) : $o->{bottomHbox}->pack_start($o->{$l->[0]}, 0, 0, 1); + $o->{$l->[0]}->signal_connect( clicked => sub { $o->{actions}{$l->[0]}->() }); +} gtkadd($o->{mw}{window}, gtkpack_(Gtk2::VBox->new(0, 2), 1, $o->{nb}, @@ -180,35 +164,21 @@ $o->{mw}{rwindow}->show_all; Gtk2->main; ugtk2->exit(0); -sub subsOnline { +sub subs_online { my $explink = 'http://www.mandrakeexpert.com/online3_CreateAccount.php'; - my $login = $o->{clogin}->get_text; - my $despwd = $o->{cpasswd}->get_text; - my $despwdcfm = $o->{cconfirm}->get_text; + my $login = $o->{clogin}->get_text; my $despwd = $o->{cpasswd}->get_text; my $despwdcfm = $o->{cconfirm}->get_text; my $cmail = $o->{cmail}->get_text; $::error = 0; - checkErrors($login, $despwd, $despwdcfm, $o->{cmail}); + check_errors($login, $despwd, $despwdcfm, $o->{cmail}); # print "Error = $::error"; if (!$::error) { my $url = $explink . '?desuserid=' . $login . '&despwd=' . $despwd . '&user_email=' . $cmail; - print "LOGIN = $login\nPASSWD = $despwd\nMAIL= $cmail\nURL=$url\n"; - my $ret = requestURL($url); - my $result = { - 10 => sub { !$::error and $o->{nb}->next_page}, - 11 => sub { raiseError($o->{mw}->{window},N("Creation"),N("Login and password should be less than 12 characters\n")) }, - 12 => sub { raiseError($o->{mw}->{window},N("Special characters"),N("Special characters are not allowed\n")) }, - 13 => sub { raiseError($o->{mw}->{window},N("Empty fields"),N("Please fill in all fields\n")) }, - 14 => sub { raiseError($o->{mw}->{window},N("Email"),N("Email not valid\n")) }, - 15 => sub { raiseError($o->{mw}->{window},N("Change account"),N("Account already exist\n")) }, - }; - if ($ret->is_success) { - my $content = $ret->content; -# print "CODE_RETOUR = $content\n"; - if ($content =~ m/(\d+)/) { my $code = sprintf("%d",$1); eval { $result->{$code}->() } } - } else { raiseError($o->{mw}->{window}, N("Server Problem"), N("Problem connecting to server \n")) } + #print "LOGIN = $login\nPASSWD = $despwd\nMAIL= $cmail\nURL=$url\n"; + my $ret = mdkonline::subscribe_online($url); + if ($ret eq 'OK') { $o->{nb}->next_page } else { raiseError($o->{mw}->{window}, $ret) }; } } -sub checkErrors { +sub check_errors { my ($login, $despwd, $despwdcfm, $cmail) = @_; $login or raiseError($o->{mw}->{window},N("Error"), N("Please provide a login")); if (!$::error && $despwd ne $despwdcfm) { @@ -217,97 +187,64 @@ sub checkErrors { raiseError($o->{mw}->{window},N("Error"), N("Not a valid mail address!\n")) } } -sub setEntryWithConf { +sub set_entry_with_conf { + my $wideconf = '/etc/sysconfig/mdkonline'; my %t = getVarsFromSh($wideconf); my $host = chomp_(`hostname`) ; $host =~ /(\w+)(.*)/; $t{MACHINE} ||= $1; foreach (qw(login machine)) { $o->{$_}->get_text or $o->{$_}->set_text($t{uc($_)}) } } -sub sendConfig { - # When we arrive here, we're sure the login/passwd is correct - # print STDERR "Sending config\n"; - my $result = -1; - my ($login, $boxname, $passwd); - $login = $o->{login}->get_text; $boxname = $o->{machine}->get_text; my $passwd = md5_hex($o->{passwd}->get_text); - reportConfig("$confdir/$login.$passwd.$boxname.online.log"); - `/usr/bin/bzip2 \\\-9 \\\-f $confdir/$login.$passwd.$boxname.online.log`; - # Turn the binary file into a uuencoded ascii file - open (FILE, "$confdir/$login.$passwd.$boxname.online.log.bz2") or die "$!"; - my ($chunk, $buffer); - while (read(FILE, $chunk, 60*57)) { - $buffer .= $chunk; - } - close (FILE); - open (FILEOUT, "> $confdir/$login.$passwd.$boxname.online.log.bz2.uue") or die "$!"; - print FILEOUT encode_base64($buffer); - close (FILEOUT); - my $ua = LWP::UserAgent->new; - $ua->agent("MdkOnlineAgent/0.15" . $ua->agent); - $ua->env_proxy; - my $w = wait_msg(N("Sending configuration...")); - my $response = $ua->request(POST 'http://www.mandrakeonline.net/wizard.php', - - Content_Type => 'form-data', - Content => [submit => "upload_wizard", - wizard => ["$confdir/$login.$passwd.$boxname.online.log.bz2.uue"] - ]); - #printf("*********** Reponse is %s ***********\n", $response->as_string); - # Check the outcome of the response - #print "REPONSE: ".$response->content."\n"; +sub send_conf_online { + my ($login, $passwd, $boxname) = get_names(); + my $w = wait_msg(N("Reading configuration\n")); + my $link = 'https://www.mandrakeonline.net/wizard.php'; + mdkonline::report_config("$confdir/$login.$passwd.$boxname.online.log"); + my $tag = { submit => "upload_wizard", wizard => ["$confdir/$login.$passwd.$boxname.online.log.bz2.uue"] }; remove_wait_msg($w); - if ($response->is_success || $::testing) { - $result = ($response->content =~ /^TRUE(.*)/) ? 0 : -1; - #printf("Send Config :\nNEWKEY=%s\nRESPONSE=%s", $1, $response->content); - $o->{currentkey} = $1; - } else { - # pb with the connection ? - $result = -1; - } - # if information were sent correctly (exit code: 0 from scp script), go to page 5 - if (! $result || $::testing) { - # go to last page + my $ww = wait_msg(N("Sending configuration...")); + my ($res, $key) = mdkonline::send_config($link, $tag); + remove_wait_msg($ww); + if ($res eq 'TRUE' && $key) { + $o->{currentkey} = $key; $o->{nb}->next_page; $o->{Next}->set_label(N("Finish")); $o->{Prev}->hide } else { - # if incorrect, go/stay on page 4 to retry sending data - # pb with the connection ? - raiseError($o->{mw}->{window}, N("Connection problem"), N("MandrakeOnline could not be contacted, please try again at a later time")); + raiseError($o->{mw}->{window}, N("Connection problem"), N("Problem occurs when uploading files, please try again")); } } -sub setConf { - my $login = $o->{login}->get_text; - my $passwd = md5_hex($o->{passwd}->get_text); - my $boxname = $o->{machine}->get_text; my $country = lc($countries{$o->{country}->entry->get_text}); +sub set_conf() { + my ($login, $passwd, $boxname) = get_names(); + my $country = lc($countries{$o->{country}->entry->get_text}); my $key = $o->{currentkey}; my $auto = 'FALSE'; if ($auto_update) { $auto = 'TRUE' }; - automatedUpgrades($login, $passwd, $boxname, $key, $country, $auto); - writeWideConf($login, $boxname, $country); + mdkonline::automated_upgrades($conffile, $login, $passwd, $boxname, $key, $country, $auto); + mdkonline::write_wide_conf($login, $boxname, $country); } sub init { my $i = shift; $o->{Prev}->set_sensitive(0); $o->{Next}->grab_focus; - $i and FirstSettings(); + $i and first_settings(); } -sub FirstSettings { +sub first_settings() { foreach my $l (qw(vbox_account vbox_auto)) { $o->{$l}->set_sensitive(0); } } -sub final { +sub final() { $o->{Prev}->hide; $o->{SkipWiz}->hide; $o->{Next}->set_label(N("Finish")) } -sub getNames { - my ($login, $passwd, $machine) = @_; +sub get_names() { + my ($login, $passwd, $machine); $login = $o->{login}->get_text; $passwd = md5_hex($o->{passwd}->get_text); $machine = $o->{machine}->get_text; ($login, $passwd, $machine) } -sub mainQuit { +sub main_quit() { # remove local files - my ($login, $passwd, $boxname) = getNames(); - if ($o->{login}->get_text && $o->{passwd}->get_text) { + my ($login, $passwd, $boxname) = get_names(); + if ($login && $passwd && $boxname) { -f "$confdir/$login.$passwd.$boxname.online.log.bz2.uue" && unlink ("$confdir/$login.$passwd.$boxname.online.log.bz2.uue"); -f "$confdir/$login.$passwd.$boxname.online.log.bz2" && unlink ("$confdir/$login.$passwd.$boxname.online.log.bz2"); } @@ -315,34 +252,23 @@ sub mainQuit { print N("Quitting Wizard\n"); Gtk2->main_quit; } -sub isalphanum { - my ($str) = @_; - if ($str =~ /^[[:alnum:]]+$/) { - return 1; - } else { - return 0; - } +sub is_alphanum { + my $is_num = sub { $_[0] =~ /^[[:alnum:]]+$/ ? 1 : 0 } } -sub testPasswd () { - my $result = -1; - my $login = $o->{login}->get_text; - my $passwd = $o->{passwd}->get_text; - my $boxname = $o->{machine}->get_text; - my $test = isalphanum($boxname); - #print ("isalnum : $test"); - if ($login && $passwd && $test && $login !~ /\s+/ && $passwd !~ /\s+/) { -# NEW METHOD (http) +sub check_passwd() { + my $link = 'http://www.mandrakeexpert.com/firsttimewizard/validusercheck.php'; + my $result; + my $login = $o->{login}->get_text; my $passwd = md5_hex($o->{passwd}->get_text); my $boxname = $o->{machine}->get_text; + $boxname = is_alphanum($boxname); + if ($login && $passwd && $boxname && $login !~ /\s+/ && $passwd !~ /\s+/) { + # NEW METHOD (http) # first, MD5ify the password my $w = wait_msg(("Connecting ...\n")); - $passwd = md5_hex($passwd); # or md5 () or md5_base64 () - my $ua = LWP::UserAgent->new; - $ua->agent("MdkOnlineAgent/0.15" . $ua->agent); - $ua->env_proxy; - my $request = HTTP::Request->new(GET => 'http://www.mandrakeexpert.com/firsttimewizard/validusercheck.php?u=' . $login . '&p=' . $passwd); - my $response = $ua->request($request); + $link .= '?u=' . $login . '&p=' . $passwd; + my $response = mdkonline::get_from_URL($link); remove_wait_msg($w); # Check the outcome of the response - if ($response->is_success || $::testing) { + if ($response->is_success) { $result = ($response->content =~ /TRUE/) ? 0 : -1; } else { # pb with the connection ? stay on page 2 @@ -354,7 +280,7 @@ sub testPasswd () { } # if correct, go to page 4 - if (! $result || $::testing) { + if (! $result) { $o->{nb}->next_page(); } else { # if incorrect, clear passwd and stay on page 2 @@ -362,34 +288,6 @@ sub testPasswd () { $o->{passwd}->set_text(""); } } -sub reportConfig { - my ($file) = @_; - #touch($file); - my $w = wait_msg(N("Reading configuration\n")); - sub header { " -******************************************************************************** -* $_[0] -********************************************************************************"; - } -open (FILE,"> $file") || die "Couldn't open $file : $!"; -join '', 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_("/var/lib/pcmcia/stab") || cat_("/var/run/stab"), - header("usb"), cat_("/proc/bus/usb/devices"), - header("partitions"), cat_("/proc/partitions"), - header("cpuinfo"), cat_("/proc/cpuinfo"), - header("install.log"), cat_("/root/drakx/install.log"), - header("fstab"), cat_("/etc/fstab"), - header("lilo.conf"), cat_("/etc/lilo.conf"), - header("menu.lst"), cat_("/boot/grub/menu.lst"), - header("/etc/modules.conf"), cat_("/etc/modules.conf"), - header("rpm -qa"), join ('', sort `rpm -qa`), - header("mandrake version"), cat_('/etc/mandrake-release'); - close(FILE); - remove_wait_msg($w); -} sub wait_msg { my ($msg, %options) = @_; my $mainw = ugtk2->new('mdkonline', grab => 1, if_(exists $options{transient}, transient => $options{transient})); @@ -403,38 +301,6 @@ sub wait_msg { $mainw; } sub remove_wait_msg { $_[0]->destroy } -sub mvfiles { - my ($source, $dest) = @_; - -e $source and system("mv","$source","$dest"); -} -sub automatedUpgrades { - my ($login, $passwd, $boxname, $key, $country, $auto) = @_; - my ($r) = cat_('/etc/mandrake-release') =~ /release\s(\S+)/; - output "$confdir/mdkupdate", - qq(# automatically generated file. Please don't edit -LOGIN=$login -PASS=$passwd -MACHINE=$boxname -VER=$r -CURRENTKEY=$key -COUNTRY=$country -AUTO=$auto -); - output_p "/etc/cron.daily/mdkupdate", - qq(#!/bin/bash -if [ -f $confdir/mdkupdate ]; then /usr/sbin/mdkupdate --auto; fi -); -chmod 0755, "/etc/cron.daily/mdkupdate"; -} -sub writeWideConf { - my ($login, $boxname, $country) = @_; - my $d = localtime(); - $d =~ s/\s+/_/g; - output_with_perm $wideconf, 644, - qq(LOGIN=$login -MACHINE=$boxname -COUNTRY=$country -LASTCHECK=$d -); -} + + diff --git a/mdkonline.pm b/mdkonline.pm new file mode 100644 index 00000000..2be4c45b --- /dev/null +++ b/mdkonline.pm @@ -0,0 +1,132 @@ +package mdkonline; + +use strict; +use MIME::Base64 qw(encode_base64); + +use lib qw(/usr/lib/libDrakX); +use c; +use common; + +use LWP::UserAgent; +use Net::HTTPS; +use HTTP::Request::Common; +use HTTP::Request; + +sub get_release() { + my ($release) = cat_('/etc/mandrake-release') =~ /release\s+(\S+)/; + ($release) +} + +sub get_from_URL { + my ($link, $agent_name) = @_; + my $ua = LWP::UserAgent->new; + $ua->agent("$agent_name" . $ua->agent); + $ua->env_proxy; + my $request = HTTP::Request->new(GET => $link); + my $response = $ua->request($request); + $response +} + +sub subscribe_online { + my ($full_link) = shift; + my $ret = get_from_URL($full_link, "MdkOnlineAgent"); + my $str; + my $result = { + 10 => 'OK', + 11 => N("Login and password should be less than 12 characters\n"), + 12 => N("Special characters are not allowed\n"), + 13 => N("Please fill in all fields\n"), + 14 => N("Email not valid\n"), + 15 => N("Account already exist\n"), + }; + if ($ret->is_success) { + my $content = $ret->content; +# print "CODE_RETOUR = $content\n"; + if ($content =~ m/(\d+)/) { my $code = sprintf("%d",$1); $str = $result->{$code} } + } else { $str = N("Problem connecting to server \n") } + $str +} + +sub report_config { + my $file = shift; +sub header { " +******************************************************************************** +* $_[0] +********************************************************************************"; +} +open (my $FILE,"> $file") || die "Couldn't open $file : $!"; +map { chomp; print $FILE "$_\n" } + header("partitions"), cat_("/proc/partitions"), + header("cpuinfo"), cat_("/proc/cpuinfo"), + header("fstab"), cat_("/etc/fstab"), + header("/etc/modules.conf"), cat_("/etc/modules.conf"), + header("rpm -qa"), join ('', sort `rpm -qa`), + header("mandrake version"), cat_('/etc/mandrake-release'); +close($FILE); +`/usr/bin/bzip2 \\\-f $file`; +open (my $F, "$file" . ".bz2") or die "Cannot open file : $!"; +my ($chunk, $buffer); +while (read($F, $chunk, 60*57)) { + $buffer .= $chunk; +} +close ($F); +open (my $OUT, "> $file" . ".bz2.uue") or die "Cannot open file : $!"; +print $OUT encode_base64($buffer); +close ($OUT); +} + +sub send_config { + my ($link, $content) = @_; + my ($res, $key); + my $ua = LWP::UserAgent->new; + $ua->agent("MdkOnlineAgent/0.15" . $ua->agent); + $ua->env_proxy; + my $response = $ua->request(POST $link, + Content_Type => 'form-data', + Content => [ %$content ]); + if ($response->is_success && $response->content =~ /^TRUE(.*)/) { + ($res, $key) = ('TRUE', $1); + } + ($res, $key) +} + +sub mv_files { + my ($source, $dest) = @_; + -e $source and system("mv","$source","$dest"); +} + +sub automated_upgrades { + my ($conffile, $login, $passwd, $boxname, $key, $country, $auto) = @_; + my ($r) = get_release(); + output "$conffile", + qq(# automatically generated file. Please don't edit +LOGIN=$login +PASS=$passwd +MACHINE=$boxname +VER=$r +CURRENTKEY=$key +COUNTRY=$country +AUTO=$auto +); + output_p "/etc/cron.daily/mdkupdate", + qq(#!/bin/bash +if [ -f $conffile ]; then /usr/sbin/mdkupdate --auto; fi +); + + chmod 0755, "/etc/cron.daily/mdkupdate"; +} + +sub write_wide_conf { + my ($login, $boxname, $country) = @_; + my $wideconf = '/etc/sysconfig/mdkonline'; + my $d = localtime(); + $d =~ s/\s+/_/g; + output_with_perm $wideconf, 644, + qq(LOGIN=$login +MACHINE=$boxname +COUNTRY=$country +LASTCHECK=$d +); +} + +1; diff --git a/mdkonline.spec b/mdkonline.spec index 41ebaa61..49ce0e0a 100644 --- a/mdkonline.spec +++ b/mdkonline.spec @@ -4,17 +4,23 @@ Summary: The MandrakeOnline Tool Name: %{name} Version: %{version} -Release: 3mdk +Release: 4mdk Source0: %{name}-%{version}.tar.bz2 URL: http://www.mandrakeonline.net Packager: Daouda Lo <daouda@mandrakesoft.com> License: GPL Group: System/Configuration/Other -Requires: drakfirsttime >= 1.0-0.6mdk, perl-Crypt-SSLeay >= 0.51-2mdk, perl-Gtk2-TrayIcon >= 0.03-3mdk +Requires: %{name}-backend >= 1.1-4mdk, drakfirsttime >= 1.0-0.6mdk, perl-Crypt-SSLeay >= 0.51-2mdk, perl-Gtk2-TrayIcon >= 0.03-3mdk BuildRequires: gettext BuildRoot: %{_tmppath}/%{name}-buildroot BuildArch: noarch +%package backend +Summary: MandrakeOnline libraries and background tools +Group: System/Configuration/Other +Requires: drakxtools-newt +Conflicts: %{name} < 1.1-3mdk + %description The MandrakeOnline tool is designed for registered users who want to upload their configuration (packages, hardware infos). @@ -28,6 +34,9 @@ The package include : * Mdkapplet which is a KDE/Gnome applet for security updates notification and installation. +%description backend +This package contains the mdkonline library and backend tools. + %prep %setup -q @@ -63,6 +72,8 @@ EOF %post %{update_menus} +%post backend + if [ -r /etc/cron.daily/mdkupdate ]; then perl -p -i -e 's!/usr/bin/mdkupdate!/usr/sbin/mdkupdate!' /etc/cron.daily/mdkupdate fi @@ -73,10 +84,17 @@ fi %clean rm -rf $RPM_BUILD_ROOT +%files backend +%defattr(-,root,root) +%{_sbindir}/mdkupdate +%dir %{_libdir}/libDrakX/drakfirsttime +%{_libdir}/libDrakX/drakfirsttime/*.pm + %files -f %{name}.lang %defattr(-,root,root) %doc COPYING ChangeLog -%{_sbindir}/* +%{_sbindir}/mdkonline +%{_sbindir}/drakonline %{_bindir}/* %{_prefix}/X11R6/bin/* %{_menudir}/%{name} @@ -96,6 +114,10 @@ rm -rf $RPM_BUILD_ROOT # get the source from our cvs repository (see # http://www.linuxmandrake.com/en/cvs.php3) %changelog +* Thu Jul 8 2004 Daouda LO <daouda@mandrakesoft.com> 1.1-4mdk +- added mdkonline backend package for derivative products + (MNF, Corporate ...) + * Tue Jun 8 2004 Daouda LO <daouda@mandrakesoft.com> 1.1-3mdk o Tue Jun 8 2004 Daouda LO <daouda@mandrakesoft.com> 1.1-2.1.100mdk - added misc architectures (ia64, amd64, x86_64, noarch, ppc64) @@ -21,25 +21,20 @@ ################################################################################ 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 lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use common; +use mdkonline; + BEGIN { unshift @::textdomains, 'mdkupdate' } require_root_capability(); -my $logfile = "/var/log/mdkupdate.log"; my $confdir = '/root/.MdkOnline'; my $conffile = "$confdir/mdkupdate"; my $onlineUrl = "https://www.mandrakeonline.net/"; my %url; -foreach (qw(online_dif online_update online3_RemoteAction)) { +foreach (qw(online_dif online_update online3_RemoteAction wizard)) { $url->{$_} = $onlineUrl . $_ . '.php' } my $rpms_rep = "/root/tmp/"; @@ -50,7 +45,7 @@ my $update = grep { /^-?-update$/ } @ARGV; #for compatibilities mkdir_p($confdir) if !-d $confdir; --e '/root/.mdkupdate' and system("mv","/root/.mdkupdate", "$confdir/mdkupdate"); +-e '/root/.mdkupdate' and system("mv","/root/.mdkupdate", "$conffile"); my ($scheduled, $noscheduled); @@ -77,21 +72,21 @@ my %o = getVarsFromSh($conffile); if ($o{LOGIN} && $o{PASS} && $o{LOGIN} !~ /\s+/ && $o{PASS} !~ /\s+/) { my $u; my $MandrakeUpdateURL = $url->{online3_RemoteAction} . '?action=ScheduledRPM' . '&log=' . $o{LOGIN} . '&pass=' . $o{PASS} . '&host=' . $o{MACHINE} . '&key=' . $o{CURRENTKEY}; - my $resp = getFromURL($MandrakeUpdateURL); + my $resp = mdkonline::get_from_URL($MandrakeUpdateURL); my $contents = $resp->content; #print "CONTENTS = $contents \n"; if ($resp->is_success) { if ($contents =~ /TRUE/) { $u = 10 } elsif ($contents =~ m/(\d+)/) { $u = sprintf("%d", $1) } else { $u = 83 } ; my $action = { 10 => sub { - my $c2h = splitContents($contents); + my $c2h = split_contents($contents); #printf("\nCONTENTS = $contents \n torf = %s\n OLDKEY = %s = %s \n NEWKEY = %s \n FTP = %s\n", $c2h->{torf}, $c2h->{OLDKEY}, $o{CURRENTKEY}, $c2h->{NEWKEY}, $c2h->{FTP} ); - if ($c2h->{torf} eq "TRUE" && $c2h->{OLDKEY} && $c2h->{NEWKEY}) { updateConf($c2h->{OLDKEY}, $c2h->{NEWKEY}) } + if ($c2h->{torf} eq "TRUE" && $c2h->{OLDKEY} && $c2h->{NEWKEY}) { update_conf($c2h->{OLDKEY}, $c2h->{NEWKEY}) } if ($c2h->{FTP}) { # for debugging purpose printf("FTP = %s\n", $c2h->{FTP}); #$c2h->{FTP} = 'ftp://ftp.lip6.fr/pub/linux/distributions/mandrake/updates'; - addMedia($c2h->{FTP}) + add_media($c2h->{FTP}) } $scheduled = join(',',@{$c2h->{sched}}); $noscheduled = join(',',@{$c2h->{nosched}}); $noscheduled =~ s/\.rpm//g; @@ -99,16 +94,16 @@ if ($o{LOGIN} && $o{PASS} && $o{LOGIN} !~ /\s+/ && $o{PASS} !~ /\s+/) { if ($opt eq '--applet') { system "MandrakeUpdate", "--no-confirmation", "--media=mdkupdate", "--pkg-sel=$scheduled", "--pkg-nosel=$noscheduled"; } elsif ($opt eq '--auto') { - $o{AUTO} eq 'TRUE' and autoInstallRpms($c2h->{sched}); + $o{AUTO} eq 'TRUE' and auto_install_rpms($c2h->{sched}); } rpm_qa("$confdir/rpm_qa_installed_after"); my %new = getVarsFromSh($conffile); if (! -s "$confdir/mdkupdate.rpms" || $update) { #- send configuration and get back key to use... - $new{CURRENTKEY} = send_config($new{LOGIN},$new{PASS},$new{MACHINE}); - delete $new{OLDKEY}; - #- save back keys. - setVarsInSh($conffile, \%new); + my $r; + + ($r, $new{CURRENTKEY}) = send_conf_update($new{LOGIN},$new{PASS},$new{MACHINE}); + if ($r eq 'TRUE') { delete $new{OLDKEY}; setVarsInSh($conffile, \%new) } } else { #- this can safely be ignored if new configuration is sent. send_rpm_dif($new{LOGIN},$new{PASS},$new{MACHINE},$new{OLDKEY}); @@ -135,7 +130,7 @@ if ($o{LOGIN} && $o{PASS} && $o{LOGIN} !~ /\s+/ && $o{PASS} !~ /\s+/) { } else { $ret = -1; } -sub splitContents { +sub split_contents { my $cont = shift; my ($elem, $s); $s = [ split /\n/, $cont ]; @@ -146,102 +141,13 @@ sub splitContents { } $elem } - -################################################################################ -# 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 getFromURL { - my ($link) = @_; - my $ua = LWP::UserAgent->new; - $ua->agent("MdkUpdateAgent/$VERSION" . $ua->agent); - $ua->env_proxy; - my $request = HTTP::Request->new(GET => $link); - my $response = $ua->request($request); - $response -} -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("$confdir/$login.$passwd.$box_name.online.log"); - `/usr/bin/bzip2 \\\-9 \\\-f $confdir/$login.$passwd.$box_name.online.log`; - - # Turn the binary file into a uuencoded ascii file - open (FILE, "$confdir/$login.$passwd.$box_name.online.log.bz2") or die "$!"; - my ($chunk, $buffer); - while (read(FILE, $chunk, 60*57)) { - $buffer .= $chunk; - } - close (FILE); - open (FILEOUT, "> $confdir/$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); - $ua->env_proxy; - my $response = $ua->request(POST 'https://www.mandrakeonline.net/wizard.php', - - Content_Type => 'form-data', - Content => [submit => "upload_wizard", - wizard => ["$confdir/$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 "$confdir/mdkupdate.rpms"; - rename "$confdir/rpm_qa_installed_after", "$confdir/mdkupdate.rpms"; - } else { - # pb with the connection ? - $result = -1; - } - - unlink "$confdir/$login.$passwd.$box_name.online.log.bz2"; - unlink "$confdir/$login.$passwd.$box_name.online.log.bz2.uue"; - - $result == 0 && $key; -} -################################################################################ - -sub autoInstallRpms { +sub auto_install_rpms { my ($pkgs) = shift; my @pkg; push(@pkg, $_ . '.rpm') foreach @{$pkgs}; - updatePkgs(@pkg); + update_pkgs(@pkg); } -sub updateConf { +sub update_conf { my ($oldkey, $newkey) = @_; my %l = getVarsFromSh $conffile; setVarsInSh($conffile, { @@ -254,9 +160,9 @@ sub updateConf { AUTO => $l{AUTO} }); } -sub addMedia { +sub add_media { my $mirror = shift; - my ($r) = getRelease(); + my ($r) = mdkonline::get_release(); my $fullpath2mir = "ftp://" . "$mirror". "/$r" . "/RPMS" . "/" ; eval { system "/usr/sbin/urpmi.removemedia", "mdkupdate"; @@ -264,42 +170,39 @@ sub addMedia { }; $@ and die "Problem adding Update Media with urpmi"; } -sub getRelease() { - my ($release) = cat_('/etc/mandrake-release') =~ /release\s+(\S+)/; - ($release) -} -sub updatePkgs { - my (@str) = @_; - @str or return; +sub update_pkgs { + @_ or return; eval { - system "/usr/sbin/urpmi", "--auto", "--media", "mdkupdate", map { /^(.*)\.rpm$/ && $1 } @str; + system "/usr/sbin/urpmi", "--auto", "--media", "mdkupdate", map { /^(.*)\.rpm$/ && $1 } @_; $? == 0 or die N("Unable to update packages from mdkupdate medium.\n"); }; $@ and die "Problem upgrading with urpmi"; } +sub send_conf_update { + my ($login,$password,$boxname) =@_; + mdkonline::report_config("$confdir/$login.$password.$boxname.online.log"); + my $tag = { submit => 'upload_wizard', wizard => [ "$confdir/$login.$password.$boxname.online.log.bz2.uue" ] }; + my ($res, $key) = mdkonline::send_config($url->{wizard}, $tag); + ($res, $key) +} sub send_rpm_dif { - my ($login,$password,$box_name,$oldkey) =@_; - #`sdiff -s $confdir/rpm_qa_installed_after $confdirrpm_qa_installed_before >$confdir/$login.$password.$box_name.$oldkey.dif`; - `sdiff -s $confdir/rpm_qa_installed_after $confdir/mdkupdate.rpms > $confdir/$login.$password.$box_name.$oldkey.dif`; - -s "$confdir/$login.$password.$box_name.$oldkey.dif" or die N("No diff found"); - my $ua = LWP::UserAgent->new; - $ua->agent("MdkOnlineAgent/$VERSION" . $ua->agent); - $ua->env_proxy; - my $response = $ua->request(POST "https://www.mandrakeonline.net/online_dif.php", - - Content_Type => 'form-data', - Content => [submit => "upload_dif", - dif_file => ["$confdir/$login.$password.$box_name.$oldkey.dif"] - ]); + my ($login,$password,$boxname,$oldkey) =@_; + `sdiff -s $confdir/rpm_qa_installed_after $confdir/mdkupdate.rpms > $confdir/$login.$password.$boxname.$oldkey.dif`; + -s "$confdir/$login.$password.$boxname.$oldkey.dif" or die N("No diff found"); + my $tag = { submit => "upload_dif", dif_file => [ "$confdir/$login.$password.$boxname.$oldkey.dif" ] }; + my ($res, $key) = mdkonline::send_config($url->{online_dif}, $tag); #- update mdkupdate.rpms with newer version just sent. - if ($response->content =~ /TRUE/) { + if ($res eq 'TRUE') { unlink "$confdir/mdkupdate.rpms"; rename "$confdir/rpm_qa_installed_after", "$confdir/mdkupdate.rpms"; - } else { print "REPONSE: " . $response->content . "\n"; } + } else { + log::l(N("Connection problem")."\n" . N("Mdkupdate could not upload the diff files. Send a mail to support [at] mandrakeonline [dot] net")); + return + } } sub clean_dir() { - system("rm -f $confdir/*.dif $confdir/rpm_qa_installed_before $confdir/rpm_qa_installed_after"); + system("rm -f $confdir/*log.bz2 $confdir/*log.bz2.uue $confdir/*.dif $confdir/rpm_qa_installed_before $confdir/rpm_qa_installed_after"); } sub rpm_qa { @@ -309,14 +212,3 @@ sub rpm_qa { close FILE; } -sub log_i { - local *LOG; - open LOG, ">> $logfile" or die "can't output to log file\n"; - print LOG @_; - close LOG; -} - -sub fatal { - my ($comment)=@_; - printf STDERR "%s\n", $comment; exit($_[0]); -} |