mirror of
https://github.com/fosslinux/live-bootstrap.git
synced 2026-03-02 01:18:08 +01:00
Rework tmpdir & associated a bit.
- Split out tmpdir logic into a separate entity & add the appropriate arguments and checks. - sysb can be removed since there is now no associated logic. - Move disk/etc logic into tmpdir.py.
This commit is contained in:
parent
4f9f56f006
commit
51b0bf8405
8 changed files with 170 additions and 195 deletions
|
|
@ -4,20 +4,17 @@ This file contains a few functions to be shared by all Sys* classes
|
|||
"""
|
||||
|
||||
# SPDX-FileCopyrightText: 2022-2023 Dor Askayo <dor.askayo@gmail.com>
|
||||
# SPDX-FileCopyrightText: 2021-22 fosslinux <fosslinux@aussies.space>
|
||||
# SPDX-FileCopyrightText: 2021-23 fosslinux <fosslinux@aussies.space>
|
||||
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import hashlib
|
||||
import glob
|
||||
import subprocess
|
||||
|
||||
import requests
|
||||
|
||||
from lib.utils import mount, umount
|
||||
|
||||
class SysGeneral:
|
||||
"""
|
||||
A class from which all Sys* class are extended.
|
||||
|
|
@ -25,38 +22,12 @@ class SysGeneral:
|
|||
"""
|
||||
|
||||
# All of these are variables defined in the individual Sys* classes
|
||||
preserve_tmp = None
|
||||
tmp_dir = None
|
||||
cache_dir = None
|
||||
base_dir = None
|
||||
git_dir = None
|
||||
sys_dir = None
|
||||
initramfs_path = None
|
||||
mounted_tmpfs = False
|
||||
|
||||
def __del__(self):
|
||||
if not self.preserve_tmp:
|
||||
self.remove_tmp()
|
||||
|
||||
def remove_tmp(self):
|
||||
"""Remove the tmp directory"""
|
||||
if self.tmp_dir is None:
|
||||
return
|
||||
|
||||
if self.mounted_tmpfs:
|
||||
print(f"Unmounting tmpfs from {self.tmp_dir}")
|
||||
umount(self.tmp_dir)
|
||||
|
||||
print(f"Removing {self.tmp_dir}")
|
||||
shutil.rmtree(self.tmp_dir, ignore_errors=True)
|
||||
|
||||
def mount_tmpfs(self):
|
||||
"""Mount the tmpfs for this sysx"""
|
||||
if not os.path.isdir(self.tmp_dir):
|
||||
os.mkdir(self.tmp_dir)
|
||||
print(f"Mounting tmpfs on {self.tmp_dir}")
|
||||
mount('tmpfs', self.tmp_dir, 'tmpfs', 'size=8G')
|
||||
self.mounted_tmpfs = True
|
||||
tmp_dir = None
|
||||
|
||||
def check_file(self, file_name, expected_hash):
|
||||
"""Check hash of downloaded source file."""
|
||||
|
|
|
|||
99
lib/tmpdir.py
Normal file
99
lib/tmpdir.py
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# SPDX-FileCopyrightText: 2023 fosslinux <fosslinux@aussies.space>
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
"""
|
||||
Contains a class that represents a tmpdir
|
||||
"""
|
||||
|
||||
import enum
|
||||
import getpass
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from lib.utils import mount, umount, create_disk, run
|
||||
|
||||
class TmpType(enum.Enum):
|
||||
"""Different types of tmpdirs we can have"""
|
||||
NONE = 0
|
||||
TMPFS = 1
|
||||
|
||||
class Tmpdir:
|
||||
"""
|
||||
Represents a tmpdir
|
||||
"""
|
||||
|
||||
_syses = {}
|
||||
_disks = {}
|
||||
_disk_filesystems = {}
|
||||
_mountpoints = {}
|
||||
|
||||
def __init__(self, preserve, path="tmp"):
|
||||
self.path = os.path.abspath(path)
|
||||
self.preserve = preserve
|
||||
self._type = TmpType.NONE
|
||||
|
||||
if not os.path.exists(self.path):
|
||||
os.mkdir(self.path)
|
||||
|
||||
def __del__(self):
|
||||
for path in self._mountpoints:
|
||||
print(f"Unmounting {path}")
|
||||
umount(path)
|
||||
|
||||
if not self.preserve:
|
||||
for disk in self._disks.values():
|
||||
print(f"Detaching {disk}")
|
||||
run("sudo", "losetup", "-d", disk)
|
||||
|
||||
if self._type == TmpType.TMPFS:
|
||||
print(f"Unmounting tmpdir from {self.path}")
|
||||
umount(self.path)
|
||||
|
||||
print(f"Removing {self.path}")
|
||||
shutil.rmtree(self.path, ignore_errors=True)
|
||||
|
||||
def tmpfs(self, size="8G"):
|
||||
"""Mount a tmpfs"""
|
||||
print(f"Mounting tmpfs on {self.path}")
|
||||
mount("tmpfs", self.path, "tmpfs", f"size={size}")
|
||||
self._type = TmpType.TMPFS
|
||||
|
||||
def add_sys(self, name, subdir=None):
|
||||
"""Create a subdirectory and register a sys"""
|
||||
if subdir is None:
|
||||
subdir = name
|
||||
sys_path = os.path.join(self.path, name)
|
||||
if not os.path.exists(sys_path):
|
||||
os.mkdir(sys_path)
|
||||
return sys_path
|
||||
|
||||
def add_disk(self, name, size="8G", filesystem="ext4"):
|
||||
"""Add a disk"""
|
||||
disk_path = os.path.join(self.path, f"{name}.img")
|
||||
self._disks[name] = create_disk(disk_path, "msdos", filesystem, size)
|
||||
self._disk_filesystems[name] = filesystem
|
||||
# Allow executing user to access it
|
||||
run("sudo", "chown", getpass.getuser(), self._disks[name])
|
||||
|
||||
def mount_disk(self, name, mountpoint=None):
|
||||
"""Mount the disk"""
|
||||
if mountpoint is None:
|
||||
mountpoint = f"{name}_mnt"
|
||||
mountpoint = os.path.join(self.path, mountpoint)
|
||||
os.mkdir(mountpoint)
|
||||
mount(self._disks[name] + "p1", mountpoint, self._disk_filesystems[name])
|
||||
# Allow executing user to access it
|
||||
run("sudo", "chown", getpass.getuser(), mountpoint)
|
||||
self._mountpoints[name] = mountpoint
|
||||
return mountpoint
|
||||
|
||||
def umount_disk(self, name):
|
||||
"""Unmount a disk"""
|
||||
umount(self._mountpoints[name])
|
||||
del self._mountpoints[name]
|
||||
|
||||
def get_disk(self, name):
|
||||
"""Get the path to a device of a disk"""
|
||||
return self._disks[name]
|
||||
|
|
@ -5,7 +5,7 @@ This file contains a few self-contained helper functions
|
|||
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
|
||||
# SPDX-FileCopyrightText: 2021-22 fosslinux <fosslinux@aussies.space>
|
||||
# SPDX-FileCopyrightText: 2021-23 fosslinux <fosslinux@aussies.space>
|
||||
|
||||
import os
|
||||
import shutil
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue