From 78038181eed903c04a56da6bf5ad43628bc16608 Mon Sep 17 00:00:00 2001 From: paspo Date: Sun, 28 Apr 2024 09:44:40 +0200 Subject: [PATCH] wip --- libreschool-client-manager-legacygui.spec | 177 ++++++++++++++++++ .../en/NethServer_Module_Doraemon.php | 13 ++ .../en/NethServer_Module_Doraemon_Hosts.php | 9 + .../en/NethServer_Module_Doraemon_Rooms.php | 9 + .../it/NethServer_Module_Doraemon.php | 13 ++ .../it/NethServer_Module_Doraemon_Hosts.php | 9 + .../it/NethServer_Module_Doraemon_Rooms.php | 9 + .../nethesis/NethServer/Module/Doraemon.php | 17 ++ .../NethServer/Module/Doraemon/Hosts.php | 40 ++++ .../Module/Doraemon/Hosts/Modify.php | 55 ++++++ .../Module/Doraemon/Hosts/TogglePower.php | 48 +++++ .../Module/Doraemon/Hosts/TogglePowerAll.php | 34 ++++ .../NethServer/Module/Doraemon/Rooms.php | 28 +++ .../Module/Doraemon/Rooms/Modify.php | 89 +++++++++ .../NethServer/Template/Doraemon/Hosts.php | 22 +++ .../Template/Doraemon/Hosts/TogglePower.php | 23 +++ .../Doraemon/Hosts/TogglePowerAll.php | 21 +++ .../NethServer/Template/Doraemon/Rooms.php | 40 ++++ 18 files changed, 656 insertions(+) create mode 100644 libreschool-client-manager-legacygui.spec create mode 100644 root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php create mode 100644 root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon_Hosts.php create mode 100644 root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon_Rooms.php create mode 100644 root/usr/share/nethesis/NethServer/Language/it/NethServer_Module_Doraemon.php create mode 100644 root/usr/share/nethesis/NethServer/Language/it/NethServer_Module_Doraemon_Hosts.php create mode 100644 root/usr/share/nethesis/NethServer/Language/it/NethServer_Module_Doraemon_Rooms.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePower.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePowerAll.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms.php create mode 100644 root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms/Modify.php create mode 100644 root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts.php create mode 100644 root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePower.php create mode 100644 root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePowerAll.php create mode 100644 root/usr/share/nethesis/NethServer/Template/Doraemon/Rooms.php diff --git a/libreschool-client-manager-legacygui.spec b/libreschool-client-manager-legacygui.spec new file mode 100644 index 0000000..f02641e --- /dev/null +++ b/libreschool-client-manager-legacygui.spec @@ -0,0 +1,177 @@ +Summary: Helps client to join domain and maintain itself +Name: doraemon +Version: 2.1.0 +Release: 4.ns6 +URL: https://github.com/bglug-it/doraemon/ +License: GPLv2+ +Packager: Paolo Asperti +Group: System Environment/Daemons +BuildRoot: %{_tmppath}/%{name}-root +BuildRequires: nethserver-devtools > 1.0.1 +BuildRequires: hunspell-en +Requires: httpd, php, sudo, php-xml, php-mcrypt +Requires: nethserver-base, nethserver-php +Requires: net-tools +Requires: upstart +Requires: ansible +Source0: %{name}-%{version}-%{release}.tar.gz +Source1: createlinks.pl +BuildArch: noarch + +%description +Helps client on a domain network to get information for its maintenance. + +%prep +%setup -n %{name}-%{version}-%{release} + +%build +%{makedocs} +perl createlinks.pl + +%install +rm -Rf $RPM_BUILD_ROOT +(cd root ; find . -depth -print | cpio -dump %{buildroot}) +rm -f %{name}-%{version}-%{release}-filelist +%{genfilelist} %{buildroot} > %{name}-%{version}-%{release}-filelist +mkdir -p %{buildroot}%{_localstatedir}/log/doraemon +mkdir -p %{buildroot}%{_localstatedir}/cache/doraemon + + +%pre +#if [ "$1" = 1 ]; then +# #installation +#fi +if [ "$1" = 2 ]; then + #upgrade + /sbin/service %{name} stop >/dev/null 2>&1 || : + /sbin/stop %{name} >/dev/null 2>&1 || : + DATABASE=/var/lib/doraemon/doraemon.db + INI=/etc/doraemon.ini + if [ -f $INI ]; then + DATABASE=$(awk -F "=" '/Database/ {print $2}' $INI) + PORT=$(awk -F "=" '/Port/ {print $2}' $INI) + BASE=$(awk -F "=" '/Base/ {print $2}' $INI) + ROLE=$(awk -F "=" '/Role/ {print $2}' $INI) + DIGITS=$(awk -F "=" '/Digits/ {print $2}' $INI) + DOMAIN=$(awk -F "=" '/Domain/ {print $2}' $INI) + MGMTKEY=$(awk -F "=" '/MgmtKey/ {print $2}' $INI) + VAULTPASSFILE=$(awk -F "=" '/VaultPassFile/ {print $2}' $INI) + rm $INI + /sbin/e-smith/db configuration set %{name} service \ + status enabled \ + TCPPort $PORT \ + access private \ + DefaultRole $ROLE \ + DomainFile $DOMAIN \ + ManagementKeyFile $MGMTKEY \ + NamingBase $BASE \ + NamingDigits $DIGITS \ + VaultPassFile $VAULTPASSFILE + else + /sbin/e-smith/db configuration set %{name} service \ + status enabled \ + TCPPort 3000 \ + access private \ + DefaultRole client \ + DomainFile /etc/domain.yml \ + ManagementKeyFile /home/amgmt/.ssh/id_rsa.pub \ + NamingBase lab \ + NamingDigits 2 \ + VaultPassFile /home/amgmt/.ansible/vault.txt + fi + if [ -f $DATABASE ]; then + sqlite3 -separator " " $DATABASE \ + "select * from client" | while read id hostname mac role; do + /sbin/e-smith/db hosts set $hostname local \ + MacAddress $mac Role $role + done + rm $DATABASE + fi +fi + +%post +/etc/e-smith/events/actions/initialize-default-databases +[ -e /usr/sbin/doraemon ] && [ ! -L /usr/sbin/doraemon ] && rm /usr/sbin/doraemon +[ ! -L /usr/sbin/doraemon ] && ln -s httpd /usr/sbin/doraemon +if [ "$1" = 1 ]; then + #installation + /sbin/e-smith/db configuration set %{name} service status enabled TCPPort 3000 access private DefaultRole client DomainFile /etc/domain.yml ManagementKeyFile /home/amgmt/.ssh/id_rsa.pub ManagementPrivateKeyFile /home/amgmt/.ssh/id_rsa NamingBase lab NamingDigits 2 VaultPassFile /home/amgmt/.ansible/vault.txt + /sbin/e-smith/expand-template /etc/sudoers + /sbin/e-smith/expand-template /etc/httpd/doraemon/httpd.conf + /sbin/start %{name} >/dev/null 2>&1 || : + /sbin/e-smith/signal-event runlevel-adjust + /sbin/e-smith/signal-event firewall-adjust +fi +if [ "$1" = 2 ]; then + #upgrade + # TODO: this won't be needed in the next version + /sbin/e-smith/expand-template /etc/sudoers + /sbin/e-smith/expand-template /etc/httpd/doraemon/httpd.conf + /sbin/start %{name} >/dev/null 2>&1 || : + /sbin/e-smith/signal-event runlevel-adjust + /sbin/e-smith/signal-event firewall-adjust +fi + + +%preun +#if [ "$1" = 1 ]; then +# #upgrade +#fi +if [ "$1" = 0 ]; then + #uninstallation + /sbin/stop %{name} >/dev/null 2>&1 || : +fi + + +%postun +#if [ "$1" = 1 ]; then +# #upgrade +#fi +if [ "$1" = 0 ]; then + #uninstallation + /sbin/e-smith/db configuration delete %{name} + /sbin/e-smith/expand-template /etc/sudoers + /sbin/e-smith/signal-event runlevel-adjust + /sbin/e-smith/signal-event firewall-adjust +fi + + +%clean +rm -rf %{buildroot} + +%files -f %{name}-%{version}-%{release}-filelist +%defattr(0644,root,root,755) +%doc README.md LICENSE.txt +%attr(0644,srvmgr,srvmgr) %ghost %{_localstatedir}/log/doraemon/access_log +%attr(0644,srvmgr,srvmgr) %ghost %{_localstatedir}/log/doraemon/error_log + + +%changelog +* Sun Oct 8 2017 Paolo Asperti - 2.0.2-1 +- FIX: bug in WOL +- FIX: small language typos + +* Wed Nov 9 2016 Paolo Asperti - 2.0.1-1 +- PHP porting +- Added a basic UI + +* Tue Oct 27 2015 Emiliano Vavassori - 1.2.1-2.ns6 +- Packing corrections to rpm to fix upgrading issue + +* Tue Oct 27 2015 Emiliano Vavassori - 1.2.1-1.ns6 +- Packing new minor correction on how packages are extracted from db + +* Mon Sep 11 2015 Emiliano Vavassori - 1.2.0-1.ns6 +- Packing new version with ansible dynamic inventory support, epoptes server role support. + +* Mon Sep 07 2015 Emiliano Vavassori - 1.1.1-1.ns6 +- Packing new version with correct roles. + +* Sun Sep 06 2015 Emiliano Vavassori - 1.1.0-1.ns6 +- Packing new version with new functionalities. + +* Wed Jul 15 2015 Emiliano Vavassori - 1.0.0-2.ns6 +- Added logrotate file. + +* Mon Jul 13 2015 Emiliano Vavassori - 1.0.0-1.ns6 +- Unique binary for both ansiblehelper and mac2hostname. 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 new file mode 100644 index 0000000..6f87ce3 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Language/en/NethServer_Module_Doraemon.php @@ -0,0 +1,13 @@ +loadChildrenDirectory(); + } + +} diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts.php new file mode 100644 index 0000000..a75e7f9 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts.php @@ -0,0 +1,40 @@ +setTableAdapter($this->getPlatform()->getTableAdapter('hosts', 'local')) + ->setColumns($columns) + ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('update')) + // ->addRowAction(new \NethServer\Module\Doraemon\Hosts\Modify('adopt')) + ->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 \NethServer\Module\Doraemon\Hosts\TogglePowerAll('wake-all')) + ->addTableAction(new \NethServer\Module\Doraemon\Hosts\TogglePowerAll('reboot-all')) + ->addTableAction(new \NethServer\Module\Doraemon\Hosts\TogglePowerAll('shutdown-all')) + ->addTableAction(new \Nethgui\Controller\Table\Help('Help')) + ; + + parent::initialize(); + } + +} diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php new file mode 100644 index 0000000..ab9d3d6 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/Modify.php @@ -0,0 +1,55 @@ +setSchema($parameterSchema); + parent::initialize(); + } + + public function validate(\Nethgui\Controller\ValidationReportInterface $report) + { + if ($this->getIdentifier() === 'delete') { + $v = $this->createValidator()->platform('host-delete'); + if ( ! $v->evaluate($this->parameters['hostname'])) { + $report->addValidationError($this, 'Key', $v); + } + } + parent::validate($report); + } + + protected function onParametersSaved($parameters) + { + $actionName = $this->getIdentifier(); + if ($actionName === 'update') { + $actionName = 'modify'; + } + $this->getPlatform()->signalEvent(sprintf('host-%s &', $actionName)); + } + + public function prepareView(\Nethgui\View\ViewInterface $view) + { + parent::prepareView($view); + $templates = array( + 'create' => 'NethServer\Template\Doraemon\Hosts', + 'update' => 'NethServer\Template\Doraemon\Hosts', + 'delete' => 'Nethgui\Template\Table\Delete', + ); + $view->setTemplate($templates[$this->getIdentifier()]); + } + +} 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/Module/Doraemon/Hosts/TogglePowerAll.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePowerAll.php new file mode 100644 index 0000000..b1c7a26 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Hosts/TogglePowerAll.php @@ -0,0 +1,34 @@ +getRequest()->isMutation()) { + return; + } + + $this->getPlatform()->signalEvent(sprintf('doraemon-%s@post', $this->getIdentifier())); + } + +} diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms.php new file mode 100644 index 0000000..6859baf --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms.php @@ -0,0 +1,28 @@ +setTableAdapter($this->getPlatform()->getTableAdapter('rooms', 'room')) + ->setColumns($columns) + ->addRowAction(new \NethServer\Module\Doraemon\Rooms\Modify('update')) + ->addRowAction(new \NethServer\Module\Doraemon\Rooms\Modify('delete')) + ->addTableAction(new \NethServer\Module\Doraemon\Rooms\Modify('create')) + ->addTableAction(new \Nethgui\Controller\Table\Help('Help')) + ; + + parent::initialize(); + } + +} diff --git a/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms/Modify.php b/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms/Modify.php new file mode 100644 index 0000000..6ee5e48 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Module/Doraemon/Rooms/Modify.php @@ -0,0 +1,89 @@ +setSchema($parameterSchema); + parent::initialize(); + } + + public function bind(\Nethgui\Controller\RequestInterface $request) + { + parent::bind($request); + if($request->isMutation()) { + // save the old values for later usage: + $this->originalAclRead = $this->getPlatform()->getDatabase('accounts')->getProp($this->parameters['ibay'], 'AclRead'); + $this->originalAclWrite = $this->getPlatform()->getDatabase('accounts')->getProp($this->parameters['ibay'], 'AclWrite'); + } + } + + public function validate(\Nethgui\Controller\ValidationReportInterface $report) + { + if ($this->getIdentifier() === 'delete') { + $v = $this->createValidator()->platform('room-delete'); + if ( ! $v->evaluate($this->parameters['name'])) { + $report->addValidationError($this, 'Key', $v); + } + } + parent::validate($report); + } + + protected function onParametersSaved($parameters) + { + $actionName = $this->getIdentifier(); + if ($actionName === 'update') { + $actionName = 'modify'; + } + $this->getPlatform()->signalEvent(sprintf('room-%s &', $actionName)); + } + + public function prepareView(\Nethgui\View\ViewInterface $view) + { + parent::prepareView($view); + $templates = array( + 'create' => 'NethServer\Template\Doraemon\Rooms', + 'update' => 'NethServer\Template\Doraemon\Rooms', + 'delete' => 'Nethgui\Template\Table\Delete', + ); + $view->setTemplate($templates[$this->getIdentifier()]); + + + $owners = array(array('locals', $view->translate('locals_group_label'))); + $subjects = array(array('locals', $view->translate('locals_group_label'))); + + foreach ($this->getPlatform()->getDatabase('accounts')->getAll('group') as $keyName => $props) { + $entry = array($keyName, sprintf("%s (%s)", isset($props['Description']) ? $props['Description'] : $keyName, $keyName)); + $owners[] = $entry; + $subjects[] = $entry; + } + + $view['OwningGroupDatasource'] = $owners; + + foreach ($this->getPlatform()->getDatabase('accounts')->getAll('user') as $keyName => $props) { + $entry = array($keyName, sprintf("%s (%s)", trim($props['FirstName'] . ' ' . $props['LastName']), $keyName)); + $subjects[] = $entry; + } + + $view['AclSubjects'] = $subjects; + + } + +} diff --git a/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts.php b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts.php new file mode 100644 index 0000000..eccb4a9 --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts.php @@ -0,0 +1,22 @@ +getModule()->getIdentifier() == 'update') { + // disable updating of hostname + // the hostname is the key of the db item, if you change it, bad things happens + $keyFlags = $view::STATE_DISABLED; + $template = 'Update_Host_Header'; +} else { + $keyFlags = 0; + $template = 'Create_Host_Header'; +} + +echo $view->header('hostname')->setAttribute('template', $T($template)); + +echo $view->panel() + ->insert($view->textInput('hostname', $keyFlags)) + ->insert($view->textInput('MacAddress')) + ->insert($view->textInput('Role')) +; + +echo $view->buttonList($view::BUTTON_SUBMIT | $view::BUTTON_CANCEL | $view::BUTTON_HELP); 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'])) +; diff --git a/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePowerAll.php b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePowerAll.php new file mode 100644 index 0000000..2d9968f --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Template/Doraemon/Hosts/TogglePowerAll.php @@ -0,0 +1,21 @@ +requireFlag($view::INSET_DIALOG); + +if ($view->getModule()->getIdentifier() == 'shutdown-all') { + $headerText = $T('Shutdown all hosts'); + $panelText = $T('Proceed with all hosts shutdown?'); +} elseif ($view->getModule()->getIdentifier() == 'reboot-all') { + $headerText = $T('Reboot all hosts'); + $panelText = $T('Proceed with all hosts reboot?'); +} else { + $headerText = $T('Wakeup all hosts'); + $panelText = $T('Proceed with all hosts wakeup?'); +} + +echo $view->header()->setAttribute('template', $headerText); +// TODO: add a text label here +// echo $view->textLabel()->setAttribute('template', $panelText); +echo $view->buttonList() + ->insert($view->button('Yes', $view::BUTTON_SUBMIT)) + ->insert($view->button('No', $view::BUTTON_CANCEL)->setAttribute('value', $view['Cancel'])) +; diff --git a/root/usr/share/nethesis/NethServer/Template/Doraemon/Rooms.php b/root/usr/share/nethesis/NethServer/Template/Doraemon/Rooms.php new file mode 100644 index 0000000..723c7ef --- /dev/null +++ b/root/usr/share/nethesis/NethServer/Template/Doraemon/Rooms.php @@ -0,0 +1,40 @@ +requireFlag($view::INSET_FORM); + +if ($view->getModule()->getIdentifier() == 'update') { + // disable updating of hostname + // the hostname is the key of the db item, if you change it, bad things happens + $keyFlags = $view::STATE_DISABLED; + $template = 'Update_Room_Header'; +} else { + $keyFlags = 0; + $template = 'Create_Room_Header'; +} + +echo $view->header('doraemon')->setAttribute('template', $view->translate($template)); + +echo $view->panel() + ->insert($view->textInput('ibay', $keyFlags)) + ->insert($view->textInput('Description')) + ->insert($view->selector('OwningGroup', $view::SELECTOR_DROPDOWN)) + ->insert($view->checkBox('GroupAccess', 'rw')->setAttribute('uncheckedValue', 'r')) + ->insert($view->checkBox('OtherAccess', 'r')->setAttribute('uncheckedValue', '')) + ->insert($view->objectPicker() + ->setAttribute('objects', 'AclSubjects') + ->setAttribute('objectLabel', 1) + ->insert($view->checkBox('AclRead', FALSE, $view::STATE_CHECKED)) + ->insert($view->checkBox('AclWrite', FALSE)) +); + +echo $view->buttonList($view::BUTTON_SUBMIT | $view::BUTTON_CANCEL | $view::BUTTON_HELP); + +$actionId = $view->getUniqueId(); +$view->includeJavascript(" +jQuery(function($){ + $('#${actionId}').on('nethguishow', function () { + $(this).find('.Tabs').tabs('select', 0); + }); +}); +");