diff options
author | Ramón M. Gómez <ramongomez@us.es> | 2018-06-18 20:47:35 +0200 |
---|---|---|
committer | Ramón M. Gómez <ramongomez@us.es> | 2018-06-18 20:47:35 +0200 |
commit | 1246429a3955e5530842f02d5c06d679a3f3e58e (patch) | |
tree | 694f5c7db2aee48993563ea60b74e66b31b91517 | |
parent | 412401803144c83698840c51c301d38cc1c5c928 (diff) |
#750: Using PEP 8 Style Guide for Python in new module; implementing basic {{{getconfig}}} operation.
6 files changed, 156 insertions, 161 deletions
diff --git a/admin/Sources/Clients/ogagent/oglive/build-package.sh b/admin/Sources/Clients/ogagent/oglive/build-package.sh new file mode 100755 index 00000000..c0e03c5f --- /dev/null +++ b/admin/Sources/Clients/ogagent/oglive/build-package.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cd $(dirname "$0") + +# Build package +dpkg-buildpackage -b -d + diff --git a/admin/Sources/Clients/ogagent/oglive/build-packages.sh b/admin/Sources/Clients/ogagent/oglive/build-packages.sh deleted file mode 100755 index 4d5eb8d2..00000000 --- a/admin/Sources/Clients/ogagent/oglive/build-packages.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -cd $(dirname "$0") -top=`pwd` - -[ -r ../src/VERSION ] && VERSION="$(cat ../src/VERSION)" || VERSION="1.1.0" -RELEASE="1" - -# Debian based -dpkg-buildpackage -b -d - 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 index 1438e469..01fa1072 100644 --- a/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py +++ b/admin/Sources/Clients/ogagent/src/opengnsys/modules/server/OpenGnSys/__init__.py @@ -25,29 +25,27 @@ # 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 subprocess -import threading -import thread import os -import platform -import time import random import string +import threading +import time import urllib -from opengnsys.workers import ServerWorker -from opengnsys import REST, RESTError +from opengnsys import REST from opengnsys import operations from opengnsys.log import logger from opengnsys.scriptThread import ScriptExecutorThread +from opengnsys.workers import ServerWorker + # Error handler decorator. -def catchBackgroundError(fnc): +def catch_background_error(fnc): def wrapper(*args, **kwargs): this = args[0] try: @@ -56,18 +54,45 @@ def catchBackgroundError(fnc): this.REST.sendMessage('error?id={}'.format(kwargs.get('requestId', 'error')), {'error': '{}'.format(e)}) return wrapper + +def check_locked_partition(sync=False): + """ + Decorator to check if a partition is locked + """ + def outer(fnc): + def wrapper(*args, **kwargs): + part_id = 'None' + try: + this, path, get_params, post_params = args # @UnusedVariable + part_id = post_params['disk'] + post_params['part'] + if this.locked.get(part_id, False): + this.locked[part_id] = True + fnc(*args, **kwargs) + else: + return 'partition locked' + except Exception as e: + this.locked[part_id] = False + return 'error {}'.format(e) + finally: + if sync is True: + this.locked[part_id] = False + logger.debug('Lock status: {} {}'.format(fnc, this.locked)) + return wrapper + return outer + + class OpenGnSysWorker(ServerWorker): name = 'opengnsys' interface = None # Binded interface for OpenGnsys loggedin = False # User session flag - locked = {} + locked = {} # Locked partitions random = None # Random string for secure connections length = 32 # Random string length def checkSecret(self, server): - ''' + """ Checks for received secret key and raise exception if it isn't valid. - ''' + """ try: if self.random != server.headers['Authorization']: raise Exception('Unauthorized operation') @@ -76,9 +101,9 @@ class OpenGnSysWorker(ServerWorker): raise Exception(e) def onActivation(self): - ''' + """ Sends OGAgent activation notification to OpenGnsys server - ''' + """ self.cmd = None # Ensure cfg has required configuration variables or an exception will be thrown self.REST = REST(self.service.config.get('opengnsys', 'remote')) @@ -107,52 +132,59 @@ class OpenGnSysWorker(ServerWorker): # Generate random secret to send on activation self.random = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(self.length)) # Send initalization message - self.REST.sendMessage('ogagent/started', {'mac': self.interface.mac, 'ip': self.interface.ip, 'secret': self.random, 'ostype': operations.osType, 'osversion': operations.osVersion}) + self.REST.sendMessage('ogagent/started', {'mac': self.interface.mac, 'ip': self.interface.ip, + 'secret': self.random, 'ostype': operations.os_type, + 'osversion': operations.os_version}) 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.osType, 'osversion': operations.osVersion}) + 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, userData): - ''' + """ Sends session login notification to OpenGnsys server - ''' + """ user, sep, language = userData.partition(',') logger.debug('Received login for {} with language {}'.format(user, language)) self.loggedin = True - self.REST.sendMessage('ogagent/loggedin', {'ip': self.interface.ip, 'user': user, 'language': language, 'ostype': operations.osType, 'osversion': operations.osVersion}) + 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.loggedin = False self.REST.sendMessage('ogagent/loggedout', {'ip': self.interface.ip, 'user': user}) def process_ogclient(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 + """ + his 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 patharray) 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 "mazinger", and look for a "self" method that is called "process_mazinger", and invoke it this way: + 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"], 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 + 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) - ''' + The methods must return data that can be serialized to json (i.e. Ojects are not serializable to json, + basic type are) + """ if not path: return "ok" try: @@ -162,34 +194,27 @@ class OpenGnSysWorker(ServerWorker): return operation(path[1:], getParams, postParams) def process_status(self, path, getParams, postParams, server): - ''' + """ Returns client status. - ''' - res = {'status': '', 'loggedin': self.loggedin} - 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' + """ + st = {'linux': 'LNX', 'macos': 'OSX', 'oglive': 'OPG', 'windows': 'WIN'} + res = {'loggedin': self.loggedin} + try: + res['status'] = st[operations.os_type.lower()] + except KeyError: + res['status'] = '' + # Check if OpenGnsys Client is busy + if res['status'] == 'OPG' and self.locked: + res['status'] = 'BSY' return res def process_reboot(self, path, getParams, postParams, server): - ''' + """ Launches a system reboot operation. - ''' + """ logger.debug('Received reboot operation') self.checkSecret(server) + # Rebooting thread. def rebt(): operations.reboot() @@ -197,11 +222,12 @@ class OpenGnSysWorker(ServerWorker): return {'op': 'launched'} def process_poweroff(self, path, getParams, postParams, server): - ''' + """ Launches a system power off operation. - ''' + """ logger.debug('Received poweroff operation') self.checkSecret(server) + # Powering off thread. def pwoff(): time.sleep(2) @@ -210,9 +236,9 @@ class OpenGnSysWorker(ServerWorker): return {'op': 'launched'} def process_script(self, path, getParams, postParams, server): - ''' + """ Processes an script execution (script should be encoded in base64) - ''' + """ logger.debug('Processing script request') self.checkSecret(server) # Decoding script. @@ -227,9 +253,9 @@ class OpenGnSysWorker(ServerWorker): return {'op': 'launched'} def process_logoff(self, path, getParams, postParams, server): - ''' + """ Closes user session. - ''' + """ logger.debug('Received logoff operation') self.checkSecret(server) # Sending log off message to OGAgent client. @@ -237,9 +263,9 @@ class OpenGnSysWorker(ServerWorker): return {'op': 'sended to client'} def process_popup(self, path, getParams, postParams, server): - ''' + """ Shows a message popup on the user's session. - ''' + """ logger.debug('Received message operation') self.checkSecret(server) # Sending popup message to OGAgent client. @@ -248,3 +274,17 @@ class OpenGnSysWorker(ServerWorker): def process_client_popup(self, params): self.REST.sendMessage('popup_done', params) + + def process_getconfig(self, path, get_params, post_params, server): + """ + Returns client configuration + :param path: + :param get_params: + :param post_params: + :param server: + :return: object + """ + logger.debug('Recieved getconfig operation') + self.checkSecret(server) + # Returns raw data + return {'config': operations.get_disk_config()} diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/oglive/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/oglive/operations.py index ded43791..6c67421b 100644 --- a/admin/Sources/Clients/ogagent/src/opengnsys/oglive/operations.py +++ b/admin/Sources/Clients/ogagent/src/opengnsys/oglive/operations.py @@ -26,17 +26,14 @@ # 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 socket import platform import fcntl -import os -import ctypes # @UnusedImport -import ctypes.util import subprocess import struct import array @@ -44,37 +41,11 @@ import six from opengnsys import utils -def checkLockedPartition(sync=False): - ''' - Decorator to check if a partition is locked - ''' - def outer(fnc): - def wrapper(*args, **kwargs): - partId = 'None' - try: - this, path, getParams, postParams = args # @UnusedVariable - partId = postParams['disk'] + postParams['part'] - if this.locked.get(partId, False): - this.locked[partId] = True - fnc(*args, **kwargs) - else: - return 'partition locked' - except Exception as e: - this.locked[partId] = False - return 'error {}'.format(e) - finally: - if sync is True: - this.locked[partId] = False - logger.debug('Lock status: {} {}'.format(fnc, this.locked)) - return wrapper - return outer - - 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): @@ -88,10 +59,10 @@ def _getMacAddr(ifname): 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): @@ -108,9 +79,9 @@ def _getIpAddr(ifname): 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': @@ -134,32 +105,32 @@ def _getInterfaces(): def _getIpAndMac(ifname): ip, mac = _getIpAddr(ifname), _getMacAddr(ifname) - return (ip, mac) + return ip, mac -def _exec_ogcommand(self, ogcmd): - ''' +def _exec_ogcommand(ogcmd): + """ Loads OpenGnsys environment variables, executes the command and returns the result - ''' - ret = subprocess.check_output('source /opt/opengnsys/etc/preinit/loadenviron.sh >/dev/null; {}'.format(ogcmd), shell=True) + """ + ret = subprocess.check_output(ogcmd, shell=True) return ret 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: + :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 @@ -170,56 +141,44 @@ def getDomainName(): return '' -def getOgliveVersion(): - lv = platform.linux_distribution() - return lv[0] + ', ' + lv[1] +def get_oglive_version(): + """ + Returns ogLive Kernel version and architecture + :return: kernel version + """ + kv = platform.os.uname() + return kv[2] + ', ' + kv[4] def reboot(): - ''' + """ Simple reboot using OpenGnsys script - ''' + """ # Workaround for dummy thread if six.PY3 is False: import threading threading._DummyThread._Thread__stop = lambda x: 42 - _exec_ogcommand('/opt/opengnsys/scripts/reboot', shell=True) + _exec_ogcommand('/opt/opengnsys/scripts/reboot') def poweroff(): - ''' + """ Simple poweroff using OpenGnsys script - ''' + """ # Workaround for dummy thread if six.PY3 is False: import threading threading._DummyThread._Thread__stop = lambda x: 42 - _exec_ogcommand('/opt/opengnsys/scripts/poweroff', shell=True) - - -def logoff(): - pass - - -def renameComputer(newName): - pass - - -def joinDomain(domain, ou, account, password, executeInOneStep=False): - pass - - -def changeUserPassword(user, oldPassword, newPassword): - pass + _exec_ogcommand('/opt/opengnsys/scripts/poweroff') -def diskconfig(): - ''' - Returns disk configuration. - Warning: this operation may take some time. - ''' +def get_disk_config(): + """ + Returns disk configuration + Warning: this operation may take some time + """ try: _exec_ogcommand('/opt/opengnsys/interfaceAdm/getConfiguration') # Returns content of configuration file. diff --git a/admin/Sources/Clients/ogagent/src/opengnsys/operations.py b/admin/Sources/Clients/ogagent/src/opengnsys/operations.py index 9015cbec..926e5a2c 100644 --- a/admin/Sources/Clients/ogagent/src/opengnsys/operations.py +++ b/admin/Sources/Clients/ogagent/src/opengnsys/operations.py @@ -26,9 +26,9 @@ # 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 +""" # pylint: disable=unused-wildcard-import,wildcard-import from __future__ import unicode_literals @@ -39,19 +39,19 @@ import os # Importing platform operations and getting operating system data. if sys.platform == 'win32': from .windows.operations import * # @UnusedWildImport - osType = 'Windows' - osVersion = getWindowsVersion() + os_type = 'Windows' + os_version = getWindowsVersion() else: if sys.platform == 'darwin': from .macos.operations import * # @UnusedWildImport - osType = 'MacOS' - osVersion = getMacosVersion().replace(',','') + os_type = 'MacOS' + os_version = getMacosVersion().replace(',', '') else: if os.path.exists('/scripts/oginit'): from .oglive.operations import * # @UnusedWildImport - osType = 'ogLive' - osVersion = getOgliveVersion().replace(',','') + os_type = 'ogLive' + os_version = get_oglive_version() else: from .linux.operations import * # @UnusedWildImport - osType = 'Linux' - osVersion = getLinuxVersion().replace(',','') + os_type = 'Linux' + os_version = getLinuxVersion().replace(',', '') diff --git a/installer/vagrant/Vagrantfile-ogagent-vbox b/installer/vagrant/Vagrantfile-ogagent-vbox index 1bf48faa..31760d65 100644 --- a/installer/vagrant/Vagrantfile-ogagent-vbox +++ b/installer/vagrant/Vagrantfile-ogagent-vbox @@ -21,7 +21,7 @@ localectl set-x11-keymap ${LANG%_*} # Update repositories. dnf install -y http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm # Install main dependencies. -dnf install -y gcc-c++ debhelper dpkg-dev pyqt4-devel rpm-build subversion samba-winbind wine.i686 mingw32-wine-gecko wine-mono cabextract xar +dnf install -y gcc-c++ perl-Digest-SHA debhelper dpkg-dev pyqt4-devel rpm-build subversion samba-winbind wine.i686 mingw32-wine-gecko wine-mono cabextract xar setsebool -P wine_mmap_zero_ignore=on mmap_low_allowed=on # Install desktop (XFCE) and GUI utils. dnf install -y @xfce-desktop-environment firefox VirtualBox-guest kmod-VirtualBox akmod-VirtualBox akmods |