diff options
Diffstat (limited to 'lib/AdminPanel/Module/LogViewer.pm')
-rw-r--r-- | lib/AdminPanel/Module/LogViewer.pm | 568 |
1 files changed, 0 insertions, 568 deletions
diff --git a/lib/AdminPanel/Module/LogViewer.pm b/lib/AdminPanel/Module/LogViewer.pm deleted file mode 100644 index e009c1c..0000000 --- a/lib/AdminPanel/Module/LogViewer.pm +++ /dev/null @@ -1,568 +0,0 @@ -# vim: set et ts=4 sw=4: -package ManaTools::Module::LogViewer; -#============================================================= -*-perl-*- - -=head1 NAME - -ManaTools::Module::LogViewer - Log viewer - -=head1 SYNOPSIS - -my $logViewer = ManaTools::Module::LogViewer->new(); -$logViewer->start(); - -=head1 DESCRIPTION - -Log viewer is a backend to journalctl, it can also load a custom -file. - - -=head1 SUPPORT - -You can find documentation for this module with the perldoc command: - -perldoc ManaTools::Module::::LogViewer - -=head1 AUTHOR - -Angelo Naselli <anaselli@linux.it> - -=head1 COPYRIGHT and LICENSE - -Copyright (C) 2014-2015, Angelo Naselli. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License version 2, as -published by the Free Software Foundation. - -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 - -=head1 FUNCTIONS - -=cut - -use Moose; - -use diagnostics; -use open OUT => ':utf8'; - -use ManaTools::Shared::GUI; -use ManaTools::Shared::Locales; -use ManaTools::Shared::Services; -use ManaTools::Shared::JournalCtl; - - -use POSIX qw/strftime floor/; -use English; -use Date::Simple (); -use File::HomeDir qw(home); - -use yui; - -extends qw( ManaTools::Module ); - -### TODO icon -has '+icon' => ( - default => "/usr/share/mcc/themes/default/logdrake-mdk.png", -); - -has 'loc' => ( - is => 'rw', - init_arg => undef, - builder => '_localeInitialize' -); - -sub _localeInitialize { - my $self = shift; - - # TODO fix domain binding for translation - $self->loc(ManaTools::Shared::Locales->new(domain_name => 'libDrakX-standalone') ); - # TODO if we want to give the opportunity to test locally add dir_name => 'path' -} - -has 'sh_gui' => ( - is => 'rw', - init_arg => undef, - builder => '_SharedUGUIInitialize' -); - -sub _SharedUGUIInitialize { - my $self = shift; - - $self->sh_gui(ManaTools::Shared::GUI->new() ); -} - -=head1 VERSION - -Version 1.0.0 - -=cut - -our $VERSION = '1.0.0'; - - -my %prior = ('emerg' => 0, - 'alert' => 1, - 'crit' => 2, - 'err' => 3, - 'warning' => 4, - 'notice' => 5, - 'info' => 6, - 'debug' => 7); - - -#============================================================= - -=head2 BUILD - -=head3 INPUT - - $self: this object - -=head3 DESCRIPTION - - The BUILD method is called after a Moose object is created, - in this methods Services loads all the service information. - -=cut - -#============================================================= -sub BUILD { - my $self = shift; - - if (! $self->name) { - $self->name ($self->loc->N("Log viewer")); - } -} - - -#============================================================= - -=head2 start - -=head3 INPUT - - $self: this object - -=head3 DESCRIPTION - - This method extends Module::start and is invoked to - start the log viewer - -=cut - -#============================================================= -sub start { - my $self = shift; - - $self->_logViewerPanel(); -}; - - - - - -sub _logViewerPanel { - my $self = shift; - - if(!$self->_warn_about_user_mode()) { - return 0; - } - - my $appTitle = yui::YUI::app()->applicationTitle(); - - ## set new title to get it in dialog - yui::YUI::app()->setApplicationTitle($self->name); - ## set icon if not already set by external launcher - yui::YUI::app()->setApplicationIcon($self->icon); - - my $factory = yui::YUI::widgetFactory; - my $optFactory = yui::YUI::optionalWidgetFactory; - - # Create Dialog - my $dialog = $factory->createMainDialog; - - # Start Dialog layout: - my $layout = $factory->createVBox( $dialog ); - my $align = $factory->createAlignment($layout, $yui::YAlignCenter, $yui::YAlignUnchanged); - $factory->createLabel( $align, $self->loc->N("A tool to monitor your logs"), 1, 0 ); - - #### matching - my $hbox = $factory->createHBox($layout); - my $matchingInputField = $factory->createInputField($hbox, $self->loc->N("Matching")); - $factory->createHSpacing($hbox, 1); - - #### not matching - my $notMatchingInputField = $factory->createInputField($hbox, $self->loc->N("but not matching")); - $matchingInputField->setWeight($yui::YD_HORIZ, 2); - $notMatchingInputField->setWeight($yui::YD_HORIZ, 2); - - my $frame = $factory->createFrame($layout, $self->loc->N("Options")); - - #### lastBoot - my $vbox = $factory->createVBox( $frame ); - $align = $factory->createLeft($vbox); - my $lastBoot = $factory->createCheckBox($align, $self->loc->N("Last boot"), 1); - $factory->createVSpacing($vbox, 0.5); - $lastBoot->setNotify(1); - - my $row1 = $factory->createHBox($vbox); - $factory->createVSpacing($vbox, 0.5); - my $row2 = $factory->createHBox($vbox); - $factory->createVSpacing($vbox, 0.5); - my $row3 = $factory->createHBox($vbox); - - #### since and until - my $sinceDate; - my $sinceTime; - my $sinceFrame = $factory->createCheckBoxFrame($row1, $self->loc->N("Since"), 1); - $sinceFrame->setNotify(1); - - my $untilDate; - my $untilTime; - my $untilFrame = $factory->createCheckBoxFrame($row2, $self->loc->N("Until"), 1); - $untilFrame->setNotify(1); - if ($optFactory->hasDateField()) { - my $hbox1 = $factory->createHBox($sinceFrame); - - $sinceDate = $optFactory->createDateField($hbox1, ""); - $factory->createHSpacing($hbox1, 1.0); - $sinceTime = $optFactory->createTimeField($hbox1, ""); - my $day = strftime "%F", localtime; - $sinceDate->setValue($day); - $sinceTime->setValue("00:00:00"); - - $hbox1 = $factory->createHBox($untilFrame); - $untilDate = $optFactory->createDateField($hbox1, ""); - $factory->createHSpacing($hbox1, 1.0); - $untilTime = $optFactory->createTimeField($hbox1, ""); - $untilDate->setValue($day); - $untilTime->setValue("23:59:59"); - } - else { - $sinceFrame->enable(0); - $untilFrame->enable(0); - } - - #### units - my $spacing = $factory->createHSpacing($row1, 2.0); - - my $unitsFrame = $factory->createCheckBoxFrame($row1, $self->loc->N("Select a unit"), 1); - $unitsFrame->setNotify(1); - $align = $factory->createLeft($unitsFrame); - my $units = $factory->createComboBox ( $align, "" ); - my $itemCollection = new yui::YItemCollection; - - yui::YUI::app()->busyCursor(); - my $serv = ManaTools::Shared::Services->new(); - my ($l, $active_services) = $serv->services(); - - foreach (@{$active_services}) { - my $serviceName = $_; - my $item = new yui::YItem($serviceName); - $itemCollection->push($item); - $item->DISOWN(); - } - $units->addItems($itemCollection); - yui::YUI::app()->normalCursor(); - - #### priority - # From - $factory->createHSpacing($row2, 2.0); - my $priorityFromFrame = $factory->createCheckBoxFrame($row2, $self->loc->N("From priority"), 1); - $priorityFromFrame->setNotify(1); - $priorityFromFrame->setWeight($yui::YD_HORIZ, 1); - my $priorityFrom = $factory->createComboBox ( $priorityFromFrame, "" ); - $itemCollection->clear(); - - my @pr = ('emerg', 'alert', 'crit', 'err', - 'warning', 'notice', 'info', 'debug'); - foreach (@pr) { - my $item = new yui::YItem($_); - if ( $_ eq 'emerg' ) { - $item->setSelected(1); - } - $itemCollection->push($item); - $item->DISOWN(); - } - $priorityFrom->addItems($itemCollection); - - $factory->createHSpacing( $row2, 2.0 ); - # To - my $priorityToFrame = $factory->createCheckBoxFrame($row2, $self->loc->N("To priority"), 1); - $priorityToFrame->setNotify(1); - $priorityToFrame->setWeight($yui::YD_HORIZ, 1); - my $priorityTo = $factory->createComboBox ( $priorityToFrame, "" ); - $itemCollection->clear(); - - foreach (@pr) { - my $item = new yui::YItem($_); - if ( $_ eq 'debug' ) { - $item->setSelected(1); - } - $itemCollection->push($item); - $item->DISOWN(); - } - $priorityTo->addItems($itemCollection); - - #### search - $align = $factory->createRight($row3); - my $searchButton = $factory->createPushButton($align, $self->loc->N("&Find")); - - #### create log view object - my $logView = $factory->createLogView($layout, $self->loc->N("Log content"), 10, 0); - - - ### NOTE CheckBoxFrame doesn't honoured his costructor checked value for his children - $unitsFrame->setValue(0); - $sinceFrame->setValue(0); - $untilFrame->setValue(0); - $priorityFromFrame->setValue(0); - $priorityToFrame->setValue(0); - - # buttons on the last line - $align = $factory->createRight($layout); - $hbox = $factory->createHBox($align); - my $aboutButton = $factory->createPushButton($hbox, $self->loc->N("&About") ); - $align = $factory->createRight($hbox); - $hbox = $factory->createHBox($align); - my $saveButton = $factory->createPushButton($hbox, $self->loc->N("&Save")); - my $quitButton = $factory->createPushButton($hbox, $self->loc->N("&Quit")); - - # End Dialof layout - - while(1) { - my $event = $dialog->waitForEvent(); - my $eventType = $event->eventType(); - - #event type checking - if ($eventType == $yui::YEvent::CancelEvent) { - last; - } - elsif ($eventType == $yui::YEvent::WidgetEvent) { - # widget selected - my $widget = $event->widget(); - if ($widget == $quitButton) { - last; - } - elsif($widget == $aboutButton) { - my $translators = $self->loc->N("_: Translator(s) name(s) & email(s)\n"); - $translators =~ s/\</\<\;/g; - $translators =~ s/\>/\>\;/g; - $self->sh_gui->AboutDialog({ name => $self->name, - version => $self->VERSION, - credits => $self->loc->N("Copyright (C) %s Mageia community", '2014'), - license => $self->loc->N("GPLv2"), - description => $self->loc->N("Log viewer is a systemd journal viewer"), - authors => $self->loc->N("<h3>Developers</h3> - <ul><li>%s</li> - <li>%s</li> - </ul> - <h3>Translators</h3> - <ul><li>%s</li></ul>", - "Angelo Naselli <anaselli\@linux.it>", - "Matteo Pasotti <matteo.pasotti\@gmail.com>", - $translators - ), - } - ); - } - elsif($widget == $saveButton) { - if ($logView->lines()) { - $self->_save($logView); - } - else { - $self->sh_gui->warningMsgBox({text => $self->loc->N("Empty log found")}); - } - } - elsif ($widget == $searchButton) { - yui::YUI::app()->busyCursor(); - $dialog->startMultipleChanges(); - $logView->clearText(); - my %log_opts; - if ($lastBoot->value()) { - $log_opts{this_boot} = 1; - } - if ($unitsFrame->value()) { - $log_opts{unit} = $units->value(); - } - if ($sinceFrame->value()) { - $log_opts{since} = $sinceDate->value() . " " . $sinceTime->value(); - } - if ($untilFrame->value()) { - $log_opts{until} = $untilDate->value() . " " . $untilTime->value(); -# TODO check date until > date since - } - if ($priorityFromFrame->value() || $priorityToFrame->value()) { - my $prio = $priorityFrom->value(); - $prio .= "..".$priorityTo->value() if ($priorityToFrame->value()); - $log_opts{priority} = $prio; -# TODO enabling right using checkBoxes - } - my $log = $self->_search(\%log_opts); -print " log lines: ". scalar (@{$log}) ."\n"; -# TODO check on log line number what to do if too big? and adding a progress bar? - $self->_parse_content({'matching' => $matchingInputField->value(), - 'noMatching' => $notMatchingInputField->value(), - 'log' => $log, - 'logView' => $logView, - } - ); - $dialog->recalcLayout(); - $dialog->doneMultipleChanges(); - yui::YUI::app()->normalCursor(); - } - elsif ($widget == $lastBoot) { - yui::YUI::ui()->blockEvents(); - if ($lastBoot->value()) { - #last boot overrrides until and since - $sinceFrame->setValue(0); - $untilFrame->setValue(0); - } - yui::YUI::ui()->unblockEvents(); - } - elsif ($widget == $sinceFrame) { - yui::YUI::ui()->blockEvents(); - if ($sinceFrame->value()) { - #disabling last boot that overrrides until and since - $lastBoot->setValue(0); - } - yui::YUI::ui()->unblockEvents(); - } - elsif ($widget == $untilFrame) { - yui::YUI::ui()->blockEvents(); - if ($untilFrame->value()) { - #disabling last boot that overrrides until and since - $lastBoot->setValue(0); - } - yui::YUI::ui()->unblockEvents(); - } - elsif ($widget == $priorityFromFrame) { - if ($priorityToFrame->value() && !$priorityFromFrame->value()) { - yui::YUI::ui()->blockEvents(); - $priorityToFrame->setValue(0) ; - yui::YUI::ui()->unblockEvents(); - } - } - elsif ($widget == $priorityToFrame) { - if ($priorityToFrame->value() && !$priorityFromFrame->value()) { - yui::YUI::ui()->blockEvents(); - $priorityFromFrame->setValue(1) ; - yui::YUI::ui()->unblockEvents(); - } - } - - } - } - $dialog->destroy(); - - #restore old application title - yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle; -} - - - -sub _warn_about_user_mode { - my $self = shift; - - my $title = $self->loc->N("Running in user mode"); - my $msg = $self->loc->N("You are launching this program as a normal user.\n". - "You will not be able to read system logs which you do not have rights to,\n". - "but you may still browse all the others."); - - if(($EUID != 0) and (!$self->sh_gui->ask_OkCancel({title => $title, text => $msg}))) { - # TODO add Privileges? - return 0; - } - - return 1; -} - - -## Save as -# -# $logView: log Widget -# -## -sub _save { - my ($self, $logView) = @_; - - yui::YUI::app()->busyCursor(); - - my $outFile = yui::YUI::app()->askForSaveFileName(home(), "*", $self->loc->N("Save as..")); - if ($outFile) { - open(OF, ">".$outFile); - print OF $logView->logText(); - close OF; - } - - yui::YUI::app()->normalCursor(); -} - -## Search call back -sub _search { - my ($self, $log_opts) = @_; - - my $log = ManaTools::Shared::JournalCtl->new(%{$log_opts}); - my $all = $log->getLog(); - - return $all; -} - -## _parse_content -# -# $info : HASH cotaining -# -# matching: string to match -# notMatching: string to skip -# log: ARRAY REF to log content -# logViewer: logViewer Widget -# -## -sub _parse_content { - my ($self, $info) = @_; - - my $ey = ""; - my $en = ""; - - if( exists($info->{'matching'} ) ){ - $ey = $info->{'matching'}; - } - if( exists($info->{'noMatching'} ) ){ - $en = $info->{'noMatching'}; - } - - $ey =~ s/ OR /|/ if ($ey); - $ey =~ s/^\*$// if ($ey); - $en =~ s/^\*$/.*/ if ($en); - - my $test; - - if ($en && !$ey) { - $test = sub { $_[0] !~ /$en/ }; - } - elsif ($ey && !$en) { - $test = sub { $_[0] =~ /$ey/ }; - } - elsif ($ey && $en) { - $test = sub { $_[0] =~ /$ey/ && $_[0] !~ /$en/ }; - } - else { - $test = sub { $_[0] }; - } - - foreach (@{$info->{log}}) { - $info->{logView}->appendLines($_) if $test->($_); - } - -} - - -1 |