summaryrefslogtreecommitdiffstats
path: root/admin/Sources
diff options
context:
space:
mode:
authorRamón M. Gómez <ramongomez@us.es>2020-05-19 14:53:27 +0200
committerRamón M. Gómez <ramongomez@us.es>2020-05-19 14:53:27 +0200
commit4f9978aea3a93f3069a47c31bf5649835e8ba2c3 (patch)
tree08f5e8f0cd6843bfb9ee1c54f909f0608c941a61 /admin/Sources
parenta0868b7012b2a8aba33b34b0cf08741ea2b97725 (diff)
#959: Delete dirs moved to other repositories.
OGAgent code, browser code and the ogLive builder scrips are moved to new Git repositories.
Diffstat (limited to 'admin/Sources')
-rw-r--r--admin/Sources/Clients/ogagent/INSTALL.es.txt87
-rw-r--r--admin/Sources/Clients/ogagent/linux/Makefile73
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/build-packages.sh37
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/changelog31
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/compat1
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/control18
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/copyright26
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/docs1
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.init23
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.links2
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst21
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst.debhelper5
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm10
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm.debhelper12
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/ogagent.substvars2
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/debian/rules44
-rw-r--r--admin/Sources/Clients/ogagent/linux/debian/source/format1
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/desktop/OGAgentTool.desktop12
-rw-r--r--admin/Sources/Clients/ogagent/linux/ogagent-template.spec83
-rw-r--r--admin/Sources/Clients/ogagent/linux/policy/org.openuds.pkexec.UDSActorConfig.policy20
-rw-r--r--admin/Sources/Clients/ogagent/linux/readme.txt3
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/scripts/OGAgentTool14
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/scripts/OGAgentTool-startup10
-rwxr-xr-xadmin/Sources/Clients/ogagent/linux/scripts/ogagent14
-rwxr-xr-xadmin/Sources/Clients/ogagent/macos/build-pkg.sh87
-rw-r--r--admin/Sources/Clients/ogagent/macos/scripts/es.opengnsys.ogagent.plist15
-rwxr-xr-xadmin/Sources/Clients/ogagent/macos/scripts/ogagent6
-rwxr-xr-xadmin/Sources/Clients/ogagent/macos/scripts/postinstall17
-rw-r--r--admin/Sources/Clients/ogagent/requires.txt3
-rw-r--r--admin/Sources/Clients/ogagent/src/OGAServiceHelper.py57
-rw-r--r--admin/Sources/Clients/ogagent/src/OGAgent.manifest17
-rw-r--r--admin/Sources/Clients/ogagent/src/OGAgent.qrc5
-rw-r--r--admin/Sources/Clients/ogagent/src/OGAgentUser.py349
-rw-r--r--admin/Sources/Clients/ogagent/src/OGAgent_rc.py292
-rw-r--r--admin/Sources/Clients/ogagent/src/VERSION1
-rw-r--r--admin/Sources/Clients/ogagent/src/about-dialog.ui244
-rw-r--r--admin/Sources/Clients/ogagent/src/cfg/ogagent.cfg23
-rw-r--r--admin/Sources/Clients/ogagent/src/cfg/ogclient.cfg11
-rw-r--r--admin/Sources/Clients/ogagent/src/img/oga-48x48.icobin9662 -> 0 bytes
-rw-r--r--admin/Sources/Clients/ogagent/src/img/oga-512.pngbin44217 -> 0 bytes
-rw-r--r--admin/Sources/Clients/ogagent/src/img/oga.icobin9662 -> 0 bytes
-rw-r--r--admin/Sources/Clients/ogagent/src/img/oga.pngbin3906 -> 0 bytes
-rw-r--r--admin/Sources/Clients/ogagent/src/license.txt27
-rw-r--r--admin/Sources/Clients/ogagent/src/message-dialog.ui89
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/RESTApi.py167
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/__init__.py60
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/certs.py101
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/config.py58
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/httpserver.py150
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/ipc.py423
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/OGAgentService.py147
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/__init__.py32
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/daemon.py182
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/log.py80
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/operations.py297
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/__init__.py61
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/debian.py68
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/opensuse.py66
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/redhat.py74
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/loader.py111
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/log.py103
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/macos/__init__.py32
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/macos/operations.py263
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/modules/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/modules/client/OpenGnSys/__init__.py69
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/modules/client/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py319
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/modules/server/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/operations.py50
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/scriptThread.py51
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/service.py249
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/utils.py72
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/windows/OGAgentService.py124
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/windows/__init__.py39
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/windows/log.py77
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/windows/operations.py269
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/workers/__init__.py2
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/workers/client_worker.py114
-rw-r--r--admin/Sources/Clients/ogagent/src/opengnsys/workers/server_worker.py186
-rw-r--r--admin/Sources/Clients/ogagent/src/prototypes/threaded_server.py170
-rw-r--r--admin/Sources/Clients/ogagent/src/setup.py143
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/client/Sample1/__init__.py38
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/client/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/__init__.py2
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample1.py40
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample_pkg/__init__.py36
-rw-r--r--admin/Sources/Clients/ogagent/src/test_modules/server/__init__.py0
-rw-r--r--admin/Sources/Clients/ogagent/src/test_rest_server.py210
-rwxr-xr-xadmin/Sources/Clients/ogagent/src/update.sh42
-rwxr-xr-xadmin/Sources/Clients/ogagent/windows/build-windows.sh7
-rw-r--r--admin/Sources/Clients/ogagent/windows/build.bat6
-rw-r--r--admin/Sources/Clients/ogagent/windows/ogagent.nsi238
-rwxr-xr-xadmin/Sources/Clients/ogagent/windows/py2exe-wine-linux.sh67
94 files changed, 0 insertions, 6888 deletions
diff --git a/admin/Sources/Clients/ogagent/INSTALL.es.txt b/admin/Sources/Clients/ogagent/INSTALL.es.txt
deleted file mode 100644
index 9eb2e174..00000000
--- a/admin/Sources/Clients/ogagent/INSTALL.es.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-OGAgent: agente OpenGnsys para sistemas operativos INSTALL.es.txt
-====================================================================
-
-
-Requisitos de creación
-----------------------
-Sisitema operativo Linux con los siguientes paquetes instalados:
-- Subversion
-- GNU C++, Python, librerías PyQt4
-- Creación de instalador Exe (Wine 32 bits, Wine Gecko, Wine Mono, Samba Winbind, Cabextrct)
-- Creación de paquetes Deb (debhelper, dpkg-dev)
-- Creación de paquetes RPM (rpm-build)
-- Creación de paquetes Pkg (xar, bomutils)
-
-
-Crear instaladores de OGAgent
------------------------------
-- Paso previo: actaulizar componentes gráficos de PyQt para OGAgnet:
- src/update.sh
-
-- Crear paquetes Deb y RPM para distribuciones Linux (requiere permisos de "root"):
- sudo linux/build-packages.sh
-
-- Crear paquete Pkg para sistemas operativos macOS X:
- sudo macos/build-pkg.sh
-
-- Crear el programa instalador para sistemas operativos Windows:
- windows/build-windows.sh
-
-- Subir los nuevos ficheros .deb, .rpm, .pkg y .exe generados al directorio
-/opt/opengnsys/www/descargas del servidor OpenGnsys.
-
-
-Instalar OGAgent en cliente modelo
-----------------------------------
-- Descargar el fichero correspondiente en el sistema operativo del cliente.
-
-- Ubuntu, Debian y derivados:
- - Descargar e instalar el agente:
- sudo apt install ./ogagent_Version_all.deb
- - Configurar el agente:
- sudo sed -i "0,/remote=/ s,remote=.*,remote=https://IPServidorOpenGnsys/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
- - Iniciar el servicio (se iniciará automáticamente en el proceso de arranque):
- sudo service ogagent start
-
-- Red Hat, Fedora y derivados (como root):
- - Descargar e instalar el agente:
- yum install ogagent-Version.noarch.rpm (Red Hat/CentOS)
- dnf install ogagent-Version.noarch.rpm (Fedora)
- - Configurar el agente:
- sed -i "0,/remote=/ s,remote=.*,remote=https://IPServidorOpenGnsys/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
- - Puede ser necesario corregir permisos antes de iniciar el servicio:
- chmod +x /etc/init.d/ogagent
- - Iniciar el servicio (se iniciará automáticamente en el proceso de arranque):
- service ogagent start
-
-- OpenSuSE:
- (en preparación)
-
-- Windows (como usuario administrador):
- - Descargar e instalar el agente ejecutando:
- OGAgentSetup-Version.exe
- - Seguir las instrucciones del instalador.
- - Editar el fichero de configuación "C:\Program Files\OGAgent\cfg\ogagent.cfg" (o C:\Archivos de programa\OGAgent\cfg\ogagent.cfg) y modificar el valor de la cláusula "remote" de la sección [OGAgent] inclyendo la dirección IP del servidor OpenGnsys.
- - Iniciar el servicio (se iniciará automáticamente en el proceso de arranque):
- NET START OGAgent
-
-- macOS:
- - Instalar dependencias:
- sudo easy_install pip
- sudo pip install netifaces requests six
- - Descargar e instalar el agente:
- sudo installer -pkg OGAgentInstaller-Version.pkg -target /
- - Descargar el paquete y usar Finder pulsando sobre el fichero para instalarlo.
- - Configurar el agente:
- sed -i "0,/remote=/ s,remote=.*,remote=https://IPServidorOpenGnsys/opengnsys/rest/," /Applications/OGAgent.app/cfg/ogagent.cfg
- - Iniciar el servicio (se iniciará automáticamente en el proceso de arranque):
- sudo ogagent start
-
-
-Postconfiguración para clientes clonados
-----------------------------------------
-- Ejecutar manualmente o configurar automáticamente OGAgent en los clientes clonados
-en el script de postconfiguración tras restuarar imagen:
- ogConfigureOgagent NDisco Npart
-
-
diff --git a/admin/Sources/Clients/ogagent/linux/Makefile b/admin/Sources/Clients/ogagent/linux/Makefile
deleted file mode 100644
index 889f07de..00000000
--- a/admin/Sources/Clients/ogagent/linux/Makefile
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-
-# Directories
-SOURCEDIR := ../src
-LIBDIR := $(DESTDIR)/usr/share/OGAgent
-BINDIR := $(DESTDIR)/usr/bin
-SBINDIR = $(DESTDIR)/usr/sbin
-APPSDIR := $(DESTDIR)/usr/share/applications
-CFGDIR := $(DESTDIR)/etc/ogagent
-INITDIR := $(DESTDIR)/etc/init.d
-XDGAUTOSTARTDIR := $(DESTDIR)/etc/xdg/autostart
-KDEAUTOSTARTDIR := $(DESTDIR)/usr/share/autostart
-
-PYC := $(shell find $(SOURCEDIR) -name '*.py[co]')
-CACHES := $(shell find $(SOURCEDIR) -name '__pycache__')
-
-clean:
- rm -rf $(PYC) $(CACHES) $(DESTDIR)
-
-install-ogagent:
- rm -rf $(DESTDIR)
- mkdir -p $(LIBDIR)
- mkdir -p $(BINDIR)
- mkdir -p $(SBINDIR)
- mkdir -p $(APPSDIR)
- mkdir -p $(CFGDIR)
- mkdir -p $(XDGAUTOSTARTDIR)
- mkdir -p $(KDEAUTOSTARTDIR)
- mkdir -p $(LIBDIR)/img
-
- # Cleans up .pyc and cache folders
- rm -f $(PYC) $(CACHES)
-
- cp -r $(SOURCEDIR)/opengnsys $(LIBDIR)/opengnsys
- cp -r $(SOURCEDIR)/cfg $(LIBDIR)/cfg
- cp $(SOURCEDIR)/img/oga.png $(LIBDIR)/img
-
- cp $(SOURCEDIR)/OGAgentUser.py $(LIBDIR)
- # QT Dialogs & resources
- cp $(SOURCEDIR)/*_ui.py $(LIBDIR)
- cp $(SOURCEDIR)/OGAgent_rc.py $(LIBDIR)
- # Version file
- cp $(SOURCEDIR)/VERSION $(LIBDIR)
-
- # Autostart elements for gnome/kde
- cp desktop/OGAgentTool.desktop $(XDGAUTOSTARTDIR)
- cp desktop/OGAgentTool.desktop $(KDEAUTOSTARTDIR)
-
- # scripts
- cp scripts/ogagent $(BINDIR)
- cp scripts/OGAgentTool-startup $(BINDIR)
- cp scripts/OGAgentTool $(BINDIR)
-
- # Fix permissions
- chmod 755 $(BINDIR)/ogagent
- chmod 755 $(BINDIR)/OGAgentTool-startup
- chmod 755 $(LIBDIR)/OGAgentUser.py
- chmod 600 $(LIBDIR)/cfg/ogagent.cfg
-
- # If for red hat based, copy init.d
-ifeq ($(DISTRO),rh)
- mkdir -p $(INITDIR)
- cp debian/ogagent.init $(INITDIR)/ogagent
- chmod +x $(INITDIR)/ogagent
- ln -fs /usr/share/OGAgent/cfg/ogagent.cfg $(CFGDIR)
- ln -fs /usr/share/OGAgent/cfg/ogclient.cfg $(CFGDIR)
-endif
-
-uninstall:
- rm -rf $(LIBDIR)
- # rm -f $(BINDIR)/ogagent
- rm -rf $(CFGDIR)
diff --git a/admin/Sources/Clients/ogagent/linux/build-packages.sh b/admin/Sources/Clients/ogagent/linux/build-packages.sh
deleted file mode 100755
index facde2c9..00000000
--- a/admin/Sources/Clients/ogagent/linux/build-packages.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-
-cd $(dirname "$0")
-top=$(pwd)
-
-VERSION="$(cat ../src/VERSION 2>/dev/null)" || VERSION="1.1.1"
-RELEASE="1"
-
-# Debian based
-dpkg-buildpackage -b -d
-
-# Fix version number.
-sed -e "s/version 0.0.0/version ${VERSION}/g" \
- -e "s/release 1/release ${RELEASE}/g" ogagent-template.spec > ogagent-$VERSION.spec
-
-# Now fix dependencies for opensuse
-sed -e "s/name ogagent/name ogagent-opensuse/g" \
- -e "s/version 0.0.0/version ${VERSION}/g" \
- -e "s/release 1/release ${RELEASE}/g" \
- -e "s/chkconfig//g" \
- -e "s/initscripts/insserv/g" \
- -e "s/PyQt4/python-qt4/g" \
- -e "s/libXScrnSaver/libXss1/g" ogagent-template.spec > ogagent-opensuse-$VERSION.spec
-
-
-# Right now, ogagent-xrdp-1.7.0.spec is not needed
-for pkg in ogagent-$VERSION.spec ogagent-opensuse-$VERSION.spec; do
-
- rm -rf rpm
- for folder in SOURCES BUILD RPMS SPECS SRPMS; do
- mkdir -p rpm/$folder
- done
-
- rpmbuild -v -bb --clean --buildroot=$top/rpm/BUILD/$pkg-root --target noarch $pkg 2>&1
-done
-
-#rm ogagent-$VERSION
diff --git a/admin/Sources/Clients/ogagent/linux/debian/changelog b/admin/Sources/Clients/ogagent/linux/debian/changelog
deleted file mode 100644
index 9b59a251..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/changelog
+++ /dev/null
@@ -1,31 +0,0 @@
-ogagent (1.1.1b) stable; urgency=medium
-
- * Use python-distro to detect the distribution version
-
- -- Ramón M. Gómez <ramongomez@us.es> Fri, 7 Feb 2020 12:00:00 +0100
-
-ogagent (1.1.1) stable; urgency=medium
-
- * Set connection timeout
- * Compatibility with "Exam Mode" from the University of Seville
-
- -- Ramón M. Gómez <ramongomez@us.es> Thu, 23 May 2019 13:00:00 +0200
-
-ogagent (1.1.0a) stable; urgency=medium
-
- * Fix a bug when activating the agent with some network devices
-
- -- Ramón M. Gómez <ramongomez@us.es> Wed, 22 May 2019 18:00:00 +0200
-
-ogagent (1.1.0) stable; urgency=medium
-
- * Functional OpenGnsys Agent interacting with OpenGnsys Server 1.1.0
-
- -- Ramón M. Gómez <ramongomez@us.es> Tue, 13 Oct 2016 17:00:00 +0100
-
-ogagent (1.0.0) stable; urgency=medium
-
- * Initial release for OpenGnsys Agent
-
- -- Adolfo Gómez García <agomez@virtualcable.es> Tue, 18 Jul 2015 03:18:22 +0200
-
diff --git a/admin/Sources/Clients/ogagent/linux/debian/compat b/admin/Sources/Clients/ogagent/linux/debian/compat
deleted file mode 100644
index f11c82a4..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9 \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/linux/debian/control b/admin/Sources/Clients/ogagent/linux/debian/control
deleted file mode 100644
index 7df4deae..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/control
+++ /dev/null
@@ -1,18 +0,0 @@
-Source: ogagent
-Section: admin
-Priority: optional
-Maintainer: Ramón M. Gómez <ramongomez@us.es>
-Build-Depends: debhelper (>= 7), po-debconf
-Standards-Version: 3.9.2
-Homepage: https://opengnsys.es/
-
-Package: ogagent
-Section: admin
-Priority: optional
-Architecture: all
-Depends:
- policykit-1 (>= 0.100), python2 (>=2.7) | python (>= 2.7), python-qt4 (>= 4.9),, python-requests (>= 0.8.2),
- python-six (>= 1.1), python-prctl (>= 1.1.1), python-distro, libxss1, ${misc:Depends}
-Suggests: gnome-shell-extension-top-icons-plus
-Description: OpenGnsys Agent for Operating Systems
- This package provides the required components to allow this machine to work on an environment managed by OpenGnsys.
diff --git a/admin/Sources/Clients/ogagent/linux/debian/copyright b/admin/Sources/Clients/ogagent/linux/debian/copyright
deleted file mode 100644
index 7b6ef31b..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/copyright
+++ /dev/null
@@ -1,26 +0,0 @@
-Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
-Name: ogagent
-Maintainer: Ramón M. Gómez
-Source: https://opengnsys.es
-
-Copyright: 2014 Virtual Cable S.L.U.
-License: BSD-3-clause
-
-License: GPL-2+
-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 of the License, 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.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-.
-On Debian systems, the full text of the GNU General Public
-License version 2 can be found in the file
-`/usr/share/common-licenses/GPL-2'.
diff --git a/admin/Sources/Clients/ogagent/linux/debian/docs b/admin/Sources/Clients/ogagent/linux/debian/docs
deleted file mode 100644
index b2b2a781..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/docs
+++ /dev/null
@@ -1 +0,0 @@
-readme.txt
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.init b/admin/Sources/Clients/ogagent/linux/debian/ogagent.init
deleted file mode 100644
index 3eee35c1..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.init
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh -e
-### BEGIN INIT INFO
-# Provides: ogagent
-# Required-Start: $local_fs $remote_fs $network $syslog $named
-# Required-Stop: $local_fs $remote_fs $network $syslog $named
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: OpenGnsys Agent Service
-### END INIT INFO
-#
-
-# . /lib/lsb/init-functions
-
-case "$1" in
- start|stop|restart)
- /usr/bin/ogagent $1
- ;;
- force-reload)
- /usr/bin/ogagent restart
- ;;
- *) echo "Usage: $0 {start|stop|restart|force-reload}" >&2; exit 1 ;;
-esac
-
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.links b/admin/Sources/Clients/ogagent/linux/debian/ogagent.links
deleted file mode 100644
index 9b970d7b..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.links
+++ /dev/null
@@ -1,2 +0,0 @@
-/usr/share/OGAgent/cfg/ogagent.cfg /etc/ogagent/ogagent.cfg
-/usr/share/OGAgent/cfg/ogclient.cfg /etc/ogagent/ogclient.cfg
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst b/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst
deleted file mode 100644
index b59cfa6f..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-
-. /usr/share/debconf/confmodule
-
-set -e
-case "$1" in
- configure)
- chmod 600 /usr/share/OGAgent/cfg/ogagent.cfg
- ;;
- abort-upgrade|abort-remove|abort-deconfigure)
- ;;
-
- *)
- echo "postinst called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst.debhelper b/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst.debhelper
deleted file mode 100644
index e75924dc..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postinst.debhelper
+++ /dev/null
@@ -1,5 +0,0 @@
-# Automatically added by dh_installinit
-if [ -x "/etc/init.d/ogagent" ]; then
- update-rc.d ogagent defaults >/dev/null || exit $?
-fi
-# End automatically added section
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm b/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm
deleted file mode 100644
index a46fa487..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh -e
-
-. /usr/share/debconf/confmodule
-
-set -e
-
-if [ "$1" = "purge" ] ; then
- rm -rf /usr/share/OGAgent || true > /dev/null 2>&1
-fi
-
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm.debhelper b/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm.debhelper
deleted file mode 100644
index 3167f1f8..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.postrm.debhelper
+++ /dev/null
@@ -1,12 +0,0 @@
-# Automatically added by dh_installinit
-if [ "$1" = "purge" ] ; then
- update-rc.d ogagent remove >/dev/null
-fi
-
-
-# In case this system is running systemd, we make systemd reload the unit files
-# to pick up changes.
-if [ -d /run/systemd/system ] ; then
- systemctl --system daemon-reload >/dev/null || true
-fi
-# End automatically added section
diff --git a/admin/Sources/Clients/ogagent/linux/debian/ogagent.substvars b/admin/Sources/Clients/ogagent/linux/debian/ogagent.substvars
deleted file mode 100644
index 978fc8b5..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/ogagent.substvars
+++ /dev/null
@@ -1,2 +0,0 @@
-misc:Depends=
-misc:Pre-Depends=
diff --git a/admin/Sources/Clients/ogagent/linux/debian/rules b/admin/Sources/Clients/ogagent/linux/debian/rules
deleted file mode 100755
index fbe82e67..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/rules
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-configure: configure-stamp
-configure-stamp:
- dh_testdir
- touch configure-stamp
-build: build-arch build-indep
-build-arch: build-stamp
-build-indep: build-stamp
-build-stamp: configure-stamp
- dh_testdir
- $(MAKE)
- touch $@
-clean:
- dh_testdir
- dh_testroot
- rm -f build-stamp configure-stamp
- dh_clean
-install: build
- dh_testdir
- dh_testroot
- dh_prep
- dh_installdirs
- $(MAKE) DESTDIR=$(CURDIR)/debian/ogagent install-ogagent
-binary-arch: build install
- # emptyness
-binary-indep: build install
- dh_testdir
- dh_testroot
- dh_installchangelogs
- dh_installdocs
- dh_installdebconf
- dh_installinit --no-start
- dh_python2=python
- dh_compress
- dh_link
- dh_fixperms
- dh_installdeb
- dh_shlibdeps
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-binary: binary-indep
-.PHONY: build clean binary-indep binary install configure
diff --git a/admin/Sources/Clients/ogagent/linux/debian/source/format b/admin/Sources/Clients/ogagent/linux/debian/source/format
deleted file mode 100644
index 9f674278..00000000
--- a/admin/Sources/Clients/ogagent/linux/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (native) \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/linux/desktop/OGAgentTool.desktop b/admin/Sources/Clients/ogagent/linux/desktop/OGAgentTool.desktop
deleted file mode 100755
index fd3867d3..00000000
--- a/admin/Sources/Clients/ogagent/linux/desktop/OGAgentTool.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Name=OpenGnsys Agent Tools
-Comment=OpenGnsys Userspace tools
-Exec=/usr/bin/OGAgentTool-startup
-Icon=/usr/share/OGAgent/img/oga.png
-Terminal=false
-Type=Application
-NoDisplay=true
-X-KDE-autostart-after=panel
-X-KDE-StartupNotify=false
-X-DBUS-StartupType=Unique
-X-KDE-UniqueApplet=true
diff --git a/admin/Sources/Clients/ogagent/linux/ogagent-template.spec b/admin/Sources/Clients/ogagent/linux/ogagent-template.spec
deleted file mode 100644
index 7f55454f..00000000
--- a/admin/Sources/Clients/ogagent/linux/ogagent-template.spec
+++ /dev/null
@@ -1,83 +0,0 @@
-%define _topdir %(echo $PWD)/rpm
-%define name ogagent
-%define version 0.0.0
-%define release 1
-%define buildroot %{_topdir}/%{name}-%{version}-%{release}-root
-
-BuildRoot: %{buildroot}
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Summary: OpenGnsys Agent for Operating Systems
-License: BSD3
-Group: Admin
-Requires: chkconfig initscripts python-six python-requests python-distro PyQt4 libXScrnSaver
-Vendor: OpenGnsys Project
-URL: https://opengnsys.es/
-Provides: ogagent
-
-%define _rpmdir ../
-%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
-
-
-%install
-curdir=`pwd`
-cd ../..
-make DESTDIR=$RPM_BUILD_ROOT DISTRO=rh install-ogagent
-cd $curdir
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-curdir=`pwd`
-cd ../..
-make DESTDIR=$RPM_BUILD_ROOT DISTRO=rh clean
-cd $curdir
-
-
-%post
-systemctl enable ogagent.service > /dev/null 2>&1
-
-%preun
-systemctl disable ogagent.service > /dev/null 2>&1
-systemctl stop ogagent.service > /dev/null 2>&1
-
-%postun
-# $1 == 0 on uninstall, == 1 on upgrade for preun and postun (just a reminder for me... :) )
-if [ $1 -eq 0 ]; then
- rm -rf /etc/ogagent
- rm /var/log/ogagent.log
-fi
-# And, posibly, the .pyc leaved behind on /usr/share/OGAgent
-rm -rf /usr/share/OGAgent > /dev/null 2>&1
-
-%description
-This package provides the required components to allow this machine to work on an environment managed by OpenGnsys.
-
-%files
-%defattr(-,root,root)
-/etc/ogagent
-/etc/xdg/autostart/OGAgentTool.desktop
-/etc/init.d/ogagent
-/usr/bin/OGAgentTool-startup
-/usr/bin/ogagent
-/usr/bin/OGAgentTool
-/usr/share/OGAgent/*
-/usr/share/autostart/OGAgentTool.desktop
-
-%changelog
-* Fri Feb 07 2020 Ramón M. Gómez <ramongomez@us.es> - 1.1.1b-1
-- Use python-distro to detect the distribution version
-
-* Thu May 23 2019 Ramón M. Gómez <ramongomez@us.es> - 1.1.1-1
-- Set connection timeout
-- Compatibility with "Exam Mode" from the University of Seville
-
-* Wed May 22 2019 Ramón M. Gómez <ramongomez@us.es> - 1.1.0a-1
-- Fix a bug when activating the agent with some network devices
-
-* Tue Oct 13 2016 Ramón M. Gómez <ramongomez@us.es> - 1.1.0-1
-- Functional OpenGnsys Agent interacting with OpenGnsys Server 1.1.0
-
-* Tue Jul 18 2015 Adolfo Gómez García <agomez@virtualcable.es> - 1.0.0-1
-- Initial release for OpenGnsys Agent
-
diff --git a/admin/Sources/Clients/ogagent/linux/policy/org.openuds.pkexec.UDSActorConfig.policy b/admin/Sources/Clients/ogagent/linux/policy/org.openuds.pkexec.UDSActorConfig.policy
deleted file mode 100644
index 9afd775a..00000000
--- a/admin/Sources/Clients/ogagent/linux/policy/org.openuds.pkexec.UDSActorConfig.policy
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE policyconfig PUBLIC
- "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
-
-<policyconfig>
-
- <action id="org.freedesktop.policykit.pkexec.run-UDSActorConfig">
- <description>Run UDS Actor Configuration Program</description>
- <message>Authentication is required to run UDS Actor Configuration</message>
- <defaults>
- <allow_any>no</allow_any>
- <allow_inactive>no</allow_inactive>
- <allow_active>auth_admin_keep</allow_active>
- </defaults>
- <annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/UDSActorConfig</annotate>
- <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
- </action>
-
-</policyconfig> \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/linux/readme.txt b/admin/Sources/Clients/ogagent/linux/readme.txt
deleted file mode 100644
index a2771def..00000000
--- a/admin/Sources/Clients/ogagent/linux/readme.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-OGAgent is the agent intended for OpengGnsys interaction.
-
-Please, visit https://opengnsys.es for more information
diff --git a/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool b/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool
deleted file mode 100755
index da91704f..00000000
--- a/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-for p in python python2; do
- [ -z "$PYTHON" ] && [ $($p -c 'import sys; print(sys.version_info[0])') -eq 2 ] && PYTHON=$p
-done
-if [ -z "$PYTHON" ]; then
- echo "ERROR: OGAgent needs Python 2" &>2
- exit 1
-fi
-
-FOLDER=/usr/share/OGAgent
-
-cd $FOLDER
-$PYTHON OGAgentUser.py $@
diff --git a/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool-startup b/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool-startup
deleted file mode 100755
index bb3a848e..00000000
--- a/admin/Sources/Clients/ogagent/linux/scripts/OGAgentTool-startup
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-# Simple hack to wait for systray to be present
-# Exec tool if not already runned by session manager
-ps -ef | grep "$USER" | grep -v grep | grep -v OGAgentTool-startup | grep 'OGAgentTool' -q
-# If not already running
-if [ $? -eq 1 ]; then
- sleep 5
- exec /usr/bin/OGAgentTool
-fi \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/linux/scripts/ogagent b/admin/Sources/Clients/ogagent/linux/scripts/ogagent
deleted file mode 100755
index 155af678..00000000
--- a/admin/Sources/Clients/ogagent/linux/scripts/ogagent
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-for p in python python2; do
- [ -z "$PYTHON" ] && [ $($p -c 'import sys; print(sys.version_info[0])') -eq 2 ] && PYTHON=$p
-done
-if [ -z "$PYTHON" ]; then
- echo "ERROR: OGAgent needs Python 2" &>2
- exit 1
-fi
-
-FOLDER=/usr/share/OGAgent
-
-cd $FOLDER
-$PYTHON -m opengnsys.linux.OGAgentService $@
diff --git a/admin/Sources/Clients/ogagent/macos/build-pkg.sh b/admin/Sources/Clients/ogagent/macos/build-pkg.sh
deleted file mode 100755
index 29f5545a..00000000
--- a/admin/Sources/Clients/ogagent/macos/build-pkg.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-# Create macOS installation packages.
-# Based on bomutils tutorail: http://bomutils.dyndns.org/tutorial.html
-
-cd $(dirname $0)
-[ -r ../src/VERSION ] && VERSION="$(cat ../src/VERSION)" || VERSION="1.1.0"
-AUTHOR="OpenGnsys Project"
-
-# Create empty directories.
-rm -fr build
-mkdir -p build && cd build
-mkdir -p flat/base.pkg flat/Resources/en.lproj
-mkdir -p root/Applications
-
-# Copy application and script files.
-cp -a ../../src root/Applications/OGAgent.app
-cp -a ../scripts .
-
-# Create plist file.
-cat << EOT > root/Applications/OGAgent.app/OGAgent.plist
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>BuildAliasOf</key>
- <string>OGAgent</string>
- <key>BuildVersion</key>
- <value>$VERSION</value>
- <author>$AUTHOR</author>
-</dict>
-</plist>
-EOT
-
-# Add files in the base package.
-( cd root && find . | cpio -o --format odc --owner 0:80 | gzip -c ) > flat/base.pkg/Payload
-
-# Create PackageInfo file.
-cat << EOT > flat/base.pkg/PackageInfo
-<pkg-info format-version="2" identifier="es.opengnsys.ogagent.base.pkg" version="$VERSION" install-location="/" auth="root">
-<payload installKBytes="$(du -k -s root)" numberOfFiles="$(find root | wc -l)"/>
- <scripts>
- <postinstall file="./postinstall"/>
- </scripts>
-<bundle-version>
- <bundle id="es.opengnsys.ogagent" CFBundleIdentifier="es.opengnsys.ogagent" path="./Applications/OGAgent.app" CFBundleVersion="$VERSION"/>
-</bundle-version>
-</pkg-info>
-EOT
-
-# Compress the scripts folder.
-( cd scripts && find . | cpio -o --format odc --owner 0:80 | gzip -c ) > flat/base.pkg/Scripts
-
-# Create BOM file.
-mkbom -u 0 -g 80 root flat/base.pkg/Bom
-
-# Create Distribution file.
-cat << EOT > flat/Distribution
-<?xml version="1.0" encoding="utf-8"?>
-<installer-script minSpecVersion="1.000000" authoringTool="com.apple.PackageMaker" authoringToolVersion="3.0.3" authoringToolBuild="174">
- <title>OGAgent $VERSION</title>
- <options customize="never" allow-external-scripts="no"/>
- <domains enable_anywhere="true"/>
- <installation-check script="pm_install_check();"/>
- <script>function pm_install_check() {
- if(!(system.compareVersions(system.version.ProductVersion,'10.5') >= 0)) {
- my.result.title = 'Failure';
- my.result.message = 'You need at least Mac OS X 10.5 to install OGAgent.';
- my.result.type = 'Fatal';
- return false;
- }
- return true;
-}
-</script>
- <choices-outline>
- <line choice="choice1"/>
- </choices-outline>
- <choice id="choice1" title="base">
- <pkg-ref id="es.opengnsys.ogagent.base.pkg"/>
- </choice>
- <pkg-ref id="es.opengnsys.ogagent.base.pkg" installKBytes="$(du -k -s root)" version="$VERSION" auth="Root">#base.pkg</pkg-ref>
-</installer-script>
-EOT
-
-# Create new Xar application archive.
-rm -f ../../../OGAgentInstaller-$VERSION.pkg
-( cd flat && xar --compression none -cf "../../../OGAgentInstaller-$VERSION.pkg" * )
-
diff --git a/admin/Sources/Clients/ogagent/macos/scripts/es.opengnsys.ogagent.plist b/admin/Sources/Clients/ogagent/macos/scripts/es.opengnsys.ogagent.plist
deleted file mode 100644
index 5ec11fa5..00000000
--- a/admin/Sources/Clients/ogagent/macos/scripts/es.opengnsys.ogagent.plist
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
- <dict>
- <key>Label</key>
- <string>es.opengnsys.ogagent</string>
- <key>ProgramArguments</key>
- <array>
- <string>/usr/bin/ogagent</string>
- <string>start</string>
- </array>
- <key>RunAtLoad</key>
- <true/>
- </dict>
-</plist>
-
diff --git a/admin/Sources/Clients/ogagent/macos/scripts/ogagent b/admin/Sources/Clients/ogagent/macos/scripts/ogagent
deleted file mode 100755
index b139d7f2..00000000
--- a/admin/Sources/Clients/ogagent/macos/scripts/ogagent
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-FOLDER=/Applications/OGAgent.app
-
-cd $FOLDER
-python -m opengnsys.linux.OGAgentService $@
diff --git a/admin/Sources/Clients/ogagent/macos/scripts/postinstall b/admin/Sources/Clients/ogagent/macos/scripts/postinstall
deleted file mode 100755
index ebb2ca48..00000000
--- a/admin/Sources/Clients/ogagent/macos/scripts/postinstall
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env sh
-
-# Directories
-SRCDIR=$(dirname "$0")
-BINDIR=/usr/bin
-INITDIR=/Library/LaunchDaemons
-
-# Check if it needs to install Python dependencies:
-if ! which pip &>/dev/null; then
- easy_install pip
- pip install netifaces requests six
-fi
-
-# Copying files.
-cp $SRCDIR/ogagent $BINDIR
-cp $SRCDIR/es.opengnsys.ogagent.plist $INITDIR
-
diff --git a/admin/Sources/Clients/ogagent/requires.txt b/admin/Sources/Clients/ogagent/requires.txt
deleted file mode 100644
index 07ce387c..00000000
--- a/admin/Sources/Clients/ogagent/requires.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-six
-requests
-
diff --git a/admin/Sources/Clients/ogagent/src/OGAServiceHelper.py b/admin/Sources/Clients/ogagent/src/OGAServiceHelper.py
deleted file mode 100644
index ca75a090..00000000
--- a/admin/Sources/Clients/ogagent/src/OGAServiceHelper.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import win32service
-import win32serviceutil
-
-svc_name = "UDSActor"
-
-try:
- hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
-
- try:
- hs = win32serviceutil.SmartOpenService(hscm, svc_name, win32service.SERVICE_ALL_ACCESS)
- service_failure_actions = {
- 'ResetPeriod': 864000, # Time in ms after which to reset the failure count to zero.
- 'RebootMsg': u'', # Not using reboot option
- 'Command': u'', # Not using run-command option
- 'Actions': [
- (win32service.SC_ACTION_RESTART, 5000), # action, delay in ms
- (win32service.SC_ACTION_RESTART, 5000)
- ]
- }
- win32service.ChangeServiceConfig2(hs, win32service.SERVICE_CONFIG_FAILURE_ACTIONS, service_failure_actions)
- finally:
- win32service.CloseServiceHandle(hs)
-finally:
- win32service.CloseServiceHandle(hscm)
diff --git a/admin/Sources/Clients/ogagent/src/OGAgent.manifest b/admin/Sources/Clients/ogagent/src/OGAgent.manifest
deleted file mode 100644
index 0e5ff974..00000000
--- a/admin/Sources/Clients/ogagent/src/OGAgent.manifest
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity
- type="win32"
- name="UDSActorService"
- version="1.6.0.0"
- processorArchitecture="x86"
- />
- <description>Description</description>
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- </requestedPrivileges>
- </security>
- </trustInfo>
-</assembly>
diff --git a/admin/Sources/Clients/ogagent/src/OGAgent.qrc b/admin/Sources/Clients/ogagent/src/OGAgent.qrc
deleted file mode 100644
index 59177668..00000000
--- a/admin/Sources/Clients/ogagent/src/OGAgent.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="images">
- <file>img/oga.png</file>
- </qresource>
-</RCC>
diff --git a/admin/Sources/Clients/ogagent/src/OGAgentUser.py b/admin/Sources/Clients/ogagent/src/OGAgentUser.py
deleted file mode 100644
index 7eefbb08..00000000
--- a/admin/Sources/Clients/ogagent/src/OGAgentUser.py
+++ /dev/null
@@ -1,349 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-"""
-from __future__ import unicode_literals
-
-import sys
-import time
-import json
-import six
-import atexit
-from PyQt4 import QtCore, QtGui # @UnresolvedImport
-
-from opengnsys import VERSION, ipc, operations, utils
-from opengnsys.log import logger
-from opengnsys.service import IPC_PORT
-from about_dialog_ui import Ui_OGAAboutDialog
-from message_dialog_ui import Ui_OGAMessageDialog
-from opengnsys.scriptThread import ScriptExecutorThread
-from opengnsys.config import readConfig
-from opengnsys.loader import loadModules
-
-# Set default characters encoding to UTF-8
-reload(sys)
-if hasattr(sys, 'setdefaultencoding'):
- sys.setdefaultencoding('utf-8')
-
-trayIcon = None
-
-
-def sigAtExit():
- if trayIcon:
- trayIcon.quit()
-
-
-# About dialog
-class OGAAboutDialog(QtGui.QDialog):
- def __init__(self, parent=None):
- QtGui.QDialog.__init__(self, parent)
- self.ui = Ui_OGAAboutDialog()
- self.ui.setupUi(self)
- self.ui.VersionLabel.setText("Version " + VERSION)
-
- def closeDialog(self):
- self.hide()
-
-
-class OGAMessageDialog(QtGui.QDialog):
- def __init__(self, parent=None):
- QtGui.QDialog.__init__(self, parent)
- self.ui = Ui_OGAMessageDialog()
- self.ui.setupUi(self)
-
- def message(self, message):
- self.ui.message.setText(message)
- self.show()
-
- def closeDialog(self):
- self.hide()
-
-
-class MessagesProcessor(QtCore.QThread):
- logoff = QtCore.pyqtSignal(name='logoff')
- message = QtCore.pyqtSignal(tuple, name='message')
- script = QtCore.pyqtSignal(QtCore.QString, name='script')
- exit = QtCore.pyqtSignal(name='exit')
-
- def __init__(self, port):
- super(self.__class__, self).__init__()
- # Retries connection for a while
- for _ in range(10):
- try:
- self.ipc = ipc.ClientIPC(port)
- self.ipc.start()
- break
- except Exception:
- logger.debug('IPC Server is not reachable')
- self.ipc = None
- time.sleep(2)
-
- self.running = False
-
- def stop(self):
- self.running = False
- if self.ipc:
- self.ipc.stop()
-
- def isAlive(self):
- return self.ipc is not None
-
- def sendLogin(self, userName, language):
- if self.ipc:
- self.ipc.sendLogin(userName, language)
-
- def sendLogout(self, userName):
- if self.ipc:
- self.ipc.sendLogout(userName)
-
- def run(self):
- if self.ipc is None:
- return
- self.running = True
-
- # Wait a bit so we ensure IPC thread is running...
- time.sleep(2)
-
- while self.running and self.ipc.running:
- try:
- msg = self.ipc.getMessage()
- if msg is None:
- break
- msgId, data = msg
- logger.debug('Got Message on User Space: {}:{}'.format(msgId, data))
- if msgId == ipc.MSG_MESSAGE:
- module, message, data = data.split('\0')
- self.message.emit((module, message, data))
- elif msgId == ipc.MSG_LOGOFF:
- self.logoff.emit()
- elif msgId == ipc.MSG_SCRIPT:
- self.script.emit(QtCore.QString.fromUtf8(data))
- except Exception as e:
- try:
- logger.error('Got error on IPC thread {}'.format(utils.exceptionToMessage(e)))
- except:
- logger.error('Got error on IPC thread (an unicode error??)')
-
- if self.ipc.running is False and self.running is True:
- logger.warn('Lost connection with Service, closing program')
-
- self.exit.emit()
-
-
-class OGASystemTray(QtGui.QSystemTrayIcon):
- def __init__(self, app_, parent=None):
- self.app = app_
- self.config = readConfig(client=True)
-
- # Get opengnsys section as dict
- cfg = dict(self.config.items('opengnsys'))
-
- # Set up log level
- logger.setLevel(cfg.get('log', 'INFO'))
-
- self.ipcport = int(cfg.get('ipc_port', IPC_PORT))
-
- # style = app.style()
- # icon = QtGui.QIcon(style.standardPixmap(QtGui.QStyle.SP_ComputerIcon))
- icon = QtGui.QIcon(':/images/img/oga.png')
-
- QtGui.QSystemTrayIcon.__init__(self, icon, parent)
- self.menu = QtGui.QMenu(parent)
- exitAction = self.menu.addAction("About")
- exitAction.triggered.connect(self.about)
- self.setContextMenu(self.menu)
- self.ipc = MessagesProcessor(self.ipcport)
-
- if self.ipc.isAlive() is False:
- raise Exception('No connection to service, exiting.')
-
- self.timer = QtCore.QTimer()
- self.timer.timeout.connect(self.timerFnc)
-
- self.stopped = False
-
- self.ipc.message.connect(self.message)
- self.ipc.exit.connect(self.quit)
- self.ipc.script.connect(self.executeScript)
- self.ipc.logoff.connect(self.logoff)
-
- self.aboutDlg = OGAAboutDialog()
- self.msgDlg = OGAMessageDialog()
-
- self.timer.start(1000) # Launch idle checking every 1 seconds
-
- self.ipc.start()
-
- def initialize(self):
- # Load modules and activate them
- # Also, sends "login" event to service
- self.modules = loadModules(self, client=True)
- logger.debug('Modules: {}'.format(list(v.name for v in self.modules)))
-
- # Send init to all modules
- validMods = []
- for mod in self.modules:
- try:
- logger.debug('Activating module {}'.format(mod.name))
- mod.activate()
- validMods.append(mod)
- except Exception as e:
- logger.exception()
- logger.error("Activation of {} failed: {}".format(mod.name, utils.exceptionToMessage(e)))
-
- self.modules[:] = validMods # copy instead of assignment
-
- # If this is running, it's because he have logged in, inform service of this fact
- self.ipc.sendLogin(operations.getCurrentUser(), operations.getSessionLanguage())
-
- def deinitialize(self):
- for mod in reversed(self.modules): # Deinitialize reversed of initialization
- try:
- logger.debug('Deactivating module {}'.format(mod.name))
- mod.deactivate()
- except Exception as e:
- logger.exception()
- logger.error("Deactivation of {} failed: {}".format(mod.name, utils.exceptionToMessage(e)))
-
- def timerFnc(self):
- pass
-
- def message(self, msg):
- """
- Processes the message sent asynchronously, msg is an QString
- """
- try:
- logger.debug('msg: {}, {}'.format(type(msg), msg))
- module, message, data = msg
- except Exception as e:
- logger.error('Got exception {} processing message {}'.format(e, msg))
- return
-
- for v in self.modules:
- if v.name == module: # Case Sensitive!!!!
- try:
- logger.debug('Notifying message {} to module {} with json data {}'.format(message, v.name, data))
- v.processMessage(message, json.loads(data))
- return
- except Exception as e:
- logger.error('Got exception {} processing generic message on {}'.format(e, v.name))
-
- logger.error('Module {} not found, messsage {} not sent'.format(module, message))
-
- def executeScript(self, script):
- logger.debug('Executing script')
- script = six.text_type(script.toUtf8()).decode('base64')
- th = ScriptExecutorThread(script)
- th.start()
-
- def logoff(self):
- logger.debug('Logoff invoked')
- operations.logoff() # Invoke log off
-
- def about(self):
- self.aboutDlg.exec_()
-
- def cleanup(self):
- logger.debug('Quit invoked')
- if self.stopped is False:
- self.stopped = True
- try:
- self.deinitialize()
- except Exception:
- logger.exception()
- logger.error('Got exception deinitializing modules')
-
- try:
- # If we close Client, send Logoff to Broker
- self.ipc.sendLogout(operations.getCurrentUser())
- time.sleep(1)
- self.timer.stop()
- self.ipc.stop()
- except Exception:
- # May we have lost connection with server, simply log and exit in that case
- logger.exception()
- logger.exception("Got an exception, processing quit")
-
- try:
- # operations.logoff() # Uncomment this after testing to logoff user
- pass
- except Exception:
- pass
-
- def quit(self):
- # logger.debug("Exec quit {}".format(self.stopped))
- if self.stopped is False:
- self.cleanup()
- self.app.quit()
-
- def closeEvent(self, event):
- logger.debug("Exec closeEvent")
- event.accept()
- self.quit()
-
-
-if __name__ == '__main__':
- app = QtGui.QApplication(sys.argv)
-
- if not QtGui.QSystemTrayIcon.isSystemTrayAvailable():
- # QtGui.QMessageBox.critical(None, "Systray", "I couldn't detect any system tray on this system.")
- sys.exit(1)
-
- # This is important so our app won't close on messages windows (alerts, etc...)
- QtGui.QApplication.setQuitOnLastWindowClosed(False)
-
- try:
- trayIcon = OGASystemTray(app)
- except Exception as e:
- logger.exception()
- logger.error('OGA Service is not running, or it can\'t contact with OGA Server. User Tools stopped: {}'.format(
- utils.exceptionToMessage(e)))
- sys.exit(1)
-
- try:
- trayIcon.initialize() # Initialize modules, etc..
- except Exception as e:
- logger.exception()
- logger.error('Exception initializing OpenGnsys User Agent {}'.format(utils.exceptionToMessage(e)))
- trayIcon.quit()
- sys.exit(1)
-
- app.aboutToQuit.connect(trayIcon.cleanup)
- trayIcon.show()
-
- # Catch kill and logout user :)
- atexit.register(sigAtExit)
-
- res = app.exec_()
-
- logger.debug('Exiting')
- trayIcon.quit()
-
- sys.exit(res)
diff --git a/admin/Sources/Clients/ogagent/src/OGAgent_rc.py b/admin/Sources/Clients/ogagent/src/OGAgent_rc.py
deleted file mode 100644
index b0a95622..00000000
--- a/admin/Sources/Clients/ogagent/src/OGAgent_rc.py
+++ /dev/null
@@ -1,292 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created by: The Resource Compiler for PyQt4 (Qt v4.8.6)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x0f\x42\
-\x89\
-\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
-\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x01\x20\x05\xc9\x11\
-\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc7\x00\x00\x0e\xc7\
-\x01\x38\x92\x2f\x76\x00\x00\x0e\xf4\x49\x44\x41\x54\x78\xda\xc5\
-\x59\x07\x58\x53\xd9\x12\xbe\x29\xd4\x84\x12\x21\xf4\x22\x08\x08\
-\x02\x22\xa2\x22\x22\x22\x8a\xa0\xa0\x14\x1b\xae\x62\x05\xac\xb8\
-\x76\xd7\xde\xd6\xde\x15\xf5\xd9\x7b\x17\x51\x41\x50\x14\x10\x04\
-\x44\x94\x8e\xd2\x25\x80\x80\x48\xef\x24\xb4\xbc\x39\x59\x6e\x4c\
-\x42\xe2\x0a\xea\x7b\xf3\x7d\xe1\xde\x7b\xca\xcc\x9c\x73\xe6\xcc\
-\xfc\x33\x90\xd9\x6c\x36\x86\xe8\xe8\xe9\x9b\xe9\xab\x97\x79\x9a\
-\x62\x5d\x44\x46\x7f\xd6\x6f\x3f\xc1\xb6\xb7\x1d\xf6\xf7\xc3\xc0\
-\xf0\xf3\x53\x5c\xc6\x2e\xe4\x74\x9c\xbe\x78\xff\xcd\xc1\x9d\x2b\
-\x08\xf8\x48\x34\x48\x55\x85\x9e\x4a\x5e\xe6\x3d\x7d\x04\xfa\x40\
-\x8d\xd3\xdd\xc6\x6d\x73\x1c\x6b\x55\xd8\xd9\xd1\xf9\x88\xc3\x0a\
-\x9f\x11\x19\x93\xc8\x4e\x4e\xcb\xce\x5e\xeb\x3b\x7b\x07\x19\xe3\
-\xa1\xd1\x23\x2d\x08\xd0\x91\xcc\x91\x81\x6b\x15\x15\x9b\xb4\xd6\
-\xd6\x7a\xf0\x61\xae\x56\x1b\x77\x9d\x62\xed\xdb\xe6\x2b\x11\xfc\
-\x22\xfa\x10\x5f\x47\x47\x47\x87\x38\xc6\x4f\x6c\xee\x3a\x0e\x9f\
-\xba\x91\xd1\xa5\x00\x6a\x24\x30\x99\x2c\x39\x32\xef\x1a\x10\xed\
-\x3e\x7c\x91\xb5\x65\xad\xb7\x38\x9f\x56\x57\x6f\x3f\x79\xda\xd9\
-\xc9\x76\xae\xaa\xae\xd5\xe7\x6a\x85\x2f\x12\x71\x40\xef\x82\x9c\
-\xba\xed\xe1\x9c\x19\x13\x27\x9b\x18\xf5\x7b\x84\x77\xf8\x07\x86\
-\x5f\x98\xea\x32\xd6\x07\xbd\x57\xd7\xd4\xe9\xef\x3f\x7e\x35\x47\
-\x4d\x85\xde\x40\x3e\x70\xe2\x6a\x1e\x6a\xec\xec\xec\xe4\x4c\x6e\
-\x6f\xef\x90\x44\x4f\x34\xf8\xaf\x1d\x27\xd8\x07\x76\xac\xc0\x52\
-\xd3\x73\x36\x4d\x18\x67\x1d\x6a\x37\x72\x88\x23\xf9\xaf\x15\xf3\
-\xf4\xf8\x44\x92\x49\x4c\xa4\xce\xd5\xdb\x81\x9c\xc1\x70\x58\x71\
-\x70\x2e\xfb\x22\x5e\xbf\xdb\xcb\x55\x49\x18\x95\x55\xd4\xb4\xc0\
-\x43\x0a\x06\x5b\x9d\xba\x70\xaf\xc8\xd7\xc7\x03\xdb\xb0\xd3\xaf\
-\x43\xe4\x84\x0d\x2b\xe6\x4a\x27\xa5\x64\xb2\x07\x0f\x32\xc2\x5c\
-\x27\xd8\x6a\xc2\xc9\xb4\xed\xdf\xbe\x5c\x9c\xbb\x4b\x88\x92\xd3\
-\xb2\x66\xdd\x79\x18\x7a\x53\xd4\x0e\x71\x55\x82\x3d\x26\x6d\xd8\
-\x79\xb2\x7d\xa9\xd7\x34\x9b\x95\x4b\x66\x9a\xff\xeb\xb6\xa2\xc1\
-\x5b\xd7\xf9\xa8\xca\x50\xa5\xcb\xf0\xf3\x10\x29\x01\x1f\x80\x06\
-\xa3\xe7\xd0\xc1\xc6\x97\xdf\x27\x7d\x5c\xc0\x3b\x68\xdf\xb1\xcb\
-\x0d\x34\x79\x39\xaa\x89\xa1\xee\xca\x6e\x8b\xd6\xd3\xd1\x88\xc0\
-\x27\x7c\x29\xab\x1c\x25\x2f\x27\x13\x45\xa5\x50\x72\x86\x0e\x32\
-\x32\xa0\x50\xa4\x8f\x77\x9b\x80\x16\xbd\x69\xf5\x02\xed\xd6\xd6\
-\x36\x8a\xaa\x8a\x62\x14\xd8\x6b\xd6\xf2\x85\x1e\x46\x99\xd9\x05\
-\xec\x80\xa7\xaf\x0a\xc9\x72\xb2\xd4\xe2\xba\xfa\x46\x0d\x5c\x35\
-\xdd\xbe\xea\x51\xc0\xb5\x28\xe8\xf9\x6b\xf6\xa4\xf1\xa3\x30\x65\
-\xba\xc2\x01\xd4\x2e\x21\x21\x6e\xeb\x3e\xd1\x4e\x86\xbc\x79\x8d\
-\x97\xa6\xb0\xc5\xa1\xc1\x88\x86\x98\x0f\xb8\xfa\x22\x22\x2e\xc8\
-\x61\x8c\xd5\xc4\x80\xa0\x08\x86\xd0\x83\xcb\xc9\x2b\x74\x34\xd0\
-\xd3\xe6\x7e\x9b\x9b\x19\x4d\x44\xcf\xf8\xc4\xf4\xbe\x42\x27\xc0\
-\xe0\x50\xde\x2b\x95\x5f\x50\x82\xd1\x15\xe4\x31\xb0\x2d\xa2\x48\
-\xd3\x68\x6a\x6e\xa1\x1f\x3e\x75\x93\xb1\x75\xad\x17\xcd\xd2\xc2\
-\xb8\xcd\xef\xfc\xbd\x42\x58\xbc\x68\xe3\xcb\x67\x14\x8f\xd9\xbe\
-\xde\x87\xfa\x24\x24\xaa\xcd\xd5\xc9\x16\xf3\x99\xe3\x66\xc6\xe7\
-\x07\x78\xe9\xdc\xd5\x87\x11\x9f\x18\xc5\x76\xf8\xb7\xa6\xba\xf2\
-\xfb\xe5\x0b\x67\x0c\xc3\x7a\x41\x7c\x1a\xf1\x9a\x11\x5a\x1f\x81\
-\x80\xb1\x13\x53\x32\xe7\xdc\x7b\xf4\xe2\x1a\xde\xb7\x78\xfe\xd4\
-\xd1\xe8\xa8\x7a\x24\x20\x2a\x36\x71\x5d\xf0\x8b\x98\x83\xe8\x5d\
-\x52\x52\xa2\x6e\xd7\xc6\xc5\xf2\xf8\x00\x8b\x41\x46\xd7\x91\x00\
-\xfc\x1b\x8d\xed\x91\x80\xbc\xfc\xcf\x63\x71\xe6\x88\x78\x99\xe3\
-\xb4\x68\xfe\x14\xbb\x73\x57\x1e\xbe\xfa\xc7\xf6\x07\x5c\xe6\xf3\
-\x92\x6c\x36\x71\xcb\x9e\x33\x6d\xfa\xba\x5a\xc4\xd9\x1e\xce\x18\
-\x89\x44\xe4\xf1\x7e\x81\x35\xe4\xf3\xd7\x02\xc2\x04\x27\x10\x08\
-\x84\x4e\x3e\x73\xf7\x7f\x7e\x0b\x3d\x89\x44\x62\xbb\x89\x91\x5e\
-\x00\x7a\x2f\x2a\x2e\x73\x3a\x7b\xc5\x3f\x78\xef\x56\x5f\x6c\xcf\
-\x96\x65\xd8\xf6\xfd\x67\xeb\xd3\x3e\xe6\x2c\x95\x92\x92\x6c\xaf\
-\xab\x6f\xba\x0b\x96\x81\xa9\xa9\x2a\x7d\x21\x7b\xcf\x76\x1b\x7f\
-\xf1\xc6\xe3\xe7\x5c\xcf\xb2\xd3\xaf\xed\xc0\x8e\x3f\x49\x82\xe7\
-\x62\xa8\xdf\x37\x64\x81\xa7\xab\x33\xde\x06\xde\x06\x43\xcc\xbb\
-\xbe\x91\x3b\x96\xe3\x84\xb2\x33\x37\xd9\x43\x06\x0d\xa8\xdd\xba\
-\xe7\x0c\x79\xc3\xca\x79\xa3\xc9\xc8\x88\x91\x33\x89\x8e\x4b\x5e\
-\x05\xf7\xeb\x28\x5a\x01\xce\x14\x1d\xf2\x8a\xc5\x33\x07\xab\xab\
-\xd2\x93\x79\x05\xc2\x78\x5e\xc3\xc0\x78\x9d\x51\x7f\x3d\xed\xa0\
-\xa7\xa1\xd1\x93\xf4\x74\x34\xb1\xf8\x84\x8f\xe5\x5c\x2b\xb2\xb1\
-\x32\x3f\x86\x7e\xdf\x3b\xb0\x82\xa2\x52\x6b\xfb\xd1\x96\x22\xfb\
-\x71\x37\xef\xec\x60\xc3\x15\x4e\xee\x89\x4d\xab\x2a\xd3\xd3\xc2\
-\xa3\xde\xf3\xb5\x59\x5a\x98\x60\x17\xae\x3d\xea\xd4\xd6\x54\x21\
-\xcc\xfd\x63\x12\x8f\x7f\xce\xae\x9a\x60\x3f\xe2\x48\x8f\x04\x48\
-\x48\x88\x35\x8c\xb2\x1e\x3c\xee\xef\x43\x17\x43\x60\x7f\xc5\xc4\
-\xc4\xc8\x10\xbd\x87\x74\x1c\xf2\xbb\xce\xae\xad\xab\xaf\xb6\xb6\
-\x1c\xa4\xd4\x15\xc4\xc0\xb1\x7c\x48\x5f\x3c\x7f\xca\x3e\x72\x4f\
-\x6f\xa6\xbe\xae\x66\x18\xc4\x22\x83\x0b\xd7\x1f\x31\x1c\xc7\x58\
-\x61\xe9\x19\xb9\x24\x63\xc3\x7e\xfe\x39\x9f\x0a\xa7\x52\x28\x52\
-\x1c\xe6\x7b\x8f\x5e\x29\xdd\xb2\xd6\xcb\xee\xbb\x81\xed\x7b\xd4\
-\x87\x26\x5b\x00\x91\xfd\x6b\x42\x4a\x46\x2b\xf8\x4f\xcd\xe6\x66\
-\xe6\x54\x3b\x1b\x8b\x57\x87\xfd\xae\xab\x8d\xb7\xb7\xde\x08\xcc\
-\xb9\x31\x5b\xa8\x2f\x42\x04\x93\x14\x82\x42\x5f\x1f\x49\xfb\x98\
-\x3b\x8d\x4c\x22\xb5\xee\xdc\xb8\x98\xf6\xd3\xbe\x88\x13\x92\xbf\
-\x56\x9a\x1e\x3d\x73\x2b\x8d\xb7\x0d\xc5\x47\xac\x97\xc4\x27\xe0\
-\xc1\x93\xb0\x4b\x78\x44\x43\xb6\x8f\xee\x00\x7a\x87\xd8\x1f\x07\
-\x37\x77\xb8\xcb\x04\xdb\x15\x23\x87\x0f\x3a\xd9\x2b\x01\x8f\x9e\
-\xbe\x3a\x83\x33\x47\x0e\xce\xc3\xdd\x61\xae\xa0\x87\x0d\x7c\x16\
-\x75\xa2\x57\x02\x8a\x4b\xcb\x2d\xe2\xde\xa7\x2d\x41\xef\x52\x92\
-\x12\xb5\x38\xf3\x5f\x41\x1c\x01\x27\xcf\xdd\x49\xc0\x1b\x04\xa3\
-\xae\x9b\xd3\xe8\xe5\x8f\x43\x22\xfd\x7a\x2d\x20\x3c\xea\xdd\x16\
-\xde\x06\x71\x71\xb1\x46\xde\xef\x11\x96\x66\xa7\x7e\x44\x40\xc8\
-\xcb\xd8\x07\x1f\x33\x3f\xb9\x56\x54\xd5\x88\x71\x6e\xbd\x0a\x3d\
-\x6f\xd5\x92\x99\xfa\xe4\xd0\x88\xb8\xbf\xf1\x41\x70\x33\x5b\x7a\
-\xaa\xe1\xeb\x37\x49\x67\x82\x43\xa3\x97\x78\x7a\x38\x61\x4e\xe3\
-\xac\xb9\xed\x8d\x8d\x2d\x7a\x27\xcf\xde\x49\xe0\xb3\x22\x8a\xb4\
-\x54\xc5\xf7\x98\xa9\x28\x2b\xa6\xf3\x7e\xef\x39\x72\x89\xa9\xa3\
-\xad\x2e\x71\x00\xbc\x6b\x65\x55\x6d\x33\x18\x84\xb4\x9a\x32\xbd\
-\x73\xe5\xd2\x99\x44\x2a\x55\x0a\x6b\x6d\x6f\x97\xe1\x13\xd0\xd0\
-\xd8\xa4\x2a\xc8\x14\x07\xc7\x88\x16\xcc\x72\x71\xc6\xdf\xc1\xc1\
-\x35\xb9\x39\xdb\x49\x18\x1b\xea\x62\xe5\x15\xd5\x0d\xc7\xfe\x73\
-\x5b\x02\xb9\xed\x93\xe7\xef\x72\xad\x8e\x2a\x2d\x55\xc6\x27\xa0\
-\xa3\xa3\x53\x4c\x50\x00\x4a\x17\xba\xb6\xaf\x19\x30\xd9\x67\xf4\
-\x7e\xe4\xf4\xcd\xba\x31\x36\x43\xa4\x11\x73\x8e\xb0\xeb\x01\xf5\
-\x90\x88\x68\x7c\xcb\x34\x30\xec\xfe\xe3\x97\x59\x66\x03\x0d\xee\
-\x74\xbb\xc9\x9f\x4b\xbe\x0e\x45\x30\xa5\x6b\x7f\x57\xc3\xd2\xf5\
-\x39\x29\xc7\xe6\x65\xd4\x2e\x58\xe6\x29\x21\x2e\x26\x6b\x3e\xd0\
-\x90\x33\x1e\x00\x41\xb6\xfb\xc4\x31\xeb\xd1\x7b\x62\x6a\xe6\x5e\
-\x2a\x45\x1a\xbb\x7c\x2b\x30\xbd\xae\xbe\xa1\x13\x32\xab\xb3\x1c\
-\x30\x08\x7b\xf9\x19\x17\xe0\x77\xfe\xee\x3b\x04\x6e\x11\xf2\x42\
-\x50\x1a\xb5\x21\x3f\x84\xa2\x1b\x7a\x87\xf0\x7a\x83\x37\xa2\x01\
-\xac\xe9\x0f\xf7\x26\x90\x83\x3c\xb5\xd5\xcf\x41\x40\xcf\x30\x32\
-\xd0\x09\x2a\xfd\x5a\x69\xd6\xd8\xd8\xac\xc4\x81\xa7\x28\xcf\x82\
-\xcc\x24\x1f\x60\xaa\xfa\x3f\x67\xd1\xac\xc2\xc1\x84\xfd\xb4\x5e\
-\x78\xcf\x71\x77\xc4\x99\x65\xe5\x16\x4c\x1b\x31\xcc\x8c\xcb\xbc\
-\xbc\xb2\x06\x1b\x64\xda\xff\x0e\xfe\x2d\x29\x21\x51\xff\x30\x28\
-\xe2\x9a\x96\x9a\x32\xb1\xbf\x7e\x5f\x2c\x3c\x22\x21\x9a\xb3\x45\
-\x24\xf0\x96\xb0\x12\x8d\x7f\x33\xc9\x98\xf8\x94\x63\xde\x9e\x6e\
-\xdc\xef\xac\x1c\x46\xae\xf5\x70\x33\xee\x1d\xb9\xf7\xf8\x65\xf5\
-\xce\x0d\x8b\x10\x3f\xce\x77\xf0\xcb\x18\x9b\x1e\xc5\x83\x9c\xdc\
-\x42\x75\xde\x6f\x70\x2b\xc5\xb5\xb5\x0d\x5a\xda\x1a\xaa\x71\x57\
-\x6e\x05\x66\x8f\xb2\xb6\xe0\x32\xaf\xad\x6b\xc0\x10\xc4\x21\xff\
-\x8c\x9f\xa9\x6f\x68\x1a\x06\xfb\xbd\xa6\xa9\xa9\x45\xad\xb0\xf8\
-\x8b\x41\xbf\xbe\xdf\xe4\x83\xf3\xcc\x07\xc4\xbf\xb2\x47\x02\xe8\
-\x8a\xb4\x6a\x14\xd0\xbe\x21\x91\xc1\x94\x4b\x37\x1f\x27\x12\xe1\
-\x64\xb7\xad\x5b\xc8\x37\x36\x33\x87\xa1\x3b\x5f\xce\xe5\x73\x8f\
-\x04\x8c\xb2\x1a\xbc\xf1\x55\x74\xc2\x39\x3b\x9b\x21\x5d\x7e\x8b\
-\x8c\x2d\x59\x30\x95\xc0\x62\xb5\xb2\xf7\x1f\xbf\x4c\xd8\xb4\xda\
-\xab\xeb\xc2\x36\x63\xda\x9a\xaa\x6f\x7a\x1c\x93\x2d\x87\x98\x9c\
-\xdf\xb4\xeb\x94\x9f\xa4\xb8\xb8\xb8\x95\xe5\x40\x4e\x5b\x58\x64\
-\x7c\xea\xcb\xc8\x78\x53\x49\x09\x71\x2e\xf8\xba\x1b\x10\x9a\xe6\
-\x33\xc7\xdd\xa1\x57\x41\x7f\x2f\x98\x34\x30\xdd\xb6\x69\xf7\xa9\
-\x8d\x04\x36\x81\x34\xc5\x65\xec\x11\x40\x19\x0c\xd8\x92\x68\x7c\
-\x0c\xe4\x16\x03\xc0\x2b\x37\xf5\x1a\x55\xa4\x7e\xcc\x5d\xa4\xad\
-\xa1\x26\xe9\x3d\xdb\x1d\xdb\xb8\xeb\xe4\x75\x45\x05\x5a\xdd\xea\
-\xa5\xb3\x38\x7d\x37\xef\x3f\x7b\xb7\x7a\x99\xe7\x5c\x91\x41\xff\
-\x47\x48\xa1\x8f\x9c\xfc\xbc\x2e\x14\xb7\x6f\xdb\x72\xec\xdc\xb5\
-\x00\x39\x48\xfc\x31\x46\x61\x49\x45\x51\xf1\x17\x55\x25\x45\x5a\
-\xd6\x4f\x09\xb0\x1e\x66\xe6\x76\xe6\xd2\xfd\x13\x0e\x76\x23\x34\
-\x5a\x98\x4c\x19\x27\xfb\x11\xf5\x00\x9e\x1f\x46\xc6\x24\x4c\x80\
-\xa4\x5b\x8b\x2f\xa2\x89\xc2\x45\xc2\xe8\x53\x41\xf1\xe8\x98\xb8\
-\x94\x15\x59\xb9\x0c\x67\x61\x9e\x17\x05\x2c\x2f\x4f\xb7\x09\x3d\
-\xc9\x80\x7e\x49\xcc\xff\x1e\xa1\xb4\xe1\x59\x58\xec\xbe\xf6\xf6\
-\x0e\x89\x6e\x01\x4e\x49\xe1\x83\xa9\xb1\xbe\x3f\x84\x85\x27\x6a\
-\x2a\xf4\x14\xd8\x0b\x42\x76\x5e\xc1\xf8\xd0\xf0\xb8\xdd\xda\x5a\
-\xaa\xb1\x90\xb3\x3c\xfb\xbf\x2c\x00\x45\x81\x3b\x0f\x9f\xdf\x4a\
-\xfd\x90\xe3\x21\xd8\x87\x20\xd9\x94\x49\x63\x17\x82\xcd\xb0\xf0\
-\xb6\xf8\x84\x0f\x0b\x01\xfb\xbd\x15\x5c\x24\x44\xf8\xca\x2d\x6b\
-\xbd\xd5\x20\x2d\x6c\xfb\x9f\x2d\x20\xe6\x6d\xca\x9f\x08\x1f\x76\
-\x4f\x0a\xb4\xc2\xbc\x20\x5b\x04\xaf\xd6\xc1\xdb\x8e\x83\x56\x11\
-\xc5\x08\x45\x74\x82\xa3\x47\x5a\x1c\xfc\xed\x0b\x40\x36\x7d\xfc\
-\xec\xed\xe4\xaf\xe5\x55\xc6\x82\x83\x20\xcf\xda\x64\x67\x33\x74\
-\x9f\x30\x06\x28\x05\x3e\x70\xf2\x5a\x2e\xc4\x03\xba\xb0\x7e\xb8\
-\xd5\xc3\x7f\xbb\x09\xb5\x30\x59\xf2\xfb\x8f\x5d\x61\xa0\x67\x37\
-\xef\x6c\x61\x72\x41\x94\xf2\x78\x59\x63\xd3\xaa\x05\xda\x00\x4a\
-\x8a\x9b\x5b\x98\x7d\xba\x8f\x20\xb0\x7b\xab\x5c\x45\x65\xad\x41\
-\x69\x59\xb9\x65\x6d\x5d\xa3\xa1\x18\x99\xc4\x6c\xef\xe8\x60\x2a\
-\xd1\x69\x19\xba\xda\x1a\x91\x5c\x47\x8d\xec\x1d\xd5\xb0\x85\x29\
-\x8f\x08\x52\xee\x9d\xff\x26\x08\x79\x9f\x49\xe3\x47\xad\x06\xf8\
-\x75\x55\xb0\x4f\x5d\x8d\x9e\xf4\x23\xca\x02\x3c\xe8\x17\x1b\x9f\
-\x72\x36\x3a\x2e\xc5\x1e\xe5\xa8\x70\x7f\x50\xb9\x11\xa3\xc9\xcb\
-\x00\x1a\x56\x40\xd0\x02\x83\x0d\x42\xe8\x17\x8b\x7e\x9b\xca\x66\
-\xb6\xb0\xb2\x2d\xcc\x0c\x4f\x93\x43\x5e\xc6\x1c\x44\x05\x41\x61\
-\x4c\x11\x1a\x83\x5f\xc9\x8f\x28\x40\xa3\xc9\x32\x84\xb5\x0f\x35\
-\x37\xbe\x22\x6a\x0e\x04\x6d\xcd\xdb\xfe\xcf\x62\x21\xf4\x69\xca\
-\xca\x50\xb0\x89\x8e\x36\x9c\xc0\x02\xf0\x11\x4c\xba\x03\x7b\x9f\
-\x94\x91\x99\x99\xcb\xc0\xc0\xbb\x19\x59\x0f\x1b\x84\x2a\x31\x70\
-\x19\x31\x0c\xf2\x37\x42\xf4\x9b\x64\x03\x94\xb0\x90\x01\xa8\xce\
-\x16\x25\x00\xee\x85\xf8\x8f\x1e\x37\xca\xa3\x05\xdb\x1c\xc6\x58\
-\x6d\x03\xc5\x4a\x85\x14\x53\xdc\x01\x18\xfb\xb7\xb6\xb6\x12\x27\
-\x3a\x8e\xc2\x16\xcd\x9b\xc2\xed\x2b\x2e\xfd\x5a\x7d\xf1\xfa\x63\
-\x12\x84\xdf\x4c\x4d\x75\xa5\xf7\x03\x8d\xf5\x13\x60\x21\x57\x5a\
-\x5b\x59\x44\x5e\x1e\xb2\xb2\x14\xe4\x05\xa5\xc8\x4c\x66\xab\x9c\
-\x28\xa5\x1a\x9b\x9a\x95\xe0\x68\xb5\x50\x89\xf6\x7b\xca\xa7\xa4\
-\xe7\xcc\x78\x13\x9f\xea\x2b\xe8\x6e\xd1\x7f\x51\x78\xdb\xaa\xaa\
-\x6b\x4d\x4f\x5d\xbc\x9f\x04\x32\xc9\x0b\x3c\x5d\x51\xb9\x83\xdb\
-\xd7\xda\xda\x86\x9d\xbd\xe2\xff\xa9\xe4\x4b\xb9\xee\x8c\xc9\x8e\
-\xb3\x21\x2b\xe0\x14\xd7\xb2\x73\x0b\xd6\x80\x1e\xc4\xc6\x26\x26\
-\x77\x2c\x93\xc9\x62\x07\x3e\x7b\xdd\x02\x9b\x53\x4b\x36\x33\xd1\
-\xbf\x9f\x94\x9a\xe5\x29\x4a\xb9\xa0\xe7\xd1\x47\x66\x7b\x38\x4d\
-\x13\xd5\x8f\x5c\x2e\x72\xbd\x02\xe5\xe5\xd5\x82\x25\x2d\xff\x27\
-\x61\x31\xef\x92\x3e\x5a\x83\x4b\x85\x14\x71\x24\x1f\x0f\xb0\xeb\
-\xd6\x23\xa7\x6f\x10\x15\x68\x72\x6d\x7b\xb6\xf8\x4a\xe1\x31\x06\
-\xcc\x48\x02\x92\x80\x7d\x80\x17\x61\x43\x0c\x51\x7c\xc2\x9e\x85\
-\xc5\x64\x15\x7d\x2e\xab\xea\x43\x93\x25\x2e\x9e\x3f\xd5\x96\xec\
-\xe1\xee\x38\xa7\xae\xae\x51\x03\xc1\x04\x61\x0a\xa6\x67\xe4\x4e\
-\xdd\x7d\xf8\x62\x29\xda\x15\x3d\x5d\xcd\x70\x3c\x2b\x81\xe8\xbc\
-\x37\x21\x39\x63\x3e\xef\x58\x0d\x35\xe5\x84\x85\x73\xdd\xed\x91\
-\x67\xe2\x75\xcf\xe0\x24\x60\xf3\xeb\x64\xd6\xf8\xce\xc6\x94\xe9\
-\x7d\x04\x61\x39\x1b\x92\xb8\x0f\x06\x7a\x7d\x8b\xe7\xcf\x9c\xe4\
-\xca\xdb\xf7\x34\x34\xe6\x04\x91\x4d\xac\x01\x07\xa3\x04\xe9\x54\
-\x2c\x89\x48\x68\xd7\xd1\xd6\x78\x0d\xf1\xe8\x20\x9e\xc4\x93\x51\
-\xbe\x85\x8a\xad\xd5\x35\xf5\x3a\x37\xee\x3d\x7d\x58\xf2\xa5\xc2\
-\x5c\x08\xf6\x57\x15\xac\xa9\x72\x9d\x24\x81\xd0\x39\x6a\xc4\xe0\
-\x23\xe3\xc7\x8e\xd8\x2c\x18\x71\x51\xd5\x12\x32\xd3\x2a\x29\x49\
-\x71\x99\xcd\x6b\xbc\x31\x2a\x45\x4a\x58\x6d\xbc\x02\xf8\xeb\x6f\
-\x5b\xe7\xd3\xad\x4c\xe4\xea\x64\xbb\x18\xfd\x5a\x5a\x58\x34\xb8\
-\xab\x9b\xe0\xee\x38\x47\x44\xbf\xdb\x12\x9f\x98\xbe\x59\x49\x51\
-\xa1\x91\x4a\x95\x7c\x41\xe6\xa9\x8c\x31\xf0\x92\x10\xda\xb5\xdc\
-\xfc\x22\x7b\xb0\xbf\x09\x5f\xca\x2a\xcd\xea\x1a\x1a\xd5\x11\xce\
-\x41\xee\x52\xb1\x8f\x5c\x9e\x96\x86\xea\x5b\x93\x01\xfd\x02\xe8\
-\x0a\xb4\x9c\xef\xdd\x8d\x07\x4f\xc2\xa2\x60\xeb\x65\x56\x2c\xfe\
-\x43\xa8\xf2\xef\x12\x33\xea\xc0\x5d\xe6\x3a\xd8\x59\xf9\xa1\xd4\
-\x5b\xa0\xc8\xa6\x88\xee\x04\x89\x48\x92\x6d\x61\xb1\x50\xa5\x15\
-\x9b\x3c\x69\x0c\xe6\x39\xdd\x89\xb3\x6f\xc9\x69\xd9\x84\xc4\xd4\
-\x2c\xaa\x50\x2c\x84\x76\x12\x01\xb1\x9f\x01\x63\xb0\xab\x6a\x60\
-\x62\x23\xcd\x4c\x0c\x30\x75\x55\x25\xa1\x63\x5a\x98\x2d\x79\xa8\
-\xbc\xeb\x60\x37\x7c\x3b\x6f\xfb\x97\xaf\x95\x56\xfe\x81\x61\x51\
-\x10\x43\xc4\xa6\xb9\x3a\x60\x00\x5f\xba\xcd\x85\xac\xa4\x05\xa0\
-\xca\x30\xf2\xef\x0a\xf1\xa0\x84\x29\x28\xde\x01\xf7\x86\x24\xba\
-\xb2\x2b\x4e\xfc\x67\x21\x4c\x6e\x09\x13\x4e\x7e\xd6\xbd\x80\x17\
-\x37\x54\x94\x15\x09\x1e\xdf\x92\x7e\x3e\x8a\x4f\xfc\x50\x51\x51\
-\x55\xa3\x04\xa0\x72\xd1\x6f\x5b\x00\x95\x22\x5d\x0e\x2e\x91\x54\
-\x59\x55\x23\x7a\x10\x9b\x68\x0e\xc9\x74\xc9\xe7\xe2\x72\x6b\x22\
-\x81\x44\x09\x7f\x1d\x7f\x1c\x2e\xa7\xfc\xe8\x91\x43\x21\x58\x99\
-\x09\x9d\x82\x3c\xd2\x93\x90\x48\x39\x0d\x35\xa5\x44\x94\x84\xfe\
-\xb6\x05\xa0\x32\x2b\x78\xa5\xcc\x37\xef\xd2\x8c\xc6\xd8\x58\x62\
-\x52\x52\xdd\x63\xe2\xf0\xa1\xc6\x90\x09\x1b\xab\x17\x14\x95\xac\
-\xac\xa9\x6b\xc0\xa6\xbb\x39\x40\x6e\x2f\x0f\x59\xef\x0b\x80\x16\
-\xf5\x9c\xc8\x2c\x48\xb7\x1e\x3c\xfb\x04\xee\x55\x17\xee\xc2\xf4\
-\x5e\xa7\x7c\x3f\x4a\x8b\xe6\x4d\xb6\x3c\xe4\x77\x3d\xef\xf2\xad\
-\xc7\x34\xf0\x26\x62\xb0\x20\x21\x5e\x0c\xc3\x74\xb4\xd5\x31\xc9\
-\xb2\xca\xfa\x9b\xf7\x83\xeb\xcb\x2b\x6b\x38\xb0\x66\xde\x4c\x97\
-\x6e\x63\x23\x5e\xbf\x67\x64\xe5\x16\xf4\x9b\xe6\x6a\xef\xd5\x87\
-\x26\x97\xff\xdb\x17\x00\x36\xde\x00\x09\x8d\x32\xa4\xfc\xce\x90\
-\xa5\x2d\xcf\xce\x2b\x74\xd4\xd3\xd5\xca\x07\x08\x41\x55\x52\xec\
-\x53\x0d\xb0\x41\x16\x14\x56\x42\xa5\x65\x9a\x1c\xb5\xc8\xd5\xc9\
-\x6e\xfd\xad\x07\x21\x21\x14\x8a\x94\xf8\x80\xfe\x3a\xfc\x99\xfe\
-\x87\xdc\xca\xe7\xe1\x6f\x74\x00\x07\x9d\x40\xff\x53\xfe\xa9\xa4\
-\xbb\xa7\x64\x64\xa0\x13\x8c\x7e\x2c\x56\x1b\x35\x22\xfa\xfd\xc5\
-\x9c\xbc\xc2\xc9\x48\x71\x0d\xf0\x4e\x54\xaa\x74\xbe\x32\x5d\x21\
-\x04\xa2\xf7\xca\x97\x91\x6f\xaf\x01\xe2\x14\xf7\x98\xec\x20\x58\
-\x06\xaa\x84\x85\x29\x9a\x0f\xec\x7f\xdb\x65\x82\xed\xca\x1e\xe5\
-\xc4\xbf\x8a\x62\xe3\x53\xd7\x31\x0a\x4b\xf6\xd3\x15\xe4\x89\xbe\
-\x3e\xd3\xb9\x55\xb6\xb6\xb6\x76\xdd\xab\xb7\x83\x7c\x37\xec\x3c\
-\xe9\xdb\x85\xa1\xd0\x82\xb9\xf3\x22\x63\x12\xf2\x42\x5e\xc6\xea\
-\x41\x1c\x38\x0e\x8b\x5c\xd5\xe3\xa4\xfe\x57\xd1\x40\x63\xbd\x1b\
-\x99\xd9\x0c\x97\xe2\xd2\x0a\xd3\x8c\x6c\x86\x9c\xe9\x00\x3d\x3c\
-\x97\xc0\x7c\xe6\xba\xe3\x48\x14\xc3\xef\xc9\xe7\x92\xaf\x99\x37\
-\xee\x05\xcb\x4b\x4b\x4b\x36\x2c\xf5\x9a\x36\xb2\xaf\x96\x5a\x6c\
-\xaf\xaa\x12\xbf\x8a\x64\xa8\x94\x32\xef\x39\x6e\x36\xa8\x26\xfd\
-\x28\xf8\xd5\x19\x00\x81\x86\x60\x52\xb2\x4c\x16\x4b\x16\xb0\x53\
-\x23\x20\x4c\x4e\x8d\x1a\xd5\xaf\xc5\xc4\xc4\x9a\xca\x2b\xaa\x07\
-\xfc\x31\xc5\x71\xa6\x7e\x3f\xad\xf0\xef\xf1\xfd\x2f\x9a\x21\xe5\
-\x2e\x6b\x8c\x93\x5e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
-\x82\
-"
-
-qt_resource_name = b"\
-\x00\x06\
-\x07\x03\x7d\xc3\
-\x00\x69\
-\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
-\x00\x03\
-\x00\x00\x70\x37\
-\x00\x69\
-\x00\x6d\x00\x67\
-\x00\x07\
-\x05\xd4\x57\xa7\
-\x00\x6f\
-\x00\x67\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\
-"
-
-qt_resource_struct = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
-\x00\x00\x00\x12\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
-\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-"
-
-
-def qInitResources():
- QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-
-qInitResources()
diff --git a/admin/Sources/Clients/ogagent/src/VERSION b/admin/Sources/Clients/ogagent/src/VERSION
deleted file mode 100644
index 3e153f5b..00000000
--- a/admin/Sources/Clients/ogagent/src/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-1.1.1b
diff --git a/admin/Sources/Clients/ogagent/src/about-dialog.ui b/admin/Sources/Clients/ogagent/src/about-dialog.ui
deleted file mode 100644
index ab0cac1d..00000000
--- a/admin/Sources/Clients/ogagent/src/about-dialog.ui
+++ /dev/null
@@ -1,244 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>OGAAboutDialog</class>
- <widget class="QDialog" name="OGAAboutDialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>466</width>
- <height>402</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <family>Verdana</family>
- <pointsize>9</pointsize>
- </font>
- </property>
- <property name="windowTitle">
- <string>About OGAgent</string>
- </property>
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="modal">
- <bool>true</bool>
- </property>
- <layout class="QVBoxLayout">
- <property name="spacing">
- <number>9</number>
- </property>
- <property name="margin">
- <number>9</number>
- </property>
- <item>
- <widget class="QLabel" name="LogoLabel">
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/images/img/oga.png&quot;/&gt;OpenGnsys Agent Tools&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>5</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="TitleLabel">
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:600;&quot;&gt;OpenGnsys Agent&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="VersionLabel">
- <property name="text">
- <string>Version 1.1.0</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>5</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="aboutTab">
- <attribute name="title">
- <string>&amp;About</string>
- </attribute>
- <layout class="QVBoxLayout">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="margin">
- <number>9</number>
- </property>
- <item>
- <widget class="QTextBrowser" name="aboutBrowser">
- <property name="html">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-weight:600;&quot;&gt;OpenGnsys Agent for Operating Systems (OGAgent) is based on UDS Actor from Virtual Cable S.L.U.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:5px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-weight:600;&quot;&gt;UDS Actor is (c) 2014, Virtual Cable S.L.U.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-style:italic;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:8pt; color:#000000;&quot;&gt;More info:&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:10px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;https://opengnsys.es/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;OpenGnsys Project&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:10px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;https://github.com/dkmstr/openuds/tree/master&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;openuds on GitHub&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="authorsTab">
- <attribute name="title">
- <string>A&amp;uthors</string>
- </attribute>
- <layout class="QVBoxLayout">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="margin">
- <number>9</number>
- </property>
- <item>
- <widget class="QTextBrowser" name="authorsBrowser">
- <property name="html">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:5px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif';&quot;&gt;OGAgent developer: Ramón M. Gómez &amp;lt;ramongomez@us.es&amp;gt;&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif';&quot;&gt;UDS Actor developer: Adolfo Gómez García &amp;lt;agomez@virtualcable.es&amp;gt;&lt;/span&gt;&lt;/p&gt;
-&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="licenseTab">
- <attribute name="title">
- <string>&amp;License Agreement</string>
- </attribute>
- <layout class="QVBoxLayout">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="margin">
- <number>9</number>
- </property>
- <item>
- <widget class="QTextBrowser" name="licenseBrowser">
- <property name="html">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Copyright (c) 2014 Virtual Cable S.L.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Redistribution and use in source and binary forms, with or without modification,&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; * Redistributions of source code must retain the above copyright notice,&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; this list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; * Redistributions in binary form must reproduce the above copyright notice,&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; this list of conditions and the following disclaimer in the documentation&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; and/or other materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; * Neither the name of Virtual Cable S.L. nor the names of its contributors&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; may be used to endorse or promote products derived from this software&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt; without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Close</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="OGAgent.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>clicked(QAbstractButton*)</signal>
- <receiver>OGAAboutDialog</receiver>
- <slot>closeDialog()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>432</x>
- <y>381</y>
- </hint>
- <hint type="destinationlabel">
- <x>282</x>
- <y>362</y>
- </hint>
- </hints>
- </connection>
- </connections>
- <slots>
- <slot>closeDialog()</slot>
- </slots>
-</ui>
diff --git a/admin/Sources/Clients/ogagent/src/cfg/ogagent.cfg b/admin/Sources/Clients/ogagent/src/cfg/ogagent.cfg
deleted file mode 100644
index 3fa38ab2..00000000
--- a/admin/Sources/Clients/ogagent/src/cfg/ogagent.cfg
+++ /dev/null
@@ -1,23 +0,0 @@
-[opengnsys]
-# Listen address & port of REST
-address=0.0.0.0
-port=8000
-
-# This is a comma separated list of paths where to look for modules to load
-path=test_modules/server
-
-# Remote OpenGnsys Service
-remote=https://192.168.2.10/opengnsys/rest
-# Alternate OpenGnsys Service (comment out to enable this option)
-#altremote=https://10.0.2.2/opengnsys/rest
-
-# Log Level, if ommited, will be set to INFO
-log=DEBUG
-
-# Module specific
-# The sections must match the module name
-# This section will be passes on activation to module
-#[Sample1]
-#value1=Mariete
-#value2=Yo
-#remote=https://172.27.0.1:9999/rest
diff --git a/admin/Sources/Clients/ogagent/src/cfg/ogclient.cfg b/admin/Sources/Clients/ogagent/src/cfg/ogclient.cfg
deleted file mode 100644
index d39fc965..00000000
--- a/admin/Sources/Clients/ogagent/src/cfg/ogclient.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-[opengnsys]
-# Log Level, if ommited, will be set to INFO
-log=DEBUG
-
-# Module specific
-# The sections must match the module name
-# This section will be passes on activation to module
-#[Sample1]
-#value1=Mariete
-#value2=Yo
-#remote=https://172.27.0.1:9999/rest
diff --git a/admin/Sources/Clients/ogagent/src/img/oga-48x48.ico b/admin/Sources/Clients/ogagent/src/img/oga-48x48.ico
deleted file mode 100644
index 37ded487..00000000
--- a/admin/Sources/Clients/ogagent/src/img/oga-48x48.ico
+++ /dev/null
Binary files differ
diff --git a/admin/Sources/Clients/ogagent/src/img/oga-512.png b/admin/Sources/Clients/ogagent/src/img/oga-512.png
deleted file mode 100644
index 37a0dbe4..00000000
--- a/admin/Sources/Clients/ogagent/src/img/oga-512.png
+++ /dev/null
Binary files differ
diff --git a/admin/Sources/Clients/ogagent/src/img/oga.ico b/admin/Sources/Clients/ogagent/src/img/oga.ico
deleted file mode 100644
index 37ded487..00000000
--- a/admin/Sources/Clients/ogagent/src/img/oga.ico
+++ /dev/null
Binary files differ
diff --git a/admin/Sources/Clients/ogagent/src/img/oga.png b/admin/Sources/Clients/ogagent/src/img/oga.png
deleted file mode 100644
index 70db4564..00000000
--- a/admin/Sources/Clients/ogagent/src/img/oga.png
+++ /dev/null
Binary files differ
diff --git a/admin/Sources/Clients/ogagent/src/license.txt b/admin/Sources/Clients/ogagent/src/license.txt
deleted file mode 100644
index bdb7d25d..00000000
--- a/admin/Sources/Clients/ogagent/src/license.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012-2015 Virtual Cable S.L.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name of Virtual Cable S.L. nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/admin/Sources/Clients/ogagent/src/message-dialog.ui b/admin/Sources/Clients/ogagent/src/message-dialog.ui
deleted file mode 100644
index 75137037..00000000
--- a/admin/Sources/Clients/ogagent/src/message-dialog.ui
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>OGAMessageDialog</class>
- <widget class="QDialog" name="OGAMessageDialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>339</width>
- <height>188</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <family>Verdana</family>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="windowTitle">
- <string>UDS Actor</string>
- </property>
- <widget class="QWidget" name="verticalLayoutWidget">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>10</y>
- <width>321</width>
- <height>171</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTextBrowser" name="message"/>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>15</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>clicked(QAbstractButton*)</signal>
- <receiver>OGAMessageDialog</receiver>
- <slot>closeDialog()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>203</x>
- <y>161</y>
- </hint>
- <hint type="destinationlabel">
- <x>337</x>
- <y>125</y>
- </hint>
- </hints>
- </connection>
- </connections>
- <slots>
- <slot>closeDialog()</slot>
- </slots>
-</ui>
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/RESTApi.py b/admin/Sources/Clients/ogagent/src/opengnsys/RESTApi.py
deleted file mode 100644
index d785dfa7..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/RESTApi.py
+++ /dev/null
@@ -1,167 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 201 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-"""
-
-# pylint: disable-msg=E1101,W0703
-
-from __future__ import unicode_literals
-
-import requests
-import logging
-import json
-import warnings
-
-from .log import logger
-
-from .utils import exceptionToMessage
-
-VERIFY_CERT = False # Do not check server certificate
-TIMEOUT = 5 # Connection timout, in seconds
-
-
-class RESTError(Exception):
- ERRCODE = 0
-
-
-class ConnectionError(RESTError):
- ERRCODE = -1
-
-
-# Disable warnings log messages
-try:
- import urllib3 # @UnusedImport
-except Exception:
- from requests.packages import urllib3 # @Reimport
-
-try:
- urllib3.disable_warnings() # @UndefinedVariable
- warnings.simplefilter("ignore")
-except Exception:
- pass # In fact, isn't too important, but wil log warns to logging file
-
-
-class REST(object):
- """
- Simple interface to remote REST apis.
- The constructor expects the "base url" as parameter, that is, the url that will be common on all REST requests
- Remember that this is a helper for "easy of use". You can provide your owns using requests lib for example.
- Examples:
- v = REST('https://example.com/rest/v1/') (Can omit trailing / if desired)
- v.sendMessage('hello?param1=1&param2=2')
- This will generate a GET message to https://example.com/rest/v1/hello?param1=1&param2=2, and return the
- deserialized JSON result or an exception
- v.sendMessage('hello?param1=1&param2=2', {'name': 'mario' })
- This will generate a POST message to https://example.com/rest/v1/hello?param1=1&param2=2, with json encoded
- body {'name': 'mario' }, and also returns
- the deserialized JSON result or raises an exception in case of error
- """
-
- def __init__(self, url):
- """
- Initializes the REST helper
- url is the full url of the REST API Base, as for example "https://example.com/rest/v1".
- @param url The url of the REST API Base. The trailing '/' can be included or omitted, as desired.
- """
- self.endpoint = url
-
- if self.endpoint[-1] != '/':
- self.endpoint += '/'
-
- # Some OSs ships very old python requests lib implementations, workaround them...
- try:
- self.newerRequestLib = requests.__version__.split('.')[0] >= '1'
- except Exception:
- self.newerRequestLib = False # I no version, guess this must be an old requests
-
- # Disable logging requests messages except for errors, ...
- logging.getLogger("requests").setLevel(logging.CRITICAL)
- # Tries to disable all warnings
- try:
- warnings.simplefilter("ignore") # Disables all warnings
- except Exception:
- pass
-
- def _getUrl(self, method):
- """
- Internal method
- Composes the URL based on "method"
- @param method: Method to append to base url for composition
- """
- url = self.endpoint + method
-
- return url
-
- def _request(self, url, data=None):
- """
- Launches the request
- @param url: The url to obtain
- @param data: if None, the request will be sent as a GET request. If != None, the request will be sent as a POST,
- with data serialized as JSON in the body.
- """
- try:
- if data is None:
- logger.debug('Requesting using GET (no data provided) {}'.format(url))
- # Old requests version does not support verify, but it do not checks ssl certificate by default
- if self.newerRequestLib:
- r = requests.get(url, verify=VERIFY_CERT, timeout=TIMEOUT)
- else:
- r = requests.get(url)
- else: # POST
- logger.debug('Requesting using POST {}, data: {}'.format(url, data))
- if self.newerRequestLib:
- r = requests.post(url, data=data, headers={'content-type': 'application/json'},
- verify=VERIFY_CERT, timeout=TIMEOUT)
- else:
- r = requests.post(url, data=data, headers={'content-type': 'application/json'})
-
- r = json.loads(r.content) # Using instead of r.json() to make compatible with old requests lib versions
- except requests.exceptions.RequestException as e:
- raise ConnectionError(e)
- except Exception as e:
- raise ConnectionError(exceptionToMessage(e))
-
- return r
-
- def sendMessage(self, msg, data=None, processData=True):
- """
- Sends a message to remote REST server
- @param data: if None or omitted, message will be a GET, else it will send a POST
- @param processData: if True, data will be serialized to json before sending, else, data will be sent as "raw"
- """
- logger.debug('Invoking post message {} with data {}'.format(msg, data))
-
- if processData and data is not None:
- data = json.dumps(data)
-
- url = self._getUrl(msg)
- logger.debug('Requesting {}'.format(url))
-
- return self._request(url, data)
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/__init__.py
deleted file mode 100644
index 0197f320..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/__init__.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-"""
-from __future__ import unicode_literals
-
-# On centos, old six release does not includes byte2int, nor six.PY2
-import six
-
-import modules
-from RESTApi import REST, RESTError
-
-try:
- with open('../VERSION', 'r') as v:
- VERSION = v.read().strip()
-except IOError:
- VERSION = '1.1.1b'
-
-__title__ = 'OpenGnsys Agent'
-__version__ = VERSION
-__build__ = 0x010750
-__author__ = 'Adolfo Gómez'
-__license__ = "BSD 3-clause"
-__copyright__ = "Copyright VirtualCable S.L.U."
-
-if not hasattr(six, 'byte2int'):
- if six.PY3:
- import operator
- six.byte2int = operator.itemgetter(0)
- else:
- def _byte2int(bs):
- return ord(bs[0])
- six.byte2int = _byte2int
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/certs.py b/admin/Sources/Clients/ogagent/src/opengnsys/certs.py
deleted file mode 100644
index e4c070e8..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/certs.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-
-from tempfile import gettempdir
-from os.path import exists, join
-
-CERTFILE = 'OGAgent.pem'
-
-
-def createSelfSignedCert(force=False):
-
- certFile = join(gettempdir(), CERTFILE)
-
- if exists(certFile) and not force:
- return certFile
-
- certData = '''-----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCb50K3mIznNklz
-yVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxbfxHbeRnoYTWV2nKk4+tHqmvz
-ujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqCfItWgL5pJopDpNHFul9Rn3ds
-PMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPmVLdF4uJ3Tuz8TSy2gWLs5aSr
-5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuDUGNBvBQFac1G7qUcMReeu8Zr
-DUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDqDUK1Oqs9X35yOQfDOAFYHiix
-PX0IsXOZAgMBAAECggEBAJi3000RrIUZUp6Ph0gzPMuCjDEEwWiQA7CPNX1gpb8O
-dp0WhkDhUroWIaICYPSXtOwUTtVjRqivMoxPy1Thg3EIoGC/rdeSdlXRHMEGicwJ
-yVyalFnatr5Xzg5wkxVh4XMd0zeDt7e3JD7s0QLo5lm1CEzd77qz6lhzFic5/1KX
-bzdULtTlq60dazg2hEbcS4OmM1UMCtRVDAsOIUIZPL0M9j1C1d1iEdYnh2xshKeG
-/GOfo95xsgdMlGjtv3hUT5ryKVoEsu+36rGb4VfhPfUvvoVbRx5QZpW+QvxaYh5E
-Fi0JEROozFwG31Y++8El7J3yQko8cFBa1lYYUwwpNAECgYEAykT+GiM2YxJ4uVF1
-OoKiE9BD53i0IG5j87lGPnWqzEwYBwnqjEKDTou+uzMGz3MDV56UEFNho7wUWh28
-LpEkjJB9QgbsugjxIBr4JoL/rYk036e/6+U8I95lvYWrzb+rBMIkRDYI7kbQD/mQ
-piYUpuCkTymNAu2RisK6bBzJslkCgYEAxVE23OQvkCeOV8hJNPZGpJ1mDS+TiOow
-oOScMZmZpail181eYbAfMsCr7ri812lSj98NvA2GNVLpddil6LtS1cQ5p36lFBtV
-xQUMZiFz4qVbEak+izL+vPaev/mXXsOcibAIQ+qI/0txFpNhJjpaaSy6vRCBYFmc
-8pgSoBnBI0ECgYAUKCn2atnpp5aWSTLYgNosBU4vDA1PShD14dnJMaqyr0aZtPhF
-v/8b3btFJoGgPMLxgWEZ+2U4ju6sSFhPf7FXvLJu2QfQRkHZRDbEh7t5DLpTK4Fp
-va9vl6Ml7uM/HsGpOLuqfIQJUs87OFCc7iCSvMJDDU37I7ekT2GKkpfbCQKBgBrE
-0NeY0WcSJrp7/oqD2sOcYurpCG/rrZs2SIZmGzUhMxaa0vIXzbO59dlWELB8pmnE
-Tf20K//x9qA5OxDe0PcVPukdQlH+/1zSOYNliG44FqnHtyd1TJ/gKVtMBiAiE4uO
-aSClod5Yosf4SJbCFd/s5Iyfv52NqsAyp1w3Aj/BAoGAVCnEiGUfyHlIR+UH4zZW
-GXJMeqdZLfcEIszMxLePkml4gUQhoq9oIs/Kw+L1DDxUwzkXN4BNTlFbOSu9gzK1
-dhuIUGfS6RPL88U+ivC3A0y2jT43oUMqe3hiRt360UQ1GXzp2dMnR9odSRB1wHoO
-IOjEBZ8341/c9ZHc5PCGAG8=
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIJAIrEIthCfxUCMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD
-VQQGEwJFUzEPMA0GA1UECAwGTWFkcmlkMREwDwYDVQQHDAhBbGNvcmNvbjEMMAoG
-A1UECgwDVURTMQ4wDAYDVQQLDAVBY3RvcjESMBAGA1UEAwwJVURTIEFjdG9yMSgw
-JgYJKoZIhvcNAQkBFhlzdXBwb3J0QHVkc2VudGVycHJpc2UuY29tMB4XDTE0MTAy
-NjIzNDEyNFoXDTI0MTAyMzIzNDEyNFowgY0xCzAJBgNVBAYTAkVTMQ8wDQYDVQQI
-DAZNYWRyaWQxETAPBgNVBAcMCEFsY29yY29uMQwwCgYDVQQKDANVRFMxDjAMBgNV
-BAsMBUFjdG9yMRIwEAYDVQQDDAlVRFMgQWN0b3IxKDAmBgkqhkiG9w0BCQEWGXN1
-cHBvcnRAdWRzZW50ZXJwcmlzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCb50K3mIznNklzyVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxb
-fxHbeRnoYTWV2nKk4+tHqmvzujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqC
-fItWgL5pJopDpNHFul9Rn3dsPMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPm
-VLdF4uJ3Tuz8TSy2gWLs5aSr5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuD
-UGNBvBQFac1G7qUcMReeu8ZrDUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDq
-DUK1Oqs9X35yOQfDOAFYHiixPX0IsXOZAgMBAAGjUDBOMB0GA1UdDgQWBBRShS90
-5lJTNvYPIEqP3GxWwG5iiDAfBgNVHSMEGDAWgBRShS905lJTNvYPIEqP3GxWwG5i
-iDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAU0Sp4gXhQmRVzq+7+
-vRFUkQuPj4Ga/d9r5Wrbg3hck3+5pwe9/7APoq0P/M0DBhQpiJKjrD6ydUevC+Y/
-43ZOJPhMlNw0o6TdQxOkX6FDwQanLLs7sfvJvqtVzYn3nuRFKT3dvl7Zg44QMw2M
-ay42q59fAcpB4LaDx/i7gOYSS5eca3lYW7j7YSr/+ozXK2KlgUkuCUHN95lOq+dF
-trmV9mjzM4CNPZqKSE7kpHRywgrXGPCO000NvEGSYf82AtgRSFKiU8NWLQSEPdcB
-k//2dsQZw2cRZ8DrC2B6Tb3M+3+CA6wVyqfqZh1SZva3LfGvq/C+u+ItguzPqNpI
-xtvM
------END CERTIFICATE-----'''
- with open(certFile, "wt") as f:
- f.write(certData)
-
- return certFile
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/config.py b/admin/Sources/Clients/ogagent/src/opengnsys/config.py
deleted file mode 100644
index d1f3ede6..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/config.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import, wildcard-import
-from __future__ import unicode_literals
-
-from ConfigParser import SafeConfigParser
-
-config = None
-
-def readConfig(client=False):
- '''
- Reads configuration file
- If client is False, will read ogagent.cfg as configuration
- If client is True, will read ogclient.cfg as configuration
-
- This is this way so we can protect ogagent.cfg against reading for non admin users on all platforms.
- '''
- cfg = SafeConfigParser()
- if client is True:
- fname = 'ogclient.cfg'
- else:
- fname = 'ogagent.cfg'
-
- if len(cfg.read('cfg/{}'.format(fname))) == 0:
- # No configuration found
- return None
-
- return cfg
- \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/httpserver.py b/admin/Sources/Clients/ogagent/src/opengnsys/httpserver.py
deleted file mode 100644
index a06ae6bb..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/httpserver.py
+++ /dev/null
@@ -1,150 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2015 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import,wildcard-import
-from __future__ import unicode_literals, print_function
-
-# Pydev can't parse "six.moves.xxxx" because it is loaded lazy
-import six
-from six.moves.socketserver import ThreadingMixIn # @UnresolvedImport
-from six.moves.BaseHTTPServer import BaseHTTPRequestHandler # @UnresolvedImport
-from six.moves.BaseHTTPServer import HTTPServer # @UnresolvedImport
-from six.moves.urllib.parse import unquote # @UnresolvedImport
-
-import json
-import threading
-import ssl
-
-from .utils import exceptionToMessage
-from .certs import createSelfSignedCert
-from .log import logger
-
-class HTTPServerHandler(BaseHTTPRequestHandler):
- service = None
- protocol_version = 'HTTP/1.0'
- server_version = 'OpenGnsys Agent Server'
- sys_version = ''
-
- def sendJsonError(self, code, message):
- self.send_response(code)
- self.send_header('Content-type', 'application/json')
- self.end_headers()
- self.wfile.write(json.dumps({'error': message}))
- return
-
- def sendJsonResponse(self, data):
- self.send_response(200)
- data = json.dumps(data)
- self.send_header('Content-type', 'application/json')
- self.send_header('Content-Length', len(data))
- self.end_headers()
- # Send the html message
- self.wfile.write(data)
-
-
- # parseURL
- def parseUrl(self):
- # Very simple path & params splitter
- path = self.path.split('?')[0][1:].split('/')
-
- try:
- params = dict((v[0], unquote(v[1])) for v in (v.split('=') for v in self.path.split('?')[1].split('&')))
- except Exception:
- params = {}
-
- for v in self.service.modules:
- if v.name == path[0]: # Case Sensitive!!!!
- return (v, path[1:], params)
-
- return (None, path, params)
-
- def notifyMessage(self, module, path, getParams, postParams):
- '''
- Locates witch module will process the message based on path (first folder on url path)
- '''
- try:
- data = module.processServerMessage(path, getParams, postParams, self)
- self.sendJsonResponse(data)
- except Exception as e:
- logger.exception()
- self.sendJsonError(500, exceptionToMessage(e))
-
- def do_GET(self):
- module, path, params = self.parseUrl()
-
- self.notifyMessage(module, path, params, None)
-
- def do_POST(self):
- module, path, getParams = self.parseUrl()
-
- # Tries to get JSON content (UTF-8 encoded)
- try:
- length = int(self.headers.getheader('content-length'))
- content = self.rfile.read(length).decode('utf-8')
- logger.debug('length: {}, content >>{}<<'.format(length, content))
- postParams = json.loads(content)
- except Exception as e:
- self.sendJsonError(500, exceptionToMessage(e))
-
- self.notifyMessage(module, path, getParams, postParams)
-
-
- def log_error(self, fmt, *args):
- logger.error('HTTP ' + fmt % args)
-
- def log_message(self, fmt, *args):
- logger.info('HTTP ' + fmt % args)
-
-
-class HTTPThreadingServer(ThreadingMixIn, HTTPServer):
- pass
-
-class HTTPServerThread(threading.Thread):
- def __init__(self, address, service):
- super(self.__class__, self).__init__()
-
- HTTPServerHandler.service = service # Keep tracking of service so we can intercact with it
-
- self.certFile = createSelfSignedCert()
- self.server = HTTPThreadingServer(address, HTTPServerHandler)
- self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.certFile, server_side=True)
-
- logger.debug('Initialized HTTPS Server thread on {}'.format(address))
-
- def getServerUrl(self):
- return 'https://{}:{}/'.format(self.server.server_address[0], self.server.server_address[1])
-
- def stop(self):
- self.server.shutdown()
-
- def run(self):
- self.server.serve_forever()
-
-
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/ipc.py b/admin/Sources/Clients/ogagent/src/opengnsys/ipc.py
deleted file mode 100644
index dd3663df..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/ipc.py
+++ /dev/null
@@ -1,423 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import socket
-import threading
-import six
-import traceback
-import json
-
-from opengnsys.utils import toUnicode
-from opengnsys.log import logger
-
-# The IPC Server will wait for connections from clients
-# Clients will open socket, and wait for data from server
-# The messages sent (from server) will be the following (subject to future changes):
-# Message_id Data Action
-# ------------ -------- --------------------------
-# MSG_LOGOFF None Logout user from session
-# MSG_MESSAGE message,level Display a message with level (INFO, WARN, ERROR, FATAL) # TODO: Include level, right now only has message
-# MSG_POPUP title,message Display a popup box with a title
-# MSG_SCRIPT python script Execute an specific python script INSIDE CLIENT environment (this messages is not sent right now)
-# The messages received (sent from client) will be the following:
-# Message_id Data Action
-# ------------ -------- --------------------------
-# REQ_LOGOUT Logout user from session
-# REQ_INFORMATION None Request information from ipc server (maybe configuration parameters in a near future)
-# REQ_LOGIN python script Execute an specific python script INSIDE CLIENT environment (this messages is not sent right now)
-#
-# All messages are in the form:
-# BYTE
-# 0 1-2 3 4 ...
-# MSG_ID DATA_LENGTH (little endian) Data (can be 0 length)
-# With a previos "MAGIC" header in fron of each message
-
-# Client messages
-MSG_LOGOFF = 0xA1 # Request log off from an user
-MSG_MESSAGE = 0xB2
-MSG_POPUP = 0xB3
-MSG_SCRIPT = 0xC3
-
-# Request messages
-REQ_MESSAGE = 0xD4
-REQ_POPUP = 0xD5
-REQ_LOGIN = 0xE5
-REQ_LOGOUT = 0xF6
-
-# Reverse msgs dict for debugging
-REV_DICT = {
- MSG_LOGOFF: 'MSG_LOGOFF',
- MSG_MESSAGE: 'MSG_MESSAGE',
- MSG_POPUP: 'MSG_POPUP',
- MSG_SCRIPT: 'MSG_SCRIPT',
- REQ_LOGIN: 'REQ_LOGIN',
- REQ_LOGOUT: 'REQ_LOGOUT',
- REQ_MESSAGE: 'REQ_MESSAGE'
-}
-
-MAGIC = b'\x4F\x47\x41\x00' # OGA in hexa with a padded 0 to the right
-
-
-# States for client processor
-ST_SECOND_BYTE = 0x01
-ST_RECEIVING = 0x02
-ST_PROCESS_MESSAGE = 0x02
-
-
-class ClientProcessor(threading.Thread):
- def __init__(self, parent, clientSocket):
- super(self.__class__, self).__init__()
- self.parent = parent
- self.clientSocket = clientSocket
- self.running = False
- self.messages = six.moves.queue.Queue(32) # @UndefinedVariable
-
- def stop(self):
- logger.debug('Stoping client processor')
- self.running = False
-
- def processRequest(self, msg, data):
- logger.debug('Got Client message {}={}'.format(msg, REV_DICT.get(msg)))
- if self.parent.clientMessageProcessor is not None:
- self.parent.clientMessageProcessor(msg, data)
-
- def run(self):
- self.running = True
- self.clientSocket.setblocking(0)
-
- state = None
- recv_msg = None
- recv_data = None
- while self.running:
- try:
- counter = 1024
- while counter > 0: # So we process at least the incoming queue every XX bytes readed
- counter -= 1
- b = self.clientSocket.recv(1)
- if b == b'':
- # Client disconnected
- self.running = False
- break
- buf = six.byte2int(b) # Empty buffer, this is set as non-blocking
- if state is None:
- if buf in (REQ_MESSAGE, REQ_LOGIN, REQ_LOGOUT):
- logger.debug('State set to {}'.format(buf))
- state = buf
- recv_msg = buf
- continue # Get next byte
- else:
- logger.debug('Got unexpected data {}'.format(buf))
- elif state in (REQ_MESSAGE, REQ_LOGIN, REQ_LOGOUT):
- logger.debug('First length byte is {}'.format(buf))
- msg_len = buf
- state = ST_SECOND_BYTE
- continue
- elif state == ST_SECOND_BYTE:
- msg_len += buf << 8
- logger.debug('Second length byte is {}, len is {}'.format(buf, msg_len))
- if msg_len == 0:
- self.processRequest(recv_msg, None)
- state = None
- break
- state = ST_RECEIVING
- recv_data = b''
- continue
- elif state == ST_RECEIVING:
- recv_data += six.int2byte(buf)
- msg_len -= 1
- if msg_len == 0:
- self.processRequest(recv_msg, recv_data)
- recv_data = None
- state = None
- break
- else:
- logger.debug('Got invalid message from request: {}, state: {}'.format(buf, state))
- except socket.error as e:
- # If no data is present, no problem at all, pass to check messages
- pass
- except Exception as e:
- tb = traceback.format_exc()
- logger.error('Error: {}, trace: {}'.format(e, tb))
-
- if self.running is False:
- break
-
- try:
- msg = self.messages.get(block=True, timeout=1)
- except six.moves.queue.Empty: # No message got in time @UndefinedVariable
- continue
-
- logger.debug('Got message {}={}'.format(msg, REV_DICT.get(msg[0])))
-
- try:
- m = msg[1] if msg[1] is not None else b''
- l = len(m)
- data = MAGIC + six.int2byte(msg[0]) + six.int2byte(l & 0xFF) + six.int2byte(l >> 8) + m
- try:
- self.clientSocket.sendall(data)
- except socket.error as e:
- # Send data error
- logger.debug('Socket connection is no more available: {}'.format(e.args))
- self.running = False
- except Exception as e:
- logger.error('Invalid message in queue: {}'.format(e))
-
- logger.debug('Client processor stopped')
- try:
- self.clientSocket.close()
- except Exception:
- pass # If can't close, nothing happens, just end thread
-
-
-class ServerIPC(threading.Thread):
-
- def __init__(self, listenPort, clientMessageProcessor=None):
- super(self.__class__, self).__init__()
- self.port = listenPort
- self.running = False
- self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self.threads = []
- self.clientMessageProcessor = clientMessageProcessor
-
- def stop(self):
- logger.debug('Stopping Server IPC')
- self.running = False
- for t in self.threads:
- t.stop()
- socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect(('localhost', self.port))
- self.serverSocket.close()
-
- for t in self.threads:
- t.join()
-
- def sendMessage(self, msgId, msgData):
- '''
- Notify message to all listening threads
- '''
- logger.debug('Sending message {}({}),{} to all clients'.format(msgId, REV_DICT.get(msgId), msgData))
-
- # Convert to bytes so length is correctly calculated
- if isinstance(msgData, six.text_type):
- msgData = msgData.encode('utf8')
-
- for t in self.threads:
- if t.isAlive():
- logger.debug('Sending to {}'.format(t))
- t.messages.put((msgId, msgData))
-
- def sendLoggofMessage(self):
- self.sendMessage(MSG_LOGOFF, '')
-
- def sendMessageMessage(self, message):
- self.sendMessage(MSG_MESSAGE, message)
-
- def sendPopupMessage(self, title, message):
- self.sendMessage(MSG_POPUP, {'title':title, 'message':message})
-
- def sendScriptMessage(self, script):
- self.sendMessage(MSG_SCRIPT, script)
-
- def cleanupFinishedThreads(self):
- '''
- Cleans up current threads list
- '''
- aliveThreads = []
- for t in self.threads:
- if t.isAlive():
- logger.debug('Thread {} is alive'.format(t))
- aliveThreads.append(t)
- self.threads[:] = aliveThreads
-
- def run(self):
- self.running = True
-
- self.serverSocket.bind(('localhost', self.port))
- self.serverSocket.setblocking(1)
- self.serverSocket.listen(4)
-
- while True:
- try:
- (clientSocket, address) = self.serverSocket.accept()
- # Stop processing if thread is mean to stop
- if self.running is False:
- break
- logger.debug('Got connection from {}'.format(address))
-
- self.cleanupFinishedThreads() # House keeping
-
- logger.debug('Starting new thread, current: {}'.format(self.threads))
- t = ClientProcessor(self, clientSocket)
- self.threads.append(t)
- t.start()
- except Exception as e:
- logger.error('Got an exception on Server ipc thread: {}'.format(e))
-
-
-class ClientIPC(threading.Thread):
- def __init__(self, listenPort):
- super(ClientIPC, self).__init__()
- self.port = listenPort
- self.running = False
- self.clientSocket = None
- self.messages = six.moves.queue.Queue(32) # @UndefinedVariable
-
- self.connect()
-
- def stop(self):
- self.running = False
-
- def getMessage(self):
- while self.running:
- try:
- return self.messages.get(timeout=1)
- except six.moves.queue.Empty: # @UndefinedVariable
- continue
-
- return None
-
- def sendRequestMessage(self, msg, data=None):
- logger.debug('Sending request for msg: {}({}), {}'.format(msg, REV_DICT.get(msg), data))
- if data is None:
- data = b''
-
- if isinstance(data, six.text_type): # Convert to bytes if necessary
- data = data.encode('utf-8')
-
- l = len(data)
- msg = six.int2byte(msg) + six.int2byte(l & 0xFF) + six.int2byte(l >> 8) + data
- self.clientSocket.sendall(msg)
-
- def sendLogin(self, username, language):
- self.sendRequestMessage(REQ_LOGIN, username+','+language)
-
- def sendLogout(self, username):
- self.sendRequestMessage(REQ_LOGOUT, username)
-
- def sendMessage(self, module, message, data=None):
- '''
- Sends a message "message" with data (data will be encoded as json, so ensure that it is serializable)
- @param module: Module that will receive this message
- @param message: Message to send. This message is "customized", and understand by modules
- @param data: Data to be send as message companion
- '''
- msg = '\0'.join((module, message, json.dumps(data)))
- self.sendRequestMessage(REQ_MESSAGE, msg)
-
- def messageReceived(self):
- '''
- Override this method to automatically get notified on new message
- received. Message is at self.messages queue
- '''
- pass
-
- def receiveBytes(self, number):
- msg = b''
- while self.running and len(msg) < number:
- try:
- buf = self.clientSocket.recv(number - len(msg))
- if buf == b'':
- logger.debug('Buf {}, msg {}({})'.format(buf, msg, REV_DICT.get(msg)))
- self.running = False
- break
- msg += buf
- except socket.timeout:
- pass
-
- if self.running is False:
- logger.debug('Not running, returning None')
- return None
- return msg
-
- def connect(self):
- self.clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.clientSocket.connect(('localhost', self.port))
- self.clientSocket.settimeout(2) # Static, custom socket timeout of 2 seconds for local connection (no network)
-
- def run(self):
- self.running = True
-
- while self.running:
- try:
- msg = b''
- # We look for magic message header
- while self.running: # Wait for MAGIC
- try:
- buf = self.clientSocket.recv(len(MAGIC) - len(msg))
- if buf == b'':
- self.running = False
- break
- msg += buf
- if len(msg) != len(MAGIC):
- continue # Do not have message
- if msg != MAGIC: # Skip first byte an continue searchong
- msg = msg[1:]
- continue
- break
- except socket.timeout: # Timeout is here so we can get stop thread
- continue
-
- if self.running is False:
- break
-
- # Now we get message basic data (msg + datalen)
- msg = bytearray(self.receiveBytes(3))
-
- # We have the magic header, here comes the message itself
- if msg is None:
- continue
-
- msgId = msg[0]
- dataLen = msg[1] + (msg[2] << 8)
- if msgId not in (MSG_LOGOFF, MSG_MESSAGE, MSG_SCRIPT):
- raise Exception('Invalid message id: {}'.format(msgId))
-
- data = self.receiveBytes(dataLen)
- if data is None:
- continue
-
- self.messages.put((msgId, data))
- self.messageReceived()
-
- except socket.error as e:
- logger.error('Communication with server got an error: {}'.format(toUnicode(e.strerror)))
- self.running = False
- return
- except Exception as e:
- tb = traceback.format_exc()
- logger.error('Error: {}, trace: {}'.format(e, tb))
-
- try:
- self.clientSocket.close()
- except Exception:
- pass # If can't close, nothing happens, just end thread
-
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/OGAgentService.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/OGAgentService.py
deleted file mode 100644
index 29a238da..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/OGAgentService.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.service import CommonService
-from opengnsys.service import IPC_PORT
-from opengnsys import ipc
-
-from opengnsys.log import logger
-
-from opengnsys.linux.daemon import Daemon
-
-import sys
-import signal
-import json
-
-try:
- from prctl import set_proctitle # @UnresolvedImport
-except Exception: # Platform may not include prctl, so in case it's not available, we let the "name" as is
- def set_proctitle(_):
- pass
-
-
-class OGAgentSvc(Daemon, CommonService):
- def __init__(self, args=None):
- Daemon.__init__(self, '/var/run/opengnsys-agent.pid')
- CommonService.__init__(self)
-
- def run(self):
- logger.debug('** Running Daemon **')
- set_proctitle('OGAgent')
-
- self.initialize()
-
- # Call modules initialization
- # They are called in sequence, no threading is done at this point, so ensure modules onActivate always returns
-
-
- # *********************
- # * Main Service loop *
- # *********************
- # Counter used to check ip changes only once every 10 seconds, for
- # example
- try:
- while self.isAlive:
- # In milliseconds, will break
- self.doWait(1000)
- except (KeyboardInterrupt, SystemExit) as e:
- logger.error('Requested exit of main loop')
- except Exception as e:
- logger.exception()
- logger.error('Caught exception on main loop: {}'.format(e))
-
- self.terminate()
-
- self.notifyStop()
-
- def signal_handler(self, signal, frame):
- self.isAlive = False
- sys.stderr.write("signal handler: {}".format(signal))
-
-
-def usage():
- sys.stderr.write("usage: {} start|stop|restart|fg|login 'username'|logout 'username'|message 'module' 'message' 'json'\n".format(sys.argv[0]))
- sys.exit(2)
-
-if __name__ == '__main__':
- logger.setLevel('INFO')
-
- if len(sys.argv) == 5 and sys.argv[1] == 'message':
- logger.debug('Running client opengnsys')
- client = None
- try:
- client = ipc.ClientIPC(IPC_PORT)
- client.sendMessage(sys.argv[2], sys.argv[3], json.loads(sys.argv[4]))
- sys.exit(0)
- except Exception as e:
- logger.error(e)
-
-
- if len(sys.argv) == 3 and sys.argv[1] in ('login', 'logout'):
- logger.debug('Running client opengnsys')
- client = None
- try:
- client = ipc.ClientIPC(IPC_PORT)
- if 'login' == sys.argv[1]:
- client.sendLogin(sys.argv[2])
- sys.exit(0)
- elif 'logout' == sys.argv[1]:
- client.sendLogout(sys.argv[2])
- sys.exit(0)
- else:
- usage()
- except Exception as e:
- logger.error(e)
- elif len(sys.argv) != 2:
- usage()
-
- logger.debug('Executing actor')
- daemon = OGAgentSvc()
-
- signal.signal(signal.SIGTERM, daemon.signal_handler)
- signal.signal(signal.SIGINT, daemon.signal_handler)
-
- if len(sys.argv) == 2:
- if 'start' == sys.argv[1]:
- daemon.start()
- elif 'stop' == sys.argv[1]:
- daemon.stop()
- elif 'restart' == sys.argv[1]:
- daemon.restart()
- elif 'fg' == sys.argv[1]:
- daemon.run()
- else:
- usage()
- sys.exit(0)
- else:
- usage()
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/__init__.py
deleted file mode 100644
index 3a98c780..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/__init__.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/daemon.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/daemon.py
deleted file mode 100644
index 3753808a..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/daemon.py
+++ /dev/null
@@ -1,182 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: : http://www.jejik.com/authors/sander_marechal/
-@see: : http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
-'''
-
-from __future__ import unicode_literals
-import sys
-import os
-import time
-import atexit
-from opengnsys.log import logger
-
-from signal import SIGTERM
-
-
-class Daemon:
- """
- A generic daemon class.
-
- Usage: subclass the Daemon class and override the run() method
- """
- def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
- self.stdin = stdin
- self.stdout = stdout
- self.stderr = stderr
- self.pidfile = pidfile
-
- def daemonize(self):
- """
- do the UNIX double-fork magic, see Stevens' "Advanced
- Programming in the UNIX Environment" for details (ISBN 0201563177)
- http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
- """
- try:
- pid = os.fork()
- if pid > 0:
- # exit first parent
- sys.exit(0)
- except OSError as e:
- logger.error("fork #1 error: {}".format(e))
- sys.stderr.write("fork #1 failed: {}\n".format(e))
- sys.exit(1)
-
- # decouple from parent environment
- os.chdir("/")
- os.setsid()
- os.umask(0)
-
- # do second fork
- try:
- pid = os.fork()
- if pid > 0:
- # exit from second parent
- sys.exit(0)
- except OSError as e:
- logger.error("fork #2 error: {}".format(e))
- sys.stderr.write("fork #2 failed: {}\n".format(e))
- sys.exit(1)
-
- # redirect standard file descriptors
- sys.stdout.flush()
- sys.stderr.flush()
- si = open(self.stdin, 'r')
- so = open(self.stdout, 'a+')
- se = open(self.stderr, 'a+', 0)
- os.dup2(si.fileno(), sys.stdin.fileno())
- os.dup2(so.fileno(), sys.stdout.fileno())
- os.dup2(se.fileno(), sys.stderr.fileno())
-
- # write pidfile
- atexit.register(self.delpid)
- pid = str(os.getpid())
- with open(self.pidfile, 'w+') as f:
- f.write("{}\n".format(pid))
-
- def delpid(self):
- try:
- os.remove(self.pidfile)
- except Exception:
- # Not found/not permissions or whatever...
- pass
-
- def start(self):
- """
- Start the daemon
- """
- logger.debug('Starting daemon')
- # Check for a pidfile to see if the daemon already runs
- try:
- pf = open(self.pidfile, 'r')
- pid = int(pf.read().strip())
- pf.close()
- except IOError:
- pid = None
-
- if pid:
- message = "pidfile {} already exist. Daemon already running?\n".format(pid)
- logger.error(message)
- sys.stderr.write(message)
- sys.exit(1)
-
- # Start the daemon
- self.daemonize()
- try:
- self.run()
- except Exception as e:
- logger.error('Exception running process: {}'.format(e))
-
- if os.path.exists(self.pidfile):
- os.remove(self.pidfile)
-
- def stop(self):
- """
- Stop the daemon
- """
- # Get the pid from the pidfile
- try:
- pf = open(self.pidfile, 'r')
- pid = int(pf.read().strip())
- pf.close()
- except IOError:
- pid = None
-
- if pid is None:
- message = "pidfile {} does not exist. Daemon not running?\n".format(self.pidfile)
- logger.info(message)
- # sys.stderr.write(message)
- return # not an error in a restart
-
- # Try killing the daemon process
- try:
- for i in range(10):
- os.kill(pid, SIGTERM)
- time.sleep(1)
- except OSError as err:
- if err.errno == 3: # No such process
- if os.path.exists(self.pidfile):
- os.remove(self.pidfile)
- else:
- sys.stderr.write(err)
- sys.exit(1)
-
- def restart(self):
- """
- Restart the daemon
- """
- self.stop()
- self.start()
-
- # Overridables
- def run(self):
- """
- You should override this method when you subclass Daemon. It will be called after the process has been
- daemonized by start() or restart().
- """
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/log.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/log.py
deleted file mode 100644
index dc54e198..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/log.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import logging
-import os
-import tempfile
-import six
-
-# Valid logging levels, from UDS Broker (uds.core.utils.log)
-OTHER, DEBUG, INFO, WARN, ERROR, FATAL = (10000 * (x + 1) for x in six.moves.xrange(6)) # @UndefinedVariable
-
-
-class LocalLogger(object):
- def __init__(self):
- # tempdir is different for "user application" and "service"
- # service wil get c:\windows\temp, while user will get c:\users\XXX\temp
- # Try to open logger at /var/log path
- # If it fails (access denied normally), will try to open one at user's home folder, and if
- # agaim it fails, open it at the tmpPath
-
- for logDir in ('/var/log', os.path.expanduser('~'), tempfile.gettempdir()):
- try:
- fname = os.path.join(logDir, 'opengnsys.log')
- logging.basicConfig(
- filename=fname,
- filemode='a',
- format='%(levelname)s %(asctime)s %(message)s',
- level=logging.DEBUG
- )
- self.logger = logging.getLogger('opengnsys')
- os.chmod(fname, 0o0600)
- return
- except Exception:
- pass
-
- # Logger can't be set
- self.logger = None
-
- def log(self, level, message):
- # Debug messages are logged to a file
- # our loglevels are 10000 (other), 20000 (debug), ....
- # logging levels are 10 (debug), 20 (info)
- # OTHER = logging.NOTSET
- self.logger.log(int(level / 1000) - 10, message)
-
- def isWindows(self):
- return False
-
- def isLinux(self):
- return True
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/operations.py
deleted file mode 100644
index f3236e26..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/operations.py
+++ /dev/null
@@ -1,297 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import socket
-import platform
-import fcntl
-import os
-import locale
-import ctypes # @UnusedImport
-import ctypes.util
-import subprocess
-import struct
-import array
-import six
-import distro
-from opengnsys import utils
-from .renamer import rename
-
-
-def _getMacAddr(ifname):
- '''
- Returns the mac address of an interface
- Mac is returned as unicode utf-8 encoded
- '''
- if isinstance(ifname, list):
- return dict([(name, _getMacAddr(name)) for name in ifname])
- if isinstance(ifname, six.text_type):
- ifname = ifname.encode('utf-8') # If unicode, convert to bytes (or str in python 2.7)
- try:
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- info = bytearray(fcntl.ioctl(s.fileno(), 0x8927, struct.pack(str('256s'), ifname[:15])))
- return six.text_type(''.join(['%02x:' % char for char in info[18:24]])[:-1])
- except Exception:
- return None
-
-
-def _getIpAddr(ifname):
- '''
- Returns the ip address of an interface
- Ip is returned as unicode utf-8 encoded
- '''
- if isinstance(ifname, list):
- return dict([(name, _getIpAddr(name)) for name in ifname])
- if isinstance(ifname, six.text_type):
- ifname = ifname.encode('utf-8') # If unicode, convert to bytes (or str in python 2.7)
- try:
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- return six.text_type(socket.inet_ntoa(fcntl.ioctl(
- s.fileno(),
- 0x8915, # SIOCGIFADDR
- struct.pack(str('256s'), ifname[:15])
- )[20:24]))
- except Exception:
- return None
-
-
-def _getInterfaces():
- '''
- Returns a list of interfaces names coded in utf-8
- '''
- max_possible = 128 # arbitrary. raise if needed.
- space = max_possible * 16
- if platform.architecture()[0] == '32bit':
- offset, length = 32, 32
- elif platform.architecture()[0] == '64bit':
- offset, length = 16, 40
- else:
- raise OSError('Unknown arquitecture {0}'.format(platform.architecture()[0]))
-
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- names = array.array(str('B'), b'\0' * space)
- outbytes = struct.unpack(str('iL'), fcntl.ioctl(
- s.fileno(),
- 0x8912, # SIOCGIFCONF
- struct.pack(str('iL'), space, names.buffer_info()[0])
- ))[0]
- namestr = names.tostring()
- # return namestr, outbytes
- return [namestr[i:i + offset].split(b'\0', 1)[0].decode('utf-8') for i in range(0, outbytes, length)]
-
-
-def _getIpAndMac(ifname):
- ip, mac = _getIpAddr(ifname), _getMacAddr(ifname)
- return (ip, mac)
-
-
-def getComputerName():
- '''
- Returns computer name, with no domain
- '''
- return socket.gethostname().split('.')[0]
-
-
-def getNetworkInfo():
- '''
- Obtains a list of network interfaces
- @return: A "generator" of elements, that are dict-as-object, with this elements:
- name: Name of the interface
- mac: mac of the interface
- ip: ip of the interface
- '''
- for ifname in _getInterfaces():
- ip, mac = _getIpAndMac(ifname)
- if mac != '00:00:00:00:00:00': # Skips local interfaces
- yield utils.Bunch(name=ifname, mac=mac, ip=ip)
-
-
-def getDomainName():
- return ''
-
-
-def getLinuxVersion():
- """
- Returns the version of the Linux distribution
- """
- return distro.os_release_attr('pretty_name')
-
-
-def reboot(flags=0):
- '''
- Simple reboot using os command
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- # Check for OpenGnsys Client or GNU/Linux distribution.
- if os.path.exists('/scripts/oginit'):
- subprocess.call('source /opt/opengnsys/etc/preinit/loadenviron.sh; /opt/opengnsys/scripts/reboot', shell=True)
- else:
- subprocess.call(['/sbin/reboot'])
-
-
-def poweroff(flags=0):
- '''
- Simple poweroff using os command
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- # Check for OpenGnsys Client or GNU/Linux distribution.
- if os.path.exists('/scripts/oginit'):
- subprocess.call('source /opt/opengnsys/etc/preinit/loadenviron.sh; /opt/opengnsys/scripts/poweroff', shell=True)
- else:
- subprocess.call(['/sbin/poweroff'])
-
-
-def logoff():
- '''
- Kills all curent user processes, which must send a logogof
- caveat: If the user has other sessions, will also disconnect from them
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- subprocess.call(['/usr/bin/pkill', '-u', os.environ['USER']])
-
-
-def renameComputer(newName):
- rename(newName)
-
-
-def joinDomain(domain, ou, account, password, executeInOneStep=False):
- pass
-
-
-def changeUserPassword(user, oldPassword, newPassword):
- '''
- Simple password change for user using command line
- '''
- os.system('echo "{1}\n{1}" | /usr/bin/passwd {0} 2> /dev/null'.format(user, newPassword))
-
-
-class XScreenSaverInfo(ctypes.Structure):
- _fields_ = [('window', ctypes.c_long),
- ('state', ctypes.c_int),
- ('kind', ctypes.c_int),
- ('til_or_since', ctypes.c_ulong),
- ('idle', ctypes.c_ulong),
- ('eventMask', ctypes.c_ulong)]
-
-# Initialize xlib & xss
-try:
- xlibPath = ctypes.util.find_library('X11')
- xssPath = ctypes.util.find_library('Xss')
- xlib = ctypes.cdll.LoadLibrary(xlibPath)
- xss = ctypes.cdll.LoadLibrary(xssPath)
-
- # Fix result type to XScreenSaverInfo Structure
- xss.XScreenSaverQueryExtension.restype = ctypes.c_int
- xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo) # Result in a XScreenSaverInfo structure
-except Exception: # Libraries not accesible, not found or whatever..
- xlib = xss = None
-
-
-def initIdleDuration(atLeastSeconds):
- '''
- On linux we set the screensaver to at least required seconds, or we never will get "idle"
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- subprocess.call(['/usr/bin/xset', 's', '{}'.format(atLeastSeconds + 30)])
- # And now reset it
- subprocess.call(['/usr/bin/xset', 's', 'reset'])
-
-
-def getIdleDuration():
- '''
- Returns idle duration, in seconds
- '''
- if xlib is None or xss is None:
- return 0 # Libraries not available
-
- # production code might want to not hardcode the offset 16...
- display = xlib.XOpenDisplay(None)
-
- event_base = ctypes.c_int()
- error_base = ctypes.c_int()
-
- available = xss.XScreenSaverQueryExtension(display, ctypes.byref(event_base), ctypes.byref(error_base))
- if available != 1:
- return 0 # No screen saver is available, no way of getting idle
-
- info = xss.XScreenSaverAllocInfo()
- xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), info)
-
- if info.contents.state != 0:
- return 3600 * 100 * 1000 # If screen saver is active, return a high enough value
-
- return info.contents.idle / 1000.0
-
-
-def getCurrentUser():
- '''
- Returns current logged in user
- '''
- return os.environ['USER']
-
-
-def getSessionLanguage():
- '''
- Returns the user's session language
- '''
- return locale.getdefaultlocale()[0]
-
-
-def showPopup(title, message):
- '''
- Displays a message box on user's session (during 1 min).
- '''
- return subprocess.call('zenity --info --timeout 60 --title "{}" --text "{}"'.format(title, message), shell=True)
-
-
-def get_etc_path():
- """
- :return:
- Returns etc directory path.
- """
- return os.sep + 'etc'
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/__init__.py
deleted file mode 100644
index 27198dcf..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/__init__.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import platform
-import os
-import sys
-import pkgutil
-
-from opengnsys.log import logger
-
-renamers = {}
-
-
-# Renamers now are for IPv4 only addresses
-def rename(newName):
- distribution = platform.linux_distribution()[0].lower().strip()
- if distribution in renamers:
- return renamers[distribution](newName)
-
- # Try Debian renamer, simplest one
- logger.info('Renamer for platform "{0}" not found, tryin debian renamer'.format(distribution))
- return renamers['debian'](newName)
-
-
-# Do load of packages
-def _init():
- pkgpath = os.path.dirname(sys.modules[__name__].__file__)
- for _, name, _ in pkgutil.iter_modules([pkgpath]):
- __import__(__name__ + '.' + name, globals(), locals())
-
-_init() \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/debian.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/debian.py
deleted file mode 100644
index be55e003..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/debian.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.linux.renamer import renamers
-from opengnsys.log import logger
-
-import os
-
-
-def rename(newName):
- '''
- Debian renamer
- Expects new host name on newName
- Host does not needs to be rebooted after renaming
- '''
- logger.debug('using Debian renamer')
-
- with open('/etc/hostname', 'w') as hostname:
- hostname.write(newName)
-
- # Force system new name
- os.system('/bin/hostname %s' % newName)
-
- # add name to "hosts"
- with open('/etc/hosts', 'r') as hosts:
- lines = hosts.readlines()
- with open('/etc/hosts', 'w') as hosts:
- hosts.write("127.0.1.1\t%s\n" % newName)
- for l in lines:
- if l[:9] == '127.0.1.1': # Skips existing 127.0.1.1. if it already exists
- continue
- hosts.write(l)
-
- return True
-
-# All names in lower case
-renamers['debian'] = rename
-renamers['ubuntu'] = rename
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/opensuse.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/opensuse.py
deleted file mode 100644
index a2d29a5c..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/opensuse.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.linux.renamer import renamers
-from opengnsys.log import logger
-
-import os
-
-
-def rename(newName):
- '''
- RH, Centos, Fedora Renamer
- Expects new host name on newName
- Host does not needs to be rebooted after renaming
- '''
- logger.debug('using SUSE renamer')
-
- with open('/etc/hostname', 'w') as hostname:
- hostname.write(newName)
-
- # Force system new name
- os.system('/bin/hostname %s' % newName)
-
- # add name to "hosts"
- with open('/etc/hosts', 'r') as hosts:
- lines = hosts.readlines()
- with open('/etc/hosts', 'w') as hosts:
- hosts.write("127.0.1.1\t{}\n".format(newName))
- for l in lines:
- if l[:9] != '127.0.1.1': # Skips existing 127.0.1.1. if it already exists
- hosts.write(l)
-
- return True
-
-# All names in lower case
-renamers['opensuse'] = rename
-renamers['suse'] = rename
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/redhat.py b/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/redhat.py
deleted file mode 100644
index 8821a81c..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/linux/renamer/redhat.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.linux.renamer import renamers
-from opengnsys.log import logger
-
-import os
-
-
-def rename(newName):
- '''
- RH, Centos, Fedora Renamer
- Expects new host name on newName
- Host does not needs to be rebooted after renaming
- '''
- logger.debug('using RH renamer')
-
- with open('/etc/hostname', 'w') as hostname:
- hostname.write(newName)
-
- # Force system new name
- os.system('/bin/hostname %s' % newName)
-
- # add name to "hosts"
- with open('/etc/hosts', 'r') as hosts:
- lines = hosts.readlines()
- with open('/etc/hosts', 'w') as hosts:
- hosts.write("127.0.1.1\t{}\n".format(newName))
- for l in lines:
- if l[:9] != '127.0.1.1': # Skips existing 127.0.1.1. if it already exists
- hosts.write(l)
-
- with open('/etc/sysconfig/network', 'r') as net:
- lines = net.readlines()
- with open('/etc/sysconfig/network', 'w') as net:
- net.write('HOSTNAME={}\n'.format(newName))
- for l in lines:
- if l[:8] != 'HOSTNAME':
- net.write(l)
-
- return True
-
-# All names in lower case
-renamers['centos linux'] = rename
-renamers['fedora'] = rename
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/loader.py b/admin/Sources/Clients/ogagent/src/opengnsys/loader.py
deleted file mode 100644
index 23988fca..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/loader.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import,wildcard-import
-
-# This is a simple module loader, so we can add "external opengnsys" modules as addons
-# Modules under "opengsnsys/modules" are always autoloaded
-from __future__ import unicode_literals
-
-import pkgutil
-import os.path
-
-from opengnsys.workers import ServerWorker
-from opengnsys.workers import ClientWorker
-from .log import logger
-
-
-def loadModules(controller, client=False):
- '''
- Load own provided modules plus the modules that are in the configuration path.
- The loading order is not defined (they are loaded as found, because modules MUST be "standalone" modules
- @param service: The service that:
- * Holds the configuration
- * Will be used to initialize modules.
- '''
-
- ogModules = []
-
- if client is False:
- from opengnsys.modules.server import OpenGnSys # @UnusedImport
- from .modules import server # @UnusedImport, just used to ensure opengnsys modules are initialized
- modPath = 'opengnsys.modules.server'
- modType = ServerWorker
- else:
- from opengnsys.modules.client import OpenGnSys # @UnusedImport @Reimport
- from .modules import client # @UnusedImport, just used to ensure opengnsys modules are initialized
- modPath = 'opengnsys.modules.client'
- modType = ClientWorker
-
- def addCls(cls):
- logger.debug('Found module class {}'.format(cls))
- try:
- if cls.name is None:
- # Error, cls has no name
- # Log the issue and
- logger.error('Class {} has no name attribute'.format(cls))
- return
- ogModules.append(cls(controller))
- except Exception as e:
- logger.error('Error loading module {}'.format(e))
-
- def recursiveAdd(p):
- subcls = p.__subclasses__()
-
- if len(subcls) == 0:
- addCls(p)
- else:
- for c in subcls:
- recursiveAdd(c)
-
- def doLoad(paths):
- for (module_loader, name, ispkg) in pkgutil.iter_modules(paths, modPath + '.'):
- if ispkg:
- logger.debug('Found module package {}'.format(name))
- module_loader.find_module(name).load_module(name)
-
-
- if controller.config.has_option('opengnsys', 'path') is True:
- paths = tuple(os.path.abspath(v) for v in controller.config.get('opengnsys', 'path').split(','))
- else:
- paths = ()
-
- # paths += (os.path.dirname(sys.modules[modPath].__file__),)
-
- logger.debug('Loading modules from {}'.format(paths))
-
- # Load modules
- doLoad(paths)
-
- # Add to list of available modules
- recursiveAdd(modType)
-
- return ogModules
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/log.py b/admin/Sources/Clients/ogagent/src/opengnsys/log.py
deleted file mode 100644
index e34c0874..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/log.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import traceback
-import sys
-import six
-
-if sys.platform == 'win32':
- from opengnsys.windows.log import LocalLogger # @UnusedImport
-else:
- from opengnsys.linux.log import LocalLogger # @Reimport
-
-# Valid logging levels, from UDS Broker (uds.core.utils.log)
-OTHER, DEBUG, INFO, WARN, ERROR, FATAL = (10000 * (x + 1) for x in six.moves.xrange(6)) # @UndefinedVariable
-
-_levelName = {
- 'OTHER': OTHER,
- 'DEBUG': DEBUG,
- 'INFO': INFO,
- 'WARN': WARN,
- 'ERROR': ERROR,
- 'FATAL': FATAL
-}
-
-class Logger(object):
- def __init__(self):
- self.logLevel = INFO
- self.logger = LocalLogger()
-
- def setLevel(self, level):
- '''
- Sets log level filter (minimum level required for a log message to be processed)
- :param level: Any message with a level below this will be filtered out
- '''
- if isinstance(level, six.string_types):
- level = _levelName.get(level, INFO)
-
- self.logLevel = level # Ensures level is an integer or fails
-
- def log(self, level, message):
- if level < self.logLevel: # Skip not wanted messages
- return
-
- self.logger.log(level, message)
-
- def debug(self, message):
- self.log(DEBUG, message)
-
- def warn(self, message):
- self.log(WARN, message)
-
- def info(self, message):
- self.log(INFO, message)
-
- def error(self, message):
- self.log(ERROR, message)
-
- def fatal(self, message):
- self.log(FATAL, message)
-
- def exception(self):
- try:
- tb = traceback.format_exc()
- except Exception:
- tb = '(could not get traceback!)'
-
- self.log(DEBUG, tb)
-
- def flush(self):
- pass
-
-
-logger = Logger()
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/macos/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/macos/__init__.py
deleted file mode 100644
index ee5ba4c2..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/macos/__init__.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Ramón M. Gómez, ramongomez at us dot es
-'''
-from __future__ import unicode_literals
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/macos/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/macos/operations.py
deleted file mode 100644
index 286b6d89..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/macos/operations.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import socket
-import platform
-import fcntl
-import os
-import locale
-import ctypes # @UnusedImport
-import ctypes.util
-import subprocess
-import struct
-import array
-import six
-from opengnsys import utils
-import netifaces
-
-
-def _getMacAddr(ifname):
- '''
- Returns the mac address of an interface
- Mac is returned as unicode utf-8 encoded
- '''
- if isinstance(ifname, list):
- return dict([(name, _getMacAddr(name)) for name in ifname])
- if isinstance(ifname, six.text_type):
- ifname = ifname.encode('utf-8') # If unicode, convert to bytes (or str in python 2.7)
- try:
- return netifaces.ifaddresses(ifname)[18][0]['addr']
- except Exception:
- return None
-
-
-def _getIpAddr(ifname):
- '''
- Returns the IP address of an interface
- IP is returned as unicode utf-8 encoded
- '''
- if isinstance(ifname, list):
- return dict([(name, _getIpAddr(name)) for name in ifname])
- if isinstance(ifname, six.text_type):
- ifname = ifname.encode('utf-8') # If unicode, convert to bytes (or str in python 2.7)
- try:
- return netifaces.ifaddresses(ifname)[2][0]['addr']
- except Exception:
- return None
-
-
-def _getInterfaces():
- '''
- Returns a list of interfaces names
- '''
- return netifaces.interfaces()
-
-
-def _getIpAndMac(ifname):
- ip, mac = _getIpAddr(ifname), _getMacAddr(ifname)
- return (ip, mac)
-
-
-def getComputerName():
- '''
- Returns computer name, with no domain
- '''
- return socket.gethostname().split('.')[0]
-
-
-def getNetworkInfo():
- '''
- Obtains a list of network interfaces
- @return: A "generator" of elements, that are dict-as-object, with this elements:
- name: Name of the interface
- mac: mac of the interface
- ip: ip of the interface
- '''
- for ifname in _getInterfaces():
- ip, mac = _getIpAndMac(ifname)
- if mac != None and ip != None: # Skips local interfaces
- yield utils.Bunch(name=ifname, mac=mac, ip=ip)
-
-
-def getDomainName():
- return ''
-
-
-def getMacosVersion():
- return 'macOS {}'.format(platform.mac_ver()[0])
-
-
-def reboot(flags=0):
- '''
- Simple reboot command
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- # Exec reboot command
- subprocess.call('/sbin/shutdown -r now', shell=True)
-
-
-def poweroff(flags=0):
- '''
- Simple poweroff command
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- # Exec shutdown command
- subprocess.call('/sbin/shutdown -h now', shell=True)
-
-
-def logoff():
- '''
- Simple logout using AppleScript
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- # Exec logout using AppleSctipt
- subprocess.call('/usr/bin/osascript -e \'tell app "System Events" to «event aevtrlgo»\'', shell=True)
-
-
-def renameComputer(newName):
- rename(newName)
-
-
-def joinDomain(domain, ou, account, password, executeInOneStep=False):
- pass
-
-
-def changeUserPassword(user, oldPassword, newPassword):
- '''
- Simple password change for user using command line
- '''
- os.system('echo "{1}\n{1}" | /usr/bin/passwd {0} 2> /dev/null'.format(user, newPassword))
-
-
-class XScreenSaverInfo(ctypes.Structure):
- _fields_ = [('window', ctypes.c_long),
- ('state', ctypes.c_int),
- ('kind', ctypes.c_int),
- ('til_or_since', ctypes.c_ulong),
- ('idle', ctypes.c_ulong),
- ('eventMask', ctypes.c_ulong)]
-
-# Initialize xlib & xss
-try:
- xlibPath = ctypes.util.find_library('X11')
- xssPath = ctypes.util.find_library('Xss')
- xlib = ctypes.cdll.LoadLibrary(xlibPath)
- xss = ctypes.cdll.LoadLibrary(xssPath)
-
- # Fix result type to XScreenSaverInfo Structure
- xss.XScreenSaverQueryExtension.restype = ctypes.c_int
- xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo) # Result in a XScreenSaverInfo structure
-except Exception: # Libraries not accesible, not found or whatever..
- xlib = xss = None
-
-
-def initIdleDuration(atLeastSeconds):
- '''
- On linux we set the screensaver to at least required seconds, or we never will get "idle"
- '''
- # Workaround for dummy thread
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- subprocess.call(['/usr/bin/xset', 's', '{}'.format(atLeastSeconds + 30)])
- # And now reset it
- subprocess.call(['/usr/bin/xset', 's', 'reset'])
-
-
-def getIdleDuration():
- '''
- Returns idle duration, in seconds
- '''
- if xlib is None or xss is None:
- return 0 # Libraries not available
-
- # production code might want to not hardcode the offset 16...
- display = xlib.XOpenDisplay(None)
-
- event_base = ctypes.c_int()
- error_base = ctypes.c_int()
-
- available = xss.XScreenSaverQueryExtension(display, ctypes.byref(event_base), ctypes.byref(error_base))
- if available != 1:
- return 0 # No screen saver is available, no way of getting idle
-
- info = xss.XScreenSaverAllocInfo()
- xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), info)
-
- if info.contents.state != 0:
- return 3600 * 100 * 1000 # If screen saver is active, return a high enough value
-
- return info.contents.idle / 1000.0
-
-
-def getCurrentUser():
- '''
- Returns current logged in user
- '''
- return os.environ['USER']
-
-
-def getSessionLanguage():
- '''
- Returns the user's session language
- '''
- return locale.getdefaultlocale()[0]
-
-
-def showPopup(title, message):
- '''
- Displays a message box on user's session (during 1 min).
- '''
- # Show a dialog using AppleSctipt
- return subprocess.call('/usr/bin/osascript -e \'display notification "{}" with title "{}"\''.format(message, title), shell=True)
-
-
-def get_etc_path():
- """
- :return:
- Returns etc directory path.
- """
- return os.sep + 'etc'
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/modules/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/modules/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/OpenGnSys/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/OpenGnSys/__init__.py
deleted file mode 100644
index adeb0a60..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/OpenGnSys/__init__.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""
-@author: Ramón M. Gómez, ramongomez at us dot es
-"""
-from __future__ import unicode_literals
-
-from opengnsys.workers import ClientWorker
-
-from opengnsys import operations
-from opengnsys.log import logger
-from opengnsys.scriptThread import ScriptExecutorThread
-
-
-class OpenGnSysWorker(ClientWorker):
- name = 'opengnsys'
-
- @staticmethod
- def onActivation():
- logger.debug('Activate invoked')
-
- @staticmethod
- def onDeactivation():
- logger.debug('Deactivate invoked')
-
- # Processes script execution
- @staticmethod
- def process_script(json_params):
- logger.debug('Processed message: script({})'.format(json_params))
- thr = ScriptExecutorThread(json_params['code'])
- thr.start()
- #self.sendServerMessage('script', {'op', 'launched'})
-
- @staticmethod
- def process_logoff(json_params):
- logger.debug('Processed message: logoff({})'.format(json_params))
- operations.logoff()
-
- @staticmethod
- def process_popup(json_params):
- logger.debug('Processed message: popup({})'.format(json_params))
- ret = operations.showPopup(json_params['title'], json_params['message'])
- #self.sendServerMessage('popup', {'op', ret})
-
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/client/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py
deleted file mode 100644
index 70cc8c7f..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py
+++ /dev/null
@@ -1,319 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""
-@author: Ramón M. Gómez, ramongomez at us dot es
-"""
-from __future__ import unicode_literals
-
-import threading
-import os
-import platform
-import time
-import random
-import shutil
-import string
-import urllib
-
-from opengnsys.workers import ServerWorker
-from opengnsys import REST, RESTError
-from opengnsys import operations
-from opengnsys.log import logger
-from opengnsys.scriptThread import ScriptExecutorThread
-
-
-# Check authorization header decorator
-def check_secret(fnc):
- """
- Decorator to check for received secret key and raise exception if it isn't valid.
- """
- def wrapper(*args, **kwargs):
- try:
- this, path, get_params, post_params, server = args # @UnusedVariable
- if this.random == server.headers['Authorization']:
- fnc(*args, **kwargs)
- else:
- raise Exception('Unauthorized operation')
- except Exception as e:
- logger.error(e)
- raise Exception(e)
-
- return wrapper
-
-
-# Error handler decorator.
-def catch_background_error(fnc):
- def wrapper(*args, **kwargs):
- this = args[0]
- try:
- fnc(*args, **kwargs)
- except Exception as e:
- this.REST.sendMessage('error?id={}'.format(kwargs.get('requestId', 'error')), {'error': '{}'.format(e)})
- return wrapper
-
-
-class OpenGnSysWorker(ServerWorker):
- name = 'opengnsys'
- interface = None # Bound interface for OpenGnsys
- REST = None # REST object
- logged_in = False # User session flag
- locked = {}
- random = None # Random string for secure connections
- length = 32 # Random string length
-
- def onActivation(self):
- """
- Sends OGAgent activation notification to OpenGnsys server
- """
- t = 0
- # Generate random secret to send on activation
- self.random = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(self.length))
- # Ensure cfg has required configuration variables or an exception will be thrown
- url = self.service.config.get('opengnsys', 'remote')
- self.REST = REST(url)
- # Get network interfaces until they are active or timeout (5 minutes)
- for t in range(0, 300):
- try:
- self.interface = list(operations.getNetworkInfo())[0] # Get first network interface
- except Exception as e:
- # Wait 1 sec. and retry
- time.sleep(1)
- finally:
- # Exit loop if interface is active
- if self.interface:
- if t > 0:
- logger.debug("Fetch connection data after {} tries".format(t))
- break
- # Raise error after timeout
- if not self.interface:
- raise e
- # Loop to send initialization message
- for t in range(0, 100):
- try:
- try:
- self.REST.sendMessage('ogagent/started', {'mac': self.interface.mac, 'ip': self.interface.ip,
- 'secret': self.random, 'ostype': operations.os_type,
- 'osversion': operations.os_version})
- break
- except:
- # Trying to initialize on alternative server, if defined
- # (used in "exam mode" from the University of Seville)
- self.REST = REST(self.service.config.get('opengnsys', 'altremote'))
- self.REST.sendMessage('ogagent/started', {'mac': self.interface.mac, 'ip': self.interface.ip,
- 'secret': self.random, 'ostype': operations.os_type,
- 'osversion': operations.os_version, 'alt_url': True})
- break
- except:
- time.sleep(3)
- # Raise error after timeout
- if 0 < t < 100:
- logger.debug('Successful connection after {} tries'.format(t))
- elif t == 100:
- raise Exception('Initialization error: Cannot connect to remote server')
- # Delete marking files
- for f in ['ogboot.me', 'ogboot.firstboot', 'ogboot.secondboot']:
- try:
- os.remove(os.sep + f)
- except OSError:
- pass
- # Copy file "HostsFile.FirstOctetOfIPAddress" to "HostsFile", if it exists
- # (used in "exam mode" from the University of Seville)
- hosts_file = os.path.join(operations.get_etc_path(), 'hosts')
- new_hosts_file = hosts_file + '.' + self.interface.ip.split('.')[0]
- if os.path.isfile(new_hosts_file):
- shutil.copyfile(new_hosts_file, hosts_file)
-
- def onDeactivation(self):
- """
- Sends OGAgent stopping notification to OpenGnsys server
- """
- logger.debug('onDeactivation')
- self.REST.sendMessage('ogagent/stopped', {'mac': self.interface.mac, 'ip': self.interface.ip,
- 'ostype': operations.os_type, 'osversion': operations.os_version})
-
- def processClientMessage(self, message, data):
- logger.debug('Got OpenGnsys message from client: {}, data {}'.format(message, data))
-
- def onLogin(self, data):
- """
- Sends session login notification to OpenGnsys server
- """
- user, sep, language = data.partition(',')
- logger.debug('Received login for {} with language {}'.format(user, language))
- self.logged_in = True
- self.REST.sendMessage('ogagent/loggedin', {'ip': self.interface.ip, 'user': user, 'language': language,
- 'ostype': operations.os_type, 'osversion': operations.os_version})
-
- def onLogout(self, user):
- """
- Sends session logout notification to OpenGnsys server
- """
- logger.debug('Received logout for {}'.format(user))
- self.logged_in = False
- self.REST.sendMessage('ogagent/loggedout', {'ip': self.interface.ip, 'user': user})
-
- def process_ogclient(self, path, get_params, post_params, server):
- """
- This method can be overridden to provide your own message processor, or better you can
- implement a method that is called exactly as "process_" + path[0] (module name has been removed from path
- array) and this default processMessage will invoke it
- * Example:
- Imagine this invocation url (no matter if GET or POST): http://example.com:9999/Sample/mazinger/Z
- The HTTP Server will remove "Sample" from path, parse arguments and invoke this method as this:
- module.processMessage(["mazinger","Z"], get_params, post_params)
-
- This method will process "mazinger", and look for a "self" method that is called "process_mazinger",
- and invoke it this way:
- return self.process_mazinger(["Z"], get_params, post_params)
-
- In the case path is empty (that is, the path is composed only by the module name, like in
- "http://example.com/Sample", the "process" method will be invoked directly
-
- The methods must return data that can be serialized to json (i.e. Objects are not serializable to json,
- basic type are)
- """
- if not path:
- return "ok"
- try:
- operation = getattr(self, 'ogclient_' + path[0])
- except Exception:
- raise Exception('Message processor for "{}" not found'.format(path[0]))
- return operation(path[1:], get_params, post_params)
-
- def process_status(self, path, get_params, post_params, server):
- """
- Returns client status (OS type or execution status) and login status
- :param path:
- :param get_params:
- :param post_params:
- :param server:
- :return: JSON object {"status": "status_code", "loggedin": boolean}
- """
- res = {'status': '', 'loggedin': self.logged_in}
- if platform.system() == 'Linux': # GNU/Linux
- # Check if it's OpenGnsys Client.
- if os.path.exists('/scripts/oginit'):
- # Check if OpenGnsys Client is busy.
- if self.locked:
- res['status'] = 'BSY'
- else:
- res['status'] = 'OPG'
- else:
- # Check if there is an active session.
- res['status'] = 'LNX'
- elif platform.system() == 'Windows': # Windows
- # Check if there is an active session.
- res['status'] = 'WIN'
- elif platform.system() == 'Darwin': # Mac OS X ??
- res['status'] = 'OSX'
- return res
-
- @check_secret
- def process_reboot(self, path, get_params, post_params, server):
- """
- Launches a system reboot operation
- :param path:
- :param get_params:
- :param post_params:
- :param server: authorization header
- :return: JSON object {"op": "launched"}
- """
- logger.debug('Received reboot operation')
-
- # Rebooting thread
- def rebt():
- operations.reboot()
- threading.Thread(target=rebt).start()
- return {'op': 'launched'}
-
- @check_secret
- def process_poweroff(self, path, get_params, post_params, server):
- """
- Launches a system power off operation
- :param path:
- :param get_params:
- :param post_params:
- :param server: authorization header
- :return: JSON object {"op": "launched"}
- """
- logger.debug('Received poweroff operation')
-
- # Powering off thread
- def pwoff():
- time.sleep(2)
- operations.poweroff()
- threading.Thread(target=pwoff).start()
- return {'op': 'launched'}
-
- @check_secret
- def process_script(self, path, get_params, post_params, server):
- """
- Processes an script execution (script should be encoded in base64)
- :param path:
- :param get_params:
- :param post_params: JSON object {"script": "commands"}
- :param server: authorization header
- :return: JSON object {"op": "launched"}
- """
- logger.debug('Processing script request')
- # Decoding script (Windows scripts need a subprocess call per line)
- script = urllib.unquote(post_params.get('script').decode('base64')).decode('utf8')
- if operations.os_type == 'Windows':
- script = 'import subprocess; {0}'.format(
- ';'.join(['subprocess.check_output({0},shell=True)'.format(repr(c)) for c in script.split('\n')]))
- else:
- script = 'import subprocess; subprocess.check_output("""{0}""",shell=True)'.format(script)
- # Executing script.
- if post_params.get('client', 'false') == 'false':
- thr = ScriptExecutorThread(script)
- thr.start()
- else:
- self.sendClientMessage('script', {'code': script})
- return {'op': 'launched'}
-
- @check_secret
- def process_logoff(self, path, get_params, post_params, server):
- """
- Closes user session
- """
- logger.debug('Received logoff operation')
- # Sending log off message to OGAgent client
- self.sendClientMessage('logoff', {})
- return {'op': 'sent to client'}
-
- @check_secret
- def process_popup(self, path, get_params, post_params, server):
- """
- Shows a message popup on the user's session
- """
- logger.debug('Received message operation')
- # Sending popup message to OGAgent client
- self.sendClientMessage('popup', post_params)
- return {'op': 'launched'}
-
- def process_client_popup(self, params):
- self.REST.sendMessage('popup_done', params)
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/operations.py
deleted file mode 100644
index be777dd5..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/operations.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-"""
-# pylint: disable=unused-wildcard-import,wildcard-import
-
-from __future__ import unicode_literals
-import sys
-
-# Importing platform operations and getting operating system data.
-if sys.platform == 'win32':
- from .windows.operations import * # @UnusedWildImport
- os_type = 'Windows'
- os_version = getWindowsVersion()
-else:
- if sys.platform == 'darwin':
- from .macos.operations import * # @UnusedWildImport
- os_type = 'MacOS'
- os_version = getMacosVersion().replace(',', '')
- else:
- from .linux.operations import * # @UnusedWildImport
- os_type = 'Linux'
- os_version = getLinuxVersion()
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/scriptThread.py b/admin/Sources/Clients/ogagent/src/opengnsys/scriptThread.py
deleted file mode 100644
index 2a6779b4..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/scriptThread.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 201 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-
-# pylint: disable-msg=E1101,W0703
-
-from opengnsys.log import logger
-
-import threading
-import six
-
-
-class ScriptExecutorThread(threading.Thread):
- def __init__(self, script):
- super(ScriptExecutorThread, self).__init__()
- self.script = script
-
- def run(self):
- try:
- logger.debug('Executing script: {}'.format(self.script))
- six.exec_(self.script, globals(), None)
- except Exception as e:
- logger.error('Error executing script: {}'.format(e))
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/service.py b/admin/Sources/Clients/ogagent/src/opengnsys/service.py
deleted file mode 100644
index 4a44028e..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/service.py
+++ /dev/null
@@ -1,249 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from .log import logger
-from .config import readConfig
-from .utils import exceptionToMessage
-
-from . import ipc
-from . import httpserver
-from .loader import loadModules
-
-import socket
-import time
-import json
-import six
-
-IPC_PORT = 10398
-
-
-class CommonService(object):
- isAlive = True
- ipc = None
- httpServer = None
- modules = None
-
- def __init__(self):
- logger.info('----------------------------------------')
- logger.info('Initializing OpenGnsys Agent')
-
- # Read configuration file before proceding & ensures minimal config is there
-
- self.config = readConfig()
-
- # Get opengnsys section as dict
- cfg = dict(self.config.items('opengnsys'))
-
- # Set up log level
- logger.setLevel(cfg.get('log', 'INFO'))
-
-
- logger.debug('Loaded configuration from opengnsys.cfg:')
- for section in self.config.sections():
- logger.debug('Section {} = {}'.format(section, self.config.items(section)))
-
-
- if logger.logger.isWindows():
- # Logs will also go to windows event log for services
- logger.logger.serviceLogger = True
-
- self.address = (cfg.get('address', '0.0.0.0'), int(cfg.get('port', '10997')))
- self.ipcport = int(cfg.get('ipc_port', IPC_PORT))
-
- self.timeout = int(cfg.get('timeout', '20'))
-
- logger.debug('Socket timeout: {}'.format(self.timeout))
- socket.setdefaulttimeout(self.timeout)
-
- # Now load modules
- self.modules = loadModules(self)
- logger.debug('Modules: {}'.format(list(v.name for v in self.modules)))
-
- def stop(self):
- '''
- Requests service termination
- '''
- self.isAlive = False
-
- # ********************************
- # * Internal messages processors *
- # ********************************
- def notifyLogin(self, username):
- for v in self.modules:
- try:
- logger.debug('Notifying login of user {} to module {}'.format(username, v.name))
- v.onLogin(username)
- except Exception as e:
- logger.error('Got exception {} processing login message on {}'.format(e, v.name))
-
- def notifyLogout(self, username):
- for v in self.modules:
- try:
- logger.debug('Notifying logout of user {} to module {}'.format(username, v.name))
- v.onLogout(username)
- except Exception as e:
- logger.error('Got exception {} processing logout message on {}'.format(e, v.name))
-
- def notifyMessage(self, data):
- module, message, data = data.split('\0')
- for v in self.modules:
- if v.name == module: # Case Sensitive!!!!
- try:
- logger.debug('Notifying message {} to module {} with json data {}'.format(message, v.name, data))
- v.processClientMessage(message, json.loads(data))
- return
- except Exception as e:
- logger.error('Got exception {} processing generic message on {}'.format(e, v.name))
-
- logger.error('Module {} not found, messsage {} not sent'.format(module, message))
-
-
- def clientMessageProcessor(self, msg, data):
- '''
- Callback, invoked from IPC, on its own thread (not the main thread).
- This thread will "block" communication with agent untill finished, but this should be no problem
- '''
- logger.debug('Got message {}'.format(msg))
-
- if msg == ipc.REQ_LOGIN:
- self.notifyLogin(data)
- elif msg == ipc.REQ_LOGOUT:
- self.notifyLogout(data)
- elif msg == ipc.REQ_MESSAGE:
- self.notifyMessage(data)
-
- def initialize(self):
- # ******************************************
- # * Initialize listeners, modules, etc...
- # ******************************************
-
- if six.PY3 is False:
- import threading
- threading._DummyThread._Thread__stop = lambda x: 42
-
- logger.debug('Starting IPC listener at {}'.format(IPC_PORT))
- self.ipc = ipc.ServerIPC(self.ipcport, clientMessageProcessor=self.clientMessageProcessor)
- self.ipc.start()
-
- # And http threaded server
- self.httpServer = httpserver.HTTPServerThread(self.address, self)
- self.httpServer.start()
-
- # And lastly invoke modules activation
- validMods = []
- for mod in self.modules:
- try:
- logger.debug('Activating module {}'.format(mod.name))
- mod.activate()
- validMods.append(mod)
- except Exception as e:
- logger.exception()
- logger.error("Activation of {} failed: {}".format(mod.name, exceptionToMessage(e)))
-
- self.modules[:] = validMods # copy instead of assignment
-
- logger.debug('Modules after activation: {}'.format(list(v.name for v in self.modules)))
-
- def terminate(self):
- # First invoke deactivate on modules
- for mod in reversed(self.modules):
- try:
- logger.debug('Deactivating module {}'.format(mod.name))
- mod.deactivate()
- except Exception as e:
- logger.exception()
- logger.error("Deactivation of {} failed: {}".format(mod.name, exceptionToMessage(e)))
-
- # Remove IPC threads
- if self.ipc is not None:
- try:
- self.ipc.stop()
- except Exception:
- logger.error('Couln\'t stop ipc server')
-
- if self.httpServer is not None:
- try:
- self.httpServer.stop()
- except Exception:
- logger.error('Couln\'t stop RESTApi server')
-
- self.notifyStop()
-
- # ****************************************
- # Methods that CAN BE overridden by agents
- # ****************************************
- def doWait(self, miliseconds):
- '''
- Invoked to wait a bit
- CAN be OVERRIDDEN
- '''
- time.sleep(float(miliseconds) / 1000)
-
- def notifyStop(self):
- '''
- Overridden to log stop
- '''
- logger.info('Service is being stopped')
-
- # ***************************************************
- # * Helpers, convenient methods to facilitate comms *
- # ***************************************************
- def sendClientMessage(self, toModule, message, data):
- '''
- Sends a message to the clients using IPC
- The data is converted to json, so ensure that it is serializable.
- All IPC is asynchronous, so if you expect a response, this will be sent by client using another message
-
- @param toModule: Module that will receive this message
- @param message: Message to send
- @param data: data to send
- '''
- self.ipc.sendMessageMessage('\0'.join((toModule, message, json.dumps(data))))
-
- def sendScriptMessage(self, script):
- '''
- Sends an script to be executed by client
- '''
- self.ipc.sendScriptMessage(script)
-
- def sendLogoffMessage(self):
- '''
- Sends a logoff message to client
- '''
- self.ipc.sendLoggofMessage()
-
- def sendPopupMessage(self, title, message):
- '''
- Sends a poup box to be displayed by client
- '''
- self.ipc.sendPopupMessage(title, message)
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/utils.py b/admin/Sources/Clients/ogagent/src/opengnsys/utils.py
deleted file mode 100644
index 9480a6ab..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/utils.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import sys
-import six
-
-if sys.platform == 'win32':
- _fromEncoding = 'windows-1250'
-else:
- _fromEncoding = 'utf-8'
-
-
-def toUnicode(msg):
- try:
- if not isinstance(msg, six.text_type):
- if isinstance(msg, six.binary_type):
- return msg.decode(_fromEncoding, 'ignore')
- return six.text_type(msg)
- else:
- return msg
- except Exception:
- try:
- return six.text_type(msg)
- except Exception:
- return ''
-
-
-def exceptionToMessage(e):
- msg = ''
- for arg in e.args:
- if isinstance(arg, Exception):
- msg = msg + exceptionToMessage(arg)
- else:
- msg = msg + toUnicode(arg) + '. '
- return msg
-
-
-class Bunch(dict):
- def __init__(self, **kw):
- dict.__init__(self, kw)
- self.__dict__ = self
-
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/windows/OGAgentService.py b/admin/Sources/Clients/ogagent/src/opengnsys/windows/OGAgentService.py
deleted file mode 100644
index 71716d78..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/windows/OGAgentService.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-# pylint: disable=unused-wildcard-import, wildcard-import
-
-import win32serviceutil # @UnresolvedImport, pylint: disable=import-error
-import win32service # @UnresolvedImport, pylint: disable=import-error
-import win32security # @UnresolvedImport, pylint: disable=import-error
-import win32net # @UnresolvedImport, pylint: disable=import-error
-import win32event # @UnresolvedImport, pylint: disable=import-error
-import win32com.client # @UnresolvedImport, @UnusedImport, pylint: disable=import-error
-import pythoncom # @UnresolvedImport, pylint: disable=import-error
-import servicemanager # @UnresolvedImport, pylint: disable=import-error
-import os
-
-from opengnsys import operations
-from opengnsys.service import CommonService
-
-from opengnsys.log import logger
-
-class OGAgentSvc(win32serviceutil.ServiceFramework, CommonService):
- '''
- This class represents a Windows Service for managing Agent interactions
- with OpenGnsys Server
- '''
- _svc_name_ = "OGAgent"
- _svc_display_name_ = "OpenGnsys Agent Service"
- _svc_description_ = "OpenGnsys Agent for Operating Systems"
- # 'System Event Notification' is the SENS service
- _svc_deps_ = ['EventLog']
-
- def __init__(self, args):
- win32serviceutil.ServiceFramework.__init__(self, args)
- CommonService.__init__(self)
- self.hWaitStop = win32event.CreateEvent(None, 1, 0, None)
- self._user = None
-
- def SvcStop(self):
- self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
- self.isAlive = False
- win32event.SetEvent(self.hWaitStop)
-
- SvcShutdown = SvcStop
-
- def notifyStop(self):
- servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
- servicemanager.PYS_SERVICE_STOPPED,
- (self._svc_name_, ''))
-
- def doWait(self, miliseconds):
- win32event.WaitForSingleObject(self.hWaitStop, miliseconds)
-
- def SvcDoRun(self):
- '''
- Main service loop
- '''
- try:
- logger.debug('running SvcDoRun')
- servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
- servicemanager.PYS_SERVICE_STARTED,
- (self._svc_name_, ''))
-
- # call the CoInitialize to allow the registration to run in an other
- # thread
- logger.debug('Initializing com...')
- pythoncom.CoInitialize()
-
- # Initialize remaining service data
- self.initialize()
- except Exception: # Any init exception wil be caught, service must be then restarted
- logger.exception()
- logger.debug('Exiting service with failure status')
- os._exit(-1) # pylint: disable=protected-access
-
- # *********************
- # * Main Service loop *
- # *********************
- try:
- while self.isAlive:
- # Pumps & processes any waiting messages
- pythoncom.PumpWaitingMessages()
- win32event.WaitForSingleObject(self.hWaitStop, 1000)
- except Exception as e:
- logger.error('Caught exception on main loop: {}'.format(e))
-
- logger.debug('Exited main loop, deregistering SENS')
-
- self.terminate() # Ends IPC servers
-
- self.notifyStop()
-
-
-if __name__ == '__main__':
-
- win32serviceutil.HandleCommandLine(OGAgentSvc)
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/windows/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/windows/__init__.py
deleted file mode 100644
index e662942e..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/windows/__init__.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import os
-import sys
-
-# Change to application directory.
-os.chdir(os.path.dirname(sys.argv[0]))
-
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/windows/log.py b/admin/Sources/Clients/ogagent/src/opengnsys/windows/log.py
deleted file mode 100644
index 745fd03f..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/windows/log.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import servicemanager # @UnresolvedImport, pylint: disable=import-error
-import logging
-import os
-import tempfile
-
-# Valid logging levels, from UDS Broker (uds.core.utils.log)
-OTHER, DEBUG, INFO, WARN, ERROR, FATAL = (10000 * (x + 1) for x in range(6))
-
-
-class LocalLogger(object):
- def __init__(self):
- # tempdir is different for "user application" and "service"
- # service wil get c:\windows\temp, while user will get c:\users\XXX\temp
- logging.basicConfig(
- filename=os.path.join(tempfile.gettempdir(), 'opengnsys.log'),
- filemode='a',
- format='%(levelname)s %(asctime)s %(message)s',
- level=logging.DEBUG
- )
- self.logger = logging.getLogger('opengnsys')
- self.serviceLogger = False
-
- def log(self, level, message):
- # Debug messages are logged to a file
- # our loglevels are 10000 (other), 20000 (debug), ....
- # logging levels are 10 (debug), 20 (info)
- # OTHER = logging.NOTSET
- self.logger.log(level / 1000 - 10, message)
-
- if level < INFO or self.serviceLogger is False: # Only information and above will be on event log
- return
-
- if level < WARN: # Info
- servicemanager.LogInfoMsg(message)
- elif level < ERROR: # WARN
- servicemanager.LogWarningMsg(message)
- else: # Error & Fatal
- servicemanager.LogErrorMsg(message)
-
- def isWindows(self):
- return True
-
- def isLinux(self):
- return False
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/windows/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/windows/operations.py
deleted file mode 100644
index 95331fd0..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/windows/operations.py
+++ /dev/null
@@ -1,269 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-import os
-import locale
-import subprocess
-import ctypes
-from ctypes.wintypes import DWORD, LPCWSTR
-import win32com.client # @UnresolvedImport, pylint: disable=import-error
-import win32net # @UnresolvedImport, pylint: disable=import-error
-import win32security # @UnresolvedImport, pylint: disable=import-error
-import win32api # @UnresolvedImport, pylint: disable=import-error
-import win32con # @UnresolvedImport, pylint: disable=import-error
-
-from opengnsys import utils
-from opengnsys.log import logger
-
-
-def getErrorMessage(res=0):
- msg = win32api.FormatMessage(res)
- return msg.decode('windows-1250', 'ignore')
-
-
-def getComputerName():
- return win32api.GetComputerNameEx(win32con.ComputerNamePhysicalDnsHostname)
-
-
-def getNetworkInfo():
- '''
- Obtains a list of network interfaces
- @return: A "generator" of elements, that are dict-as-object, with this elements:
- name: Name of the interface
- mac: mac of the interface
- ip: ip of the interface
- '''
- obj = win32com.client.Dispatch("WbemScripting.SWbemLocator")
- wmobj = obj.ConnectServer("localhost", "root\cimv2")
- adapters = wmobj.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IpEnabled=True")
- try:
- for obj in adapters:
- if obj.DefaultIPGateway is None: # Skip adapters without default router
- continue
- for ip in obj.IPAddress:
- if ':' in ip: # Is IPV6, skip this
- continue
- if ip is None or ip == '' or ip.startswith('169.254') or ip.startswith('0.'): # If single link ip, or no ip
- continue
- logger.debug('Net config found: {}=({}, {})'.format(obj.Caption, obj.MACAddress, ip))
- yield utils.Bunch(name=obj.Caption, mac=obj.MACAddress, ip=ip)
- except Exception:
- return
-
-
-def getDomainName():
- '''
- Will return the domain name if we belong a domain, else None
- (if part of a network group, will also return None)
- '''
- # Status:
- # 0 = Unknown
- # 1 = Unjoined
- # 2 = Workgroup
- # 3 = Domain
- domain, status = win32net.NetGetJoinInformation()
- if status != 3:
- domain = None
-
- return domain
-
-
-def getWindowsVersion():
- '''
- Returns Windows version.
- '''
- import _winreg
- reg = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion')
- try:
- data = '{} {}'.format(_winreg.QueryValueEx(reg, 'ProductName')[0], _winreg.QueryValueEx(reg, 'ReleaseId')[0])
- except Exception:
- data = '{} {}'.format(_winreg.QueryValueEx(reg, 'ProductName')[0], _winreg.QueryValueEx(reg, 'CurrentBuildNumber')[0])
- reg.Close()
- return data
-
-
-EWX_LOGOFF = 0x00000000
-EWX_SHUTDOWN = 0x00000001
-EWX_REBOOT = 0x00000002
-EWX_FORCE = 0x00000004
-EWX_POWEROFF = 0x00000008
-EWX_FORCEIFHUNG = 0x00000010
-
-
-def reboot(flags=EWX_FORCEIFHUNG | EWX_REBOOT):
- hproc = win32api.GetCurrentProcess()
- htok = win32security.OpenProcessToken(hproc, win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY)
- privs = ((win32security.LookupPrivilegeValue(None, win32security.SE_SHUTDOWN_NAME), win32security.SE_PRIVILEGE_ENABLED),)
- win32security.AdjustTokenPrivileges(htok, 0, privs)
- win32api.ExitWindowsEx(flags, 0)
-
-def poweroff(flags=0):
- '''
- Simple poweroff command.
- '''
- reboot(flags=EWX_FORCEIFHUNG | EWX_SHUTDOWN)
-
-def logoff():
- win32api.ExitWindowsEx(EWX_LOGOFF)
-
-
-def renameComputer(newName):
- # Needs admin privileges to work
- if ctypes.windll.kernel32.SetComputerNameExW(DWORD(win32con.ComputerNamePhysicalDnsHostname), LPCWSTR(newName)) == 0: # @UndefinedVariable
- # win32api.FormatMessage -> returns error string
- # win32api.GetLastError -> returns error code
- # (just put this comment here to remember to log this when logger is available)
- error = getErrorMessage()
- computerName = win32api.GetComputerNameEx(win32con.ComputerNamePhysicalDnsHostname)
- raise Exception('Error renaming computer from {} to {}: {}'.format(computerName, newName, error))
-
-
-NETSETUP_JOIN_DOMAIN = 0x00000001
-NETSETUP_ACCT_CREATE = 0x00000002
-NETSETUP_ACCT_DELETE = 0x00000004
-NETSETUP_WIN9X_UPGRADE = 0x00000010
-NETSETUP_DOMAIN_JOIN_IF_JOINED = 0x00000020
-NETSETUP_JOIN_UNSECURE = 0x00000040
-NETSETUP_MACHINE_PWD_PASSED = 0x00000080
-NETSETUP_JOIN_WITH_NEW_NAME = 0x00000400
-NETSETUP_DEFER_SPN_SET = 0x1000000
-
-
-def joinDomain(domain, ou, account, password, executeInOneStep=False):
- '''
- Joins machine to a windows domain
- :param domain: Domain to join to
- :param ou: Ou that will hold machine
- :param account: Account used to join domain
- :param password: Password of account used to join domain
- :param executeInOneStep: If true, means that this machine has been renamed and wants to add NETSETUP_JOIN_WITH_NEW_NAME to request so we can do rename/join in one step.
- '''
- # If account do not have domain, include it
- if '@' not in account and '\\' not in account:
- if '.' in domain:
- account = account + '@' + domain
- else:
- account = domain + '\\' + account
-
- # Do log
- flags = NETSETUP_ACCT_CREATE | NETSETUP_DOMAIN_JOIN_IF_JOINED | NETSETUP_JOIN_DOMAIN
-
- if executeInOneStep:
- flags |= NETSETUP_JOIN_WITH_NEW_NAME
-
- flags = DWORD(flags)
-
- domain = LPCWSTR(domain)
-
- # Must be in format "ou=.., ..., dc=...,"
- ou = LPCWSTR(ou) if ou is not None and ou != '' else None
- account = LPCWSTR(account)
- password = LPCWSTR(password)
-
- res = ctypes.windll.netapi32.NetJoinDomain(None, domain, ou, account, password, flags)
- # Machine found in another ou, use it and warn this on log
- if res == 2224:
- flags = DWORD(NETSETUP_DOMAIN_JOIN_IF_JOINED | NETSETUP_JOIN_DOMAIN)
- res = ctypes.windll.netapi32.NetJoinDomain(None, domain, None, account, password, flags)
- if res != 0:
- # Log the error
- error = getErrorMessage(res)
- if res == 1355:
- error = "DC Is not reachable"
- print('{} {}'.format(res, error))
- raise Exception('Error joining domain {}, with credentials {}/*****{}: {}, {}'.format(domain.value, account.value, ', under OU {}'.format(ou.value) if ou.value is not None else '', res, error))
-
-
-def changeUserPassword(user, oldPassword, newPassword):
- computerName = LPCWSTR(getComputerName())
- user = LPCWSTR(user)
- oldPassword = LPCWSTR(oldPassword)
- newPassword = LPCWSTR(newPassword)
-
- res = ctypes.windll.netapi32.NetUserChangePassword(computerName, user, oldPassword, newPassword)
-
- if res != 0:
- # Log the error, and raise exception to parent
- error = getErrorMessage()
- raise Exception('Error changing password for user {}: {}'.format(user.value, error))
-
-
-class LASTINPUTINFO(ctypes.Structure):
- _fields_ = [
- ('cbSize', ctypes.c_uint),
- ('dwTime', ctypes.c_uint),
- ]
-
-
-def initIdleDuration(atLeastSeconds):
- '''
- In windows, there is no need to set screensaver
- '''
- pass
-
-
-def getIdleDuration():
- lastInputInfo = LASTINPUTINFO()
- lastInputInfo.cbSize = ctypes.sizeof(lastInputInfo)
- ctypes.windll.user32.GetLastInputInfo(ctypes.byref(lastInputInfo))
- millis = ctypes.windll.kernel32.GetTickCount() - lastInputInfo.dwTime # @UndefinedVariable
- return millis / 1000.0
-
-
-def getCurrentUser():
- '''
- Returns current logged in username
- '''
- return os.environ['USERNAME']
-
-
-def getSessionLanguage():
- '''
- Returns the user's session language
- '''
- return locale.getdefaultlocale()[0]
-
-
-def showPopup(title, message):
- '''
- Displays a message box on user's session (during 1 min).
- '''
- return subprocess.call('mshta "javascript:var sh=new ActiveXObject(\'WScript.Shell\'); sh.Popup( \'{}\', 60, \'{}\', 64); close()"'.format(message.encode('unicode_escape'), title.encode('unicode_escape')), shell=True)
-
-
-def get_etc_path():
- """
- :return:
- Returns etc directory path.
- """
- return os.path.join('C:', os.sep, 'Windows', 'System32', 'drivers', 'etc')
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/workers/__init__.py b/admin/Sources/Clients/ogagent/src/opengnsys/workers/__init__.py
deleted file mode 100644
index f2bcd7d2..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/workers/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .server_worker import ServerWorker
-from .client_worker import ClientWorker
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/workers/client_worker.py b/admin/Sources/Clients/ogagent/src/opengnsys/workers/client_worker.py
deleted file mode 100644
index 6a083804..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/workers/client_worker.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import,wildcard-import
-from __future__ import unicode_literals
-
-class ClientWorker(object):
- '''
- A ServerWorker is a server module that "works" for service
- Most method are invoked inside their own thread, except onActivation & onDeactivation.
- This two methods are invoked inside main service thread, take that into account when creating them
-
- * You must provide a module name (override name on your class), so we can identify the module by a "valid" name.
- A valid name is like a valid python variable (do not use spaces, etc...)
- * The name of the module is used as REST message destination id:
- https://sampleserver:8888/[name]/....
- Remember that module names and REST path are case sensitive!!!
-
- '''
- name = None
- service = None
-
- def __init__(self, service):
- self.service = service
-
- def activate(self):
- '''
- Convenient method to wrap onActivation, so we can include easyly custom common logic for activation in a future
- '''
- self.onActivation()
-
- def deactivate(self):
- '''
- Convenient method to wrap onActivation, so we can include easyly custom common logic for deactivation in a future
- '''
- self.onDeactivation()
-
- def processMessage(self, message, params):
- '''
- This method can be overriden to provide your own message proccessor, or better you can
- implement a method that is called "process_" + message and this default processMessage will invoke it
- * Example:
- We got a message from OGAgent "Mazinger", with json params
- module.processMessage("mazinger", jsonParams)
-
- This method will process "mazinguer", and look for a "self" method that is called "process_mazinger", and invoke it this way:
- return self.process_mazinger(jsonParams)
-
- The methods must return data that can be serialized to json (i.e. Ojects are not serializable to json, basic type are)
- '''
- try:
- operation = getattr(self, 'process_' + message)
- except Exception:
- raise Exception('Message processor for "{}" not found'.format(message))
-
- return operation(params)
-
- def onActivation(self):
- '''
- Invoked by Service for activation.
- This MUST be overridden by modules!
- This method is invoked inside main thread, so if it "hangs", complete service will hang
- This should be no problem, but be advised about this
- '''
- pass
-
- def onDeactivation(self):
- '''
- Invoked by Service before unloading service
- This MUST be overridden by modules!
- This method is invoked inside main thread, so if it "hangs", complete service will hang
- This should be no problem, but be advised about this
- '''
- pass
-
- # *************************************
- # * Helper, convenient helper methods *
- # *************************************
- def sendServerMessage(self, message, data):
- '''
- Sends a message to connected ipc clients
- By convenience, it uses the "current" moduel name as destination module name also.
- If you need to send a message to a different module, you can use self.service.sendClientMessage(module, message, data) instead
- og this helmer
- '''
- self.service.ipc.sendMessage(self.name, message, data)
- \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/workers/server_worker.py b/admin/Sources/Clients/ogagent/src/opengnsys/workers/server_worker.py
deleted file mode 100644
index 141d657c..00000000
--- a/admin/Sources/Clients/ogagent/src/opengnsys/workers/server_worker.py
+++ /dev/null
@@ -1,186 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import,wildcard-import
-from __future__ import unicode_literals
-
-class ServerWorker(object):
- '''
- A ServerWorker is a server module that "works" for service
- Most method are invoked inside their own thread, except onActivation & onDeactivation.
- This two methods are invoked inside main service thread, take that into account when creating them
-
- * You must provide a module name (override name on your class), so we can identify the module by a "valid" name.
- A valid name is like a valid python variable (do not use spaces, etc...)
- * The name of the module is used as REST message destination id:
- https://sampleserver:8888/[name]/....
- Remember that module names and REST path are case sensitive!!!
-
- '''
- name = None
- service = None
- locked = False
-
- def __init__(self, service):
- self.service = service
-
- def activate(self):
- '''
- Convenient method to wrap onActivation, so we can include easyly custom common logic for activation in a future
- '''
- self.onActivation()
-
- def deactivate(self):
- '''
- Convenient method to wrap onActivation, so we can include easyly custom common logic for deactivation in a future
- '''
- self.onDeactivation()
-
- def process(self, getParams, postParams, server):
- '''
- This method is invoked on a message received with an empty path (that means a message with only the module name, like in "http://example.com/Sample"
- Override it if you expect messages with that pattern
-
- Overriden method must return data that can be serialized to json (i.e. Ojects are not serializable to json, basic type are)
- '''
- raise NotImplementedError('Generic message processor is not supported')
-
- def processServerMessage(self, path, getParams, postParams, server):
- '''
- This method can be overriden to provide your own message proccessor, or better you can
- implement a method that is called exactly as "process_" + path[0] (module name has been removed from path array) and this default processMessage will invoke it
- * Example:
- Imagine this invocation url (no matter if GET or POST): http://example.com:9999/Sample/mazinger/Z
- The HTTP Server will remove "Sample" from path, parse arguments and invoke this method as this:
- module.processMessage(["mazinger","Z"], getParams, postParams)
-
- This method will process "mazinguer", and look for a "self" method that is called "process_mazinger", and invoke it this way:
- return self.process_mazinger(["Z"], getParams, postParams)
-
- In the case path is empty (that is, the path is composed only by the module name, like in "http://example.com/Sample", the "process" method
- will be invoked directly
-
- The methods must return data that can be serialized to json (i.e. Ojects are not serializable to json, basic type are)
- '''
- if self.locked is True:
- raise Exception('system is busy')
-
- if len(path) == 0:
- return self.process(getParams, postParams, server)
- try:
- operation = getattr(self, 'process_' + path[0])
- except Exception:
- raise Exception('Message processor for "{}" not found'.format(path[0]))
-
- return operation(path[1:], getParams, postParams, server)
-
-
- def processClientMessage(self, message, data):
- '''
- Invoked by Service when a client message is received (A message from user space Agent)
-
- This method can be overriden to provide your own message proccessor, or better you can
- implement a method that is called exactly "process_client_" + message (module name has been removed from path) and this default processMessage will invoke it
- * Example:
- We got a message from OGAgent "Mazinger", with json params
- module.processClientMessage("mazinger", jsonParams)
-
- This method will process "mazinguer", and look for a "self" method that is called "process_client_mazinger", and invoke it this way:
- self.process_client_mazinger(jsonParams)
-
- The methods returns nothing (client communications are done asynchronously)
- '''
- try:
- operation = getattr(self, 'process_client_' + message)
- except Exception:
- raise Exception('Message processor for "{}" not found'.format(message))
-
- operation(data)
-
- # raise NotImplementedError('Got a client message but no proccessor is implemented')
-
-
- def onActivation(self):
- '''
- Invoked by Service for activation.
- This MUST be overridden by modules!
- This method is invoked inside main thread, so if it "hangs", complete service will hang
- This should be no problem, but be advised about this
- '''
- pass
-
- def onDeactivation(self):
- '''
- Invoked by Service before unloading service
- This MUST be overridden by modules!
- This method is invoked inside main thread, so if it "hangs", complete service will hang
- This should be no problem, but be advised about this
- '''
- pass
-
-
- def onLogin(self, user):
- '''
- Invoked by Service when an user login is detected
- This CAN be overridden by modules
- This method is invoked whenever the client (user space agent) notifies the server (Service) that a user has logged in.
- This method is run on its own thread
- '''
- pass
-
- def onLogout(self, user):
- '''
- Invoked by Service when an user login is detected
- This CAN be overridden by modules
- This method is invoked whenever the client (user space agent) notifies the server (Service) that a user has logged in.
- This method is run on its own thread
- '''
- pass
-
- # *************************************
- # * Helper, convenient helper methods *
- # *************************************
- def sendClientMessage(self, message, data):
- '''
- Sends a message to connected ipc clients
- By convenience, it uses the "current" moduel name as destination module name also.
- If you need to send a message to a different module, you can use self.service.sendClientMessage(module, message, data) instead
- og this helmer
- '''
- self.service.sendClientMessage(self.name, message, data)
-
- def sendScriptMessage(self, script):
- self.service.sendScriptMessage(script)
-
- def sendLogoffMessage(self):
- self.service.sendLogoffMessage()
-
- def sendPopupMessage(self):
- self.service.sendPopupMessage()
diff --git a/admin/Sources/Clients/ogagent/src/prototypes/threaded_server.py b/admin/Sources/Clients/ogagent/src/prototypes/threaded_server.py
deleted file mode 100644
index ed5583bf..00000000
--- a/admin/Sources/Clients/ogagent/src/prototypes/threaded_server.py
+++ /dev/null
@@ -1,170 +0,0 @@
-'''
-Created on Jul 9, 2015
-
-@author: dkmaster
-'''
-from __future__ import unicode_literals, print_function
-
-# Pydev can't parse "six.moves.xxxx" because it is loaded lazy
-from six.moves.socketserver import ThreadingMixIn # @UnresolvedImport
-from six.moves.SimpleHTTPServer import SimpleHTTPRequestHandler # @UnresolvedImport
-from six.moves.BaseHTTPServer import HTTPServer # @UnresolvedImport
-from six.moves.urllib.parse import unquote # @UnresolvedImport
-
-import json
-import threading
-import ssl
-
-import os.path
-import tempfile
-
-# For testing
-# --------------------
-CERTFILE = 'UDSActor.pem'
-
-
-def createSelfSignedCert(force=False):
-
- certFile = os.path.join(tempfile.gettempdir(), CERTFILE)
-
- if os.path.exists(certFile) and not force:
- return certFile
-
- certData = '''-----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCb50K3mIznNklz
-yVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxbfxHbeRnoYTWV2nKk4+tHqmvz
-ujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqCfItWgL5pJopDpNHFul9Rn3ds
-PMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPmVLdF4uJ3Tuz8TSy2gWLs5aSr
-5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuDUGNBvBQFac1G7qUcMReeu8Zr
-DUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDqDUK1Oqs9X35yOQfDOAFYHiix
-PX0IsXOZAgMBAAECggEBAJi3000RrIUZUp6Ph0gzPMuCjDEEwWiQA7CPNX1gpb8O
-dp0WhkDhUroWIaICYPSXtOwUTtVjRqivMoxPy1Thg3EIoGC/rdeSdlXRHMEGicwJ
-yVyalFnatr5Xzg5wkxVh4XMd0zeDt7e3JD7s0QLo5lm1CEzd77qz6lhzFic5/1KX
-bzdULtTlq60dazg2hEbcS4OmM1UMCtRVDAsOIUIZPL0M9j1C1d1iEdYnh2xshKeG
-/GOfo95xsgdMlGjtv3hUT5ryKVoEsu+36rGb4VfhPfUvvoVbRx5QZpW+QvxaYh5E
-Fi0JEROozFwG31Y++8El7J3yQko8cFBa1lYYUwwpNAECgYEAykT+GiM2YxJ4uVF1
-OoKiE9BD53i0IG5j87lGPnWqzEwYBwnqjEKDTou+uzMGz3MDV56UEFNho7wUWh28
-LpEkjJB9QgbsugjxIBr4JoL/rYk036e/6+U8I95lvYWrzb+rBMIkRDYI7kbQD/mQ
-piYUpuCkTymNAu2RisK6bBzJslkCgYEAxVE23OQvkCeOV8hJNPZGpJ1mDS+TiOow
-oOScMZmZpail181eYbAfMsCr7ri812lSj98NvA2GNVLpddil6LtS1cQ5p36lFBtV
-xQUMZiFz4qVbEak+izL+vPaev/mXXsOcibAIQ+qI/0txFpNhJjpaaSy6vRCBYFmc
-8pgSoBnBI0ECgYAUKCn2atnpp5aWSTLYgNosBU4vDA1PShD14dnJMaqyr0aZtPhF
-v/8b3btFJoGgPMLxgWEZ+2U4ju6sSFhPf7FXvLJu2QfQRkHZRDbEh7t5DLpTK4Fp
-va9vl6Ml7uM/HsGpOLuqfIQJUs87OFCc7iCSvMJDDU37I7ekT2GKkpfbCQKBgBrE
-0NeY0WcSJrp7/oqD2sOcYurpCG/rrZs2SIZmGzUhMxaa0vIXzbO59dlWELB8pmnE
-Tf20K//x9qA5OxDe0PcVPukdQlH+/1zSOYNliG44FqnHtyd1TJ/gKVtMBiAiE4uO
-aSClod5Yosf4SJbCFd/s5Iyfv52NqsAyp1w3Aj/BAoGAVCnEiGUfyHlIR+UH4zZW
-GXJMeqdZLfcEIszMxLePkml4gUQhoq9oIs/Kw+L1DDxUwzkXN4BNTlFbOSu9gzK1
-dhuIUGfS6RPL88U+ivC3A0y2jT43oUMqe3hiRt360UQ1GXzp2dMnR9odSRB1wHoO
-IOjEBZ8341/c9ZHc5PCGAG8=
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIJAIrEIthCfxUCMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD
-VQQGEwJFUzEPMA0GA1UECAwGTWFkcmlkMREwDwYDVQQHDAhBbGNvcmNvbjEMMAoG
-A1UECgwDVURTMQ4wDAYDVQQLDAVBY3RvcjESMBAGA1UEAwwJVURTIEFjdG9yMSgw
-JgYJKoZIhvcNAQkBFhlzdXBwb3J0QHVkc2VudGVycHJpc2UuY29tMB4XDTE0MTAy
-NjIzNDEyNFoXDTI0MTAyMzIzNDEyNFowgY0xCzAJBgNVBAYTAkVTMQ8wDQYDVQQI
-DAZNYWRyaWQxETAPBgNVBAcMCEFsY29yY29uMQwwCgYDVQQKDANVRFMxDjAMBgNV
-BAsMBUFjdG9yMRIwEAYDVQQDDAlVRFMgQWN0b3IxKDAmBgkqhkiG9w0BCQEWGXN1
-cHBvcnRAdWRzZW50ZXJwcmlzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCb50K3mIznNklzyVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxb
-fxHbeRnoYTWV2nKk4+tHqmvzujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqC
-fItWgL5pJopDpNHFul9Rn3dsPMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPm
-VLdF4uJ3Tuz8TSy2gWLs5aSr5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuD
-UGNBvBQFac1G7qUcMReeu8ZrDUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDq
-DUK1Oqs9X35yOQfDOAFYHiixPX0IsXOZAgMBAAGjUDBOMB0GA1UdDgQWBBRShS90
-5lJTNvYPIEqP3GxWwG5iiDAfBgNVHSMEGDAWgBRShS905lJTNvYPIEqP3GxWwG5i
-iDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAU0Sp4gXhQmRVzq+7+
-vRFUkQuPj4Ga/d9r5Wrbg3hck3+5pwe9/7APoq0P/M0DBhQpiJKjrD6ydUevC+Y/
-43ZOJPhMlNw0o6TdQxOkX6FDwQanLLs7sfvJvqtVzYn3nuRFKT3dvl7Zg44QMw2M
-ay42q59fAcpB4LaDx/i7gOYSS5eca3lYW7j7YSr/+ozXK2KlgUkuCUHN95lOq+dF
-trmV9mjzM4CNPZqKSE7kpHRywgrXGPCO000NvEGSYf82AtgRSFKiU8NWLQSEPdcB
-k//2dsQZw2cRZ8DrC2B6Tb3M+3+CA6wVyqfqZh1SZva3LfGvq/C+u+ItguzPqNpI
-xtvM
------END CERTIFICATE-----'''
- with open(certFile, "wt") as f:
- f.write(certData)
-
- return certFile
-# --------------
-
-
-class HTTPServerHandler(SimpleHTTPRequestHandler):
- service = None
- protocol_version = 'HTTP/1.1'
- server_version = 'OpenGnsys Agent Server'
- sys_version = ''
-
- def sendJsonError(self, code, message):
- self.send_response(code)
- self.send_header('Content-type', 'application/json')
- self.end_headers()
- self.wfile.write(json.dumps({'error': message}))
- return
-
- def sendJsonResponse(self, data):
- self.send_response(200)
- data = json.dumps(data)
- self.send_header('Content-type', 'application/json')
- self.send_header('Content-Length', len(data))
- self.end_headers()
- # Send the html message
- self.wfile.write(data)
-
-
- # parseURL
- def parseUrl(self):
- # Very simple path & params splitter
- path = self.path.split('?')[0][1:].split('/')
-
- try:
- params = dict((v[0], unquote(v[1])) for v in (v.split('=') for v in self.path.split('?')[1].split('&')))
- except Exception:
- params = {}
-
- return (path, params)
-
-
- def do_GET(self):
- path, params = self.parseUrl()
-
- self.sendJsonResponse({'path': path, 'params': params})
-
- def do_POST(self):
- path, getParams = self.parseUrl()
-
- # Now post parameters, that are in JSON format
-
-
-
-
-
-class HTTPThreadingServer(ThreadingMixIn, HTTPServer):
- pass
-
-class HTTPServerThread(threading.Thread):
- def __init__(self, address, service):
- super(self.__class__, self).__init__()
-
- HTTPServerHandler.service = service
-
- self.certFile = createSelfSignedCert()
- self.server = HTTPThreadingServer(address, HTTPServerHandler)
- self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.certFile, server_side=True)
-
- def getServerUrl(self):
- return 'https://{}:{}/{}'.format(self.server.server_address[0], self.server.server_address[1], HTTPServerHandler.uuid)
-
- def stop(self):
- self.server.shutdown()
-
- def run(self):
- self.server.serve_forever()
-
-
-if __name__ == '__main__':
- thr = HTTPServerThread(('0.0.0.0', 8000), None)
- print('Server started: {}'.format(thr))
- thr.start()
-
- \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/setup.py b/admin/Sources/Clients/ogagent/src/setup.py
deleted file mode 100644
index 85300f7e..00000000
--- a/admin/Sources/Clients/ogagent/src/setup.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-@author: Ramón M. Gómez, ramongomez at us dot es
-"""
-
-# ModuleFinder can't handle runtime changes to __path__, but win32com uses them
-try:
- # py2exe 0.6.4 introduced a replacement modulefinder.
- # This means we have to add package paths there, not to the built-in
- # one. If this new modulefinder gets integrated into Python, then
- # we might be able to revert this some day.
- # if this doesn't work, try import modulefinder
- try:
- import py2exe.mf as modulefinder
- except ImportError:
- import modulefinder
- import win32com
- import sys
- for p in win32com.__path__[1:]:
- modulefinder.AddPackagePath("win32com", p)
- for extra in ["win32com.shell"]: # ,"win32com.mapi"
- __import__(extra)
- m = sys.modules[extra]
- for p in m.__path__[1:]:
- modulefinder.AddPackagePath(extra, p)
-except ImportError:
- # no build path setup, no worries.
- pass
-
-import os
-from distutils.core import setup
-
-import sys
-
-# Reading version file:
-try:
- with open('VERSION', 'r') as v:
- VERSION = v.read().split()
-except IOError:
- VERSION = '1.1.0'
-
-sys.argv.append('py2exe')
-
-
-def get_requests_cert_file():
- """Add Python requests or certifi .pem file for installers."""
- import requests
- f = os.path.join(os.path.dirname(requests.__file__), 'cacert.pem')
- if not os.path.exists(f):
- import certifi
- f = os.path.join(os.path.dirname(certifi.__file__), 'cacert.pem')
- return f
-
-
-class Target:
-
- def __init__(self, **kw):
- self.__dict__.update(kw)
- # for the versioninfo resources
- self.version = VERSION
- self.name = 'OGAgentService'
- self.description = 'OpenGnsys Agent Service'
- self.author = 'Adolfo Gomez'
- self.url = 'https://opengnsys.es/'
- self.company_name = "OpenGnsys Project"
- self.copyright = "(c) 2014 VirtualCable S.L.U."
- self.name = "OpenGnsys Agent"
-
-# Now you need to pass arguments to setup
-# windows is a list of scripts that have their own UI and
-# thus don't need to run in a console.
-
-
-udsservice = Target(
- description='OpenGnsys Agent Service',
- modules=['opengnsys.windows.OGAgentService'],
- icon_resources=[(0, 'img\\oga.ico'), (1, 'img\\oga.ico')],
- cmdline_style='pywin32'
-)
-
-# Some test_modules are hidden to py2exe by six, we ensure that they appear on "includes"
-HIDDEN_BY_SIX = ['SocketServer', 'SimpleHTTPServer', 'urllib']
-
-setup(
- windows=[
- {
- 'script': 'OGAgentUser.py',
- 'icon_resources': [(0, 'img\\oga.ico'), (1, 'img\\oga.ico')]
- },
- ],
- console=[
- {
- 'script': 'OGAServiceHelper.py'
- }
- ],
- service=[udsservice],
- data_files=[('', [get_requests_cert_file()]), ('cfg', ['cfg/ogagent.cfg', 'cfg/ogclient.cfg'])],
- options={
- 'py2exe': {
- 'bundle_files': 3,
- 'compressed': True,
- 'optimize': 2,
- 'includes': ['sip', 'PyQt4', 'win32com.shell', 'requests', 'encodings', 'encodings.utf_8'] + HIDDEN_BY_SIX,
- 'excludes': ['doctest', 'unittest'],
- 'dll_excludes': ['msvcp90.dll'],
- 'dist_dir': '..\\bin',
- }
- },
- name='OpenGnsys Agent',
- version=VERSION,
- description='OpenGnsys Agent',
- author='Adolfo Gomez',
- author_email='agomez@virtualcable.es',
- zipfile='OGAgent.zip',
-)
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/client/Sample1/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/client/Sample1/__init__.py
deleted file mode 100644
index db174f0e..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/client/Sample1/__init__.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.workers import ClientWorker
-
-class Sample1(ClientWorker):
- name = 'Sample1'
-
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/client/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/client/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/client/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/__init__.py
deleted file mode 100644
index 189957e6..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# Module must be imported on package, so we can initialize and load it
-from sample1 import Sample1 \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample1.py b/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample1.py
deleted file mode 100644
index 61e405ec..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample1.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-from opengnsys.workers import ServerWorker
-
-from .sample_pkg import test
-
-class Sample1(ServerWorker):
- name='Sample1'
-
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample_pkg/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample_pkg/__init__.py
deleted file mode 100644
index 19365721..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/server/Sample1/sample_pkg/__init__.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-from __future__ import unicode_literals
-
-
-def test():
- return 'Test' \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/test_modules/server/__init__.py b/admin/Sources/Clients/ogagent/src/test_modules/server/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/admin/Sources/Clients/ogagent/src/test_modules/server/__init__.py
+++ /dev/null
diff --git a/admin/Sources/Clients/ogagent/src/test_rest_server.py b/admin/Sources/Clients/ogagent/src/test_rest_server.py
deleted file mode 100644
index ad1aede6..00000000
--- a/admin/Sources/Clients/ogagent/src/test_rest_server.py
+++ /dev/null
@@ -1,210 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2015 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'''
-@author: Adolfo Gómez, dkmaster at dkmon dot com
-'''
-# pylint: disable=unused-wildcard-import,wildcard-import
-from __future__ import unicode_literals, print_function
-
-# Pydev can't parse "six.moves.xxxx" because it is loaded lazy
-from six.moves.socketserver import ThreadingMixIn # @UnresolvedImport
-from six.moves.BaseHTTPServer import BaseHTTPRequestHandler # @UnresolvedImport
-from six.moves.BaseHTTPServer import HTTPServer # @UnresolvedImport
-from six.moves.urllib.parse import unquote # @UnresolvedImport
-
-import json
-import threading
-import ssl
-
-import logging
-from tempfile import gettempdir
-from os.path import exists, join
-
-logger = logging.getLogger(__name__)
-
-
-CERTFILE = 'OGTestServer.pem'
-
-
-def createSelfSignedCert(force=False):
-
- certFile = join(gettempdir(), CERTFILE)
-
- if exists(certFile) and not force:
- return certFile
-
- certData = '''-----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCb50K3mIznNklz
-yVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxbfxHbeRnoYTWV2nKk4+tHqmvz
-ujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqCfItWgL5pJopDpNHFul9Rn3ds
-PMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPmVLdF4uJ3Tuz8TSy2gWLs5aSr
-5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuDUGNBvBQFac1G7qUcMReeu8Zr
-DUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDqDUK1Oqs9X35yOQfDOAFYHiix
-PX0IsXOZAgMBAAECggEBAJi3000RrIUZUp6Ph0gzPMuCjDEEwWiQA7CPNX1gpb8O
-dp0WhkDhUroWIaICYPSXtOwUTtVjRqivMoxPy1Thg3EIoGC/rdeSdlXRHMEGicwJ
-yVyalFnatr5Xzg5wkxVh4XMd0zeDt7e3JD7s0QLo5lm1CEzd77qz6lhzFic5/1KX
-bzdULtTlq60dazg2hEbcS4OmM1UMCtRVDAsOIUIZPL0M9j1C1d1iEdYnh2xshKeG
-/GOfo95xsgdMlGjtv3hUT5ryKVoEsu+36rGb4VfhPfUvvoVbRx5QZpW+QvxaYh5E
-Fi0JEROozFwG31Y++8El7J3yQko8cFBa1lYYUwwpNAECgYEAykT+GiM2YxJ4uVF1
-OoKiE9BD53i0IG5j87lGPnWqzEwYBwnqjEKDTou+uzMGz3MDV56UEFNho7wUWh28
-LpEkjJB9QgbsugjxIBr4JoL/rYk036e/6+U8I95lvYWrzb+rBMIkRDYI7kbQD/mQ
-piYUpuCkTymNAu2RisK6bBzJslkCgYEAxVE23OQvkCeOV8hJNPZGpJ1mDS+TiOow
-oOScMZmZpail181eYbAfMsCr7ri812lSj98NvA2GNVLpddil6LtS1cQ5p36lFBtV
-xQUMZiFz4qVbEak+izL+vPaev/mXXsOcibAIQ+qI/0txFpNhJjpaaSy6vRCBYFmc
-8pgSoBnBI0ECgYAUKCn2atnpp5aWSTLYgNosBU4vDA1PShD14dnJMaqyr0aZtPhF
-v/8b3btFJoGgPMLxgWEZ+2U4ju6sSFhPf7FXvLJu2QfQRkHZRDbEh7t5DLpTK4Fp
-va9vl6Ml7uM/HsGpOLuqfIQJUs87OFCc7iCSvMJDDU37I7ekT2GKkpfbCQKBgBrE
-0NeY0WcSJrp7/oqD2sOcYurpCG/rrZs2SIZmGzUhMxaa0vIXzbO59dlWELB8pmnE
-Tf20K//x9qA5OxDe0PcVPukdQlH+/1zSOYNliG44FqnHtyd1TJ/gKVtMBiAiE4uO
-aSClod5Yosf4SJbCFd/s5Iyfv52NqsAyp1w3Aj/BAoGAVCnEiGUfyHlIR+UH4zZW
-GXJMeqdZLfcEIszMxLePkml4gUQhoq9oIs/Kw+L1DDxUwzkXN4BNTlFbOSu9gzK1
-dhuIUGfS6RPL88U+ivC3A0y2jT43oUMqe3hiRt360UQ1GXzp2dMnR9odSRB1wHoO
-IOjEBZ8341/c9ZHc5PCGAG8=
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIJAIrEIthCfxUCMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD
-VQQGEwJFUzEPMA0GA1UECAwGTWFkcmlkMREwDwYDVQQHDAhBbGNvcmNvbjEMMAoG
-A1UECgwDVURTMQ4wDAYDVQQLDAVBY3RvcjESMBAGA1UEAwwJVURTIEFjdG9yMSgw
-JgYJKoZIhvcNAQkBFhlzdXBwb3J0QHVkc2VudGVycHJpc2UuY29tMB4XDTE0MTAy
-NjIzNDEyNFoXDTI0MTAyMzIzNDEyNFowgY0xCzAJBgNVBAYTAkVTMQ8wDQYDVQQI
-DAZNYWRyaWQxETAPBgNVBAcMCEFsY29yY29uMQwwCgYDVQQKDANVRFMxDjAMBgNV
-BAsMBUFjdG9yMRIwEAYDVQQDDAlVRFMgQWN0b3IxKDAmBgkqhkiG9w0BCQEWGXN1
-cHBvcnRAdWRzZW50ZXJwcmlzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCb50K3mIznNklzyVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxb
-fxHbeRnoYTWV2nKk4+tHqmvzujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqC
-fItWgL5pJopDpNHFul9Rn3dsPMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPm
-VLdF4uJ3Tuz8TSy2gWLs5aSr5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuD
-UGNBvBQFac1G7qUcMReeu8ZrDUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDq
-DUK1Oqs9X35yOQfDOAFYHiixPX0IsXOZAgMBAAGjUDBOMB0GA1UdDgQWBBRShS90
-5lJTNvYPIEqP3GxWwG5iiDAfBgNVHSMEGDAWgBRShS905lJTNvYPIEqP3GxWwG5i
-iDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAU0Sp4gXhQmRVzq+7+
-vRFUkQuPj4Ga/d9r5Wrbg3hck3+5pwe9/7APoq0P/M0DBhQpiJKjrD6ydUevC+Y/
-43ZOJPhMlNw0o6TdQxOkX6FDwQanLLs7sfvJvqtVzYn3nuRFKT3dvl7Zg44QMw2M
-ay42q59fAcpB4LaDx/i7gOYSS5eca3lYW7j7YSr/+ozXK2KlgUkuCUHN95lOq+dF
-trmV9mjzM4CNPZqKSE7kpHRywgrXGPCO000NvEGSYf82AtgRSFKiU8NWLQSEPdcB
-k//2dsQZw2cRZ8DrC2B6Tb3M+3+CA6wVyqfqZh1SZva3LfGvq/C+u+ItguzPqNpI
-xtvM
------END CERTIFICATE-----'''
- with open(certFile, "wt") as f:
- f.write(certData)
-
- return certFile
-
-class HTTPServerHandler(BaseHTTPRequestHandler):
- service = None
- protocol_version = 'HTTP/1.0'
- server_version = 'OpenGnsys Test REST Server'
- sys_version = ''
-
- def sendJsonError(self, code, message):
- self.send_response(code)
- self.send_header('Content-type', 'application/json')
- self.end_headers()
- self.wfile.write(json.dumps({'error': message}))
- return
-
- def sendJsonResponse(self, data):
- self.send_response(200)
- data = json.dumps(data)
- self.send_header('Content-type', 'application/json')
- self.send_header('Content-Length', len(data))
- self.end_headers()
- # Send the html message
- self.wfile.write(data)
-
-
- # parseURL
- def parseUrl(self):
- # Very simple path & params splitter
- path = self.path.split('?')[0][1:].split('/')
-
- try:
- params = dict((v[0], unquote(v[1])) for v in (v.split('=') for v in self.path.split('?')[1].split('&')))
- except Exception:
- params = {}
-
- return (path, params)
-
-
- def do_GET(self):
- path, params = self.parseUrl()
-
- self.sendJsonResponse({'path': path, 'params': params})
-
- def do_POST(self):
- path, getParams = self.parseUrl()
-
- # Now post parameters, that are in JSON format
- self.sendJsonResponse({'path': path, 'params': getParams})
-
- def log_error(self, fmt, *args):
- logger.error('HTTP ' + fmt % args)
-
- def log_message(self, fmt, *args):
- logger.info('HTTP ' + fmt % args)
-
-
-class HTTPThreadingServer(ThreadingMixIn, HTTPServer):
- pass
-
-class HTTPServerThread(threading.Thread):
- def __init__(self, address, service):
- super(self.__class__, self).__init__()
-
- HTTPServerHandler.service = service
-
- self.certFile = createSelfSignedCert()
- self.server = HTTPThreadingServer(address, HTTPServerHandler)
- self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.certFile, server_side=True)
-
- logger.info('Initialized HTTPS Server thread on {}'.format(address))
-
- def getServerUrl(self):
- return 'https://{}:{}/{}'.format(self.server.server_address[0], self.server.server_address[1], HTTPServerHandler.uuid)
-
- def stop(self):
- self.server.shutdown()
-
- def run(self):
- self.server.serve_forever()
-
-
-
-if __name__ == '__main__':
- logging.basicConfig(
- filename='/tmp/restserver.log',
- filemode='w',
- format='%(levelname)s %(asctime)s %(message)s',
- level=logging.DEBUG
- )
-
- thr = HTTPServerThread(('0.0.0.0', 9999), None)
- print('Server started: {}'.format(thr))
- thr.run()
- \ No newline at end of file
diff --git a/admin/Sources/Clients/ogagent/src/update.sh b/admin/Sources/Clients/ogagent/src/update.sh
deleted file mode 100755
index e6e02ab3..00000000
--- a/admin/Sources/Clients/ogagent/src/update.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2014 Virtual Cable S.L.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of Virtual Cable S.L. nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-function process {
- pyuic4 about-dialog.ui -o about_dialog_ui.py -x
- pyuic4 message-dialog.ui -o message_dialog_ui.py -x
-}
-
-cd $(dirname "$0")
-[ -r VERSION ] && sed -i "s/Version [^<]*/Version $(cat VERSION)/" about-dialog.ui
-pyrcc4 -py3 OGAgent.qrc -o OGAgent_rc.py
-
-
-# process current directory ui's
-process
-
diff --git a/admin/Sources/Clients/ogagent/windows/build-windows.sh b/admin/Sources/Clients/ogagent/windows/build-windows.sh
deleted file mode 100755
index 88a3c4ed..00000000
--- a/admin/Sources/Clients/ogagent/windows/build-windows.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-cd "$(dirname "$0")"
-export WINEARCH=win32
-export WINEPREFIX=$PWD/wine
-grep -o "[0-9]*\.[0-9]*\.[0-9]*" ../src/VERSION > VERSION
-wine cmd /c c:\\ogagent\\build.bat
-chmod -x ../OGAgentSetup*.exe
diff --git a/admin/Sources/Clients/ogagent/windows/build.bat b/admin/Sources/Clients/ogagent/windows/build.bat
deleted file mode 100644
index 2c444741..00000000
--- a/admin/Sources/Clients/ogagent/windows/build.bat
+++ /dev/null
@@ -1,6 +0,0 @@
-C:
-CD \ogagent\src
-python setup.py
-CD ..
-"C:\Program Files\NSIS\makensis.exe" ogagent.nsi
-
diff --git a/admin/Sources/Clients/ogagent/windows/ogagent.nsi b/admin/Sources/Clients/ogagent/windows/ogagent.nsi
deleted file mode 100644
index a08dbbc8..00000000
--- a/admin/Sources/Clients/ogagent/windows/ogagent.nsi
+++ /dev/null
@@ -1,238 +0,0 @@
-# We need http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin
-# Copy inside the two x86_xxxxx folders inside nsis plugins folder
-Name "OpenGnsys Agent"
-
-# OpenGnsys Agent version
-!define /file OGA_VERSION "src\VERSION"
-!define /file OGA_WINVERSION "windows\VERSION"
-
-# General Symbol Definitions
-!define REGKEY "SOFTWARE\OGAgent"
-!if ${OGA_VERSION} == ${OGA_WINVERSION}
- !define VERSION ${OGA_WINVERSION}.0
-!else
- !define VERSION ${OGA_WINVERSION}.1
-!endif
-!define COMPANY "OpenGnsys Project"
-!define URL https://opengnsys.es
-!define CONFIGFILE "cfg\ogagent.cfg"
-
-# MultiUser Symbol Definitions
-!define MULTIUSER_EXECUTIONLEVEL Admin
-!define MULTIUSER_INSTALLMODE_COMMANDLINE
-!define MULTIUSER_INSTALLMODE_INSTDIR OGAgent
-!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "${REGKEY}"
-!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUE "Path"
-
-# MUI Symbol Definitions
-!define MUI_ICON "src\img\oga.ico"
-!define MUI_FINISHPAGE_NOAUTOCLOSE
-!define MUI_UNICON "src\img\oga.ico"
-!define MUI_UNFINISHPAGE_NOAUTOCLOSE
-!define MUI_LANGDLL_REGISTRY_ROOT HKLM
-!define MUI_LANGDLL_REGISTRY_KEY ${REGKEY}
-!define MUI_LANGDLL_REGISTRY_VALUENAME InstallerLanguage
-
-# Included files
-!include MultiUser.nsh
-!include Sections.nsh
-!include MUI2.nsh
-!include nsDialogs.nsh
-!include LogicLib.nsh
-!include Filefunc.nsh
-
-# Reserved Files
-!insertmacro MUI_RESERVEFILE_LANGDLL
-
-# Variables
-Var StartMenuGroup
-Var SERVERIP
-Var SERVERIP_VALUE
-
-# Installer pages
-!insertmacro MUI_PAGE_WELCOME
-!insertmacro MUI_PAGE_LICENSE src\license.txt
-Page custom "ParamsPage" "ParamsPageLeave"
-!insertmacro MUI_PAGE_DIRECTORY
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_PAGE_FINISH
-!insertmacro MUI_UNPAGE_CONFIRM
-!insertmacro MUI_UNPAGE_INSTFILES
-
-# Installer languages
-!insertmacro MUI_LANGUAGE English
-!insertmacro MUI_LANGUAGE Spanish
-!insertmacro MUI_LANGUAGE French
-!insertmacro MUI_LANGUAGE German
-
-# Installer attributes
-BrandingText "OpenGnsys"
-OutFile OGAgentSetup-${OGA_VERSION}.exe
-InstallDir OGAgent
-CRCCheck on
-XPStyle on
-ShowInstDetails hide
-VIProductVersion "${VERSION}.0.0"
-VIAddVersionKey /LANG=${LANG_ENGLISH} ProductName "OGAgent"
-VIAddVersionKey /LANG=${LANG_ENGLISH} ProductVersion "${VERSION}"
-VIAddVersionKey /LANG=${LANG_ENGLISH} CompanyName "${COMPANY}"
-VIAddVersionKey /LANG=${LANG_ENGLISH} CompanyWebsite "${URL}"
-VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion "${VERSION}"
-VIAddVersionKey /LANG=${LANG_ENGLISH} FileDescription "OpenGnsys Agent installer"
-VIAddVersionKey /LANG=${LANG_ENGLISH} LegalCopyright "(c) 2015 Virtual Cable S.L.U."
-InstallDirRegKey HKLM "${REGKEY}" Path
-ShowUninstDetails show
-
-# Installer sections
-Section -Main SEC0000
- SetShellVarContext all
- SetOutPath $INSTDIR
- SetOverwrite on
- File /r bin\*.*
- File vcredist_x86.exe
- File src\VERSION
- WriteRegStr HKLM "${REGKEY}\Components" Main 1
-SectionEnd
-
-Section -post SEC0001
- WriteIniStr $INSTDIR\${CONFIGFILE} "opengnsys" "remote" "https://$SERVERIP_VALUE/opengnsys/rest"
- SetShellVarContext current
- WriteRegStr HKLM "${REGKEY}" Path $INSTDIR
- SetOutPath $INSTDIR
- WriteUninstaller $INSTDIR\OGAgentUninstaller.exe
- SetOutPath $SMPROGRAMS\$StartMenuGroup
- CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$(^UninstallLink).lnk" $INSTDIR\OGAgentUninstaller.exe
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}"
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}"
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}"
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\OGAgentUninstaller.exe
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\OGAgentUninstaller.exe
- WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" OGAgentTool $INSTDIR\OGAgentUser.exe
- WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
- WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
- ExecWait '"$INSTDIR\vcredist_x86.exe" /passive /norestart'
- # Add the application to the firewall exception list - All Networks - All IP Version - Enabled
- # SimpleFC::AddApplication "OpenGnsys Agent Service" "$INSTDIR\OGAgentService.exe" 0 2 "" 1
- # SimpleFC::AdvAddRule [name] [description] [protocol] [direction]
- # [status] [profile] [action] [application] [service_name] [icmp_types_and_codes]
- # [group] [local_ports] [remote_ports] [local_address] [remote_address]
- #
- SimpleFC::AdvAddRule "OpenGnsys Agent Firewall rules" "Firewall rules for OpenGnsys Agent interaction with broker." "6" "1" \
- "1" "7" "1" "$INSTDIR\OGAgentService.exe" "" "" \
- "" "" "" "" ""
- Pop $0 ; return error(1)/success(0)
- # Disable fast boot on Windows 10, if registry key exists.
- ReadRegDWORD $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Power" HiberbootEnabled
- IfErrors 0 +2
- WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Power" HiberbootEnabled 0
- # Install service
- nsExec::Exec /OEM "$INSTDIR\OGAgentService.exe --startup auto install" # Add service after installation
- # Update recovery options
- nsExec::Exec /OEM "$INSTDIR\OGAServiceHelper.exe"
- Exec "net start ogagent"
- Exec "$INSTDIR\OGAgentUser.exe"
-SectionEnd
-
-# Macro for selecting uninstaller sections
-!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID
- Push $R0
- ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}"
- StrCmp $R0 1 0 next${UNSECTION_ID}
- !insertmacro SelectSection "${UNSECTION_ID}"
- GoTo done${UNSECTION_ID}
-next${UNSECTION_ID}:
- !insertmacro UnselectSection "${UNSECTION_ID}"
-done${UNSECTION_ID}:
- Pop $R0
-!macroend
-
-# Uninstaller sections
-Section /o -un.Main UNSEC0000
- nsExec::Exec "taskkill /F /IM OGAgentUser.exe /T"
- nsExec::Exec /OEM "$INSTDIR\OGAgentService.exe stop" # Stops the service prior uninstall
- nsExec::Exec /OEM "$INSTDIR\OGAgentService.exe remove" # Removes the service prior uninstall
- nsExec::Exec "taskkill /F /IM OGAgentService.exe /T"
- Delete /REBOOTOK "$INSTDIR\*.*"
- DeleteRegValue HKLM "${REGKEY}\Components" Main
- DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" OGAgentTool
-SectionEnd
-
-Section -un.post UNSEC0001
- # Remove application from the firewall exception list
- # SimpleFC::RemoveApplication "$INSTDIR\OGAgentService.exe"
- SimpleFC::AdvRemoveRule "OpenGnsys Agent Firewall rules"
- Pop $0 ; return error(1)/success(0)
-
- SetShellVarContext current
- StrCpy $StartMenuGroup "OpenGnsys Agent"
- DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
- Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$(^UninstallLink).lnk"
- Delete /REBOOTOK $INSTDIR\OGAgentUninstaller.exe
- DeleteRegValue HKLM "${REGKEY}" Path
- DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components"
- DeleteRegKey /IfEmpty HKLM "${REGKEY}"
- RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
- SetShellVarContext all
- RmDir /r /REBOOTOK $INSTDIR
-SectionEnd
-
-# Installer functions
-Function .onInit
- InitPluginsDir
- Call GetParameters
- StrCpy $StartMenuGroup "OpenGnsys Agent"
-
- !insertmacro MUI_LANGDLL_DISPLAY
- !insertmacro MULTIUSER_INIT
-FunctionEnd
-
-# Uninstaller functions
-Function un.onInit
- StrCpy $StartMenuGroup "OpenGnsys Agent"
- !insertmacro MUI_UNGETLANGUAGE
- !insertmacro MULTIUSER_UNINIT
- !insertmacro SELECT_UNSECTION Main ${UNSEC0000}
-FunctionEnd
-
-# Parameters dialog box
-Function ParamsPage
- !insertmacro MUI_HEADER_TEXT "$(PARAMS_TITLE)" ""
- nsDialogs::Create /NOUNLOAD 1018
- Pop $0
- ${If} $0 == error
- Abort
- ${EndIf}
- ${NSD_CreateLabel} 0 0 100% 12u "$(SERVER_LABEL):"
- Pop $0
- ${NSD_CreateText} 10% 20u 80% 12u "$SERVERIP_VALUE"
- Pop $SERVERIP
- nsDialogs::Show
-FunctionEnd
-
-# Get parameters from the dialog
-Function ParamsPageLeave
- ${NSD_GetText} $SERVERIP $SERVERIP_VALUE
-FunctionEnd
-
-# Assign input parameters or default values to variables
-Function GetParameters
- ${GetOptions} $CMDLINE "/server" $SERVERIP_VALUE
- ${If} $SERVERIP_VALUE == ""
- StrCpy $SERVERIP_VALUE "192.168.2.10"
- ${EndIf}
-FunctionEnd
-
-# Installer Language Strings
-LangString PARAMS_TITLE ${LANG_ENGLISH} "Setup parameters"
-LangString PARAMS_TITLE ${LANG_SPANISH} "Parametros de configuracion"
-LangString PARAMS_TITLE ${LANG_FRENCH} "Parametres de configuration"
-LangString PARAMS_TITLE ${LANG_GERMAN} "Setup-Parameter"
-LangString SERVER_LABEL ${LANG_ENGLISH} "OpenGnsys Server IP Address"
-LangString SERVER_LABEL ${LANG_SPANISH} "Direccion IP del Servidor OpenGnsys"
-LangString SERVER_LABEL ${LANG_FRENCH} "Adresse IP du Serveur OpenGnsys"
-LangString SERVER_LABEL ${LANG_GERMAN} "OpenGnsys-Server-IP-Adresse"
-LangString ^UninstallLink ${LANG_ENGLISH} "Uninstall $(^Name)"
-LangString ^UninstallLink ${LANG_SPANISH} "Desinstalar $(^Name)"
-LangString ^UninstallLink ${LANG_FRENCH} "D�sinstaller $(^Name)"
-LangString ^UninstallLink ${LANG_GERMAN} "deinstallieren $(^Name)"
diff --git a/admin/Sources/Clients/ogagent/windows/py2exe-wine-linux.sh b/admin/Sources/Clients/ogagent/windows/py2exe-wine-linux.sh
deleted file mode 100755
index 68229b0b..00000000
--- a/admin/Sources/Clients/ogagent/windows/py2exe-wine-linux.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-
-# We need:
-# * Wine (32 bit)
-# * winetricks (in some distributions)
-
-export WINEARCH=win32 WINEPREFIX=$PWD/wine WINEDEBUG=fixme-all
-WINE=wine
-
-download() {
- mkdir downloads
- # Get needed software
- cd downloads
- wget -nd https://www.python.org/ftp/python/2.7.17/python-2.7.17.msi -O python-2.7.msi
- wget -nd https://download.microsoft.com/download/7/9/6/796EF2E4-801B-4FC4-AB28-B59FBF6D907B/VCForPython27.msi
- wget -nd https://bootstrap.pypa.io/get-pip.py
- wget -nd https://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe/download -O pyqt-install.exe
- wget -nd https://prdownloads.sourceforge.net/nsis/nsis-3.05-setup.exe?download -O nsis-install.exe
- wget -nd http://nsis.sourceforge.net/mediawiki/images/d/d7/NSIS_Simple_Firewall_Plugin_1.20.zip
- cd ..
-}
-
-install_python() {
- if which winetricks &>/dev/null; then
- echo "Setting up wine prefix (using winetricks)"
- winetricks
- fi
-
- cd downloads
- echo "Installing python"
- $WINE msiexec /qn /i python-2.7.msi
- echo "Installing vc for python"
- $WINE msiexec /qn /i VCForPython27.msi
-
- echo "Installing pyqt (needs X)"
- $WINE pyqt-install.exe
- echo "Installing nsis (needs X?)"
- $WINE nsis-install.exe
-
- cd ..
-}
-
-setup_pip() {
- echo "Seting up pip..."
- $WINE C:\\Python27\\python -m pip install --upgrade pip
-}
-
-install_packages() {
- echo "Installing pywin32"
- $WINE C:\\Python27\\python -m pip install pywin32
- echo "Installing py2exe"
- $WINE C:\\Python27\\python -m pip install py2exe_py2
- echo "Installing required packages"
- $WINE C:\\Python27\\python -m pip install requests six
- # Using easy_install instead of pip to install pycrypto
- $WINE C:\\Python27\\Scripts\\easy_install http://www.voidspace.org.uk/python/pycrypto-2.6.1/pycrypto-2.6.1.win32-py2.7.exe
- # Copy nsis required NSIS_Simple_Firewall_Plugin_1
- echo "Copying simple firewall plugin for nsis installer"
- unzip -o downloads/NSIS_Simple_Firewall_Plugin_1.20.zip SimpleFC.dll -d $WINEPREFIX/drive_c/Program\ Files/NSIS/Plugins/x86-ansi/
- unzip -o downloads/NSIS_Simple_Firewall_Plugin_1.20.zip SimpleFC.dll -d $WINEPREFIX/drive_c/Program\ Files/NSIS/Plugins/x86-unicode/
-}
-
-download
-install_python
-setup_pip
-install_packages
-