summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/logdrake
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/standalone/logdrake')
-rwxr-xr-xperl-install/standalone/logdrake486
1 files changed, 0 insertions, 486 deletions
diff --git a/perl-install/standalone/logdrake b/perl-install/standalone/logdrake
deleted file mode 100755
index e7382effa..000000000
--- a/perl-install/standalone/logdrake
+++ /dev/null
@@ -1,486 +0,0 @@
-#! /usr/bin/perl
-# $Id$
-
-# Copyright (C) 2001-2002 MandrakeSoft
-# Yves Duret <yduret at mandrakesoft.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
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# 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.
-#
-# TODO: consider switching from TreeView to gtkhtml
-
-use strict;
-use lib qw(/usr/lib/libDrakX);
-use standalone; #- warning, standalone must be loaded very first, for 'explanations'
-use common;
-use interactive;
-use ugtk2 qw(:wrappers :helpers :create);
-
-$::isInstall and die "Not supported during install.\n";
-
-my $in = 'interactive'->vnew('su');
-my $cron_hourly = "/etc/cron.hourly/logdrake_service";
-
-#- parse arguments list.
-foreach (@ARGV) {
- /^--explain=(.*)$/ and do { $::isExplain = ($::Explain) = $1; $::isFile = 1; $::File = "/var/log/explanations"; next };
- /^--file=(.*)$/ and do { $::isFile = ($::File) = $1; next };
- /^--word=(.*)$/ and do { $::isWord = ($::Word) = $1; next };
- /^--alert$/ and do { alert_config(); quit() };
-}
-
-$::isTail = 1 if $::isFile;
-$| = 1 if $::isTail;
-my $h = chomp_(`hostname -s`);
-
-my $my_win = ugtk2->new('logdrake');
-unless ($::isEmbedded) {
- $my_win->{rwindow}->set_title(N("logdrake"));
- $my_win->{window}->set_border_width(5);
- #$my_win->{rwindow}->set_policy(1, 1, 1);
- #$my_win->{window}->set_default_size(540,460);
-}
-$my_win->{window}->signal_connect(delete_event => \&quit);
-
-my $cal = gtkset_sensitive(new Gtk2::Calendar(), 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) });
-
-### menus definition
-# the menus are not shown
-# but they provides shiny shortcut like C-q
-my @menu_items = (
- { path => N("/_File"), 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/-"),type => '<Separator>' },
- { path => N("/File/_Quit"), accelerator => N("<control>Q"), callback => \&quit },
- { path => N("/_Options"), type => '<Branch>' },
- { path => N("/Options/Test") },
- { path => N("/_Help"),type => '<LastBranch>' },
- { path => N("/Help/_About...") }
- );
-my $menubar = create_factory_menu($my_win->{rwindow}, @menu_items) unless $::isEmbedded;
-######### menus end
-
-
-########## font and colors
-my %n = ('font' => ''); # Gtk2::Pango::FontDescription->from_string('Serif 12');#Gtk2::Gdk::Font->fontset_load(N("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-*-*,*"));
-my %b = ('font' => 'Bold'); #Gtk2::Pango::FontDescription->from_string('Serif Bold 12');#Gtk2::Gdk::Font->fontset_load(N("-misc-fixed-bold-r-*-*-*-100-*-*-*-*-*-*,*"));
-
-#$black = "\033[30m";
-#$red = "\033[31m";
-#$green = "\033[32m";
-#$yellow = "\033[33m";
-#$blue = "\033[34m";
-#$magenta = "\033[35m";
-#$purple = "\033[35m";
-#$cyan = "\033[36m";
-#$white = "\033[37m";
-#$darkgray = "\033[30m";
-#$col_norm = "\033[00m";
-#$col_background = "\033[07m";
-#$col_brighten = "\033[01m";
-#$col_underline = "\033[04m";
-#$col_blink = "\033[05m";
-
-my $white = gtkcolor(50400, 655, 20000);
-my $black = gtkcolor(0, 0, 0);
-my $red = gtkcolor(0xFFFF, 655, 655);
-my $green = gtkcolor(0x0, 0x9898,0x0);
-my $yellow = gtkcolor(0xFFFF, 0xD7D7, 0);
-my $blue = gtkcolor(655, 655, 0xFFFF);
-my $magenta = gtkcolor(0xFFFF, 655, 0xFFFF);
-my $purple = gtkcolor(0xA0A0, 0x2020, 0xF0F0);
-my $cyan = gtkcolor(0x0, 0x9898, 0x9898);
-my $darkgray = gtkcolor(0x2F2F, 0x4F4F, 0x4F4F);
-
-# Define global terms:
-# Define good notables:
-my @word_good = ("starting\n", "Freeing", "Detected", "starting.", "accepted.\n", "authenticated.\n", "Ready", "active", "reloading", "saved;", "restarting", "ONLINE\n");
-my @word_warn = ("dangling", "closed.\n", "Assuming", "root", "root\n", "exiting\n", "missing", "Ignored", "adminalert:", "deleting", "OFFLINE\n");
-my @word_bad = "bad";
-my @word_note = ("LOGIN", "DHCP_OFFER", "optimized", "reset:", "unloaded", "disconnected", "connect", "Successful", "registered\n");
-my @line_good = ("up", "DHCP_ACK", "Cleaned", "Initializing", "Starting", "success", "successfully", "alive", "found", "ONLINE\n");
-my @line_warn = ("warning:", "WARNING:", "invalid", "obsolete", "bad", "Password", "detected", "timeout", "timeout:", "attackalert:", "wrong", "Lame", "FAILED", "failing", "unknown", "obsolete", "stopped.\n", "terminating.", "disabled\n", "disabled", "Lost");
-my @line_bad = ("DENY", "lost", "shutting", "dead", "DHCP_NAK", "failure;", "Unable", "inactive", "terminating", "refused", "rejected", "down", "OFFLINE\n", "error\n", "ERROR\n", "ERROR:", "error", "ERROR", "error:", "failed:");
-
-# Define specifics:
-my @daemons = "named";
-
-# Now define what we want to use when:
-my $col_good = 'green4';
-my $col_warn = 'yellow4';
-my $col_bad = 'red';
-my $col_note = 'purple';
-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") },
- "explanations" => { file => "/var/log/explanations", desc => N("Mandrake Tools Explanation") }
-);
-
-my $yy = gtkset_sensitive(gtksignal_connect(new Gtk2::Button(N("search")) , clicked => \&search),0);
-my $log_text = gtktext_insert(Gtk2::TextView->new, [ [ '' ] ]);
-
-my $log_buf = $log_text->get_buffer();
-my $refcount_search;
-#### far from window
-
-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),
- # 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}),
- clicked => sub {
- $refcount_search++;
- gtkset_sensitive($yy,$refcount_search);
- }) } keys %files,
- )
- ),
- 0, gtkadd(gtkset_border_width(new Gtk2::Frame(N("Calendar")),2),
- gtkpack__(gtkset_border_width(new Gtk2::VBox(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")),
- clicked => sub {
- eval { alert_config() };
- if ($@ =~ /wizcancel/) {
- $::Wizard_no_previous = 1;
- $::Wizard_no_cancel = 1;
- $::WizardWindow->destroy if defined $::WizardWindow;
- undef $::WizardWindow;
- } else { print "CRITICAL: \"$@\"\n" }
-
- })),
- gtksignal_connect(new Gtk2::Button(N("Save")), clicked => \&save),
- gtksignal_connect(new Gtk2::Button($::isEmbedded ? N("Cancel") : N("Quit")), clicked => \&quit)
- )
- )
- )
- );
-
-$::isFile && !$::isEmbedded and gtkset_size_request($log_text, 400, 500);
-
-$my_win->{window}->show_all();
-search() if $::isFile;
-$my_win->main;
-
-sub quit { ugtk2->exit(0) }
-
-#-------------------------------------------------------------
-# search functions
-#-------------------------------------------------------------
-sub search {
- $log_text->window->freeze_updates();
- $log_buf->set_text('', -1);
- if ($::isFile) {
- parse_file($::File);
- } else {
- foreach (keys %files) {
- parse_file($files{$_}{file}, $files{$_}{desc}) if $toggle{$_}->active;
- }
- }
- $log_text->window->thaw_updates();
- $log_text->show();
- gtkflush();
-}
-
-local *F;
-my $timer;
-
-sub parse_file {
- local *F = *F;
- 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()
- )
- );
- $win_pb->set_transient_for($my_win->{rwindow}) unless $::isEmbedded;
- $win_pb->set_position('center');
- $win_pb->realize();
- $win_pb->show_all();
- gtkflush();
- }
- my $ey = $e_yes->get_chars(0, -1);
- my $en = $e_no->get_chars(0, -1);
- $ey =~ s/ OR /\|/;
- $ey =~ s/^\*$//;
- $en =~ s/^\*$/.*/;
- $ey = $ey . $::Word if $::isWord;
-
- if ($cal_mode) {
- my (undef, $month, $day) = $cal->get_date();
- $ey = $months[$month]."\\s{1,2}$day\\s.*$ey.*\n";
- }
-
- my @all = catMaybeCompressed($file);
-
- if ($::isExplain) {
- my (@t, $t);
- while (@all) {
- $t = pop @all;
- next if $t =~ /logdrake/;
- last if $t !~ /$::Explain/;
- push @t, $t;
- }
- @all = reverse @t;
- }
-
- my $taille = @all;
- my $i = 0;
- 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
- }
-
- if ($en eq "" and /$ey/i) { logcolorize($_); next }
- if (! /$en/i and /$ey/i) { logcolorize($_); next }
- if (! /$en/i and $ey eq "") { logcolorize($_); next }
- }
- $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 ||= Gtk2->timeout_add(1000, sub {
- logcolorize($_) while <F>;
- seek F, 0, 1;
- });
- }
-}
-
-
-##########################################################################################
-
-sub logcolorize {
- local $_ = shift; #my ($data) = @_;
-
- # we get date & time if it is date & time (dmesg)
- s/(\D{3} .. (\d\d:\d\d:\d\d ))//;
- my $timestamp = $::isExplain ? $2 : $1;
- my @rec = split;
-
- log_output($timestamp, { %b, 'foreground' => '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
-
- 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' });
- return;
- }
- # Extract PID if present
- if ($rec[1] =~ /\[(\d+)\]\:/) {
- 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' });
- }
- else {
- log_output($rec[1] . " ", { %n, 'foreground' => 'green' });
- }
-
- foreach my $therest (2 .. $#rec) {
- $col = 'darkcyan';
-
- # Check for keywords to highlight
- foreach (@word_good) { $col = $col_good if $_ eq $rec[$therest] }
- foreach (@word_warn) { $col = $col_warn if $_ eq $rec[$therest] }
- foreach (@word_bad) { $col = $col_bad if $_ eq $rec[$therest] }
- foreach (@word_note) { $col = $col_note if $_ eq $rec[$therest] }
-
- # Watch for words that indicate entire lines should be highlighted
- #foreach (@line_good) { $col = $col_good if $_ eq $rec[$therest] }
- #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("\n", { %n, 'foreground' => 'black' });
-}
-
-
-# log_output (Gtk2::TextView, [ [ ... ] ])
-sub log_output {
- gtktext_append($log_text, [ \@_ ]);
- $log_text->scroll_to_iter(my $iter = $log_buf->get_end_iter, 0, 1, 0.5, 0.5);
- $iter->free;
-}
-
-
-#-------------------------------------------------------------
-# mail/sms alert
-#-------------------------------------------------------------
-
-sub alert_config {
-
- $::isWizard = 1;
- $::Wizard_pix_up = "wiz_logdrake.png"; # FIXME
- $::Wizard_title = N("Mail alert");
-
- my $cron = q(#!/usr/bin/perl
-# generated by logdrake
-use MDK::Common;
-my $r = "*** " . chomp_(`date`) . " ***\n";
-
-);
-
-my $initdir = "/etc/init.d";
-
- my ($load, $email);
- $load = 3;
-
- begin:
- $::Wizard_finished = 0;
- $::Wizard_no_previous = 1;
- $in->ask_okcancel(N("Mail alert configuration"),
- N("Welcome to the mail configuration utility.\n\nHere, you'll be able to set up the alert system.\n"),
- 1) or quit();
-
- step_service:
- undef $::Wizard_no_previous;
- undef $::Wizard_finished;
- my $service = {
- httpd => N("Apache World Wide Web Server"),
- bind => N("Domain Name Resolver"),
- ftp => N("Ftp Server"),
- postfix => N("Postfix Mail Server"),
- samba => N("Samba Server"),
- sshd => N("SSH Server"),
- webmin => N("Webmin Service"),
- xinetd => N("Xinetd Service")
- };
- my @installed_d;
- foreach my $serv (keys %$service) {
- -e "$initdir/$serv" && push @installed_d, $serv;
- }
- my %services_to_check;
- $in->ask_from(N("service setting"),
- N("You will receive an alert if one of the selected services is no longer running"),
- [ map { { label => $_, val => \$services_to_check{$_}, type => "bool", text => $service->{$_} } } @installed_d
- ]) or goto begin;
-
- $cron .= "#- check services\n";
- foreach (keys %services_to_check) {
- next unless $services_to_check{$_};
- $cron .= "\$r .= \"Service $_ ($service->{$_} is not running)\\n\" unless -e \"/var/lock/subsys/$_\";\n";
- }
-
- step_load:
- undef $::Wizard_finished;
- $in->ask_from(N("load setting"),
- N("You will receive an alert if the load is higher than this value"),
- [
- { label => "load ", val => \$load, type => 'range', min => 1, max => 50 },
- ]) or goto step_service;
-
- $cron .= sprintf(<<'EOF', $load);
-#- load
-my ($load) = split ' ', first(cat_("/proc/loadavg"));
-$r .= "Load is huge: $load\n" if $load > %s;
-
-EOF
-
- step_output:
-# $::Wizard_no_previous = 1;
- $::Wizard_finished = 1;
- $in->ask_from(N("alert configuration"),
- N("Please enter your email address below "),
- [
- { label => "" },
- { label => "Email", val => \$email },
- ]) or goto step_load;
-
- $cron .= q(#- report it
-
-my $email = ) . "'$email';\n\n";
-
- $cron .= q(local *F;
-open F, '|/usr/sbin/sendmail -oi -t';
-print F q(Subject: logdrake Mail Alert
-From: root@localhost
-To: ), "$email\n";
-print F $r;
-
-# EOF);
- output $cron_hourly, $cron;
- chmod 0755, $cron_hourly;
-
- undef $::isWizard;
- if (defined $::WizardWindow) {
- $::WizardWindow->destroy;
- undef $::WizardWindow;
- }
-}
-
-
-#-------------------------------------------------------------
-# menu callback functions
-#-------------------------------------------------------------
-
-
-sub save {
- $::isWizard = 0;
- $yy = $in->ask_file(N("Save as.."), "/root") or return;
- my $buf = $log_text->get_buffer;
- output($yy, $buf->get_text(($buf->get_bounds), 0));
-}