From 34457e96923c2cf9de5c9955eb26d452ca1dfcab Mon Sep 17 00:00:00 2001 From: paspo Date: Thu, 28 Jul 2016 01:10:06 +0200 Subject: [PATCH] host actions --- doraemon.spec | 1 + .../e-smith/events/actions/doraemon-reboot | 34 +++++++++++++ .../e-smith/events/actions/doraemon-shutdown | 34 +++++++++++++ root/etc/e-smith/events/actions/doraemon-wake | 35 ++++++++++++++ .../events/doraemon-reboot/S50doraemon-reboot | 1 + .../doraemon-shutdown/S50doraemon-shutdown | 1 + .../events/doraemon-wake/S50doraemon-wake | 1 + .../en/NethServer_Module_Doraemon.php | 21 ++++---- .../it/NethServer_Module_Doraemon.php | 21 ++++---- .../NethServer/Module/Doraemon/Hosts.php | 7 ++- .../Module/Doraemon/Hosts/Modify.php | 4 +- .../Module/Doraemon/Hosts/TogglePower.php | 48 +++++++++++++++++++ .../Template/Doraemon/Hosts/TogglePower.php | 23 +++++++++ 13 files changed, 207 insertions(+), 24 deletions(-) create mode 100755 root/etc/e-smith/events/actions/doraemon-reboot create mode 100755 root/etc/e-smith/events/actions/doraemon-shutdown create mode 100755 root/etc/e-smith/events/actions/doraemon-wake create mode 120000 root/etc/e-smith/events/doraemon-reboot/S50doraemon-reboot create mode 120000 root/etc/e-smith/events/doraemon-shutdown/S50doraemon-shutdown create mode 120000 root/etc/e-smith/events/doraemon-wake/S50doraemon-wake create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePower.php create mode 100644 root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePower.php diff --git a/doraemon.spec b/doraemon.spec index c030b11..3650594 100644 --- a/doraemon.spec +++ b/doraemon.spec @@ -9,6 +9,7 @@ BuildRoot: %{_tmppath}/%{name}-root BuildRequires: nethserver-devtools > 1.0.1 Requires: httpd, php, sudo, php-xml, php-mcrypt Requires: nethserver-base, nethserver-php +Requires: net-tools Requires: upstart Source0: doraemon-1.3.0.tar.gz BuildArch: noarch diff --git a/root/etc/e-smith/events/actions/doraemon-reboot b/root/etc/e-smith/events/actions/doraemon-reboot new file mode 100755 index 0000000..5f02685 --- /dev/null +++ b/root/etc/e-smith/events/actions/doraemon-reboot @@ -0,0 +1,34 @@ +#!/usr/bin/perl -w + +package esmith; + +use strict; +use Errno; +use esmith::DB::db; +use IO::File; +use English; + +my $db_hosts = esmith::DB::db->open('hosts') || die("Could not open e-smith db (" . esmith::DB::db->error . ")\n"); + +my $event = $ARGV [0]; + +defined $ARGV[1] || die "No host specied"; +my $host = $ARGV[1]; + +reboot_host($host); + +exit 0; + +sub reboot_host +{ + my ($hostName) = @_; + #------------------------------------------------------------ + # Reboot the host + #------------------------------------------------------------ + + my $h = $db_hosts->get($hostName) or die "No host record for user $hostName"; + + system("/usr/bin/sudo -u amgmt /usr/bin/ssh -o StrictHostKeyChecking=no amgmt\@$hostName /usr/bin/sudo /sbin/reboot") == 0 + or die "Error rebooting $hostName"; + +} diff --git a/root/etc/e-smith/events/actions/doraemon-shutdown b/root/etc/e-smith/events/actions/doraemon-shutdown new file mode 100755 index 0000000..04d61c7 --- /dev/null +++ b/root/etc/e-smith/events/actions/doraemon-shutdown @@ -0,0 +1,34 @@ +#!/usr/bin/perl -w + +package esmith; + +use strict; +use Errno; +use esmith::DB::db; +use IO::File; +use English; + +my $db_hosts = esmith::DB::db->open('hosts') || die("Could not open e-smith db (" . esmith::DB::db->error . ")\n"); + +my $event = $ARGV [0]; + +defined $ARGV[1] || die "No host specied"; +my $host = $ARGV[1]; + +shutdown_host($host); + +exit 0; + +sub shutdown_host +{ + my ($hostName) = @_; + #------------------------------------------------------------ + # Shutdown the host + #------------------------------------------------------------ + + my $h = $db_hosts->get($hostName) or die "No host record for user $hostName"; + + system("/usr/bin/sudo -u amgmt /usr/bin/ssh -o StrictHostKeyChecking=no amgmt\@$hostName /usr/bin/sudo /sbin/poweroff") == 0 + or die "Error shutting down $hostName"; + +} diff --git a/root/etc/e-smith/events/actions/doraemon-wake b/root/etc/e-smith/events/actions/doraemon-wake new file mode 100755 index 0000000..bb43cb6 --- /dev/null +++ b/root/etc/e-smith/events/actions/doraemon-wake @@ -0,0 +1,35 @@ +#!/usr/bin/perl -w + +package esmith; + +use strict; +use Errno; +use esmith::DB::db; +use IO::File; +use English; + +my $db_hosts = esmith::DB::db->open('hosts') || die("Could not open e-smith db (" . esmith::DB::db->error . ")\n"); + +my $event = $ARGV [0]; + +defined $ARGV[1] || die "No host specied"; +my $host = $ARGV[1]; + +wake_host($host); + +exit 0; + +sub wake_host +{ + my ($hostName) = @_; + #------------------------------------------------------------ + # Wake up the host + #------------------------------------------------------------ + + my $h = $db_hosts->get($hostName) or die "No host record for user $hostName"; + my $client = $h[0]; + my $mac = $client->prop('MacAddress'); + system("/sbin/ether-wake -i lan0 $mac") == 0 + or die "Error waking up $hostName"; + +} diff --git a/root/etc/e-smith/events/doraemon-reboot/S50doraemon-reboot b/root/etc/e-smith/events/doraemon-reboot/S50doraemon-reboot new file mode 120000 index 0000000..42198ce --- /dev/null +++ b/root/etc/e-smith/events/doraemon-reboot/S50doraemon-reboot @@ -0,0 +1 @@ +../actions/doraemon-reboot \ No newline at end of file diff --git a/root/etc/e-smith/events/doraemon-shutdown/S50doraemon-shutdown b/root/etc/e-smith/events/doraemon-shutdown/S50doraemon-shutdown new file mode 120000 index 0000000..91b5632 --- /dev/null +++ b/root/etc/e-smith/events/doraemon-shutdown/S50doraemon-shutdown @@ -0,0 +1 @@ +../actions/doraemon-shutdown \ No newline at end of file diff --git a/root/etc/e-smith/events/doraemon-wake/S50doraemon-wake b/root/etc/e-smith/events/doraemon-wake/S50doraemon-wake new file mode 120000 index 0000000..c8520f0 --- /dev/null +++ b/root/etc/e-smith/events/doraemon-wake/S50doraemon-wake @@ -0,0 +1 @@ +../actions/doraemon-wake \ No newline at end of file diff --git a/root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php b/root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php index 7fe4d17..f9b8147 100644 --- a/root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php +++ b/root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php @@ -1,12 +1,15 @@ -setTableAdapter($this->getPlatform()->getTableAdapter('hosts', 'remote')) ->setColumns($columns) - // TODO: - // ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('wake')) - // ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('reboot')) - // ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('shutdown')) ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('update')) + ->addRowAction(new \NethServer\Module\Doraemon\Hosts\TogglePower('wake')) + ->addRowAction(new \NethServer\Module\Doraemon\Hosts\TogglePower('reboot')) + ->addRowAction(new \NethServer\Module\Doraemon\Hosts\TogglePower('shutdown')) ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('delete')) ->addTableAction(new \NethServer\Module\Doraemon\Hosts\Modify('create')) ->addTableAction(new \Nethgui\Controller\Table\Help('Help')) diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php index 740b3eb..ab9d3d6 100644 --- a/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php @@ -12,7 +12,7 @@ class Modify extends \Nethgui\Controller\Table\Modify { $parameterSchema = array( // was: Validate::HOSTNAME_FQDN, but we need hostname - array('hostname', Validate::ANYTHING, \Nethgui\Controller\Table\Modify::KEY), + array('hostname', Validate::HOSTNAME_SIMPLE, \Nethgui\Controller\Table\Modify::KEY), array('MacAddress', Validate::MACADDRESS, \Nethgui\Controller\Table\Modify::FIELD), array('Role', Validate::ANYTHING, \Nethgui\Controller\Table\Modify::FIELD), // array('Role', Validate::ROLES_COLLECTION ??? TODO!!!, \Nethgui\Controller\Table\Modify::FIELD), @@ -52,4 +52,4 @@ class Modify extends \Nethgui\Controller\Table\Modify $view->setTemplate($templates[$this->getIdentifier()]); } -} \ No newline at end of file +} diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePower.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePower.php new file mode 100644 index 0000000..b9a366b --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePower.php @@ -0,0 +1,48 @@ +declareParameter('hostname', Validate::HOSTNAME_SIMPLE); + + parent::bind($request); + $hostname = \Nethgui\array_end($request->getPath()); + + if ( ! $hostname) { + throw new \Nethgui\Exception\HttpException('Not found', 404, 1322148400); + } + + $this->parameters['hostname'] = $hostname; + } + + public function process() + { + if ( ! $this->getRequest()->isMutation()) { + return; + } + + $this->getPlatform()->signalEvent(sprintf('doraemon-%s@post', $this->getIdentifier()), array($this->parameters['hostname'])); + } + +} diff --git a/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePower.php b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePower.php new file mode 100644 index 0000000..4e16e40 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePower.php @@ -0,0 +1,23 @@ +requireFlag($view::INSET_DIALOG); + +if ($view->getModule()->getIdentifier() == 'shutdown') { + $headerText = $T('Shutdown host `${0}`'); + $panelText = $T('Proceed with host `${0}` shutdown?'); +} elseif ($view->getModule()->getIdentifier() == 'reboot') { + $headerText = $T('Reboot host `${0}`'); + $panelText = $T('Proceed with host `${0}` reboot?'); +} else { + $headerText = $T('Wakeup host `${0}`'); + $panelText = $T('Proceed with host `${0}` wakeup?'); +} + +echo $view->panel() + ->insert($view->header('hostname')->setAttribute('template', $headerText)) + ->insert($view->textLabel('hostname')->setAttribute('template', $panelText)) +; + +echo $view->buttonList() + ->insert($view->button('Yes', $view::BUTTON_SUBMIT)) + ->insert($view->button('No', $view::BUTTON_CANCEL)->setAttribute('value', $view['Cancel'])) +;