Skip to content
Snippets Groups Projects
Commit 093f1125 authored by Peter Senna Tschudin's avatar Peter Senna Tschudin
Browse files

psdk: Code cleanup


This patch removes code that was not used, simplify the Progressbar
class, and add comments to document corner cases.

Signed-off-by: default avatarPeter Senna Tschudin <peter.senna@collabora.com>
parent 3a5dddbf
No related branches found
No related tags found
3 merge requests!7v2021 ← v2022dev1: Fix build,!6Push out some old unreleased commits,!5psdk: Code cleanup
......@@ -46,11 +46,6 @@ class ConfigurationAlreadyPersistent(Exception):
"""Exception for configuration files that are already stored on persistent storage"""
pass
class ProcessStillRunning(Exception):
"""Exception for signaling that the process is still running and that requested information is
not yet available."""
pass
class Disk:
"""Persistent a persistent disk with a single partition for /home filesystem. There are two
special directories:
......@@ -223,7 +218,9 @@ class Disk:
self.progressbar = Progressbar("Disk initialization", "Starting...")
class Disks:
"""Get a list of disks from lsblk and compute some statistics"""
"""Get a list of disks from lsblk and compute some statistics. The assumption is that there is
only one level of nesting like disk -> partition. In case of dm-crypt devices and LVM volumes this
would not be the case and the code would need to recursively look for the mount points"""
def __init__(self, zenity):
"""Initializer"""
......@@ -347,81 +344,37 @@ class Disks:
if self.zenity:
self.pdisk.enable_zenity()
def probe_disks(self):
"""Clear attributes and call _init() again"""
self.jdisks = None
self.count = 0
self.disks = []
self.empty_disks = []
self.psdk_disks = []
self.psdk_mounted_disks = []
self.pdisk = None
self._init()
def pid_running(pid):
"""Check if pid is running"""
try:
os.kill(pid, 0)
except OSError:
return False
else:
return True
class Progressbar():
"""A convenient way to use Zenity progress bar"""
def __init__(self, title, text):
"""Initializer"""
self.read, self.write = os.pipe()
self.title = title
self.text = text
self.zenity_pid = None # No, not really. This is the pid of the child which calls zenity
self.zenity_result = None
self.zproc = None
self.command = ["zenity", "--progress", "--percentage", "0", "--auto-close", "--text",
text, "--title", title, "--width=360", "--no-cancel"]
def create_window(self):
"""Fork and call Zinity"""
"""Call Zenity"""
self.zenity_pid = os.fork()
if self.zenity_pid:
# parent
os.close(self.read)
return
else:
# child
os.close(self.write)
self.zenity_result = subprocess.run(self.command, stdin=self.read)
sys.exit(0)
self.zproc = subprocess.Popen(self.command, stdin=subprocess.PIPE, bufsize=0)
def set_text(self, text):
"""Update the progress bar description text"""
text = "# " + text + "\n"
os.write(self.write, text.encode('utf8'))
self.zproc.stdin.write(text.encode('utf8'))
def set_percentage(self, percentage):
"""Update the progress bar description text"""
"""Update the progress bar percentage"""
text = str(percentage) + "\n"
os.write(self.write, text.encode('utf8'))
def returncode(self):
"""Return code of Zenity"""
if pid_running(self.zenity_pid):
raise ProcessStillRunning()
return self.zenity_result.returncode
self.zproc.stdin.write(text.encode('utf8'))
def wait(self):
"""Wait until zenity child returns"""
os.waitpid(self.zenity_pid, 0)
self.zproc.wait()
def fstab_updated():
"""Check if fstab was configured to use persistent workspace disk
......@@ -582,9 +535,12 @@ def check_configuration_file(conf_file):
return conf_file_abspath
def conf_to_persistent(conf_file, alt_mount=None):
"""Create a backup copy of a configuration file, move it to the persistent
folder, and create a symlink from persistent folder to /etc. This function
will intentionally fail if receives a directory as parameter"""
"""Create a backup copy of a configuration file, move it to the persistent folder, and create a
symlink from persistent folder to /etc. This function will intentionally fail if receives a
directory as parameter. alt_mount is used during the initialization when the persistent disk mount point
is different from what it will be when the persistent disk is actually in use. This is relevant for
the creation of symlinks. This function need to handle moving configuration files to persistent
storage with the persistent disk mounted in both locations."""
conf_file_abspath = check_configuration_file(conf_file)
......@@ -748,63 +704,6 @@ def zmenu(disks=None):
return True
def menu(disks=None):
"""Menu for user interaction"""
print("Persistent disk setup")
print("\nFor help visit:\n\t" + HELP_LINK)
print("\nStatus:")
if disks.psdk_mounted_disks:
print("\tPersistent disk in use: {}".format(str(disks.psdk_mounted_disks[0])))
print("\nThis SDK is currently using the persistent disk. No further action required.")
input("\nPress enter to exit")
return False
if fstab_updated():
print("\nThis SDK was already configured to use persistent workspace disk. " + \
"You may need to reboot your system.")
input("\nPress enter to exit")
return False
if (not disks.psdk_disks) and (not disks.empty_disks):
print("\nNo disk found to use as persistent storage.")
input("\nPress enter to exit")
return False
if disks.empty_disks:
empty_disk_found = disks.empty_disks[0]
print("\tEmpty disk found: {}".format(str(empty_disk_found)))
answer = input("\nDo you want to initialize the empty disk {} ".format(empty_disk_found) +
"and configure the SDK to use it as persistent disk?\n" +
"(yes and press enter): ")
if answer == "yes":
disks.pdisk.initialize()
configure_sdk()
input("\nDisk initialization completed. Press enter to reboot the SDK.")
command = ["sudo", "reboot"]
_run(command)
return True
if disks.psdk_disks:
pdisk_found = disks.psdk_disks[0]
print("\tPersistent disk found: {}".format(str(pdisk_found)))
answer = input("\nDo you want to configure the SDK to use the persistent " +
"disk {}?\n".format(pdisk_found) +
"(yes and press enter): ")
if answer == "yes":
configure_sdk()
input("\nSDK configuration completed. Press enter to reboot the SDK.")
command = ["sudo", "reboot"]
_run(command)
return True
def is_json(myjson):
"""Check if input is valid json"""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment