diff options
-rw-r--r-- | src/live/ogOperations.py | 2 | ||||
-rw-r--r-- | src/utils/legacy.py | 58 |
2 files changed, 53 insertions, 7 deletions
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py index 6f52a5a..cb8957d 100644 --- a/src/live/ogOperations.py +++ b/src/live/ogOperations.py @@ -401,7 +401,7 @@ class OgLiveOperations: self._ogbrowser_clear_logs() self._restartBrowser(self._url_log) - if ogChangeRepo(repo).returncode != 0: + if ogChangeRepo(repo, smb_user=self._smb_user, smb_pass=self._smb_pass).returncode != 0: self._restartBrowser(self._url) logging.error('ogChangeRepo could not change repository to %s', repo) raise ValueError(f'Error: Cannot change repository to {repo}') diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 96b32eb..509b9b0 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -5,7 +5,10 @@ import subprocess import shlex import shutil -from subprocess import PIPE, DEVNULL +from subprocess import PIPE, DEVNULL, CalledProcessError + +from src.utils.fs import umount + def ogGetImageInfo(path): """ @@ -44,17 +47,60 @@ def cambiar_acceso(mode='rw', user='opengnsys', pwd='og'): p = subprocess.run(cmd, stdout=DEVNULL, stderr=DEVNULL) return p.returncode == 0 -def ogChangeRepo(ip): +def ogChangeRepo(ip, smb_user='opengnsys', smb_pass='og'): """ - Bash function 'ogGetImageInfo' wrapper (client/engine/Net.lib) + 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 + 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) - return subprocess.run(f'ogChangeRepo {ipaddr}', - shell=True) + 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): |