diff options
Diffstat (limited to 'perl-install/standalone/logdrake')
-rwxr-xr-x | perl-install/standalone/logdrake | 277 |
1 files changed, 158 insertions, 119 deletions
diff --git a/perl-install/standalone/logdrake b/perl-install/standalone/logdrake index 241878a68..562d91144 100755 --- a/perl-install/standalone/logdrake +++ b/perl-install/standalone/logdrake @@ -1,8 +1,7 @@ #! /usr/bin/perl -# $Id$ -# Copyright (C) 2001-2004 MandrakeSoft -# Yves Duret <yduret at mandrakesoft.com> +# Copyright (C) 2001-2008 Mandriva +# Yves Duret <yduret at mandriva.com> # some code is Copyright: (C) 1999, Michael T. Babcock <mikebabcock@pobox.com> # # This program is free software; you can redistribute it and/or modify @@ -24,13 +23,14 @@ use strict; use lib qw(/usr/lib/libDrakX); use standalone; #- warning, standalone must be loaded very first, for 'explanations' +use c; use common; use interactive; -use ugtk2 qw(:create :dialogs :wrappers :helpers); -use vars qw(*F); - -$::isInstall and die "Not supported during install.\n"; +use do_pkgs; +use mygtk3 qw(gtknew); #- do not import gtkadd which conflicts with ugtk3 version +use ugtk3 qw(:create :dialogs :helpers :wrappers); +$ugtk3::wm_icon = "/usr/share/mcc/themes/default/logdrake-mdk.png"; my $in = 'interactive'->vnew('su'); my ($isExplain, $Explain, $isFile, $File, $isWord, $Word); @@ -43,12 +43,17 @@ foreach (@ARGV) { /^--alert$/ and do { alert_config(); quit() }; } -my $isTail = 1 if $isFile; +if (!$::testing) { + do_pkgs_standalone->new($in)->ensure_is_installed("syslog-daemon", "/etc/systemd/system/syslog.service") or exit(0); +} + +my $isTail = $isFile; $| = 1 if $isTail; my $h = chomp_(`hostname -s`); -my $explain_title = N("Mandrake Tools Explanation"); -my $my_win = ugtk2->new($isExplain ? $explain_title : N("Logdrake")); +$ugtk3::wm_icon = "logdrake"; +my $explain_title = N("%s Tools Logs", N("Mageia")); +my $my_win = ugtk3->new($isExplain ? $explain_title : N("Logs")); unless ($::isEmbedded) { $my_win->{window}->set_border_width(5); @@ -56,36 +61,37 @@ unless ($::isEmbedded) { } $my_win->{window}->signal_connect(delete_event => \&quit); -my $cal = gtkset_sensitive(new Gtk2::Calendar(), 0); +my $cal = gtkset_sensitive(Gtk3::Calendar->new, 0); my $mday = (localtime(time()))[3]; $cal->select_day($mday); my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my $cal_mode = 0; -my $cal_butt = gtksignal_connect(new Gtk2::CheckButton(N("Show only for the selected day")), clicked => sub { $cal_mode = !$cal_mode; gtkset_sensitive($cal,$cal_mode) }); +my $cal_butt = gtksignal_connect(Gtk3::CheckButton->new(N("Show only for the selected day")), clicked => sub { $cal_mode = !$cal_mode; gtkset_sensitive($cal,$cal_mode) }); ### menus definition # the menus are not shown -# but they provides shiny shortcut like C-q -my @menu_items = ( - { path => N("/_File"), item_type => '<Branch>' }, - { path => N("/File/_New"), accelerator => N("<control>N") }, - { path => N("/File/_Open"), accelerator => N("<control>O") }, - { path => N("/File/_Save"), accelerator => N("<control>S"), callback => \&save }, - { path => N("/File/Save _As") }, - { path => N("/File/-"), item_type => '<Separator>' }, - { path => N("/File/_Quit"), accelerator => N("<control>Q"), callback => \&quit }, - { path => N("/_Options"), item_type => '<Branch>' }, - { path => N("/Options/Test") }, - { path => N("/_Help"), item_type => '<LastBranch>' }, - { path => N("/Help/_About...") } - ); -my $_menubar = create_factory_menu($my_win->{rwindow}, @menu_items) unless $::isEmbedded; +# but they provides shiny shortcut like C-q (Broken: FIXME) +if ($::isEmbedded) { + my $ui = gtknew('UIManager', actions => [ + # [name, stock_id, value, label, accelerator, tooltip, callback] + [ 'FileMenu', undef, N("_File") ], + [ 'Save', undef, N("_Quit"), N("<control>S"), undef, \&save ], + [ 'Quit', undef, N("_Quit"), N("<control>Q"), undef, \&quit ], + ], + string => qq(<ui> + <menubar name='MenuBar'> + <menu action='FileMenu'> + <menuitem action='Save'/> + <menuitem action='Quit'/> + </menu> + </menubar> +</ui>)); + $my_win->{rwindow}->add_accel_group($ui->get_accel_group); +} ######### menus end ########## font and colors -my %n = ('font' => ''); -my %b = ('font' => 'Bold'); # Define global terms: @@ -108,16 +114,16 @@ my $col = 'darkcyan'; ######### font and colors end my %files = ( - "auth" => { file => "/var/log/auth.log", desc => N("Authentication") }, - "user" => { file => "/var/log/user.log", desc => N("User") }, - "messages" => { file => "/var/log/messages", desc => N("Messages") }, - "syslog" => { file => "/var/log/syslog", desc => N("Syslog") }, + "auth" => { file => "/var/log/auth.log", desc => N("_:this is the auth.log log file\nAuthentication") }, + "user" => { file => "/var/log/user.log", desc => N("_:this is the user.log log file\nUser") }, + "messages" => { file => "/var/log/messages", desc => N("_:this is the /var/log/messages log file\nMessages") }, + "syslog" => { file => "/var/log/syslog", desc => N("_:this is the /var/log/syslog log file\nSyslog") }, "explanations" => { file => "/var/log/explanations", desc => $explain_title } ); -my $yy = gtkset_sensitive(gtksignal_connect(new Gtk2::Button(N("search")) , clicked => \&search),0); +my $yy = gtkset_sensitive(gtksignal_connect(Gtk3::Button->new(N("search")) , clicked => \&search),0); -my $log_text = gtktext_insert(Gtk2::TextView->new, [ [ '' ] ]); +my $log_text = gtktext_insert(Gtk3::TextView->new, [ [ '' ] ]); my $log_buf = $log_text->get_buffer; my $refcount_search; @@ -126,56 +132,55 @@ my $refcount_search; my %toggle; gtkadd($my_win->{window}, - gtkpack_(new Gtk2::VBox(0,0), - if_(!$isExplain && !$::isEmbedded, 0, N("A tool to monitor your logs")), - if_(!$isFile, 0, gtkadd(new Gtk2::Frame(N("Settings")), - gtkpack__(new Gtk2::VBox(0,2), - gtkpack__(new Gtk2::VBox(0,2), + gtkpack_(Gtk3::VBox->new(0,0), + if_(!$::isEmbedded, 0, gtknew('Title1', label => N("A tool to monitor your logs"))), + if_(!$isFile, 0, gtkpack__(Gtk3::VBox->new(0,2), + gtknew('Title2', label => N("Settings")), # N("Show lines"), - gtkpack__(new Gtk2::HBox(0,0), - " " . N("Matching") . " ", my $e_yes = new Gtk2::Entry(), - " " . N("but not matching") . " ", my $e_no = new Gtk2::Entry() - ) - ), - gtkpack_(new Gtk2::HBox(0,0), - 1, gtkadd(gtkset_border_width(new Gtk2::Frame(N("Choose file")),2), - gtkpack(gtkset_border_width(Gtk2::VBox->new(0,0),0), - map { $toggle{$_} = gtksignal_connect(new Gtk2::CheckButton($files{$_}{desc}), + gtkpack__(Gtk3::HBox->new(0,0), + " " . N("Matching") . " ", my $e_yes = Gtk3::Entry->new, + " " . N("but not matching") . " ", my $e_no = Gtk3::Entry->new + ), + gtkpack_(Gtk3::HBox->new(0,0), + 1, gtkadd(gtkset_border_width(Gtk3::Frame->new(N("Choose file")),2), + gtkpack(gtkset_border_width(Gtk3::VBox->new(0,0),0), + map { $toggle{$_} = gtksignal_connect(Gtk3::CheckButton->new($files{$_}{desc}), clicked => sub { $refcount_search++; gtkset_sensitive($yy, $refcount_search); - }) } sort keys %files, + }); + $toggle{$_}->set_sensitive(0) if !-f $files{$_}{file}; + $toggle{$_}; + } sort keys %files, ) ), - 0, gtkadd(gtkset_border_width(new Gtk2::Frame(N("Calendar")),2), - gtkpack__(gtkset_border_width(new Gtk2::VBox(0,0),5), + 0, gtkadd(gtkset_border_width(Gtk3::Frame->new(N("Calendar")),2), + gtkpack__(gtkset_border_width(Gtk3::VBox->new(0,0),5), $cal_butt, $cal ) ) ), $yy, ) - ) ), - !$isExplain ? (1, gtkadd(new Gtk2::Frame(N("Content of the file")), - create_scrolled_window($log_text) - )) : (1, create_scrolled_window($log_text)), - if_(!$isExplain, 0, gtkadd(gtkset_border_width(gtkset_layout(Gtk2::HButtonBox->new, 'end'), 5), - if_(!$isFile, gtksignal_connect(new Gtk2::Button(N("Mail alert")), + !$isExplain ? (0, gtknew('Title2', label => N("Content of the file")), + 1, create_scrolled_window($log_text) + ) : (1, create_scrolled_window($log_text)), + 0, gtkadd(gtkset_border_width(gtkset_layout(Gtk3::HButtonBox->new, 'end'), 5), + if_(!$isFile, gtksignal_connect(Gtk3::Button->new(N("Mail alert")), clicked => sub { eval { alert_config() }; my $err = $@; $::WizardWindow->destroy if defined $::WizardWindow; undef $::WizardWindow; if ($err && $err !~ /wizcancel/) { - err_dialog(N("Error"), N("The alert wizard had unexpectly failled:") + err_dialog(N("Error"), N("The alert wizard has failed unexpectedly:") . "\n\n" . $err); } })), - gtksignal_connect(Gtk2::Button->new(N("Save")), clicked => \&save), - gtksignal_connect(Gtk2::Button->new($::isEmbedded ? N("Cancel") : N("Quit")), clicked => \&quit) + gtksignal_connect(Gtk3::Button->new(N("Save")), clicked => \&save), + gtksignal_connect(Gtk3::Button->new($::isEmbedded ? N("Cancel") : N("Quit")), clicked => \&quit) ) - ) ) ); @@ -185,14 +190,15 @@ $my_win->{window}->show_all; search() if $isFile; $my_win->main; -sub quit() { ugtk2->exit(0) } +sub quit() { ugtk3->exit(0) } #------------------------------------------------------------- # search functions #------------------------------------------------------------- sub search() { - return if !$log_text->window; - $log_text->window->freeze_updates; + my $window = $log_text->get_window('widget'); + return if !$window; + $window->freeze_updates; $log_buf->set_text(''); if ($isFile) { parse_file($File, $File); @@ -201,26 +207,31 @@ sub search() { parse_file($files{$_}{file}, $files{$_}{desc}) if $toggle{$_}->get_active; } } - $log_text->window->thaw_updates; + $window->thaw_updates; $log_text->show; gtkflush(); } my $timer; +my @logs; + +my $F; + sub parse_file { my ($file, $descr) = @_; $file =~ s/\.gz$//; my ($pbar, $win_pb); unless ($::isEmbedded && $isExplain) { - gtkadd($win_pb = gtkset_modal(new Gtk2::Window('toplevel'), 1), - gtkpack(new Gtk2::VBox(2,0), - new Gtk2::Label(" " . N("please wait, parsing file: %s", $descr) . " "), - $pbar = new Gtk2::ProgressBar() + local $::main_window = $my_win->{real_window}; + gtkadd($win_pb = gtkset_modal(Gtk3::Window->new('toplevel'), 1), + gtkpack(Gtk3::VBox->new(2,0), + Gtk3::Label->new(" " . N("please wait, parsing file: %s", $descr) . " "), + $pbar = Gtk3::ProgressBar->new ) ); - $win_pb->set_transient_for($my_win->{rwindow}) unless $::isEmbedded; + $win_pb->set_transient_for($my_win->{real_window}); $win_pb->set_position('center'); $win_pb->realize; $win_pb->show_all; @@ -235,10 +246,10 @@ sub parse_file { if ($cal_mode) { my (undef, $month, $day) = $cal->get_date; - $ey = $months[$month]."\\s{1,2}$day\\s.*$ey.*\n"; + $ey = $months[$month] . "\\s{1,2}$day\\s.*$ey.*\n"; } - my @all = catMaybeCompressed($file); + my @all = -e $file ? catMaybeCompressed($file) : N("Sorry, log file isn't available!"); if ($isExplain) { my (@t, $t); @@ -253,63 +264,79 @@ sub parse_file { my $taille = @all; my $i = 0; + my $test; + if ($en && !$ey) { + $test = sub { $_[0] !~ /$en/ }; + } elsif ($ey && !$en) { + $test = sub { $_[0] =~ /$ey/ }; + } else { + $test = sub { $_[0] =~ /$ey/ && $_[0] !~ /$en/ }; + } + foreach (@all) { $i++; if ($pbar && $i % 10) { $pbar->set_fraction($i/$taille); - $win_pb->window->process_updates(1); # no gtkflush() because we do not want to refresh the TextView + $win_pb->get_window->process_updates(1); # no gtkflush() because we do not want to refresh the TextView } - if ($en eq "" && /$ey/i) { logcolorize($_); next } - if (! /$en/i && /$ey/i) { logcolorize($_); next } - if (! /$en/i && $ey eq "") { logcolorize($_); next } + logcolorize($_) if $test->($_); } $win_pb->destroy if !$::isEmbedded || !$isExplain; if ($isTail) { - close F; - open F, $file or die "E: $!"; - local $_; - while (<F>) {}; #to prevent to output the file twice.. -# $log_text->set_point($log_text->get_length()); - $timer ||= Glib::Timeout->add(1000, sub { - logcolorize($_) while <F>; - seek F, 0, 1; - }); + close $F if $F; + if (open $F, $file) { + local $_; + while (<$F>) {} #to prevent to output the file twice.. + # $log_text->set_point($log_text->get_length()); + $timer ||= Glib::Timeout->add(1000, sub { + logcolorize($_) while <$F>; + seek $F, 0, 1; + }); + } else { + my $error = $!; + my $string = chomp_(`LC_ALL=C date '+%b %d %T'`) . " " . + N("Error while opening \"%s\" log file: %s\n", $file, $error); + # `` return non utf8 and concat of non utf8 & utf8 is non utf8: + c::set_tagged_utf8($string); + logcolorize($string); + } } + insert_text_n_scroll(); } ########################################################################################## sub logcolorize { - local $_ = shift; #my ($data) = @_; - + my ($string) = @_; # we get date & time if it is date & time (dmesg) - s/(\D{3} .. (\d\d:\d\d:\d\d ))//; + $string =~ s/(\D{3} .. (\d\d:\d\d:\d\d ))//; my $timestamp = $isExplain ? $2 : $1; - my @rec = split; + my @rec = split(/\s/, $string); + @rec = map { c::set_tagged_utf8($_); $_ } @rec if utf8::is_utf8($string); - log_output($timestamp, { %b, 'foreground' => 'darkcyan' }); # date & time if any... + log_output($timestamp, 'Bold', 'darkcyan'); # date & time if any... # BUG: $col hasn't yet be reseted - $isExplain or log_output("$rec[0] ", { %b, 'foreground' => $rec[0] eq $h ? 'blue' : $col }); # hostname + $isExplain or log_output("$rec[0] ", 'Bold', $rec[0] eq $h ? 'blue' : $col); # hostname if ($rec[1] eq "last") { - log_output(" last message repeated ", { %n, 'foreground' => 'green' }); - log_output($rec[4], { %b, 'foreground' => 'green' }); - log_output(" times\n", { %n, 'foreground' => 'green' }); + log_output(" last message repeated ", undef, 'green'); + log_output($rec[4], 'Bold', 'green'); + log_output(" times\n", undef, 'green'); return; } # Extract PID if present if ($rec[1] =~ /\[(\d+)\]:/) { - my ($pid) = $1; + my $pid = $1; $rec[1] =~ s/\[$1\]://; - log_output($rec[1] . "[", { %n, 'foreground' => 'green' }); - log_output($pid, { %b, 'foreground' => 'black' }); - log_output("]: ", { %n, 'foreground' => 'green' }); + log_output($rec[1] . "[", undef, 'green'); + log_output($pid, 'Bold', 'black'); + log_output("]: ", undef, 'green'); } else { - log_output($rec[1] . " ", { %n, 'foreground' => 'green' }); + log_output($rec[1] . " ", undef, 'green'); } foreach my $therest (2 .. $#rec) { @@ -326,16 +353,25 @@ sub logcolorize { #foreach (@line_warn) { $col = $col_warn if $_ eq $rec[$therest] } #foreach (@line_bad) { $col = $col_bad if $_ eq $rec[$therest] } - log_output("$rec[$therest] ", { %n, 'foreground' => $col }); + log_output("$rec[$therest] ", undef, $col); } - log_output("\n", { %n, 'foreground' => 'black' }); + log_output("\n", undef, 'black'); + insert_text_n_scroll() if $isExplain; } -# log_output (Gtk2::TextView, [ [ ... ] ]) +# log_output (Gtk3::TextView, [ [ ... ] ]) sub log_output { - gtktext_append($log_text, [ \@_ ]); + my ($text, $font, $col) = @_; + my $tag = join('', $font, $col); + push @logs, [ $text, $tag ]; + $log_buf->{tags}{$tag} ||= { foreground => $col }; # if_($font, font => $font), +} + +sub insert_text_n_scroll() { + ugtk3::gtktext_insert($log_text, \@logs, append => 1); $log_text->scroll_to_iter($log_buf->get_end_iter, 0, 1, 0.5, 0.5); + undef @logs; } @@ -345,6 +381,8 @@ sub log_output { sub alert_config() { local $::isEmbedded = 0; + undef $::WizardTable; + undef $::WizardWindow; my $conffile = "/etc/sysconfig/mail_alert"; my %options = getVarsFromSh($conffile); $options{LOAD} ||= 3; @@ -364,16 +402,16 @@ sub alert_config() { my @installed_d = grep { -e "/etc/init.d/$_" } sort keys %$service; my %services_to_check = map { $_ => 1 } split(':', $options{SERVICES}); - use wizards; - my $w = wizards->new; + $::isWizard = 1; my $mode; my $cron_file = "/etc/cron.hourly/logdrake_service"; my %modes = ( configure => N("Configure the mail alert system"), disable => N("Stop the mail alert system"), ); - my $wiz = { - defaultimage => "wiz_logdrake.png", + require wizards; + my $wiz = wizards->new({ + defaultimage => "logdrake.png", name => N("Mail alert"), pages => { welcome => { @@ -381,7 +419,7 @@ sub alert_config() { N("Welcome to the mail configuration utility.\n\nHere, you'll be able to set up the alert system.\n"), no_back => 1, data => [ - { val => \$mode, label => N("What do you wan to do?"), + { val => \$mode, label => N("What do you want to do?"), list => [ keys %modes ], format => sub { $modes{$_[0]} }, }, ], @@ -405,10 +443,10 @@ sub alert_config() { email => { name => N("Alert configuration") . "\n\n" . N("Please enter your email address below ") . "\n" . - N("and enter the name (or the IP) of the smtp server you whish to use"), + N("and enter the name (or the IP) of the SMTP server you wish to use"), data => [ - { label => "Email address", val => \$options{MAIL} }, - { label => "Email server", val => \$options{SMTP} }, + { label => N("Email address"), val => \$options{MAIL} }, + { label => N("Email server"), val => \$options{SMTP} }, ], complete => sub { if ($options{MAIL} !~ /[\w.-]*\@[\w.-]/ && !member($options{MAIL}, map { $_->[0] } list_passwd())) { @@ -417,7 +455,7 @@ sub alert_config() { return 1; } if (member($options{MAIL}, map { $_->[0] } list_passwd()) && $options{SMP} !~ /localhost/) { - err_dialog(N("Error"), N("\"%s\" is a local user but you did not select a local smtp, so you must use a complete email address!", $options{MAIL})); + err_dialog(N("Error"), N("\"%s\" is a local user, but you did not select a local smtp, so you must use a complete email address!", $options{MAIL})); return 1; } }, @@ -429,14 +467,14 @@ sub alert_config() { no_back => 1, }, stop => { - pre => sub { rm_rf($cron_file) }, + pre => sub { eval { rm_rf($cron_file) } }, name => N("Congratulations") . "\n\n" . N("The wizard successfully disabled the mail alert."), end => 1, no_back => 1, }, }, - }; - $w->process($wiz, $in); + }); + $wiz->process($in); return if $mode eq 'disable'; $options{SERVICES} = join ':', grep { $services_to_check{$_} } sort keys %services_to_check; @@ -467,7 +505,7 @@ if ($r) { To => $options{MAIL}, Subject => "DrakLog Mail Alert", }) - or die "Can't open: $!\n"; + or die "Cannot open: $!\n"; print $mailer $r; $mailer->close; } @@ -489,7 +527,8 @@ if ($r) { sub save() { $::isWizard = 0; - my $y = $in->ask_file(N("Save as.."), "/root") or return; + my $y = $in->ask_filename({ title => N("Save as.."), directory => "/root", save => 1 }) or return; my $buf = $log_text->get_buffer; - output($y, $buf->get_text(($buf->get_bounds), 0)); + my ($start, $end) = $buf->get_bounds; + output($y, $buf->get_text($start, $end, 0)); } |