summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/logdrake
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/standalone/logdrake')
-rwxr-xr-xperl-install/standalone/logdrake277
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));
}