summaryrefslogtreecommitdiffstats
path: root/src/live
diff options
context:
space:
mode:
Diffstat (limited to 'src/live')
-rw-r--r--src/live/__init__.py7
-rw-r--r--src/live/ogOperations.py275
2 files changed, 282 insertions, 0 deletions
diff --git a/src/live/__init__.py b/src/live/__init__.py
new file mode 100644
index 0000000..d98c85c
--- /dev/null
+++ b/src/live/__init__.py
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2020 Soleta Networks <info@soleta.eu>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the
+# Free Software Foundation, version 3.
+#
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py
new file mode 100644
index 0000000..b7e6801
--- /dev/null
+++ b/src/live/ogOperations.py
@@ -0,0 +1,275 @@
+#
+# Copyright (C) 2020 Soleta Networks <info@soleta.eu>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the
+# Free Software Foundation, version 3.
+#
+
+import os
+import json
+import subprocess
+from src.ogClient import ogClient
+
+OG_SHELL = '/bin/bash'
+
+class OgLiveOperations:
+ def __init__(self, config):
+ self._url = config['opengnsys']['url']
+ self._url_log = config['opengnsys']['url_log']
+
+ def _restartBrowser(self, url):
+ try:
+ proc = subprocess.call(["pkill", "-9", "browser"])
+ proc = subprocess.Popen(["browser", "-qws", url])
+ except:
+ raise ValueError('Error: cannot restart browser')
+
+ def parseGetConf(self, out):
+ parsed = {'serial_number': '',
+ 'disk_setup': list(),
+ 'partition_setup': list()}
+ configs = out.split('\n')
+ for line in configs[:-1]:
+ if 'ser=' in line:
+ parsed['serial_number'] = line.partition('ser=')[2]
+ else:
+ part_setup = {}
+ params = dict(param.split('=') for param in line.split('\t'))
+ # Parse partition configuration.
+ part_setup['disk'] = params['disk']
+ part_setup['partition'] = params['par']
+ part_setup['code'] = params['cpt']
+ part_setup['filesystem'] = params['fsi']
+ part_setup['os'] = params['soi']
+ part_setup['size'] = params['tam']
+ part_setup['used_size'] = params['uso']
+ if part_setup['partition'] == '0':
+ parsed['disk_setup'].append(part_setup)
+ else:
+ parsed['partition_setup'].append(part_setup)
+ return parsed
+
+ def poweroff(self):
+ if os.path.exists('/scripts/oginit'):
+ cmd = f'source {ogClient.OG_PATH}etc/preinit/loadenviron.sh; ' \
+ f'{ogClient.OG_PATH}scripts/poweroff'
+ subprocess.call([cmd], shell=True, executable=OG_SHELL)
+ else:
+ subprocess.call(['/sbin/poweroff'])
+
+ def reboot(self):
+ if os.path.exists('/scripts/oginit'):
+ cmd = f'source {ogClient.OG_PATH}etc/preinit/loadenviron.sh; ' \
+ f'{ogClient.OG_PATH}scripts/reboot'
+ subprocess.call([cmd], shell=True, executable=OG_SHELL)
+ else:
+ subprocess.call(['/sbin/reboot'])
+
+ def shellrun(self, request, ogRest):
+ cmd = request.getrun()
+ cmds = cmd.split(";|\n\r")
+
+ self._restartBrowser(self._url_log)
+
+ try:
+ ogRest.proc = subprocess.Popen(cmds,
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ cmd_get_conf = f'{ogClient.OG_PATH}interfaceAdm/getConfiguration'
+ result = subprocess.check_output([cmd_get_conf], shell=True)
+ self._restartBrowser(self._url)
+
+ return output.decode('utf-8')
+
+ def session(self, request, ogRest):
+ disk = request.getDisk()
+ partition = request.getPartition()
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/IniciarSesion {disk} {partition}'
+
+ try:
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ return output.decode('utf-8')
+
+ def software(self, request, path, ogRest):
+ disk = request.getDisk()
+ partition = request.getPartition()
+
+ self._restartBrowser(self._url_log)
+
+ try:
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/InventarioSoftware {disk} ' \
+ f'{partition} {path}'
+
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ self._restartBrowser(self._url)
+
+ software = ''
+ with open(path, 'r') as f:
+ software = f.read()
+ return software
+
+ def hardware(self, path, ogRest):
+ self._restartBrowser(self._url_log)
+
+ try:
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/InventarioHardware {path}'
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ self._restartBrowser(self._url)
+
+ return output.decode('utf-8')
+
+ def setup(self, request, ogRest):
+ table_type = request.getType()
+ disk = request.getDisk()
+ cache = request.getCache()
+ cache_size = request.getCacheSize()
+ partlist = request.getPartitionSetup()
+ cfg = f'dis={disk}*che={cache}*tch={cache_size}!'
+
+ for part in partlist:
+ cfg += f'par={part["partition"]}*cpt={part["code"]}*' \
+ f'sfi={part["filesystem"]}*tam={part["size"]}*' \
+ f'ope={part["format"]}%'
+
+ if ogRest.terminated:
+ break
+
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/Configurar {table_type} {cfg}'
+ try:
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ cmd_get_conf = f'{ogClient.OG_PATH}interfaceAdm/getConfiguration'
+ result = subprocess.check_output([cmd_get_conf], shell=True)
+ self._restartBrowser(self._url)
+
+ return self.parseGetConf(result.decode('utf-8'))
+
+ def image_restore(self, request, ogRest):
+ disk = request.getDisk()
+ partition = request.getPartition()
+ name = request.getName()
+ repo = request.getRepo()
+ ctype = request.getType()
+ profile = request.getProfile()
+ cid = request.getId()
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/RestaurarImagen {disk} {partition} ' \
+ f'{name} {repo} {ctype}'
+
+ self._restartBrowser(self._url_log)
+
+ try:
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ if (ogRest.proc.returncode):
+ raise Exception
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ cmd_get_conf = f'{ogClient.OG_PATH}interfaceAdm/getConfiguration'
+ result = subprocess.check_output([cmd_get_conf], shell=True)
+ self._restartBrowser(self._url)
+
+ return output.decode('utf-8')
+
+ def image_create(self, path, request, ogRest):
+ disk = request.getDisk()
+ partition = request.getPartition()
+ name = request.getName()
+ repo = request.getRepo()
+ cmd_software = f'{ogClient.OG_PATH}interfaceAdm/InventarioSoftware {disk} ' \
+ f'{partition} {path}'
+ cmd_create_image = f'{ogClient.OG_PATH}interfaceAdm/CrearImagen {disk} ' \
+ f'{partition} {name} {repo}'
+
+ self._restartBrowser(self._url_log)
+
+ try:
+ ogRest.proc = subprocess.Popen([cmd_software],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ if ogRest.terminated:
+ return
+
+ try:
+ ogRest.proc = subprocess.Popen([cmd_create_image],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ with open('/tmp/image.info') as file_info:
+ line = file_info.readline().rstrip()
+
+ image_info = {}
+
+ (image_info['clonator'],
+ image_info['compressor'],
+ image_info['filesystem'],
+ image_info['datasize'],
+ image_info['clientname']) = line.split(':', 5)
+
+ os.remove('/tmp/image.info')
+
+ self._restartBrowser(self._url)
+
+ return image_info
+
+ def refresh(self, ogRest):
+ self._restartBrowser(self._url_log)
+
+ try:
+ cmd = f'{ogClient.OG_PATH}interfaceAdm/getConfiguration'
+ ogRest.proc = subprocess.Popen([cmd],
+ stdout=subprocess.PIPE,
+ shell=True,
+ executable=OG_SHELL)
+ (output, error) = ogRest.proc.communicate()
+ except:
+ raise ValueError('Error: Incorrect command value')
+
+ self._restartBrowser(self._url)
+
+ return self.parseGetConf(output.decode('utf-8'))