diff options
Diffstat (limited to 'logdrake')
-rwxr-xr-x | logdrake | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/logdrake b/logdrake new file mode 100755 index 00000000..eb373bef --- /dev/null +++ b/logdrake @@ -0,0 +1,436 @@ +#! /usr/bin/perl -w +# $Id$ + +# Copyright (C) 2001 MandrakeSoft +# Yves Duret <yduret at mandrakesoft.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. + + +use lib qw(/usr/lib/libDrakX); + +use interactive; +use standalone; +use common qw(:common :file :functional :system); +use any; +#use log; +#use c; + +use Gtk; +use Config; +init Gtk; + + +$::isInstall and die "Not supported during install.\n"; + +$::isEmbedded = ($::XID, $::CCPID) = "@ARGV" =~ /--embedded (\w+) (\w+)/; +if ($::isEmbedded) { + print "EMBED\n"; + print "parent XID\t$::XID\n"; + print "mcc pid\t$::CCPID\n"; +} + +local $_ = join '', @ARGV; + +/-h/ and die "usage: logdrake [--version]\n"; +/-version/ and die 'version: $Id$ '."\n"; + +$expert_mode = 0; + +my $window = $::isEmbedded ? new Gtk::Plug ($::XID) : new Gtk::Window -toplevel; +$window->signal_connect( delete_event => sub { $::isEmbedded ? kill(USR1, $::CCPID) : Gtk->exit(0) }); +$window->set_title( _("logdrake") ); +$window->set_policy(1, 1, 1); +$window->border_width (5); + +### menus definition +# the menus are not shown +# but they provides shiny shortcut like C-q +my @menu_items = ( { path => _("/_File"), + type => '<Branch>' }, + { path => _("/File/_New"), + accelerator => _("<control>N"), + callback => \&print_hello }, + { path => _("/File/_Open"), + accelerator => _("<control>O"), + callback => \&print_hello }, + { path => _("/File/_Save"), + accelerator => _("<control>S"), + callback => \&print_hello }, + { path => _("/File/Save _As") }, + { path => _("/File/-"), + type => '<Separator>' }, + { path => _("/File/_Quit"), + accelerator => _("<control>Q"), + callback => sub { $::isEmbedded ? kill(USR1, $::CCPID) : Gtk->exit(0) } }, + + { path => _("/_Options"), + type => '<Branch>' }, + { path => _("/Options/Test") }, + + { path => _("/_Help"), + type => '<LastBranch>' }, + { path => _("/Help/_About...") } ); +my $menubar = get_main_menu( $window ); +######### menus end + + +########## font and colors +my $fixed_font = Gtk::Gdk::Font->load("-misc-Fixed-Medium-r-*-*-*-140-*-*-*-*-*-*,*"); +# Get the system color map and allocate the color red +my $cmap = Gtk::Gdk::Colormap->get_system(); +my $color; +$color->{red} = 0xFFFF; +$color->{green} = 0; +$color->{blue} = 0; + +warn _("Couldn't allocate color\n") + unless (defined($cmap->color_alloc($color))); +######### font and colors end + +my $global_vbox = new Gtk::VBox(); +$::isEmbedded or $global_vbox->pack_start (new Gtk::Label(_("see your log")), 0, 0, 0); +#### far from window + +my $log_frame = new Gtk::Frame( _("log") ); +my $log = new Gtk::Text( undef, undef ); +my $vscrollbar = new Gtk::VScrollbar( $log->vadj ); +my $log_hbox = new Gtk::HBox (0, 0); +$log_hbox->border_width (5); +$log_hbox->set_usize( 30, 75 ); +$log_hbox->pack_start($log, 1, 1, 0); +$log_hbox->pack_start($vscrollbar, 0, 0, 0 ); +$log_frame->add ($log_hbox); +$global_vbox->pack_start ($log_frame, 0, 0, 0); + + + + +### back to window +$window->add( $global_vbox ); +$window->show_all(); + +Gtk->main_iteration while Gtk->events_pending; +$::isEmbedded and kill USR2, $::CCPID; +Gtk->main; + + + +#------------------------------------------------------------- +# tree functions +#------------------------------------------------------------- +### Subroutines + +sub fill_tree { + ($root_dir) = @_; + $root_dir = "/lib/modules/" . $root_dir; + # Create root tree item widget + $leaf = new_with_label Gtk::TreeItem( $root_dir ); + $tree->append( $leaf ); + $leaf->signal_connect( 'select', \&select_item, $root_dir ); + $leaf->set_user_data( $root_dir ); + + # Create the subtree + if ( has_sub_trees( $root_dir ) ) { + my $subtree = new Gtk::Tree(); + $leaf->set_subtree( $subtree ); + $leaf->signal_connect( 'expand', \&expand_tree, $subtree ); + $leaf->signal_connect( 'collapse', \&collapse_tree ); + $leaf->expand(); + } +} + +sub change_tree { + $leaf->destroy(); + fill_tree (@_); + $leaf->show(); +} + +# Callback for expanding a tree - find subdirectories, files and add them to tree +sub expand_tree + { + my ( $item, $subtree ) = @_; + + my $dir_entry; + my $path; + my $item_new; + my $new_subtree; + + my $dir = $item->get_user_data(); + + chdir( $dir ); + + foreach $dir_entry ( <*> ) { + if (( -d $dir_entry ) or ( $dir_entry =~ /\.o(\.gz)?$/)) { + $path = $dir . "/" . $dir_entry; + $path =~ s|//|/|g; + $item_new = new_with_label Gtk::TreeItem( $dir_entry ); + $item_new->set_user_data($path); + $item_new->signal_connect('select', \&select_item, $path ); + $subtree->append($item_new); + $item_new->show(); + + if ( has_sub_trees( $path ) ) { + $new_subtree = new Gtk::Tree(); + $item_new->set_subtree( $new_subtree ); + $item_new->signal_connect('expand', \&expand_tree, $new_subtree); + $item_new->signal_connect('collapse', \&collapse_tree); + } + } + } + chdir( ".." ); + } + + +# Callback for collapsing a tree -- removes the subtree +sub collapse_tree + { + my ( $item ) = @_; + my $subtree = new Gtk::Tree(); + + $item->remove_subtree(); + $item->set_subtree( $subtree ); + $item->signal_connect( 'expand', \&expand_tree, $subtree ); + } + + +# Test whether a directory has subdirectories +sub has_sub_trees + { + my ( $dir ) = @_; + my $file; + + foreach $file ( <$dir/*> ) { + return 1 if ( -d $file ) or ($file =~ /\.o(\.gz)?$/); + } + + return (0); + } + +# Called whenever an item is clicked on the tree widget. +sub select_item { + my ( $widget, $file ) = @_; + return if (-d $file); + my $size = ( lstat( $file ) )[ 7 ]; + my $lr = $list->rows(); + my $i; + $file =~ s|/lib/modules/.*?/||g; + for ($i=0; $i < $lr; $i++) { + last if ($file eq $list->get_text($i, 0)); + } + print $file,"\n"; + + $list->append($file, $size) if ($i == $lr) or ($lr == 0); +} + +#------------------------------------------------------------- +# menu callback functions +#------------------------------------------------------------- + +sub print_hello { + print( "mcdtg !\n" ); +} + +sub get_main_menu { + my ( $window ) = @_; + + my $accel_group = new Gtk::AccelGroup(); + my $item_factory = new Gtk::ItemFactory( 'Gtk::MenuBar', '<main>', $accel_group ); + $item_factory->create_items( @menu_items ); + $window->add_accel_group( $accel_group ); + return ( $item_factory->get_widget( '<main>' ) ); +} + + +sub create_dialog { + my ( $label, $c ) = @_; + my $ret = 0; + my $dialog = new Gtk::Dialog; + $dialog->signal_connect ( delete_event => sub {Gtk->main_quit();}); + $dialog->set_title(I_("drakfloppy")); + $dialog->border_width(10); + $dialog->vbox->pack_start(new Gtk::Label($label),1,1,0); + + my $button = new Gtk::Button I_("OK"); + $button->can_default(1); + $button->signal_connect(clicked => sub { $ret = 1; $dialog->destroy(); Gtk->main_quit(); }); + $dialog->action_area->pack_start($button, 1, 1, 0); + $button->grab_default; + + if ($c) { + my $button2 = new Gtk::Button I_("Cancel"); + $button2->signal_connect(clicked => sub { $ret = 0; $dialog->destroy(); Gtk->main_quit(); }); + $button2->can_default(1); + $dialog->action_area->pack_start($button2, 1, 1, 0); + } + + $dialog->show_all; + Gtk->main(); + $ret; +} + +sub destroy_window { + my($widget, $windowref, $w2) = @_; + $$windowref = undef; + $w2 = undef if defined $w2; + 0; +} + + +########################################################################################## +sub logcolorize { + +# logcolorize.pl 1.0.8 - A PERL script to colorize log viewing +# distributed under the GPL +# Copyright: (C) 1999, Michael T. Babcock +# <mikebabcock@pobox.com> +# http://www.linuxsupportline.com/~pgp/linux/ +# +$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"; + +# Define global terms: +# Define good notables: +@word_good=("starting\n", "Freeing", "Detected", "starting.", "accepted.\n", "authenticated.\n", "Ready", "active", "reloading", "saved;", "restarting", "ONLINE\n"); +@word_warn=("dangling", "closed.\n", "Assuming", "root", "root\n", "exiting\n", "missing", "Ignored", "adminalert:", "deleting", "OFFLINE\n"); +@word_bad=("bad"); +@word_note=("LOGIN", "DHCP_OFFER", "optimized", "reset:", "unloaded", "disconnected", "connect", "Successful", "registered\n"); +@line_good=("up", "DHCP_ACK", "Cleaned", "Initializing", "Starting", "success", "successfully", "alive", "found", "ONLINE\n"); +@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"); +@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: +@daemons=("named"); + +# Now define what we want to use when: +$col_good = $green; +$col_warn = $yellow; +$col_bad = $red; +$col_note = $purple; + +$col_norm = "\033[00m"; +$col_background = "\033[07m"; +$col_brighten = "\033[01m"; +$col_underline = "\033[04m"; +$col_blink = "\033[05m"; + +# Resets to normal colours and moves to the left one column ... +$col_default = "$col_norm$white"; +print "\n$col_norm$cyan"; +print "logcolorize.pl 1.0.8 by$col_brighten$cyan Michael T. Babcock$col_norm$cyan <$col_brighten$green"; +print "mikebabcock\@pobox.com$col_norm$cyan"; +print ">\n"; + +$datespace=0; + +mainloop: while (<>) +{ + $thisline = $_; + + $timestamp = substr($_,0,15); + s/................//; + + @rec = split (/ /, $_); + + $output="$col_brighten$cyan$timestamp"; # date & time + $output.=" $col_brighten$blue$rec[0]"; # hostname + if ($rec[1] eq "last") + { + $output.="$col_norm$green last message repeated "; + $output.="$col_brighten$rec[4]$col_norm$green times\n"; + print "$output$col_default"; + next mainloop; + } + # Extract PID if present + if ($rec[1] =~ /\[(\d+)\]\:/) + { + my($pid) = $1; + $rec[1]=~s/\[$1\]\:// ; + $output .= "$col_norm$green $rec[1]" . + "$col_brighten$green\["; + $output .= "$col_brighten$white$pid" . + "$col_brighten$green\]: "; + } + else { + $output .= "$col_norm$green $rec[1] "; + } + + $restcolor="$col_norm$cyan"; + $restoftheline=""; + for ($therest=(2); $therest<=$#rec; $therest++) + { $highlight=0; + + # Check for keywords to highlight + + for ($i=0; $i<=$#word_good; $i++) + { if ($word_good[$i] eq $rec[$therest]) + { $restoftheline.="$col_brighten$col_good"; $highlight=1; } + } + for ($i=0; $i<=$#word_warn; $i++) + { if ($word_warn[$i] eq $rec[$therest]) + { $restoftheline.="$col_brighten$col_warn"; $highlight=1; } + } + for ($i=0; $i<=$#word_bad; $i++) + { if ($word_bad[$i] eq $rec[$therest]) + { $restoftheline.="$col_brighten$col_bad"; $highlight=1; } + } + for ($i=0; $i<=$#word_note; $i++) + { if ($word_note[$i] eq $rec[$therest]) + { $restoftheline.="$col_brighten$col_note"; $highlight=1; } + } + + # Watch for words that indicate entire lines should be highlighted + + for ($i=0; $i<=$#line_good; $i++) + { if ($line_good[$i] eq $rec[$therest]) + { $restcolor="$col_norm$col_good"; + $restoftheline.="$col_brighten$col_good"; $highlight=1; } + } + for ($i=0; $i<=$#line_warn; $i++) + { if ($line_warn[$i] eq $rec[$therest]) + { $restcolor="$col_norm$col_warn"; + $restoftheline.="$col_brighten$col_warn"; $highlight=1; } + } + for ($i=0; $i<=$#line_bad; $i++) + { if ($line_bad[$i] eq $rec[$therest]) + { $restcolor="$col_norm$col_bad"; + $restoftheline.="$col_brighten$col_bad"; $highlight=1; } + } + + $restoftheline.="$rec[$therest] "; + if ($highlight == 1) + { $restoftheline.=$restcolor; } + } + $output.="$restcolor$restoftheline"; + print "$output$col_default\033[1G"; +} + +#exit(0); +} + + +# log +# $Log$ +# Revision 1.1 2001/06/27 09:22:59 yduret +# added it.. +# |