summaryrefslogtreecommitdiffstats
path: root/src/utils/legacy.py
blob: 509b9b0a01e4d0107d72837fd7b86dc891e0ec0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import ipaddress
import logging
import os
import subprocess
import shlex
import shutil

from subprocess import PIPE, DEVNULL, CalledProcessError

from src.utils.fs import umount


def ogGetImageInfo(path):
    """
    Bash function 'ogGetImageInfo' wrapper (client/engine/Image.lib)
    """
    proc = subprocess.run(f'ogGetImageInfo {path}',
                          stdout=PIPE, shell=True,
                          encoding='utf-8')

    if proc.stdout.count(':') != 3:
        return ''

    image_info = {}
    (image_info['clonator'],
     image_info['compressor'],
     image_info['filesystem'],
     image_info['datasize']) = proc.stdout.rstrip().split(':', 4)
    image_info['clientname'] = os.getenv('HOSTNAME')
    return image_info


def cambiar_acceso(mode='rw', user='opengnsys', pwd='og'):
    """
    'CambiarAcceso' (admin/Interface/CambiarAcceso) rewrite into native Python.

    Remount the (remote) samba directory that contains the OpenGnsys images.
    Specify access mode ('rw', or 'ro') with mode parameter (default 'rw').
    Specify samba credentials with user and pwd parameter.

    Return True if exit-code was 0. Return False otherwise.
    """
    if mode not in ['rw', 'ro']:
        raise ValueError('Invalid remount mode option')

    cmd = shlex.split(f'mount -o remount,{mode},username={user},password={pwd} /opt/opengnsys/images')
    p = subprocess.run(cmd, stdout=DEVNULL, stderr=DEVNULL)
    return p.returncode == 0

def ogChangeRepo(ip, smb_user='opengnsys', smb_pass='og'):
    """
    Umount current Samba directory of OpenGnsys images and mount new Samba
    directory (preserving previous access mode).

    If the mount fails, fallback to the image directory that was mounted before
    calling this function.

    If there is no previous image directory mount, then simply try mounting the
    new Samba directory with readonly mode option.

    Any CalledProcessError raised by the fallback mount subprocess should be
    handled by the caller of this function.
    """
    def fsopts_mode(fsopts):
        for opt in fsopts.split(','):
            if opt in ['rw', 'ro']:
                return opt

    def process_mntent(line):
        name, mntdir, fstype, opts, freq, passno = line.split(' ')
        mode = fsopts_mode(opts)
        return name, mntdir, fsopts_mode(opts)

    try:
        ipaddr = ipaddress.ip_address(ip)
    except ValueError as e:
        raise ValueError('Invalid ip address')

    mounted = False
    with open('/etc/mtab') as f:
        for line in f:
            if 'ogimages' in line:
                orig_name, mntdir, mode = process_mntent(line)
                mounted = True
                break

    new_name = f'//{ip}/ogimages'
    if not mounted:
        orig_name = new_name
        mntdir = '/opt/opengnsys/images'
        mode = 'ro'
    else:
        umount(mntdir)

    cmd = f'mount.cifs -o {mode},username={smb_user},password={smb_pass} {new_name} /opt/opengnsys/images'
    try:
        result = subprocess.run(shlex.split(cmd), check=True)
    except CalledProcessError as e:
        logging.error(f'Error mounting new image directory: {e}')
        cmd = f'mount.cifs -o {mode},username={smb_user},password={smb_pass} {orig_name} /opt/opengnsys/images'
        result = subprocess.run(shlex.split(cmd), check=True)
    finally:
        return result


def restoreImageCustom(repo_ip, image_name, disk, partition, method):
    """
    """
    if not shutil.which('restoreImageCustom'):
        logging.error('Invalid restoreImageCustom invocation')
        raise ValueError('Error: restoreImageCustom not found')

    if ogChangeRepo(repo).returncode != 0:
        logging.error('ogChangeRepo could not change repository to %s', repo)
        raise ValueError(f'Error: Cannot change repository to {repo}')

    cmd = f'restoreImageCustom {repo_ip} {image_name} {disk} {partition} {method}'
    with open('/tmp/command.log', 'wb', 0) as logfile:
        try:
            proc = subprocess.run(cmd,
                                  stdout=logfile,
                                  encoding='utf-8',
                                  shell=True)
        except:
            logging.error('Exception when running restoreImageCustom subprocess')
            raise ValueError('Error: Incorrect command value')
    return proc.returncode


def configureOs(disk, partition):
    """
    """
    if shutil.which('configureOsCustom'):
        cmd_configure = f"configureOsCustom {disk} {partition}"
    else:
        cmd_configure = f"configureOs {disk} {partition}"

    try:
        proc = subprocess.run(cmd_configure,
                              stdout=PIPE,
                              encoding='utf-8',
                              shell=True)
        out = proc.stdout
    except:
        logging.error('Exception when running configureOs subprocess')
        raise ValueError('Error: Incorrect command value')

    return out


def ogCopyEfiBootLoader(disk, partition):
    cmd = f'ogCopyEfiBootLoader {disk} {partition}'
    try:
        proc = subprocess.run(cmd,
                              shell=True)
    except:
        logging.error('Exception when running ogCopyEfiBootLoader subprocess')
        raise ValueError('Subprocess error: ogCopyEfiBootloader')