diff options
Diffstat (limited to 'lib/AdminPanel/Module/Services.pm')
-rw-r--r-- | lib/AdminPanel/Module/Services.pm | 588 |
1 files changed, 0 insertions, 588 deletions
diff --git a/lib/AdminPanel/Module/Services.pm b/lib/AdminPanel/Module/Services.pm deleted file mode 100644 index dca0c0c..0000000 --- a/lib/AdminPanel/Module/Services.pm +++ /dev/null @@ -1,588 +0,0 @@ -# vim: set et ts=4 sw=4: - -package ManaTools::Module::Services; - -#============================================================= -*-perl-*- - -=head1 NAME - -ManaTools::Module::Services - This module aims to manage service - with GUI - -=head1 SYNOPSIS - - my $serviceMan = ManaTools::Module::Services->new(); - $serviceMan->start(); - -=head1 DESCRIPTION - - This module presents all the system service status and gives - the availability to administrator to stop, start and active at boot - them. - - From the original code drakx services. - -=head1 SUPPORT - - You can find documentation for this module with the perldoc command: - - perldoc ManaTools::Module::Services - -=head1 SEE ALSO - - ManaTools::Module - -=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 - -=cut - - -use Moose; -use English; -use Time::HiRes qw(usleep); - -use MDK::Common::String qw(formatAlaTeX); -use MDK::Common::DataStructure qw(member); - -use yui; -use ManaTools::Shared::GUI; -use ManaTools::Shared::Locales; -use ManaTools::Shared::Services; - - -use File::Basename; - -extends qw( ManaTools::Module ); - -has '+icon' => ( - default => "/usr/share/mcc/themes/default/service-mdk.png", -); - -has '_services' => ( - traits => ['Array'], - is => 'rw', - isa => 'ArrayRef[Str]', - default => sub { [] }, - init_arg => undef, - handles => { - all_services => 'elements', - add_service => 'push', - map_service => 'map', - service_count => 'count', - sorted_services => 'sort', - }, -); - -has '_xinetd_services' => ( - traits => ['Array'], - is => 'rw', - isa => 'ArrayRef[Str]', - default => sub { [] }, - init_arg => undef, - handles => { - all_xinetd_services => 'elements', - add_xinetd_service => 'push', - map_xinetd_service => 'map', - xinetd_service_count => 'count', - sorted_xinetd_services => 'sort', - }, -); - -has 'on_services' => ( - traits => ['Array'], - is => 'rw', - isa => 'ArrayRef[Str]', - default => sub { [] }, - init_arg => undef, - handles => { - all_on_services => 'elements', - add_on_service => 'push', - map_on_service => 'map', - on_service_count => 'count', - sorted_on_services => 'sort', - }, -); - - -has 'sh_gui' => ( - is => 'rw', - init_arg => undef, - builder => '_SharedUGUIInitialize' -); - -sub _SharedUGUIInitialize { - my $self = shift(); - - $self->sh_gui(ManaTools::Shared::GUI->new() ); -} - -has 'sh_services' => ( - is => 'rw', - init_arg => undef, - lazy => 1, - builder => '_SharedServicesInitialize' -); - -sub _SharedServicesInitialize { - my $self = shift(); - - $self->sh_services(ManaTools::Shared::Services->new() ); -} - - -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' -} - -=head1 VERSION - -Version 1.0.0 - -=cut - -our $VERSION = '1.0.0'; - -=head1 METHODS - -=cut - -#============================================================= - -=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("adminService")); - } - - $self->loadServices(); -} - - -#============================================================= - -=head2 start - -=head3 INPUT - - $self: this object - -=head3 DESCRIPTION - - This method extends Module::start and is invoked to - start adminService - -=cut - -#============================================================= -sub start { - my $self = shift; - -# if ($EUID != 0) { -# $self->sh_gui->warningMsgBox({ -# title => $self->name, -# text => $self->loc->N("root privileges required"), -# }); -# return; -# } - - $self->_servicePanel(); -}; - - -#============================================================= - -=head2 loadServices - -=head3 INPUT - - $self: this object - -=head3 DESCRIPTION - - This methonds load service info into local attributes such - as xinetd_services, on_services and all the available, - services - -=cut - -#============================================================= -sub loadServices { - my $self = shift; - - my $refresh = 1; - my ($l, $on_services) = $self->sh_services->services($refresh); - my @xinetd_services = map { $_->[0] } $self->sh_services->xinetd_services(); - - $self->_xinetd_services(); - $self->_xinetd_services(\@xinetd_services); - $self->_services(\@$l); - $self->on_services(\@$on_services); - -} - -## _waitUnitStatus wait unit status is reached for -## a while (10 secs max) -sub _waitUnitStatus { - my ($self, $service, $running) = @_; - - for (my $i=0; $i < 100; $i++) { - $self->loadServices(); - if ($running) { - last if $self->sh_services->is_service_running($service); - } - else { - last if !$self->sh_services->is_service_running($service); - } - usleep(100); - } -} - -## _serviceInfo sets service description accordingly to -## selected service status -## param -## 'service' service name -## 'infoPanel' service information widget -sub _serviceInfo { - my ($self, $service, $infoPanel) = @_; - - yui::YUI::ui()->blockEvents(); - ## infoPanel - $infoPanel->setValue(MDK::Common::String::formatAlaTeX($self->sh_services->description($service))); - yui::YUI::ui()->unblockEvents(); -} - - -sub _serviceStatusString { - my ($self, $serviceName) = @_; - - my $started; - - if (MDK::Common::DataStructure::member($serviceName, $self->all_xinetd_services)) { - $started = $self->loc->N("Start when requested"); - } - else { - $started = ($self->sh_services->is_service_running($serviceName)? $self->loc->N("running") : $self->loc->N("stopped")); - } - - return $started; -} - -## _serviceStatus sets status label accordingly to selected item -## param -## 'service' yui CB table (service table) -## 'item' selected item (service) -sub _serviceStatus { - my ($self, $tbl, $item) = @_; - - my $started = $self->_serviceStatusString($item->label()); - - # TODO add icon green/red led - my $cell = $tbl->toCBYTableItem($item)->cell(1); - if ($cell) { - $cell->setLabel($started); - $tbl->cellChanged($cell); - } -} - - -## fill service table with service info -## param -## 'tbl' yui table -sub _fillServiceTable { - my ($self, $tbl) = @_; - - $tbl->startMultipleChanges(); - $tbl->deleteAllItems(); - my $itemCollection = new yui::YItemCollection; - foreach (sort $self->all_services) { - - my $serviceName = $_; - - my $item = new yui::YCBTableItem($serviceName); - my $started = $self->_serviceStatusString($serviceName); - - # TODO add icon green/red led - my $cell = new yui::YTableCell($started); - $item->addCell($cell); - - $item->check(MDK::Common::DataStructure::member($serviceName, $self->all_on_services)); - $item->setLabel($serviceName); - $itemCollection->push($item); - $item->DISOWN(); - } - $tbl->addItems($itemCollection); - $tbl->doneMultipleChanges(); -} - -## draw service panel and manage it (main dialog) -sub _servicePanel { - my $self = shift; - - 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 $mageiaPlugin = "mga"; - my $factory = yui::YUI::widgetFactory; - my $mgaFactory = yui::YExternalWidgets::externalWidgetFactory($mageiaPlugin); - $mgaFactory = yui::YMGAWidgetFactory::getYMGAWidgetFactory($mgaFactory); - - my $dialog = $factory->createMainDialog; - my $vbox = $factory->createVBox( $dialog ); - - #Line for logo and title - my $hbox_iconbar = $factory->createHBox($vbox); - my $head_align_left = $factory->createLeft($hbox_iconbar); - $hbox_iconbar = $factory->createHBox($head_align_left); - $factory->createImage($hbox_iconbar, $self->icon); - - $factory->createHeading($hbox_iconbar, $self->loc->N("Manage system services by enabling or disabling them")); - - my $frame = $factory->createFrame ($vbox, ""); - - my $frmVbox = $factory->createVBox( $frame ); - my $hbox = $factory->createHBox( $frmVbox ); - - my $yTableHeader = new yui::YTableHeader(); - $yTableHeader->addColumn($self->loc->N("Service"), $yui::YAlignBegin); - $yTableHeader->addColumn($self->loc->N("Status"), $yui::YAlignCenter); - $yTableHeader->addColumn($self->loc->N("On boot"), $yui::YAlignBegin); - - ## service list (serviceBox) - my $serviceTbl = $mgaFactory->createCBTable($hbox, $yTableHeader, $yui::YCBTableCheckBoxOnLastColumn); - - $self->_fillServiceTable($serviceTbl); - - $serviceTbl->setImmediateMode(1); - $serviceTbl->setWeight(0, 50); - - ## info panel (infoPanel) - $frame = $factory->createFrame ($hbox, $self->loc->N("Information")); - $frame->setWeight(0, 30); - $frmVbox = $factory->createVBox( $frame ); - my $infoPanel = $factory->createRichText($frmVbox, "--------------"); #, 0, 0); - $infoPanel->setAutoScrollDown(); - - ### Service Start button ($startButton) - $hbox = $factory->createHBox( $frmVbox ); - my $startButton = $factory->createPushButton($hbox, $self->loc->N("&Start")); - - ### Service Stop button ($stopButton) - my $stopButton = $factory->createPushButton($hbox, $self->loc->N("S&top")); - - # dialog buttons - $factory->createVSpacing($vbox, 1.0); - ## Window push buttons - $hbox = $factory->createHBox( $vbox ); - my $align = $factory->createLeft($hbox); - $hbox = $factory->createHBox($align); - my $aboutButton = $factory->createPushButton($hbox, $self->loc->N("&About") ); - $align = $factory->createRight($hbox); - $hbox = $factory->createHBox($align); - - ### Service Refresh button ($refreshButton) - my $refreshButton = $factory->createPushButton($hbox, $self->loc->N("&Refresh")); - my $closeButton = $factory->createPushButton($hbox, $self->loc->N("&Quit") ); - - #first item status - my $item = $serviceTbl->selectedItem(); - if ($item) { - $self->_serviceInfo($item->label(), $infoPanel); - if (MDK::Common::DataStructure::member($item->label(), $self->all_xinetd_services)) { - $stopButton->setDisabled(); - $startButton->setDisabled(); - } - else { - $stopButton->setEnabled(1); - $startButton->setEnabled(1); - } - } - - 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(); - my $wEvent = yui::toYWidgetEvent($event); - - if ($widget == $closeButton) { - 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", '2013-2015'), - license => $self->loc->N("GPLv2"), - description => $self->loc->N("adminService is the Mageia service and daemon management tool\n - (from the original idea of Mandriva draxservice)."), - 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 == $serviceTbl) { - - # service selection changed - $item = $serviceTbl->selectedItem(); - if ($item) { - $self->_serviceInfo($item->label(), $infoPanel); - if (MDK::Common::DataStructure::member($item->label(), $self->all_xinetd_services)) { - $stopButton->setDisabled(); - $startButton->setDisabled(); - } - else { - $stopButton->setEnabled(1); - $startButton->setEnabled(1); - } - } -# TODO fix libyui-mga-XXX item will always be changed after first one - if ($wEvent->reason() == $yui::YEvent::ValueChanged) { - $item = $serviceTbl->changedItem(); - if ($item) { - yui::YUI::app()->busyCursor(); - eval { - $self->sh_services->set_service($item->label(), $item->checked()); - }; - my $errors = $@; - $self->loadServices(); - yui::YUI::app()->normalCursor(); - - if ($errors) { - $self->sh_gui->warningMsgBox({ - title => $self->loc->N($item->checked() ? "Enabling %s" : "Disabling %s", $item->label()), - text => "$errors", - richtext => 1, - }); - $dialog->startMultipleChanges(); - $self->_fillServiceTable($serviceTbl); - $dialog->recalcLayout(); - $dialog->doneMultipleChanges(); - } - } - } - } - elsif ($widget == $startButton) { - $item = $serviceTbl->selectedItem(); - if ($item) { - my $serviceName = $item->label(); - yui::YUI::app()->busyCursor(); - eval { - $self->sh_services->restart_or_start($serviceName); - $self->_waitUnitStatus($serviceName, 1); - }; - my $errors = $@; - yui::YUI::app()->normalCursor(); - $self->_serviceStatus($serviceTbl, $item); - - $self->sh_gui->warningMsgBox({ - title => $self->loc->N("Starting %s", $serviceName), - text => "$errors", - richtext => 1, - }) if $errors; - } - } - elsif ($widget == $stopButton) { - $item = $serviceTbl->selectedItem(); - if ($item) { - my $serviceName = $item->label(); - yui::YUI::app()->busyCursor(); - eval { - $self->sh_services->stopService($serviceName); - $self->_waitUnitStatus($serviceName, 0); - }; - my $errors = $@; - yui::YUI::app()->normalCursor(); - $self->_serviceStatus($serviceTbl, $item); - - $self->sh_gui->warningMsgBox({ - title => $self->loc->N("Stopping %s", $serviceName), - text => "$errors", - richtext => 1, - }) if $errors; - } - } - elsif ($widget == $refreshButton) { - yui::YUI::app()->busyCursor(); - $self->loadServices(); - $dialog->startMultipleChanges(); - $self->_fillServiceTable($serviceTbl); - $dialog->recalcLayout(); - $dialog->doneMultipleChanges(); - yui::YUI::app()->normalCursor(); - } - } - } - $dialog->destroy(); - - #restore old application title - yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle; -} - -no Moose; -__PACKAGE__->meta->make_immutable; - -1; |