mirror of
https://github.com/Snigdha-OS/snigdhaos-blackbox.git
synced 2025-09-21 20:15:02 +02:00
changes(())
This commit is contained in:

committed by
GitHub

parent
4dca72f959
commit
672454b534
@@ -1940,3 +1940,211 @@ def close_in_app_notification(self):
|
|||||||
self.notification_revealer.set_reveal_child(False)
|
self.notification_revealer.set_reveal_child(False)
|
||||||
GLib.source_remove(self.timeout_id)
|
GLib.source_remove(self.timeout_id)
|
||||||
self.timeout_id = None
|
self.timeout_id = None
|
||||||
|
|
||||||
|
def update_package_import_textview(self, line):
|
||||||
|
try:
|
||||||
|
if len(line) > 0:
|
||||||
|
self.msg_buffer.insert(
|
||||||
|
self.msg_buffer.get_end_iter(),
|
||||||
|
" %s" % line,
|
||||||
|
len(" %s" % line),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("[Exception] update_progress_textview(): %s" % e)
|
||||||
|
finally:
|
||||||
|
self.pkg_import_queue.task_done()
|
||||||
|
text_mark_end = self.msg_buffer.create_mark(
|
||||||
|
"end", self.msg_buffer.get_end_iter(), False
|
||||||
|
)
|
||||||
|
# scroll to the end of the textview
|
||||||
|
self.textview.scroll_mark_onscreen(text_mark_end)
|
||||||
|
|
||||||
|
def monitor_package_import(self):
|
||||||
|
while True:
|
||||||
|
if self.stop_thread is True:
|
||||||
|
break
|
||||||
|
message = self.pkg_import_queue.get()
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_import_textview,
|
||||||
|
self,
|
||||||
|
message,
|
||||||
|
priority=GLib.PRIORITY_DEFAULT,
|
||||||
|
)
|
||||||
|
|
||||||
|
def update_package_status_label(label, text):
|
||||||
|
label.set_markup(text)
|
||||||
|
|
||||||
|
def import_packages(self):
|
||||||
|
try:
|
||||||
|
packages_status_list = []
|
||||||
|
package_failed = False
|
||||||
|
package_err = {}
|
||||||
|
count = 0
|
||||||
|
if os.path.exists(pacman_cache_dir):
|
||||||
|
query_pacman_clean_cache_str = [
|
||||||
|
"pacman",
|
||||||
|
"-Sc",
|
||||||
|
"--noconfirm",
|
||||||
|
]
|
||||||
|
logger.info(
|
||||||
|
"Cleaning Pacman cache directory = %s" % pacman_cache_dir
|
||||||
|
)
|
||||||
|
event = "%s [INFO]: Cleaning pacman cache\n" % datetime.now().strftime(
|
||||||
|
"%Y-%m-%d-%H-%M-%S"
|
||||||
|
)
|
||||||
|
self.pkg_import_queue.put(event)
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b>Cleaning pacman cache</b>",
|
||||||
|
)
|
||||||
|
process_pacman_cc = subprocess.Popen(
|
||||||
|
query_pacman_clean_cache_str,
|
||||||
|
shell=False,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
universal_newlines=True,
|
||||||
|
)
|
||||||
|
out, err = process_pacman_cc.communicate(timeout=process_timeout)
|
||||||
|
self.pkg_import_queue.put(out)
|
||||||
|
if process_pacman_cc.returncode == 0:
|
||||||
|
logger.info("Pacman cache directory cleaned")
|
||||||
|
else:
|
||||||
|
logger.error("Failed to clean Pacman cache directory")
|
||||||
|
logger.info("Running full system upgrade")
|
||||||
|
# run full system upgrade, Arch does not allow partial package updates
|
||||||
|
query_str = ["pacman", "-Syu", "--noconfirm"]
|
||||||
|
# query_str = ["pacman", "-Qqen"]
|
||||||
|
logger.info("Running %s" % " ".join(query_str))
|
||||||
|
event = "%s [INFO]:Running full system upgrade\n" % datetime.now().strftime(
|
||||||
|
"%Y-%m-%d-%H-%M-%S"
|
||||||
|
)
|
||||||
|
self.pkg_import_queue.put(event)
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b>Performing full system upgrade - do not power off your system</b>",
|
||||||
|
)
|
||||||
|
output = []
|
||||||
|
with subprocess.Popen(
|
||||||
|
query_str,
|
||||||
|
shell=False,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
bufsize=1,
|
||||||
|
universal_newlines=True,
|
||||||
|
) as process:
|
||||||
|
while True:
|
||||||
|
if process.poll() is not None:
|
||||||
|
break
|
||||||
|
for line in process.stdout:
|
||||||
|
# print(line.strip())
|
||||||
|
self.pkg_import_queue.put(line)
|
||||||
|
output.append(line)
|
||||||
|
# time.sleep(0.2)
|
||||||
|
if process.returncode == 0:
|
||||||
|
logger.info("Pacman system upgrade completed")
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b> Full system upgrade - completed</b>",
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if len(output) > 0:
|
||||||
|
if "there is nothing to do" not in output:
|
||||||
|
logger.error("Pacman system upgrade failed")
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b> Full system upgrade - failed</b>",
|
||||||
|
)
|
||||||
|
print("%s" % " ".join(output))
|
||||||
|
event = "%s [ERROR]: Installation of packages aborted due to errors\n" % datetime.now().strftime(
|
||||||
|
"%Y-%m-%d-%H-%M-%S"
|
||||||
|
)
|
||||||
|
self.pkg_import_queue.put(event)
|
||||||
|
logger.error("Installation of packages aborted due to errors")
|
||||||
|
return
|
||||||
|
# do not proceed with package installs if system upgrade fails
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
# iterate through list of packages, calling pacman -S on each one
|
||||||
|
for package in self.packages_list:
|
||||||
|
process_output = []
|
||||||
|
package = package.strip()
|
||||||
|
if len(package) > 0:
|
||||||
|
if "#" not in package:
|
||||||
|
query_str = ["pacman", "-S", package, "--needed", "--noconfirm"]
|
||||||
|
count += 1
|
||||||
|
logger.info("Running %s" % " ".join(query_str))
|
||||||
|
event = "%s [INFO]: Running %s\n" % (
|
||||||
|
datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
|
||||||
|
" ".join(query_str),
|
||||||
|
)
|
||||||
|
self.pkg_import_queue.put(event)
|
||||||
|
with subprocess.Popen(
|
||||||
|
query_str,
|
||||||
|
shell=False,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
bufsize=1,
|
||||||
|
universal_newlines=True,
|
||||||
|
) as process:
|
||||||
|
while True:
|
||||||
|
if process.poll() is not None:
|
||||||
|
break
|
||||||
|
for line in process.stdout:
|
||||||
|
process_output.append(line.strip())
|
||||||
|
self.pkg_import_queue.put(line)
|
||||||
|
# time.sleep(0.2)
|
||||||
|
if process.returncode == 0:
|
||||||
|
# since this is being run in another thread outside of main, use GLib to update UI component
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b>%s</b> -> <b>Installed</b>" % package,
|
||||||
|
)
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_count,
|
||||||
|
"Progress: <b>%s/%s</b>"
|
||||||
|
% (count, len(self.packages_list)),
|
||||||
|
)
|
||||||
|
packages_status_list.append("%s -> Installed" % package)
|
||||||
|
else:
|
||||||
|
logger.error("%s --> Install failed" % package)
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"Status: <b>%s</b> -> <b>Install failed</b>" % package,
|
||||||
|
)
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_count,
|
||||||
|
"Progress: <b>%s/%s</b>"
|
||||||
|
% (count, len(self.packages_list)),
|
||||||
|
)
|
||||||
|
if len(process_output) > 0:
|
||||||
|
if "there is nothing to do" not in process_output:
|
||||||
|
logger.error("%s" % " ".join(process_output))
|
||||||
|
# store package error in dict
|
||||||
|
package_err[package] = " ".join(process_output)
|
||||||
|
package_failed = True
|
||||||
|
packages_status_list.append("%s -> Failed" % package)
|
||||||
|
if len(packages_status_list) > 0:
|
||||||
|
self.pkg_status_queue.put(packages_status_list)
|
||||||
|
if package_failed is True:
|
||||||
|
GLib.idle_add(
|
||||||
|
update_package_status_label,
|
||||||
|
self.label_package_status,
|
||||||
|
"<b>Some packages have failed to install see %s</b>" % self.logfile,
|
||||||
|
)
|
||||||
|
# end
|
||||||
|
event = "%s [INFO]: Completed, check the logfile for any errors\n" % (
|
||||||
|
datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
|
||||||
|
)
|
||||||
|
self.pkg_import_queue.put(event)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Exception in import_packages(): %s" % e)
|
||||||
|
finally:
|
||||||
|
self.pkg_err_queue.put(package_err)
|
Reference in New Issue
Block a user