diff --git a/push.sh b/push.sh
index e5b5919..dfa8b4e 100755
--- a/push.sh
+++ b/push.sh
@@ -1,10 +1,52 @@
#!/bin/bash
-# Author: Eshan Roy (Eshanized)
+# Author : ESHAN ROY
+# Author URI : https://eshanized.github.io
-BRANCH=master
-CMSG="โณ @eshanized updated the repository!!!"
+# NOTE : Run at your own Risk!
+# Define the conventional commit types with emojis
+TYPES=("๐ feat" "๐ fix" "๐ docs" "๐
style" "๐จ refactor" "โก๏ธ perf" "๐งช test" "๐ ๏ธ build" "๐ค ci" "๐งน chore" "โช๏ธ revert")
+
+# Prompt the user to select a commit type
+echo "Select a commit type:"
+select type in "${TYPES[@]}"; do
+ break
+done
+
+# Extract the commit type and emoji from the selection
+type_emoji=${type}
+type=${type_emoji#* }
+emoji=${type_emoji% *}
+
+# Prompt the user to enter a scope (optional)
+read -p "Enter a scope (optional): " scope
+
+# Prompt the user to enter a short description
+read -p "Enter a short description: " desc
+
+# Prompt the user to enter a longer description (optional)
+read -p "Enter a longer description (optional): " long_desc
+
+# Create the commit message
+commit_msg="$emoji $type($scope): $desc"
+
+# If a longer description was provided, add it to the commit message
+if [ -n "$long_desc" ]; then
+ commit_msg+="
+
+$long_desc"
+fi
+
+# Print the commit message to the console
+echo "Commit message:"
+echo "$commit_msg"
+
+# Stage all changes
git add .
-git commit -m "${CMSG}"
-git push origin "${BRANCH}"
\ No newline at end of file
+
+# Commit the changes with the conventional commit message
+git commit -m "$commit_msg"
+
+# Push the changes to the remote repository
+git push origin $(git rev-parse --abbrev-ref HEAD)
\ No newline at end of file
diff --git a/usr/bin/blackbox b/usr/bin/blackbox
deleted file mode 100644
index 2742918..0000000
--- a/usr/bin/blackbox
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env sh
-
-echo "---------------------------------------------------------------------------"
-echo "[INFO] Checking session"
-test $(whoami) == "root" && echo "[ERROR] Do not run this script as root." && exit 1
-test -z $DISPLAY && echo "[ERROR] DISPLAY variable is not set." && exit 1
-
-# check session is either one of X11, Wayland or TTY
-session=$(loginctl show-session $(loginctl|grep $(whoami) | awk '{print $1}') -p Type | awk -F= '{print $2}' | grep "x11\|wayland\|tty")
-
-test -z "$session" && echo "[ERROR] Failed to verify session for user." && exit 1
-
-xauth_file=$(xauth info | awk -F"Authority file:" '{print $2}' | tr -d ' ')
-test -s "$xauth_file" || touch "$xauth_file"
-
-case "$session" in
- "wayland")
- # Wayland session, generate Xauth session cookie for $DISPLAY
- xauth gen $DISPLAY &> /dev/null
- echo "[INFO] Display = $DISPLAY"
- echo "[INFO] Session = $session"
-
- test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
- ;;
- "x11")
- # X11 session, don't do anything here
- echo "[INFO] Display = $DISPLAY"
- echo "[INFO] Session = $session"
-
- # just show msg on whether the Xauth session cookie is setup
- test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
- ;;
- "tty")
- # TTY session, as user may not use a display manager
- echo "[INFO] Display = $DISPLAY"
- echo "[INFO] Session = $session"
-
- test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
- ;;
- *)
- # anything here is an unknown session, most likely Sofirem will fail to load
- echo "[WARN] Cannot verify session for user."
- ;;
-esac
-echo "---------------------------------------------------------------------------"
-
-echo "[INFO] Starting BlackBox"
-pkexec '/usr/share/blackbox/blackbox.py'
\ No newline at end of file
diff --git a/usr/share/applications/blackbox.desktop b/usr/share/applications/blackbox.desktop
deleted file mode 100644
index 2040337..0000000
--- a/usr/share/applications/blackbox.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Name=BlackBox - Software installer/remover for Arch Linux based systems
-GenericName=BlackBox
-X-GNOME-FullName=BlackBox
-Comment=Software installer/remover for Arch Linux based systems
-Exec=/usr/bin/blackbox
-Icon=blackbox
-Terminal=false
-Type=Application
-Categories=GTK;GNOME;Utility;Settings;Security;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
-Keywords=application;installer;
-StartupNotify=true
\ No newline at end of file
diff --git a/usr/share/blackbox/Functions.py b/usr/share/blackbox/Functions.py
deleted file mode 100644
index 7edfb36..0000000
--- a/usr/share/blackbox/Functions.py
+++ /dev/null
@@ -1,2190 +0,0 @@
-#!/bin/python
-
-import os
-import sys
-import psutil
-import time
-import datetime
-from datetime import datetime, timedelta
-import subprocess
-import threading
-import gi
-import logging
-from logging.handlers import TimedRotatingFileHandler
-import shutil
-from threading import Thread
-from Package import Package
-from Settings import Settings
-from ui.MessageDialog import MessageDialog
-from distro import id
-from os import makedirs
-
-gi.require_version("Gtk", "3.0")
-from gi.repository import GLib, Gtk
-
-# NOTE: Base Directory
-base_dir = os.path.dirname(os.path.realpath(__file__))
-
-# NOTE: Global Variables
-sudo_username = os.getlogin()
-home = "/home/" + str(sudo_username)
-path_dir_cache = base_dir + "/cache/"
-packages = []
-distr = id()
-blackbox_lockfile = "/tmp/blackbox.lock"
-blackbox_pidfile = "/tmp/blackbox.pid"
-process_timeout = 300 # NOTE: process time out has been set to 5 mins.
-snigdhaos_mirrorlist = "/etc/pacman.d/snigdhaos-mirrorlist"
-
-# NOTE: pacman settings
-pacman_conf = "/etc/pacman.conf"
-pacman_conf_backup = "/etc/pacman.conf.bak" # NOTE: Bak stands for backup
-pacman_logfile = "/var/log/pacman.log"
-pacman_lockfile = "/var/lib/pacman/db.lck"
-pacman_cache_dir = "/var/cache/pacman/pkg/"
-
-# NOTE: Snigdha OS Mirror Config
-snigdhaos_core = [
- "[snigdhaos-core]",
- "SigLevel = PackageRequired DatabaseNever",
- "Include = /etc/pacman.d/snigdhaos-mirrorlist",
-]
-snigdhaos_extra = [
- "[snigdhaos-extra]",
- "SigLevel = PackageRequired DatabaseNever",
- "Include = /etc/pacman.d/snigdhaos-mirrorlist",
-]
-
-# NOTE: BlackBox Specific
-log_dir = "/var/log/blackbox/"
-config_dir = "%s/.config/blackbox" % home
-config_file = "%s/blackbox.yaml" % config_dir # NOTE: It is already on $pwd
-event_log_file = "%s/event.log" % log_dir
-export_dir = "%s/blackbox-exports" % home
-
-# NOTE: Permissions specified here
-
-def permissions(dst):
- try:
- # NOTE : Use try-catch block so that we can trace any error!
- # DOCS : https://docs.python.org/3/library/subprocess.html
- groups = subprocess.run(
- ["sh", "-c", "id " + sudo_username],
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- )
- # DOCS : https://www.geeksforgeeks.org/python-strings-decode-method/
- for i in groups.stdout.decode().split(" "):
- if "gid" in i:
- g = i.split("(")[1]
- group = g.replace(")", "").strip() # NOTE: replace with nothing!
- subprocess.call(["chown", "-R", sudo_username + ":" + group, dst], shell=False)
- except Exception as e:
- logger.error(
- "[Exception] permissions() : %s" % e
- )
-
-# NOTE: Creating Log, Export and Config Directory:
-# DOCS : https://python.land/deep-dives/python-try-except
-try:
- # DOCS : https://docs.python.org/3/library/os.path.html
- if not os.path.exists(log_dir):
- makedirs(log_dir) # REF : LOC 4
- if not os.path.exists(export_dir):
- makedirs(export_dir)
- if not os.path.exists(config_dir):
- makedirs(config_dir)
- permissions(export_dir)
- permissions(config_dir)
- print("[INFO] Log Directory: %s" % log_dir)
- print("[INFO] Export Directory: %s" % export_dir)
- print("[INFO] Config Directory: %s" % config_dir)
-# DOCS : https://www.geeksforgeeks.org/handling-oserror-exception-in-python/
-except os.error as oserror:
- print("[ERROR] Exception: %s" % oserror)
- sys.exit(1)
-
-# NOTE: Read Config File dst: $HOME/.config/blackbox/blackbox.yaml
-# NOTE: Initiate logger
-try:
- settings = Settings(False, False)
- settings_config = settings.read_config_file()
- logger = logging.getLogger("logger")
- # NOTE: Create a console handler
- ch = logging.StreamHandler()
- # NOTE: Rotate the fucking event log!
- tfh = TimedRotatingFileHandler(
- event_log_file,
- encoding="utf-8",
- delay=False,
- when="W4",
- )
-
- if settings_config:
- debug_logging_enabled = None
- debug_logging_enabled = settings_config[
- "Debug Logging"
- ]
-
- if debug_logging_enabled is not None and debug_logging_enabled is True:
- logger.setLevel(logging.DEBUG)
- ch.setLevel(logging.DEBUG)
- tfh.setLevel(level=logging.DEBUG)
- else:
- logger.setLevel(logging.INFO)
- ch.setLevel(logging.INFO)
- tfh.setLevel(level=logging.INFO)
- else:
- logger.setLevel(logging.INFO)
- ch.setLevel(logging.INFO)
- tfh.setLevel(level=logging.INFO)
- # DOCS : https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler
- formatter = logging.Formatter(
- "%(asctime)s:%(levelname)s > %(message)s",
- "%Y-%m-%d %H:%M:%S"
- )
- ch.setFormatter(formatter)
- tfh.setFormatter(formatter)
- logger.addHandler(ch)
- logger.addHandler(tfh)
-except Exception as e:
- print("Found Exception in LOC109: %s" % e)
-# NOTE : On app close create package file
-def _on_close_create_package_file():
- try:
- logger.info("App cloding saving currently installed package to file")
- package_file = "%s-packages.txt" % datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
- logger.info("Saving: %s%s" %(log_dir, package_file))
- cmd = [
- "pacman",
- "-Q",
- ]
- with subprocess.Popen(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- with open("%s/%s" % (log_dir, package_file), "w") as f:
- for line in process.stdout:
- f.write("%s" %line)
- except Exception as e:
- logger.error("[Exception] _on_close_create_package_file(): %s" % e)
-
-# NOTE: Global Functions
-def _get_position(lists, value):
- data = [
- string for string in lists if value in string
- ]
- position = lists.index(data[0])
- return position
-
-def is_file_stale(filepath, stale_days, stale_hours, stale_minutes):
- now = datetime.now()
- stale_datetime = now - timedelta(
- days=stale_days,
- hours=stale_hours,
- minutes=stale_minutes,
- )
- if os.path.exists(filepath):
- file_created = datetime.fromtimestamp(
- os.path.getctime(filepath)
- )
- if file_created < stale_datetime:
- return True
- else:
- return False
-
-# NOTE : Pacman
-def sync_package_db():
- try:
- sync_str = [
- "pacman",
- "-Sy",
- ]
- logger.info(
- "[INFO] Synchronizing Package Database..."
- )
- process_sync = subprocess.run(
- sync_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
- )
- if process_sync.returncode == 0:
- return None
- else:
- if process_sync.stdout:
- out = str(process_sync.stdout.decode("utf-8"))
- logger.error(out)
- return out
- except Exception as e:
- logger.error(
- "[Exception] sync_package_db() : %s" % e
- )
-
-def sync_file_db():
- try:
- sync_str = [
- "pacman",
- "-Fy",
- ]
- logger.info(
- "[INFO] Synchronizing File Database..."
- )
- process_sync = subprocess.run(
- sync_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
-
- )
- if process_sync.returncode == 0:
- return None
- else:
- if process_sync.stdout:
- out = str(process_sync.stdout.decode("utf-8"))
- logger.error(out)
- return out
- except Exception as e:
- logger.error(
- "[Exception] sync_file_db() : %s" % e
- )
-
-# NOTE: Installation & Uninstallation Process
-def start_subprocess(
- self,
- cmd,
- progress_dialog,
- action,
- pkg,
- widget
-):
- try:
- # DOCS : https://www.knowledgehut.com/blog/programming/self-variabe-python-examples
- self.switch_package_version.set_sensitive(False)
- self.switch_snigdhaos_keyring.set_sensitive(False)
- self.switch_snigdhaos_mirrorlist.set_sensitive(False)
- # DOCS : https://irtfweb.ifa.hawaii.edu/SoftwareDocs/gtk20/gtk/gtkwidget.html
- widget.set_sensitive(False)
- process_stdout_lst = []
- process_stdout_lst.append(
- "Command = %s\n\n" % " ".join(cmd)
- )
- with subprocess.Popen(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- if progress_dialog is not None:
- progress_dialog.pkg_dialog_closed = False
- self.in_progress = True
- if (
- progress_dialog is not None and progress_dialog.pkg_dialog_closed is False
- ):
- line = (
- "Pacman Processing: %s Package: %s \n\n Command: %s\n\n" % (action, pkg.name, " ".join(cmd))
- )
- # DOCS : https://docs.gtk.org/glib/const.PRIORITY_DEFAULT.html
- GLib.idle_add(
- update_progress_textview,
- self,
- line,
- progress_dialog,
- priority=GLib.PRIORITY_DEFAULT,
- )
- logger.debug("Pacman is processing the request.")
-
- while True:
- if process.poll() is not None:
- break
- if (
- progress_dialog is not None and progress_dialog.pkg_dialog_closed is False
- ):
- for line in process.stdout:
- GLib.idle_add(
- update_progress_textview,
- self,
- line,
- progress_dialog,
- priority=GLib.PRIORITY_DEFAULT,
- )
- process_stdout_lst.append(line)
- time.sleep(0.3)
- else:
- for line in process.stdout:
- process_stdout_lst.append(line)
- time.sleep(1)
- returncode = None
- returncode = process.poll()
-
- if returncode is not None:
- logger.info(
- "Pacman process completion: %s" % " ".join(cmd)
- )
- GLib.idle_add(
- refresh_ui,
- self,
- action,
- widget,
- pkg,
- progress_dialog,
- process_stdout_lst,
- priority=GLib.PRIORITY_DEFAULT,
- )
- else:
- logger.error(
- "Pacman process failed to run %s" % " ".join(cmd)
- )
-
- except TimeoutError as terr:
- # print(e)
- logger.error(
- "Timeout Error in %s : %s" % (action, terr)
- )
- process.terminate()
- if progress_dialog is not None:
- progress_dialog.btn_package_progress_close.set_sensitive(True)
- self.switch_package_version.set_sensitive(True)
- self.switch_snigdhaos_keyring.set_sensitive(True)
- self.switch_snigdhaos_mirrorlist.set_sensitive(True)
-
- except SystemError as syerr:
- logger.error(
- "Timeout Error in %s : %s" % (action, syerr)
- )
- process.terminate()
- if progress_dialog is not None:
- progress_dialog.btn_package_progress_close.set_sensitive(True)
- self.switch_package_version.set_sensitive(True)
- self.switch_snigdhaos_keyring.set_sensitive(True)
- self.switch_snigdhaos_mirrorlist.set_sensitive(True)
-
-def refresh_ui(
- self,
- action,
- switch,
- pkg,
- progress_dialog,
- process_stdout_lst,
-):
- self.switch_package_version.set_sensitive(False)
- self.switch_snigdhaos_keyring.set_sensitive(False)
- self.switch_snigdhaos_mirrorlist.set_sensitive(False)
-
- logger.debug("Checking if the package installed..." % pkg.name)
- installed = check_package_installed(pkg.name)
- if progress_dialog is not None:
- progress_dialog.btn_package_progress_close.set_sentitive(True)
- if installed is True and action == "install":
- logger.debug("Toggle switch state = True")
- switch.set_sensitive(True)
- switch.set_state(True)
- switch.set_active(True)
- if progress_dialog is not None:
- if progress_dialog.pkg_dialog_closed is False:
- progress_dialog.set_title(
- "Package installed: %s" % pkg.name
- )
- progress_dialog.infobar.set_name(
- "infobar_info"
- )
- content = progress_dialog.infobar.get_content_area()
- if content is not None:
- for widget in content.get_children():
- content.remove(widget)
- # DOCS : https://docs.gtk.org/gtk3/class.Label.html
- lbl_install = Gtk.Label(xalign=0, yalign=0)
- # DOCS : https://stackoverflow.com/questions/40072104/multi-color-text-in-one-gtk-label
- lbl_install.set_markup(
- "Package %s installed." % pkg.name
- )
- content.add(lbl_install)
- if self.timeout_id is not None:
- # DOCS : https://gtk-rs.org/gtk-rs-core/stable/0.14/docs/glib/source/fn.source_remove.html
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
- self.timeout_id = GLib.timeout_add(
- 100,
- reveal_infobar, # LOC : 618
- self,
- progress_dialog,
- )
- if installed is False and action == "install":
- logger.debug("Toggle switch state = False")
- if progress_dialog is not None:
- switch.set_sensitive(True)
- switch.set_state(False)
- switch.set_active(False)
- if progress_dialog.pkg_dialog_closed is False:
- progress_dialog.set_title("%s install failed" % pkg.name)
- progress_dialog.infobar.set_name("infobar_error")
- content = progress_dialog.infobar.get_content_area()
- if content is not None:
- for widget in content.get_children():
- content.remove(widget)
- lbl_install = Gtk.Label(xalign=0, yalign=0)
- lbl_install.set_markup(
- "Package %s installed failed." % pkg.name
- )
- content.add(lbl_install)
- if self.timeout_id is not None:
- # DOCS : https://gtk-rs.org/gtk-rs-core/stable/0.14/docs/glib/source/fn.source_remove.html
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
- self.timeout_id = GLib.timeout_add(
- 100,
- reveal_infobar,
- self,
- progress_dialog,
- )
- else:
- logger.debug(" ".join(process_stdout_lst))
- message_dialog = MessageDialog(
- "Errors occured suring installation",
- "Errors occured during installation of %s failed" % pkg.name,
- "Pacman failed to install %s" %pkg.name,
- " ".join(process_stdout_lst),
- "error",
- True,
- )
- message_dialog.show_all()
- result = message_dialog.run()
- message_dialog.destroy()
- elif progress_dialog is None or progress_dialog.pkg_dialog_closed is True:
- # DOCS : https://bbs.archlinux.org/viewtopic.php?id=48234
- if (
- "error: failed to init transaction (unable to lock database)\n" in process_stdout_lst
- ):
- if progress_dialog is None:
- logger.debug("Holding Package")
- if self.display_package_progress is False:
- inst_str = [
- "pacman",
- "-S",
- pkg.name,
- "--needed",
- "--noconfirm",
- ]
- self.pkg_holding_queue.put(
- (
- pkg,
- action,
- switch,
- inst_str,
- progress_dialog,
- ),
- )
- else:
- logger.debug(" ".join(process_stdout_lst))
- switch.set_sensitive(True)
- switch.set_state(False)
- switch.set_active(False)
- proc = get_pacman_process()
- message_dialog = MessageDialog(
- "Warning",
- "Unable to proceed, pacman lock found!",
- "Pacman is unable to lock the database inside: %s" % pacman_lockfile,
- "Pacman is processing: %s" % proc,
- "warning",
- False,
- )
- message_dialog.show_all()
- result = message_dialog.run()
- message_dialog.destroy()
- elif "error: traget not found: %s\n" %pkg.name in process_stdout_lst:
- switch.set_sensitive(True)
- switch.set_state(False)
- switch.set_active(False)
- message_dialog = MessageDialog(
- "Error",
- "%s not found!" % pkg.name,
- "Blackbox unable to process the request!",
- "Are you sure pacman config is correct?",
- "error",
- False,
- )
- message_dialog.show_all()
- result = message_dialog.run()
- message_dialog.destroy()
- else:
- switch.set_sensitive(True)
- switch.set_state(False)
- switch.set_active(False)
- message_dialog = MessageDialog(
- "Errors occured",
- "Errors occured during installation of %s failed" % pkg.name,
- "Pacman failed to install %s\n" %pkg.name,
- " ".join(process_stdout_lst),
- "error",
- True,
- )
- message_dialog.show_all()
- result = message_dialog.run()
- message_dialog.destroy()
- if installed is False and action =="uninstall":
- logger.debug("Toggle switch state = False")
- switch.set_sensitive(True)
- switch.set_state(True)
- switch.set_active(True)
- if progress_dialog is not None:
- if progress_dialog.pkg_dialog_closed is False:
- progress_dialog.set_title(
- "%s uninstalled!" %pkg.name
- )
- progress_dialog.infobar.set_name("infobar_info")
- content =progress_dialog.infobar.get_content_area()
- if content is not None:
- for widget in content.get_children():
- content.remove(widget)
- lbl_install = Gtk.Label(xalign=0, yalign=0)
- # DOCS : https://stackoverflow.com/questions/40072104/multi-color-text-in-one-gtk-label
- lbl_install.set_markup(
- "Package %s installed." % pkg.name
- )
- content.add(lbl_install)
- if self.timeout_id is not None:
- # DOCS : https://gtk-rs.org/gtk-rs-core/stable/0.14/docs/glib/source/fn.source_remove.html
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
- self.timeout_id = GLib.timeout_add(
- 100,
- reveal_infobar,
- self,
- progress_dialog,
- )
- if installed is True and action == "uninstall":
- # logger.debug("Toggle switch state = False")
- switch.set_sensitive(True)
- switch.set_state(True)
- switch.set_active(True)
- if progress_dialog is not None:
- if progress_dialog.pkg_dialog_closed is False:
- progress_dialog.set_title(
- "Failed to uninstall %s !" %pkg.name
- )
- progress_dialog.infobar.set_name("infobar_error")
- content =progress_dialog.infobar.get_content_area()
- if content is not None:
- for widget in content.get_children():
- content.remove(widget)
- lbl_install = Gtk.Label(xalign=0, yalign=0)
- # DOCS : https://stackoverflow.com/questions/40072104/multi-color-text-in-one-gtk-label
- lbl_install.set_markup(
- "Package %s uninstallation failed!" % pkg.name
- )
- content.add(lbl_install)
- if self.timeout_id is not None:
- # DOCS : https://gtk-rs.org/gtk-rs-core/stable/0.14/docs/glib/source/fn.source_remove.html
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
- self.timeout_id = GLib.timeout_add(
- 100,
- reveal_infobar,
- self,
- progress_dialog,
- )
- elif progress_dialog is None or progress_dialog.pkg_dialog_closed is True:
- if (
- "error: failed to init transaction (unable to lock database)\n" in process_stdout_lst
- ):
- logger.error(" ".join(process_stdout_lst))
- else:
- message_dialog = MessageDialog(
- "Errors occured during uninstall",
- "Errors occured during uninstallation of %s failed" % pkg.name,
- "Pacman failed to uninstall %s\n" %pkg.name,
- " ".join(process_stdout_lst),
- "error",
- True,
- )
- message_dialog.show_all()
- result = message_dialog.run()
- message_dialog.destroy()
-
-
-def reveal_infobar(
- self,
- progress_dialog,
-):
- progress_dialog.infobar.set_revealed(True)
- progress_dialog.infobar.show_all()
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
-
-def update_progress_textview(
- self,
- line,
- progress_dialog
-):
- if (
- progress_dialog is not None
- and progress_dialog.pkg_dialog_closed is False
- and self.in_progress is True
- ):
- buffer = progress_dialog.package_progress_textview.get_buffer()
- # DOCS : https://docs.python.org/3/library/asyncio-protocol.html#buffered-streaming-protocols
- if len(line) > 0 or buffer is None:
- buffer.insert(buffer.get_end_iter(), "%s" % line, len("%s" % line))
- text_mark_end = buffer.create_mark("\nend", buffer.get_end_iter(), False)
- # DOCS : https://lazka.github.io/pgi-docs/#Gtk-4.0/classes/TextView.html#Gtk.TextView.scroll_mark_onscreen
- progress_dialog.package_progress_textview.scroll_mark_onscreen(
- text_mark_end
- )
- else:
- line = None
- return False
-
-
-def check_package_installed(package_name):
- query_str = [
- "pacman",
- "-Qq",
- ]
- try:
- process_pkg_installed = subprocess.run(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- universal_newlines=True,
- )
- if package_name in process_pkg_installed.stdout.splitlines():
- return True
- else:
- if check_pacman_localdb(package_name):
- return True
- else:
- return False
- except subprocess.CalledProcessError:
- return False # NOTE : It means package is not installed.
-
-def check_pacman_localdb(package_name):
- query_str = [
- "pacman",
- "-Qi",
- package_name,
- ]
- try:
- process_pkg_installed = subprocess.run(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
- )
- if process_pkg_installed.returncode == 0:
- for line in process_pkg_installed.stdout.decode("utf-8").splitlines():
- if line.startswith("Name :"):
- if line.replace(" ", "").split("Name:")[1].strip() == package_name:
- return True
- if line.startswith("Replaces :"):
- replaces = line.split("Replaces :")[1].strip()
- if len(replaces) > 0:
- if package_name in replaces:
- return True
- else:
- return False
- except subprocess.CalledProcessError:
- return False # LOC: 387
-
-# NOTE: App installation
-def install(self):
- pkg, action, widget, inst_str, progress_dialog = self.pkg_queue.get()
- try:
- if action == "install":
- logger.debug(
- "Running inside install thread"
- )
- logger.info(
- "Installing: %s" % pkg.name
- )
- logger.debug(
- inst_str,
- )
- th_subprocess_install = Thread(
- name = "thread_subprocess",
- target=start_subprocess,
- args=(
- self,
- inst_str,
- progress_dialog,
- action,
- pkg,
- widget,
- ),
- daemon=True
- )
- th_subprocess_install.start()
- logger.debug(
- "Thread: subprocess install started!"
- )
- except Exception as e:
- widget.set_state(False)
- if progress_dialog is not None:
- progress_dialog.btn_package_progress_close.set_sensitive(True)
- finally:
- self.pkg_queue.task_done()
-
-# NOTE: App uninstall
-def uninstall(self):
- pkg, action, widget, uninst_str, progress_dialog = self.pkg_queue.get()
- try:
- if action == "uninstall":
- logger.debug(
- "Running inside uninstall thread"
- )
- logger.info(
- "Uninstalling: %s" % pkg.name
- )
- logger.debug(
- uninst_str,
- )
- th_subprocess_install = Thread(
- name = "thread_subprocess",
- target=start_subprocess,
- args=(
- self,
- uninst_str,
- progress_dialog,
- action,
- pkg,
- widget,
- ),
- daemon=True
- )
- th_subprocess_install.start()
- logger.debug(
- "Thread: subprocess uninstall started!"
- )
- except Exception as e:
- widget.set_state(True)
- if progress_dialog is not None:
- progress_dialog.btn_package_progress_close.set_sensitive(True)
- finally:
- self.pkg_queue.task_done()
-
-def store_packages():
- path = base_dir + "/yaml/"
- cache = base_dir + "/cache/yaml-packages.lst"
- yaml_files = []
- packages = []
- category_dict = {}
- try:
- package_metadata = get_all_package_info()
- for file in os.listdir(path):
- if file.endswith(".yaml"):
- yaml_files.append(file)
-
- if len(yaml_files) > 0:
- for yaml_file in yaml_files:
- cat_desc = ""
- package_name = ""
- package_cat = ""
- category_name = yaml_file[11:-5].strip().capitalize()
- with open(path + yaml_file, "r") as yaml:
- content = yaml.readlines()
- for line in content:
- if line.startswith(" packages:"):
- continue
- elif line.startswith(" description: "):
- subcat_desc = (
- line.strip(" description: ")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- )
- elif line.startswith("- name:"):
- subcat_name = (
- line.strip("- name:")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- )
- elif line.startswith(" - "):
- package_name = line.strip(" - ").strip()
- package_version = "Unknown"
- package_description = "Unknown"
- for data in package_metadata:
- if data["name"] == package_name:
- package_version = data["version"]
- package_description = data["description"]
- break
- if package_description == "Unknown":
- package_description = obtain_pkg_description(package_name)
- package = Package(
- package_name,
- package_description,
- category_name,
- subcat_name,
- subcat_desc,
- package_version,
- )
- packages.append(package)
-
- category_name = None
- packages_cat_lst = []
- for pkg in packages:
- if category_name == pkg.category:
- packages_cat_lst.append(pkg)
- category_dict[category_name] = packages_cat_lst
- elif category_name is None:
- packages_cat_lst.append(pkg)
- category_dict[pkg.category] = packages_cat_lst
- else:
- packages_cat_lst = []
- packages_cat_lst.append(pkg)
- category_dict[pkg.category] = packages_cat_lst
- category_name = pkg.category
- sorted_dict = None
- sorted_dict = dict(sorted(category_dict.items()))
- if sorted_dict is None:
- logger.error(
- "An error occurred during sort of packages in stored_packages()"
- )
- else:
- with open(cache, "w", encoding="utf-8") as f:
- for key in category_dict.keys():
- pkg_list = category_dict[key]
- for pkg in pkg_list:
- f.write("%s\n" % pkg.name)
- return sorted_dict
- except Exception as e:
- logger.error(
- "Exception found: %s" % e
- )
- sys.exit(1)
-
-def get_all_package_info():
- query_str = [
- "pacman",
- "-Si",
- ]
- try:
- process_pkg_query = subprocess.Popen(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- )
- out, err = process_pkg_query.communicate(timeout=process_timeout)
- if process_pkg_query.returncode == 0:
- if out:
- package_data = []
- package_name = "Unknown"
- package_version = "Unknown"
- package_description = "Unknown"
- package_repository = "Unknown"
- for line in out.decode("utf-8").splitlines():
- package_dict = {}
- if "Name :" in line.strip():
- package_name = line.replace(" ", "").split("Name:")[1].strip()
- if "Version :" in line.strip():
- package_version = line.replace(" ", "").split("Version:")[1].strip()
- if "Description :" in line.strip():
- package_description = line.replace(" ", "").split("Description:")[1].strip()
- if "Repository :" in line.strip():
- package_repository = line.replace(" ", "").split("Repository:")[1].strip()
-
- package_dict["name"] = package_name
- package_dict["version"] = package_version
- package_dict["description"] = package_description
- package_dict["repository"] = package_repository
-
- package_data.append(package_dict)
- return package_data
- else:
- logger.error(
- "Failed to extract Package Version Info!"
- )
- except Exception as e:
- logger.error(
- "Exception Occured: %s" % e
- )
-
-def file_lookup(package, path):
- pkg = package.strip("\n")
- output =""
- if os.path.exists(path + "corrections/" + pkg):
- file_name = path + "corrections/" + pkg
- else:
- file_name = path + pkg
- file = open(file_name, "r")
- output = file.read()
- file.close()
- if len(output) > 0:
- return output
- return "No Description Found!"
-
-
-def obtain_pkg_description(package):
- output = ""
- path = base_dir + "/cache/"
- if os.path.exists(path + package.strip("\n")):
- output = file_lookup(package, path)
- else:
- output = cache(package, path)
- packages.append(package)
- return output
-
-def cache(package, path_dir_cache):
- try:
- pkg = package.strip()
- query_str = [
- "pacman",
- "-Si",
- pkg,
- "--noconfirm",
- ]
- process = subprocess.Popen(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- # stderr=subprocess.STDOUT,
- stderr=subprocess.PIPE,
- )
- out, err = process.communicate()
-
- if process.returncode == 0:
- output = out.decode("utf-8")
- if len(output) > 0:
- split = output.splitlines()
- desc = str(split[3])
- description = desc[18:]
- filename = path_dir_cache + pkg
- file = open(filename, "w")
- file.write(description)
- file.close()
- return description
- if process.returncode != 0:
- exceptions = [
- "ttf-firacode" # NOTE: ADD ESSENTIAL PACKAGES ONLY! # INS0011
- ]
- if pkg in exceptions:
- description = file_lookup(pkg, path_dir_cache + "corrections/")
- return description
- return "No Description Found!"
- except Exception as e:
- logger.error(
- "Exception %s" % e
- )
-
-def get_package_description(package):
- query_str = [
- "pacman",
- "-Si",
- package,
- ]
- try:
- with subprocess.Popen(
- query_str,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- while True:
- if process.poll() is not None:
- break
- returncode = None
- returncode = process.poll()
- if returncode is not None:
- for line in process.stdout:
- if "Description :" in line.strip():
- return line.replace(" ", "").split("Description:")[1].strip()
-
- except Exception as e:
- logger.error(
- "Exception: %s" % e
- )
-
-def get_installed_package_data(self):
- latest_package_data = get_all_package_info()
- try:
- installed_packages_list = []
- pkg_name = None
- pkg_version = None
- pkg_install_date = None
- pkg_installed_size = None
- pkg_latest_version = None
- with subprocess.Popen(
- self.pacman_export_cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- for line in process.stdout:
- if "Name :" in line.strip():
- pkg_name = line.replace(" ", "").split("Name:")[1].strip()
- if "Version :" in line.strip():
- pkg_name = line.replace(" ", "").split("Version:")[1].strip()
- if "Installed Size :" in line.strip():
- pkg_name = line.replace(" ", "").split("Installed Size :")[1].strip()
- if "Install Date :" in line.strip():
- pkg_name = line.replace(" ", "").split("Install Date :")[1].strip()
- found = False
- pkg_latest_version = None
- for i in latest_package_data:
- if i["name"] == pkg_name:
- pkg_latest_version = i["version"]
- break
- installed_packages_list.append(
- (
- pkg_name,
- pkg_version,
- pkg_latest_version,
- pkg_installed_size,
- pkg_install_date,
- )
- )
- self.pkg_export_queue.put(
- installed_packages_list
- )
- except Exception as e:
- logger.error(
- "Exception: %s" % e
- )
-
-def get_package_files(package_name):
- try:
- query_str = [
- "pacman",
- "-Fl",
- package_name,
- ]
- process = subprocess.run(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
- )
- if process.returncode == 0:
- package_files = []
- for line in process.stdout.decode("utf-8").splitlines():
- package_files.append(line.split(" ")[1], None)
- return package_files
- else:
- return None
- except Exception as e:
- logger.error(
- "Exception in LOC1161: %s" % e
- )
-
-
-# NOTE : Fixed where functions were not mutable and uable to call.
-def get_package_information(package_name):
- logger.info("Fetching Information: %s" % package_name)
- try:
- pkg_name = "Unknown"
- pkg_version = "Unknown"
- pkg_repository = "Unknown / pacman mirrorlist not configured"
- pkg_description = "Unknown"
- pkg_arch = "Unknown"
- pkg_url = "Unknown"
- pkg_depends_on = []
- pkg_conflicts_with = []
- pkg_download_size = "Unknown"
- pkg_installed_size = "Unknown"
- pkg_build_date = "Unknown"
- pkg_packager = "Unknown"
- package_metadata = {}
- query_local_cmd = ["pacman", "-Qi", package_name]
- query_remote_cmd = ["pacman", "-Si", package_name]
- process_query_remote = subprocess.run(
- query_remote_cmd,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
- )
- if process_query_remote.returncode == 0:
- for line in process_query_remote.stdout.decode("utf-8").splitlines():
- if "Name :" in line.strip():
- pkg_name = line.replace(" ", "").split("Name:")[1].strip()
- if "Version :" in line.strip():
- pkg_version = line.replace(" ", "").split("Version:")[1].strip()
- if "Repository :" in line.strip():
- pkg_repository = line.split("Repository :")[1].strip()
- if "Description :" in line.strip():
- pkg_description = line.split("Description :")[1].strip()
- if "Architecture :" in line.strip():
- pkg_arch = line.split("Architecture :")[1].strip()
- if "URL :" in line.strip():
- pkg_url = line.split("URL :")[1].strip()
- if "Depends On :" in line.strip():
- if line.split("Depends On :")[1].strip() != "None":
- pkg_depends_on_str = line.split("Depends On :")[1].strip()
- for pkg_dep in pkg_depends_on_str.split(" "):
- pkg_depends_on.append((pkg_dep, None))
- else:
- pkg_depends_on = []
- if "Conflicts With :" in line.strip():
- if line.split("Conflicts With :")[1].strip() != "None":
- pkg_conflicts_with_str = line.split("Conflicts With :")[
- 1
- ].strip()
- for pkg_con in pkg_conflicts_with_str.split(" "):
- pkg_conflicts_with.append((pkg_con, None))
- else:
- pkg_conflicts_with = []
- if "Download Size :" in line.strip():
- pkg_download_size = line.split("Download Size :")[1].strip()
- if "Installed Size :" in line.strip():
- pkg_installed_size = line.split("Installed Size :")[1].strip()
- if "Build Date :" in line.strip():
- pkg_build_date = line.split("Build Date :")[1].strip()
- if "Packager :" in line.strip():
- pkg_packager = line.split("Packager :")[1].strip()
- package_metadata["name"] = pkg_name
- package_metadata["version"] = pkg_version
- package_metadata["repository"] = pkg_repository
- package_metadata["description"] = pkg_description
- package_metadata["arch"] = pkg_arch
- package_metadata["url"] = pkg_url
- package_metadata["depends_on"] = pkg_depends_on
- package_metadata["conflicts_with"] = pkg_conflicts_with
- package_metadata["download_size"] = pkg_download_size
- package_metadata["installed_size"] = pkg_installed_size
- package_metadata["build_date"] = pkg_build_date
- package_metadata["packager"] = pkg_packager
- return package_metadata
- elif (
- "error: package '%s' was not found\n" % package_name
- in process_query_remote.stdout.decode("utf-8")
- ):
- return "error: package '%s' was not found" % package_name
- else:
- process_query_local = subprocess.run(
- query_local_cmd,
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- timeout=process_timeout,
- )
- # NOTE: Added validation on process result
- if process_query_local.returncode == 0:
- for line in process_query_local.stdout.decode("utf-8").splitlines():
- if "Name :" in line.strip():
- pkg_name = line.replace(" ", "").split("Name:")[1].strip()
- if "Version :" in line.strip():
- pkg_version = line.replace(" ", "").split("Version:")[1].strip()
- if "Repository :" in line.strip():
- pkg_repository = line.split("Repository :")[1].strip()
- if "Description :" in line.strip():
- pkg_description = line.split("Description :")[1].strip()
- if "Architecture :" in line.strip():
- pkg_arch = line.split("Architecture :")[1].strip()
- if "URL :" in line.strip():
- pkg_url = line.split("URL :")[1].strip()
- if "Depends On :" in line.strip():
- if line.split("Depends On :")[1].strip() != "None":
- pkg_depends_on_str = line.split("Depends On :")[
- 1
- ].strip()
- for pkg_dep in pkg_depends_on_str.split(" "):
- pkg_depends_on.append((pkg_dep, None))
- else:
- pkg_depends_on = []
- if "Conflicts With :" in line.strip():
- if line.split("Conflicts With :")[1].strip() != "None":
- pkg_conflicts_with_str = line.split("Conflicts With :")[
- 1
- ].strip()
- for pkg_con in pkg_conflicts_with_str.split(" "):
- pkg_conflicts_with.append((pkg_con, None))
- else:
- pkg_conflicts_with = []
- if "Download Size :" in line.strip():
- pkg_download_size = line.split("Download Size :")[1].strip()
- if "Installed Size :" in line.strip():
- pkg_installed_size = line.split("Installed Size :")[1].strip()
- if "Build Date :" in line.strip():
- pkg_build_date = line.split("Build Date :")[1].strip()
- if "Packager :" in line.strip():
- pkg_packager = line.split("Packager :")[1].strip()
- package_metadata["name"] = pkg_name
- package_metadata["version"] = pkg_version
- package_metadata["repository"] = pkg_repository
- package_metadata["description"] = pkg_description
- package_metadata["arch"] = pkg_arch
- package_metadata["url"] = pkg_url
- package_metadata["depends_on"] = pkg_depends_on
- package_metadata["conflicts_with"] = pkg_conflicts_with
- package_metadata["download_size"] = pkg_download_size
- package_metadata["installed_size"] = pkg_installed_size
- package_metadata["build_date"] = pkg_build_date
- package_metadata["packager"] = pkg_packager
- return package_metadata
- else:
- return None
- except Exception as e:
- logger.error("Exception in LOC1061: %s" % e)
-
-# NOTE : ICON ON THE BACK
-def get_current_installed():
- logger.debug(
- "Get currently installed packages"
- )
- path = base_dir + "/cache/installed.lst"
-
- query_str = [
- "pacman",
- "-Q",
- ]
-
- subprocess_query = subprocess.Popen(
- query_str,
- shell=False,
- stdout=subprocess.PIPE,
- )
-
- out, err = subprocess_query.communicate(timeout=process_timeout)
-
- # added validation on process result
- if subprocess_query.returncode == 0:
- file = open(path, "w")
- for line in out.decode("utf-8"):
- file.write(line)
- file.close()
- else:
- logger.warning("Failed to run %s" % query_str)
-
-def query_pkg(package):
- try:
- package = package.strip()
- path = base_dir + "/cache/installed.lst"
-
- pacman_localdb = base_dir + "/cache/pacman-localdb"
-
- if os.path.exists(path):
- if is_file_stale(path, 0, 0, 30):
- get_current_installed()
- else:
- get_current_installed()
- with open(path, "r") as f:
- pkg = package.strip("\n")
- for line in f:
- installed = line.split(" ")
- if pkg == installed[0]:
- return True
- # file.close()
- return False
- except Exception as e:
- logger.error("Exception in LOC1206: %s " % e)
-
-def cache(package, path_dir_cache):
- try:
- pkg = package.strip()
- query_str = [
- "pacman",
- "-Si",
- pkg,
- " --noconfirm",
- ]
- process = subprocess.Popen(
- query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE
- )
- out, err = process.communicate()
- if process.returncode == 0:
- # out, err = process.communicate()
-
- output = out.decode("utf-8")
-
- if len(output) > 0:
- split = output.splitlines()
- desc = str(split[3]) # Ref: LOC:963
- description = desc[18:] # Ref: LOC:964
- filename = path_dir_cache + pkg
-
- file = open(filename, "w")
- file.write(description)
- file.close()
-
- return description
-
- if process.returncode != 0:
- exceptions = [
- "cached-package-goes-here"
- ]
- if pkg in exceptions:
- description = file_lookup(pkg, path_dir_cache + "corrections/")
- return description
- return "No Description Found"
-
- except Exception as e:
- logger.error("Exception in cache(): %s " % e)
-
-def add_pacmanlog_queue(self):
- try:
- lines = []
- with open(pacman_logfile, "r", encoding="utf-8") as f:
- while True:
- line = f.readline()
- if line:
- lines.append(line.encode("utf-8"))
- self.pacmanlog_queue.put(lines)
- else:
- time.sleep(0.5)
-
- except Exception as e:
- logger.error("Exception in add_pacmanlog_queue() : %s" % e)
- finally:
- logger.debug("No new lines found inside the pacman log file")
-
-def start_log_timer(self, window_pacmanlog):
- while True:
- if window_pacmanlog.start_logtimer is False:
- logger.debug("Stopping Pacman log monitoring timer")
- return False
-
- GLib.idle_add(update_textview_pacmanlog, self, priority=GLib.PRIORITY_DEFAULT)
- time.sleep(2)
-
-# NOTE: SNIGDHA OS SPECIFIC #
-
-def append_repo(text):
- """Append a new repo"""
- try:
- with open(pacman_conf, "a", encoding="utf-8") as f:
- f.write("\n\n")
- f.write(text)
- except Exception as e:
- logger.error("Exception in LOC1299: %s" % e)
-
-def repo_exist(value):
- """check repo_exists"""
- with open(pacman_conf, "r", encoding="utf-8") as f:
- lines = f.readlines()
- f.close()
- for line in lines:
- if value in line:
- return True
- return False
-
-def install_snigdhaos_keyring():
- try:
- keyring = base_dir + "/packages/snigdhaos-keyring/"
- file = os.listdir(keyring)
- cmd_str = [
- "pacman",
- "-U",
- keyring + str(file).strip("[]'"),
- "--noconfirm",
- ]
- logger.debug("%s" % " ".join(cmd_str))
- with subprocess.Popen(
- cmd_str,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- process.wait(process_timeout)
- output = []
- for line in process.stdout:
- output.append(line)
- if process.returncode == 0:
- return 0
- else:
- if len(output) == 0:
- output.append("Error: install of Snigdha OS keyring failed")
- logger.error(" ".join(output))
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = output
- return result_err
- except Exception as e:
- logger.error("Exception in LOC1318: %s" % e)
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = e
- return result_err
-
-def remove_snigdhaos_keyring():
- try:
- cmd_str = [
- "pacman",
- "-Rdd",
- "snigdhaos-keyring",
- "--noconfirm"
- ]
- with subprocess.Popen(
- cmd_str,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- process.wait(process_timeout)
- output = []
- for line in process.stdout:
- output.append(line)
- if process.returncode == 0:
- return 0
- else:
- if len(output) == 0:
- output.append("[Error] Removal of Snigdha OS keyring failed!")
- logger.error(" ".join(output))
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = output
- return result_err
- except Exception as e:
- logger.error("Exception in LOC1357: %s" % e)
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = e
- return result_err
-
-def install_snigdhaos_mirrorlist():
- try:
- mirrorlist = base_dir + "/packages/snigdhaos-mirrorlist/"
- file = os.listdir(mirrorlist)
- cmd_str = [
- "pacman",
- "-U",
- mirrorlist + str(file).strip("[]'"),
- "--noconfirm",
- ]
- logger.debug("%s" % " ".join(cmd_str))
- with subprocess.Popen(
- cmd_str,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- process.wait(process_timeout)
- output = []
- for line in process.stdout:
- output.append(line)
- if process.returncode == 0:
- return 0
- else:
- if len(output) == 0:
- output.append("[Error] install of Snigdha OS Mirrorlist failed")
- logger.error(" ".join(output))
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = output
- return result_err
- except Exception as e:
- logger.error("Exception in LOC1393: %s" % e)
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = output
- return result_err
-
-def remove_snigdhaos_mirrorlist():
- try:
- cmd_str = [
- "pacman",
- "-Rdd",
- "snigdhaos-mirrorlist",
- "--noconfirm",
- ]
- logger.debug("%s" % " ".join(cmd_str))
- with subprocess.Popen(
- cmd_str,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=1,
- universal_newlines=True,
- ) as process:
- process.wait(process_timeout)
- output = []
- for line in process.stdout:
- output.append(line)
- if process.returncode == 0:
- return 0
- else:
- if len(output) == 0:
- output.append("[Error] Removal of Snigdha OS Mirrorlist failed")
- logger.error(" ".join(output))
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = output
- return result_err
- except Exception as e:
- logger.error("Exception in LOC1432: %s" % e)
- result_err = {}
- result_err["cmd_str"] = cmd_str
- result_err["output"] = e
- return result_err
-
-def add_snigdhaos_repos():
- logger.info("Adding Snigdha OS Repos on %s" % distr)
- try:
- if verify_snigdhaos_pacman_conf() is False:
- if os.path.exists(pacman_conf):
- shutil.copy(
- pacman_conf,
- pacman_conf_backup,
- )
- logger.info("Reading from %s" % pacman_conf)
- lines = []
- with open(pacman_conf, "r", encoding="utf-8") as r:
- lines = r.readlines()
- if len(lines) > 0:
- snigdhaos_core_found = False
- snigdhaos_extra_found = False
- for line in lines:
- if "#" in line.strip():
- if snigdhaos_core[0].replace("#", "") in line.strip():
- snigdhaos_core_found = True
- index = lines.index(line)
- del lines[index]
- lines.insert(index, snigdhaos_core[0])
- index += 1
- del lines[index]
- lines.insert(index, snigdhaos_core[1])
- index += 1
- del lines[index]
- lines.insert(index, snigdhaos_core[2])
- if snigdhaos_extra[0].replace("#", "") in line.strip():
- snigdhaos_extra_found = True
- index = lines.index(line)
- del lines[index]
- lines.insert(index, snigdhaos_extra[0])
- index += 1
- del lines[index]
- lines.insert(index, snigdhaos_extra[1])
- index += 1
- del lines[index]
- lines.insert(index, snigdhaos_extra[2])
- if line.strip() == snigdhaos_core[0]:
- snigdhaos_core_found = True
- if line.strip() == snigdhaos_extra[0]:
- snigdhaos_extra_found = True
- if snigdhaos_core_found is False:
- lines.append("\n")
- for snigdhaos_core_line in snigdhaos_core:
- lines.append(snigdhaos_core_line)
- if snigdhaos_extra_found is False:
- lines.append("\n")
- for snigdhaos_extra_found_line in snigdhaos_extra_found:
- lines.append(snigdhaos_extra_found_line)
- logger.info("[Add Snigdha OS repos] Writing to %s" % pacman_conf)
- if len(lines) > 0:
- with open(pacman_conf, "w", encoding="utf-8") as w:
- for l in lines:
- w.write(l.strip() + "\n")
- w.flush()
- return 0
- else:
- logger.error("Failed to process %s" % pacman_conf)
- else:
- logger.error("Failed to read %s" % pacman_conf)
- else:
- logger.info("Snigdha OS repos already setup inside pacman conf file")
- return 0
- except Exception as e:
- logger.error("Exception in LOC1469: %s" % e)
- return e
-
-def verify_snigdhaos_pacman_conf():
- try:
- lines = None
- snigdhaos_core_setup = False
- snigdhaos_extra_setup = False
- with open(pacman_conf, "r") as r:
- lines = r.readlines()
- if lines is not None:
- for line in lines:
- if snigdhaos_core[0] in line.strip():
- if "#" not in line.strip():
- snigdhaos_core_setup = True
- else:
- return False
-
- if snigdhaos_extra[0] in line.strip():
- if "#" not in line.strip():
- snigdhaos_extra_setup = True
- else:
- return False
- if (
- snigdhaos_core_setup is True
- and snigdhaos_extra_setup is True
- ):
- return True
- else:
- return False
- except Exception as e:
- logger.error("Exception in LOC1604: %s" % e)
-
-def update_textview_pacmanlog(self):
- lines = self.pacmanlog_queue.get()
- try:
- buffer = self.textbuffer_pacmanlog
- if len(lines) > 0:
- # DOCS : https://askubuntu.com/questions/435629/how-to-get-text-buffer-from-file-and-loading-into-textview-using-python-and-gtk
- end_iter = buffer.get_end_iter()
- for line in lines:
- if len(line) > 0:
- buffer.insert(
- end_iter,
- line.decode("utf-8"),
- len(line),
- )
- except Exception as e:
- logger.error(
- "Found Exception in LOC1628: %s" % e
- )
- finally:
- # DOCS : https://stackoverflow.com/questions/49637086/python-what-is-queue-task-done-used-for
- self.pacmanlog_queue.task_done()
-
-def search(self, term):
- try:
- logger.info('Searching: "%s"' % term)
- pkg_matches = []
- category_dict = {}
- whitespace = False
- if term.strip():
- whitespace = True
- for pkg_list in self.packages.values():
- for pkg in pkg_list:
- if whitespace:
- for te in term.split(" "):
- if(
- te.lower() in pkg.name.lower() or te.lower() in pkg.description.lower()
- ):
- if pkg not in pkg_matches:
- pkg_matches.append(
- pkg,
- )
- else:
- if (
- te.lower() in pkg.name.lower() or te.lower() in pkg.description.lower()
- ):
- pkg_matches.append(
- pkg,
- )
-
- category_name = None
- packages_cat = []
- for pkg_match in pkg_matches:
- if category_name == pkg_match.category:
- packages_cat.append(pkg_match)
- category_dict[category_name] = packages_cat
- elif category_name is None:
- packages_cat.append(pkg_match)
- else:
- packages_cat = []
- packages_cat.append(pkg_match)
- category_dict[pkg_match.category] = packages_cat
- category_name = pkg_match.category
- sorted_dict = None
- if len(category_dict) > 0:
- sorted_dict = dict(sorted(category_dict.items()))
- self.search_queue.put(
- sorted_dict,
- )
- else:
- self.search_queue.put(
- None,
- )
- except Exception as e:
- logger.error(
- "Found Exception in LOC1650: %s" % e
- )
-
-def remove_snigdhaos_repos():
- try:
- if verify_snigdhaos_pacman_conf() is True:
- if os.path.exists(pacman_conf):
- shutil.copy(
- pacman_conf,
- pacman_conf_backup,
- )
- logger.info(
- "Reading From: %s" % pacman_conf
- )
- lines = []
- with open(
- pacman_conf, "r", encoding="utf-8"
- ) as r:
- lines = r.readlines()
- if len(lines) > 0:
- index = 0
- for line in lines:
- if "%s\n" % snigdhaos_core[0] == line:
- index = line.index("%s\n" % snigdhaos_core[0])
- if index > 0:
- if distr != "snigdhaos":
- del lines[index]
- del lines[index]
- del lines[index]
- else:
- lines[index] = "#%s\n" % snigdhaos_core[0]
- lines[index + 1] = "#%s\n" % snigdhaos_core[1]
- lines[index + 2] = "#%s\n" % snigdhaos_core[2]
- elif (
- "#" in line.strip()
- and snigdhaos_core[0] == line.replace("#", "").strip()
- and distr != "snigdhaos"
- ):
- index = lines.index(line)
- del lines[index]
- del lines[index]
- del lines[index]
- if "%s\n" %snigdhaos_extra[0] == line:
- index = lines.index("%s\n" % snigdhaos_extra[0])
- if index > 0:
- if distr != "snigdhaos":
- del lines[index]
- del lines[index]
- del lines[index]
- else:
- lines[index] = "#%s\n" % snigdhaos_extra[0]
- lines[index + 1] = "#%s\n" % snigdhaos_extra[1]
- lines[index + 2] = "#%s\n" % snigdhaos_extra[2]
- elif (
- "#" in line.strip()
- and snigdhaos_extra[0] == line.replace("#", "").strip()
- and distr != "snigdhaos"
- ):
- index = lines.index(line)
- del lines[index]
- del lines[index]
- del lines[index]
- if distr != "snigdhaos":
- if lines[-1] == "\n":
- del lines[-1]
- if lines[-2] == "\n":
- del lines[-2]
- if lines[-3] == "\n":
- del lines[-3]
- if lines[-4] == "\n":
- del lines[-4]
- logger.info(
- "[Remove Snigdha OS Repos] Writing to %s" % pacman_conf
- )
- if len(lines) > 0:
- with open(pacman_conf, "w") as w:
- w.writelines(lines)
- w.flush() # DOCS : https://www.geeksforgeeks.org/file-flush-method-in-python/
- return 0
- else:
- logger.error(
- "Failed to process: %s" % pacman_conf
- )
- else:
- logger.error(
- "Failed to read %s" % pacman_conf
- )
- else:
- logger.info(
- "No Snigdha OS Repos inside Pacman Config!"
- )
- return 0
- except Exception as e:
- logger.error(
- "Found Exception in LOC1705: %s" % e
- )
- return e
-def check_if_process_running(process_name):
- # DOCS : https://psutil.readthedocs.io/en/latest/#psutil.process_iter
- for proc in psutil.process_iter():
- try:
- pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
- if process_name == pinfo["pid"]:
- return True
- except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
- pass
- return False
-
-def terminate_pacman():
- try:
- process_found = False
- for proc in psutil.process_iter():
- try:
- pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
- if pinfo["name"] == "pacman":
- process_found = True
- logger.debug(
- "Killing Pacman Process: %s" %pinfo["name"]
- )
- proc.kill()
- except (psutil.NoSuchProcess, psutil.AccessDenied):
- continue
- if process_found == True:
- if check_pacman_lockfile():
- os.unlink(pacman_lockfile)
- except Exception as e:
- logger.error(
- "Found Exception in LOC1810: %s" % e
- )
-
-def check_pacman_lockfile():
- try:
- if os.path.exists(pacman_lockfile):
- return True
- else:
- return False
- except Exception as e:
- logger.error(
- "Found Exception in LOC1832: %s" % e
- )
-
-def is_thread_alive(thread_name):
- for thread in threading.enumerate():
- if thread.name == thread_name and thread.is_alive():
- return True
- return False
-
-def print_running_threads():
- threads_alive = []
- for thread in threading.enumerate():
- if thread.is_alive():
- threads_alive.append(thread.name)
- for th in threads_alive:
- logger.debug(
- "Thread: %s Status: Alive" % th
- )
-
-def check_holding_queue(self):
- while True:
- (
- package,
- action,
- widget,
- cmd_str,
- progress_dialog,
- ) = self.pkg_holding_queue.get()
- try:
- while check_pacman_lockfile() is True:
- time.sleep(0.2)
- th_subprocess = Thread(
- name = "thread_subprocess",
- target = start_subprocess,
- args=(
- self,
- cmd_str,
- progress_dialog,
- action,
- package,
- widget,
- ),
- daemon=True
- )
- th_subprocess.start()
- finally:
- self.pkg_holding_queue.task_done()
-
-def get_pacman_process():
- try:
- for proc in psutil.process_iter():
- try:
- pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
- if pinfo["name"] == "pacman":
- return " ".join(proc.cmdline)
- except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
- pass
- except Exception as e:
- logger.error(
- "Found Exception in LOC1888: %s" % e
- )
-
-def cache_btn():
- # fraction = 1 / len(packages)
- packages.sort()
- number = 1
- for pkg in packages:
- logger.debug(str(number) + "/" + str(len(packages)) + ": Caching " + pkg)
- cache(pkg, path_dir_cache)
- number = number + 1
- # progressbar.timeout_id = GLib.timeout_add(50, progressbar.update, fraction)
-
- logger.debug("Caching applications finished")
-
-def restart_program():
- os.unlink("/tmp/blackbox.lock")
- python = sys.executable
- os.execl(python, python, *sys.argv)
-
-def show_in_app_notification(self, message, err):
- if self.timeout_id is not None:
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
-
- if err is True:
- self.notification_label.set_markup(
- '' + message + ""
- )
- else:
- self.notification_label.set_markup(
- '' + message + ""
- )
- self.notification_revealer.set_reveal_child(True)
- self.timeout_id = GLib.timeout_add(3000, timeout, self)
-
-def timeout(self):
- close_in_app_notification(self)
-
-
-def close_in_app_notification(self):
- self.notification_revealer.set_reveal_child(False)
- GLib.source_remove(self.timeout_id)
- 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: Cleaning pacman cache",
- )
- 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: Performing full system upgrade - do not power off your system",
- )
- 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: Full system upgrade - completed",
- )
- 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: Full system upgrade - failed",
- )
- 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: %s -> Installed" % package,
- )
- GLib.idle_add(
- update_package_status_label,
- self.label_package_count,
- "Progress: %s/%s"
- % (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: %s -> Install failed" % package,
- )
- GLib.idle_add(
- update_package_status_label,
- self.label_package_count,
- "Progress: %s/%s"
- % (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,
- "Some packages have failed to install see %s" % 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)
-
-def log_package_status(self):
- logger.info("Logging package status")
- packages_status_list = None
- package_err = None
- while True:
- try:
- time.sleep(0.2)
- packages_status_list = self.pkg_status_queue.get()
- package_err = self.pkg_err_queue.get()
- finally:
- self.pkg_status_queue.task_done()
- self.pkg_err_queue.task_done()
- with open(self.logfile, "w") as f:
- f.write(
- "# This file was auto-generated by Sofirem on %s at %s\n"
- % (
- datetime.today().date(),
- datetime.now().strftime("%H:%M:%S"),
- ),
- )
- if packages_status_list is not None:
- for package in packages_status_list:
- if package.split("->")[0].strip() in package_err:
- f.write("%s\n" % package)
- f.write(
- "\tERROR: %s\n"
- % package_err[package.split("->")[0].strip()]
- )
- else:
- f.write("%s\n" % package)
- break
-
-def open_log_dir():
- try:
- subprocess.Popen(
- ["sudo", "-u", sudo_username, "xdg-open", log_dir],
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- )
- except Exception as e:
- logger.error("Exception in open_log_dir(): %s" % e)
\ No newline at end of file
diff --git a/usr/share/blackbox/Functions_Ref_DO_NOT_MODIFY.py b/usr/share/blackbox/Functions_Ref_DO_NOT_MODIFY.py
deleted file mode 100644
index caabd3f..0000000
--- a/usr/share/blackbox/Functions_Ref_DO_NOT_MODIFY.py
+++ /dev/null
@@ -1,300 +0,0 @@
-import os
-import sys
-import shutil
-import psutil
-import datetime
-
-# import time
-import subprocess
-import threading # noqa
-import gi
-
-# import configparser
-gi.require_version("Gtk", "3.0")
-from gi.repository import GLib, Gtk # noqa
-
-
-log_dir = "/var/log/snigdhaos/"
-aai_log_dir = "/var/log/snigdhaos/aai/"
-
-def create_log(self):
- print("Making log in /var/log/snigdhaos")
- now = datetime.datetime.now()
- time = now.strftime("%Y-%m-%d-%H-%M-%S")
- destination = aai_log_dir + "aai-log-" + time
- command = "sudo pacman -Q > " + destination
- subprocess.call(
- command,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- )
-
-def _get_position(lists, value):
- data = [string for string in lists if value in string]
- position = lists.index(data[0])
- return position
-
-def permissions(dst):
- try:
- groups = subprocess.run(
- [
- "sh",
- "-c",
- "id " + sudo_username
- ],
- shell=False,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- )
- for x in groups.stdout.decode().split(" "):
- if "gid" in x:
- g = x.split("(")[1]
- group = g.replace(")", "").strip()
- subprocess.call(
- [
- "chown",
- "-R",
- sudo_username + ":" + group,
- dst
- ],
- shell=False,
- )
- except Exception as e:
- print(e)
-
-sudo_username = os.getlogin()
-home = "/home/" + str(sudo_username)
-
-sddm_default = "/etc/sddm.conf"
-sddm_default_original = "/usr/local/share/snigdhaos/sddm/sddm.conf"
-
-sddm_default_d1 = "/etc/sddm.conf"
-sddm_default_d2 = "/etc/sddm.conf.d/kde_settings.conf"
-sddm_default_d2_dir = "/etc/sddm.conf.d/"
-sddm_default_d_sddm_original_1 = "/usr/local/share/snigdhaos/sddm.conf.d/sddm.conf"
-sddm_default_d_sddm_original_2 = (
- "/usr/local/share/snigdhaos/sddm.conf.d/kde_settings.conf"
-)
-
-if os.path.exists("/etc/sddm.conf.d/kde_settings.conf"):
- sddm_conf = "/etc/sddm.conf.d/kde_settings.conf"
-else:
- sddm_conf = "/etc/sddm.conf"
-
-snigdhaos_mirrorlist = "/etc/pacman.d/snigdhaos-mirrorlist"
-snigdhaos_mirrorlist_original = "/usr/local/share/snigdhaos/snigdhaos-mirrorlist"
-pacman = "/etc/pacman.conf"
-neofetch_config = home + "/.config/neofetch/config.conf"
-autostart = home + "/.config/autostart/"
-
-srepo = "[snigdhaos-core]\n\
-SigLevel = Required DatabaseOptional\n\
-Include = /etc/pacman.d/snigdhaos-mirrorlist"
-
-serepo = "[snigdhaos-extra]\n\
-SigLevel = Required DatabaseOptional\n\
-Include = /etc/pacman.d/snigdhaos-mirrorlist"
-
-def show_in_app_notification(self, message):
- if self.timeout_id is not None:
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
- self.notification_label.set_markup(
- '' + message + ""
- )
- self.notification_revealer.set_reveal_child(True)
- self.timeout_id = GLib.timeout_add(3000, timeOut, self)
-
-def timeOut(self):
- close_in_app_notification(self)
-
-def close_in_app_notification(self):
- self.notification_revealer.set_reveal_child(False)
- GLib.source_remove(self.timeout_id)
- self.timeout_id = None
-
-def test(dst):
- for root, dirs, filesr in os.walk(dst):
- # print(root)
- for folder in dirs:
- pass
- # print(dst + "/" + folder)
- for file in filesr:
- pass
- # print(dst + "/" + folder + "/" + file)
- for file in filesr:
- pass
-
-def copy_func(src, dst, isdir=False):
- if isdir:
- subprocess.run(["cp", "-Rp", src, dst], shell=False)
- else:
- subprocess.run(["cp", "-p", src, dst], shell=False)
-
-def source_shell(self):
- process = subprocess.run(["sh", "-c", 'echo "$SHELL"'], stdout=subprocess.PIPE)
-
- output = process.stdout.decode().strip()
- print(output)
- if output == "/bin/bash":
- subprocess.run(
- [
- "bash",
- "-c",
- "su - " + sudo_username + ' -c "source ' + home + '/.bashrc"',
- ],
- stdout=subprocess.PIPE,
- )
- elif output == "/bin/zsh":
- subprocess.run(
- ["zsh", "-c", "su - " + sudo_username + ' -c "source ' + home + '/.zshrc"'],
- stdout=subprocess.PIPE,
- )
-
-def run_as_user(script):
- subprocess.call(["su - " + sudo_username + " -c " + script], shell=False)
-
-def MessageBox(self, title, message):
- md2 = Gtk.MessageDialog(
- parent=self,
- flags=0,
- message_type=Gtk.MessageType.INFO,
- buttons=Gtk.ButtonsType.OK,
- text=title,
- )
- md2.format_secondary_markup(message)
- md2.run()
- md2.destroy()
-
-def rgb_to_hex(rgb):
- if "rgb" in rgb:
- rgb = rgb.replace("rgb(", "").replace(")", "")
- vals = rgb.split(",")
- return "#{0:02x}{1:02x}{2:02x}".format(
- clamp(int(vals[0])), clamp(int(vals[1])), clamp(int(vals[2]))
- )
- return rgb
-
-def clamp(x):
- return max(0, min(x, 255))
-
-def _get_variable(lists, value):
- data = [string for string in lists if value in string]
- if len(data) >= 1:
- data1 = [string for string in data if "#" in string]
- for i in data1:
- if i[:4].find("#") != -1:
- data.remove(i)
- if data:
- data_clean = [data[0].strip("\n").replace(" ", "")][0].split("=")
- return data_clean
-
-def check_value(list, value):
- data = [string for string in list if value in string]
- if len(data) >= 1:
- data1 = [string for string in data if "#" in string]
- for i in data1:
- if i[:4].find("#") != -1:
- data.remove(i)
- return data
-
-# def check_backups(now):
-# if not os.path.exists(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H")):
-# os.makedirs(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H"), 0o777)
-# permissions(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H"))
-
-def file_check(file):
- if os.path.isfile(file):
- return True
- return False
-
-def path_check(path):
- if os.path.isdir(path):
- return True
- return False
-
-def gtk_check_value(my_list, value):
- data = [string for string in my_list if value in string]
- if len(data) >= 1:
- data1 = [string for string in data if "#" in string]
- for i in data1:
- if i[:4].find("#") != -1:
- data.remove(i)
- return data
-
-def gtk_get_position(my_list, value):
- data = [string for string in my_list if value in string]
- position = my_list.index(data[0])
- return position
-
-def get_shortcuts(conflist):
- sortcuts = _get_variable(conflist, "shortcuts")
- shortcuts_index = _get_position(conflist, sortcuts[0])
- return int(shortcuts_index)
-
-def get_commands(conflist):
- commands = _get_variable(conflist, "commands")
- commands_index = _get_position(conflist, commands[0])
- return int(commands_index)
-
-def check_lightdm_value(list, value):
- data = [string for string in list if value in string]
- return data
-
-def check_sddm_value(list, value):
- data = [string for string in list if value in string]
- return data
-
-def hblock_get_state(self):
- lines = int(
- subprocess.check_output("wc -l /etc/hosts", shell=True).strip().split()[0]
- )
- if os.path.exists("/usr/local/bin/hblock") and lines > 100:
- return True
- self.firstrun = False
- return False
-
-def do_pulse(data, prog):
- prog.pulse()
- return True
-
-def copytree(self, src, dst, symlinks=False, ignore=None): # noqa
- if not os.path.exists(dst):
- os.makedirs(dst)
- for item in os.listdir(src):
- s = os.path.join(src, item)
- d = os.path.join(dst, item)
- if os.path.exists(d):
- try:
- shutil.rmtree(d)
- except Exception as e:
- print(e)
- os.unlink(d)
- if os.path.isdir(s):
- try:
- shutil.copytree(s, d, symlinks, ignore)
- except Exception as e:
- print(e)
- print("ERROR2")
- self.ecode = 1
- else:
- try:
- shutil.copy2(s, d)
- except: # noqa
- print("ERROR3")
- self.ecode = 1
-
-def checkIfProcessRunning(processName):
- for proc in psutil.process_iter():
- try:
- pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
- if processName == pinfo["pid"]:
- return True
- except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
- pass
- return False
-
-def restart_program():
- python = sys.executable
- os.execl(python, python, *sys.argv)
\ No newline at end of file
diff --git a/usr/share/blackbox/Package.py b/usr/share/blackbox/Package.py
deleted file mode 100644
index 8030a88..0000000
--- a/usr/share/blackbox/Package.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/python
-
-# NOTE: It is encapsulated package data
-
-class Package(object):
- def __init__(
- self,
- name,
- description,
- category,
- subcategory,
- subcategory_description,
- version,
- ):
- self.name = name
- self.description = description
- self.category = category
- self.subcategory = subcategory
- self.subcategory_description = subcategory_description
- self.version = version
\ No newline at end of file
diff --git a/usr/share/blackbox/Settings.py b/usr/share/blackbox/Settings.py
deleted file mode 100644
index ccab4f3..0000000
--- a/usr/share/blackbox/Settings.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/bin/python
-
-import os
-import Functions as fn
-import string
-from string import Template
-
-base_dir = os.path.dirname(os.path.realpath(__file__))
-
-default_file = "%s/defaults/blackbox.yaml" % base_dir
-
-class Settings(object):
- def __init__(self, display_versions, display_package_progress):
- self.display_versions = display_versions
- self.display_package_progress = display_package_progress
-
- def write_config_file(self):
- try:
- content = []
- with open(fn.config_file, "r", encoding="utf-8") as f:
- contents = f.readlines()
- if len(contents) > 0:
- self.read(contents)
- conf_settings = {}
- conf_settings[
- "Display Package Versions"
- ] = self.display_versions
- conf_settings[
- "Display Package Progress"
- ] = self.display_package_progress
- index = 0
- for line in contents:
- if line.startswith("- name:"):
- if (
- line.strip("- name:")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- == "Display Package Versions"
- ):
- index = contents.index(line)
- index += 2
- if contents[index].startswith(" enabled: "):
- del contents[index]
- contents.insert(
- index,
- " enabled: %s\n"
- % conf_settings["Display Package Versions"],
- )
- if (
- line.strip("- name:")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- == "Display Package Progress"
- ):
- index += 4
- if contents[index].startswith(" enabled: "):
- del contents[index]
- contents.insert(
- index,
- " enabled: %s\n"
- % conf_settings["Display Package Progress"],
- )
-
- if len(contents) > 0:
- with open(fn.config_file, "w", encoding="utf-8") as f:
- f.writelines(contents)
- fn.permissions(fn.config_dir)
-
- except Exception as e:
- fn.Logger.error("[ERROR] Exception: %s" % e)
-
- def read_config_file(self):
- try:
- if os.path.exists(fn.config_file):
- contents = []
- with open(fn.config_file, "r", encoding="utf-8") as f:
- contents = f.readlines()
- if len(contents) == 0:
- fn.shutil.copy(default_file, fn.config_file)
- fn.permissions(fn.config_dir)
- else:
- return self.read(contents)
- else:
- # NOTE: String Replaces the Template File
- fn.shutil.copy(default_file, fn.config_file)
- fn.permissions(fn.config_dir)
- with open(fn.config_file, "r", encoding="utf-8") as f:
- contents = f.readlines()
- return self.read(contents)
- except Exception as e:
- print("[ERROR] Exception: %s" % e)
-
- def read(self, contents):
- setting_name = None
- setting_value_enabled = None
- conf_settings = {}
- for line in contents:
- if line.startswith("- name:"):
- setting_name = (
- line.strip("- name: ")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- )
- elif line.startswith(" enabled: "):
- setting_value_enabled = (
- line.strip("- name: ")
- .strip()
- .strip('"')
- .strip("\n")
- .strip()
- )
- if setting_value_enabled == "False":
- conf_settings[setting_name] = False
- else:
- conf_settings[setting_name] = True
- if len(conf_settings) > 0:
- return conf_settings
- else:
- print("[ERROR] Failed To Read Settings!")
diff --git a/usr/share/blackbox/blackbox.css b/usr/share/blackbox/blackbox.css
deleted file mode 100644
index c90a369..0000000
--- a/usr/share/blackbox/blackbox.css
+++ /dev/null
@@ -1,60 +0,0 @@
-box#vbox {
- padding-right: 20px;
-}
-
-#sidebar label {
- font-size: 14px;
- font-weight: normal;
- padding-left: 15px;
- padding-right: 15px;
-}
-
-label#title {
- font-size: 20px;
- font-weight: bold;
-}
-
-label#lbl_package_version {
- color: aquamarine;
- background-color: #28282b;
- border: none;
- border-radius: 5px;
- font-size: 80%;
- font-weight: bold;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-infobar#infobar_info {
- background-color: #28282b;
- color: wheat;
-}
-
-infobar#infobar_error {
- background-color: red;
- color: white;
-}
-
-infobar#infobar_warning {
- background-color: orange;
- color: white;
-}
-
-modelbutton#modelbtn_popover {
- padding-left: 0;
- padding-right: 0;
- padding-top: 1px;
- padding-bottom: 1px;
-}
-
-modelbutton#modelbtn_popover:hover {
- font-weight: bold;
-}
-
-frame#awesome * {
- padding-left: 20px;
- padding-right: 20px;
- padding-top: 10px;
- padding-bottom: 20px;
- border-color: transparent;
-}
\ No newline at end of file
diff --git a/usr/share/blackbox/blackbox.py b/usr/share/blackbox/blackbox.py
deleted file mode 100644
index 5aaec8c..0000000
--- a/usr/share/blackbox/blackbox.py
+++ /dev/null
@@ -1,1058 +0,0 @@
-#!/bin/python
-
-import os
-import subprocess
-import queue
-from queue import Queue
-import sys
-import time
-from time import sleep
-import signal
-
-# UI modules
-from ui.GUI import GUI
-from ui.SplashScreen import SplashScreen
-from ui.ProgressBarWindow import ProgressBarWindow
-from ui.AppFrameGUI import AppFrameGUI
-from ui.AboutDialog import AboutDialog
-from ui.MessageDialog import MessageDialog
-from ui.PacmanLogWindow import PacmanLogWindow
-from ui.PackageListDialog import PackageListDialog
-from ui.ProgressDialog import ProgressDialog
-# from ui.ISOPackagesWindow import ISOPackagesWindow
-from ui.PackageSearchWindow import PackageSearchWindow
-from ui.PackagesImportDialog import PackagesImportDialog
-
-import gi
-gi.require_version("Gtk", "3.0")
-from gi.repository import Gtk,Gdk,GdkPixbuf, Pango, GLib
-
-import Functions as fn
-from Settings import Settings
-from requests.packages import package
-
-base_dir = os.path.dirname(os.path.realpath(__file__))
-
-class Main(Gtk.Window):
- queue = Queue()
- pkg_queue = Queue()
- search_queue = Queue()
- pacmanlog_queue = Queue()
- pkg_holding_queue = Queue()
-
- def __init__(self):
- try:
- super(Main, self).__init__(title="BlackBox")
- self.set_border_width(10)
- self.connect("delete-event", self.on_close)
- self.set_position(Gtk.WindowPosition.CENTER) # DOCS : https://docs.gtk.org/gtk3/enum.WindowPosition.html
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
- self.set_default_size(1280, 720) # Basic Con
- # let's give a focus on search entry * set "ctrl + f"
- self.connect("key-press-event", self.on_keypress_event)
- self.timeout_id = None
- self.display_versions = False # Bool
- self.search_activated = False
- self.display_package_progress = False
- print("******************************************************")
- print(" Report error")
- print("******************************************************")
- print("https://github.com/snigdha-os/snigdhaos-blackbox")
- print("******************************************************")
- if os.path.exists(fn.blackbox_lockfile):
- running = fn.check_if_process_running("blackbox")
- if running is True:
- fn.logger.error(
- "BlackBox LockFile (%s) Found!๐ซ " % fn.blackbox_lockfile
- )
- fn.logger.error(
- "Another BlackBox instance Running already?"
- )
- sys.exit(1)
- else:
- splash_screen = SplashScreen()
- while Gtk.events_pending(): # DOCS: https://docs.gtk.org/gtk3/func.events_pending.html
- Gtk.main_iteration()
- sleep(1.5)
- splash_screen.destroy()
- if fn.check_pacman_lockfile():
- message_dialog = MessageDialog(
- "Error",
- "Blackbox failed to initiate, Pacman Lockfile Found!",
- "Pacman unable to lock the database!" % fn.pacman_lockfile,
- "Is another process running?",
- "error",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- sys.exit(1)
- fn.logger.info(
- "pkgver : pkgversion"
- )
- fn.logger.info(
- "pkgrel : pkgrelease"
- )
- print("*************************************************")
- fn.logger.info("Distro : " + fn.distr)
- print("*************************************************")
- if os.path.isdir(fn.home + "/.config/gtk-3.0"):
- try:
- if not os.path.islink("/root/.config/gtk-3.0"):
- if os.path.exists("/root/.config/gtk-3.0"):
- fn.shutil.rmtree("/root/.config/gtk-3.0")
- fn.shutil.copytree(
- fn.home + "/.config/gtk-3.0", "/root/.config/gtk-3.0"
- )
- except Exception as e:
- fn.logger.warning(
- "GTK Config: %s" % e
- )
- # if os.path.isdir
- fn.logger.info(
- "Storing package metadate started.",
- )
- self.packages = fn.store_packages()
- fn.logger.info(
- "Storing packages metadat completed.",
- )
- fn.logger.info(
- "categories: %s" % len(self.packages.keys())
- )
- total_packages = 0
- for category in self.packages:
- total_packages += len(self.packages[category])
- fn.logger.info(
- "Total Packages: %s" % total_packages
- )
- fn.logger.info(
- "Initiating GUI"
- )
- GUI.setup_gui(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- fn.settings_config,
- )
- fn.get_current_installed()
- installed_lst_file = "%s/cache/installed.lst" % base_dir
- packages_app_start_file = "%s/%s-packages.txt" % (
- fn.log_dir,
- fn.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
- )
- if os.path.exists(installed_lst_file):
- fn.logger.info(
- "Created installed.lst"
- )
- thread_pacman_sync_db = fn.threading.Thread(
- name="thread_pacman_sync_db",
- target=self.pacman_db_sync,
- daemon=True,
- )
- thread_pacman_sync_db.start()
- except Exception as e:
- fn.logger.error(
- "Found Exception in Main(): %s" % e
- )
-
- def pacman_db_sync(self):
- sync_err = fn.sync_package_db()
- if sync_err is not None:
- fn.logger.error(
- "Pacman Database Synchronization Faild!"
- )
- print("--")
- GLib.idle_add(
- self.show_sync_db_message_dialog,
- sync_err,
- priority=GLib.PRIORITY_DEFAULT,
- )
- else:
- fn.logger.info(
- "Pacman Dtabase Synchronization Completed."
- )
- return True
-
- def show_sync_db_message_dialog(self, sync_err):
- message_dialog = MessageDialog(
- "Error",
- "Pacman db Synchronization faled!",
- "Failed to run command: sudo pacman -Sy\nPacman db synchronization failed.\nCheck pcman sync log",
- sync_err,
- "error",
- True,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- def on_keypress_event(self, widget, event):
- shortcut = Gtk.accelerator_get_label(event.keyval, event.state)
- if shortcut in ("Ctrl+F", "Ctrl+Mod2+F"):
- self.searchentry.grab_focus()
- if shortcut in ("Ctrl+I", "Ctrl+Mod2+I"):
- fn.show_package_info(self)
-
- def on_search_activated(self, searchentry):
- if searchentry.get_text_length() == 0 and self.search_activated:
- GUI.setup_gui(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- None,
- )
- self.search_activated = False
-
- if searchentry.get_text_length() == 0:
- self.search_activated = False
-
- search_term = searchentry.get_text()
- if not search_term.isspace():
- try:
- if len(search_term.rstrip().lstrip()) > 0:
- th_search = fn.threading.Thread(
- name="thread_search",
- target=fn.search,
- args=(
- self,
- search_term.rstrip().lstrip(),
- ),
- )
- fn.logger.info("Starting search")
- th_search.start()
- # get the search_results from the queue
- results = self.search_queue.get()
- if results is not None:
- fn.logger.info("Search complete")
- if len(results) > 0:
- total = 0
- for val in results.values():
- total += len(val)
- fn.logger.info("Search found %s results" % total)
- # make sure the gui search only displays the pkgs inside the results
- GUI.setup_gui_search(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- results,
- search_term,
- None,
- )
- self.search_activated = True
- else:
- fn.logger.info("Search found %s results" % 0)
- self.searchentry.grab_focus()
- message_dialog = MessageDialog(
- "Info",
- "Search returned 0 results",
- "Failed to find search term inside the package name or description.",
- "Try to search again using another term",
- "info",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- elif self.search_activated == True:
- GUI.setup_gui(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- None,
- )
- self.search_activated = False
- except Exception as err:
- fn.logger.error("Exception in on_search_activated(): %s" % err)
- finally:
- if self.search_activated == True:
- self.search_queue.task_done()
-
- def on_search_cleared(self, searchentry, icon_pos, event):
- if self.search_activated:
- GUI.setup_gui(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- None,
- )
- self.searchentry.set_placeholder_text("Search...")
- self.search_activated = False
-
- def on_close(self, widget, data):
- settings = Settings(self.display_versions, self.display_package_progress)
- settings.write_config_file()
- if os.path.exists(fn.blackbox_lockfile):
- os.unlink(fn.blackbox_lockfile)
- if os.path.exists(fn.blackbox_pidfile):
- os.unlink(fn.blackbox_pidfile)
- fn.terminate_pacman()
- Gtk.main_quit()
- print("")
- print("Thanks for using BlackBox")
- print("Report issues to make it even better")
- print("")
- print("")
- print("")
-
- def app_toggle(self, widget, active, package):
- if widget.get_state() == False and widget.get_active() == True:
- if len(package.name) > 0:
- inst_str = [
- "pacman",
- "-S",
- package.name,
- "--needed",
- "--noconfirm",
- ]
- if self.display_package_progress is True:
- if fn.check_pacman_lockfile():
- widget.set_state(False)
- widget.set_active(False)
- proc = fn.get_pacman_process()
- message_dialog = MessageDialog(
- "Warning",
- "Blackbox cannot proceed pacman lockfile found",
- "Pacman cannot lock the db, a lockfile is found inside %s"
- % fn.pacman_lockfile,
- "Pacman is running: %s" % proc,
- "warning",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- return True
- else:
- package_metadata = fn.get_package_information(package.name)
- if (
- type(package_metadata) is str
- and package_metadata.strip()
- == "error: package '%s' was not found" % package.name
- ):
- self.package_found = False
- fn.logger.warning(
- "The package %s was not found in any configured Pacman repositories"
- % package.name
- )
- fn.logger.warning("Package install cannot continue")
- message_dialog = MessageDialog(
- "Error",
- "Pacman repository error: package '%s' was not found"
- % package.name,
- "Blackbox cannot process the request",
- "Are the correct pacman mirrorlists configured ?",
- "error",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- widget.set_state(False)
- widget.set_active(False)
- return True
- else:
- widget.set_state(True)
- widget.set_active(True)
- progress_dialog = ProgressDialog(
- "install",
- package,
- " ".join(inst_str),
- package_metadata,
- )
- progress_dialog.show_all()
- self.pkg_queue.put(
- (
- package,
- "install",
- widget,
- inst_str,
- progress_dialog,
- ),
- )
- th = fn.threading.Thread(
- name="thread_pkginst",
- target=fn.install,
- args=(self,),
- daemon=True,
- )
- th.start()
- fn.logger.debug("Package-install thread started")
- else:
- progress_dialog = None
- widget.set_sensitive(False)
- widget.set_active(True)
- widget.set_state(True)
- fn.logger.info("Package to install : %s" % package.name)
- # another pacman transaction is running, add items to the holding queue
- if (
- fn.check_pacman_lockfile() is True
- and self.display_package_progress is False
- ):
- self.pkg_holding_queue.put(
- (
- package,
- "install",
- widget,
- inst_str,
- progress_dialog,
- ),
- )
- if fn.is_thread_alive("thread_check_holding_queue") is False:
- th = fn.threading.Thread(
- target=fn.check_holding_queue,
- name="thread_check_holding_queue",
- daemon=True,
- args=(self,),
- )
- th.start()
- fn.logger.debug("Check-holding-queue thread started")
- elif self.display_package_progress is False:
- self.pkg_queue.put(
- (
- package,
- "install",
- widget,
- inst_str,
- progress_dialog,
- ),
- )
- th = fn.threading.Thread(
- name="thread_pkginst",
- target=fn.install,
- args=(self,),
- daemon=True,
- )
- th.start()
- fn.logger.debug("Package-install thread started")
- # switch widget is currently toggled on
- if widget.get_state() == True and widget.get_active() == False:
- # Uninstall the package
- if len(package.name) > 0:
- uninst_str = ["pacman", "-Rs", package.name, "--noconfirm"]
- fn.logger.info("Package to remove : %s" % package.name)
- if fn.check_pacman_lockfile():
- widget.set_state(True)
- widget.set_active(True)
- fn.logger.info("Pacman lockfile found, uninstall aborted")
- GLib.idle_add(
- self.show_lockfile_message_dialog,
- priority=GLib.PRIORITY_DEFAULT,
- )
- return True
- if self.display_package_progress is True:
- package_metadata = fn.get_package_information(package.name)
-
- progress_dialog = ProgressDialog(
- "uninstall",
- package,
- " ".join(uninst_str),
- package_metadata,
- )
- progress_dialog.show_all()
- else:
- progress_dialog = None
- widget.set_active(False)
- widget.set_state(False)
- self.pkg_queue.put(
- (
- package,
- "uninstall",
- widget,
- uninst_str,
- progress_dialog,
- ),
- )
- th = fn.threading.Thread(
- name="thread_pkgrem",
- target=fn.uninstall,
- args=(self,),
- daemon=True,
- )
- th.start()
- fn.logger.debug("Package-uninstall thread started")
-
- # fn.print_running_threads()
-
- # return True to prevent the default handler from running
- return True
-
- # App_Frame_GUI.GUI(self, Gtk, vboxStack1, fn, category, package_file)
- # widget.get_parent().get_parent().get_parent().get_parent().get_parent().get_parent().get_parent().queue_redraw()
- # self.gui.hide()
- # self.gui.queue_redraw()
- # self.gui.show_all()
-
- def show_lockfile_message_dialog(self):
- proc = fn.get_pacman_process()
- message_dialog = MessageDialog(
- "Warning",
- "Blackbox cannot proceed pacman lockfile found",
- "Pacman cannot lock the db, a lockfile is found inside %s"
- % fn.pacman_lockfile,
- "Process running = %s" % proc,
- "warning",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- message_dialog.destroy()
-
- def recache_clicked(self, widget):
- fn.logger.info("Recache applications - start")
- fn.cache_btn()
-
- def on_package_search_clicked(self, widget):
- fn.logger.debug("Showing Package Search window")
- self.toggle_popover()
- package_search_win = PackageSearchWindow()
- package_search_win.show_all()
-
- # def on_arcolinux_iso_packages_clicked(self, widget):
- # fn.logger.debug("Showing ArcoLinux ISO Packages window")
- # arcolinux_iso_packages_window = ISOPackagesWindow()
- # arcolinux_iso_packages_window.show()
-
- def on_about_app_clicked(self, widget):
- fn.logger.debug("Showing About dialog")
- self.toggle_popover()
- about = AboutDialog()
- about.run()
- about.hide()
- about.destroy()
-
- def on_packages_export_clicked(self, widget):
- self.toggle_popover()
- dialog_packagelist = PackageListDialog()
- dialog_packagelist.show_all()
-
- def on_packages_import_clicked(self, widget):
- self.toggle_popover()
- try:
- if not os.path.exists(fn.pacman_lockfile):
- package_file = "%s/packages-x86_64.txt" % (fn.export_dir,)
- package_import_logfile = "%spackages-install-status-%s-%s.log" % (
- fn.log_dir,
- fn.datetime.today().date(),
- fn.datetime.today().time().strftime("%H-%M-%S"),
- )
- if os.path.exists(package_file):
- # check we have a valid file
- lines = None
- with open(package_file, encoding="utf-8", mode="r") as f:
- lines = f.readlines()
- if lines is not None:
- if (
- "# This file was auto-generated by the ArchLinux Tweak Tool on"
- in lines[0]
- or "# This file was auto-generated by Blackbox on"
- in lines[0]
- ):
- fn.logger.info("Package list file is valid")
- packages_list = []
- for line in lines:
- if not line.startswith("#"):
- packages_list.append(line.strip())
-
- if len(packages_list) > 0:
- dialog_package_import = PackagesImportDialog(
- package_file,
- packages_list,
- package_import_logfile,
- )
- dialog_package_import.show_all()
-
- else:
- message_dialog = MessageDialog(
- "Error",
- "Package file is not valid %s" % package_file,
- "Export a list of packages first using the Show Installed Packages button",
- "",
- "error",
- False,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- else:
- message_dialog = MessageDialog(
- "Warning",
- "Cannot locate export package file %s" % package_file,
- "Export a list of packages first using the Show Installed Packages button",
- "",
- "warning",
- False,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- else:
- message_dialog = MessageDialog(
- "Error",
- "Pacman lock file found %s" % fn.pacman_lockfile,
- "Cannot proceed, another pacman process is running",
- "",
- "error",
- False,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- except Exception as e:
- fn.logger.error("Exception in on_packages_import_clicked(): %s" % e)
-
- def toggle_popover(self):
- if self.popover.get_visible():
- self.popover.hide()
- else:
- self.popover.show_all()
-
- def on_settings_clicked(self, widget):
- self.toggle_popover()
-
- def snigdhaos_keyring_toggle(self, widget, data):
- # toggle is currently off, add keyring
- if widget.get_state() == False and widget.get_active() == True:
- fn.logger.info("Installing Snigdha OS keyring")
- install_keyring = fn.install_snigdhaos_keyring()
-
- if install_keyring == 0:
- fn.logger.info("Installation of Snigdha OS keyring = OK")
- rc = fn.add_snigdhaos_repos()
- if rc == 0:
- fn.logger.info("Snigdha OS repos added into %s" % fn.pacman_conf)
- widget.set_active(True)
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to update pacman conf",
- "Errors occurred during update of the pacman config file",
- rc,
- "error",
- True,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- widget.set_active(False)
- widget.set_state(False)
- return True
-
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to install Snigdha OS keyring",
- "Errors occurred during install of the Snigdha OS keyring",
- "Command run = %s\n\n Error = %s"
- % (install_keyring["cmd_str"], install_keyring["output"]),
- "error",
- True,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- widget.set_active(False)
- widget.set_state(False)
- return True
- # toggle is currently on
- if widget.get_state() == True and widget.get_active() == False:
- remove_keyring = fn.remove_snigdhaos_keyring()
-
- if remove_keyring == 0:
- fn.logger.info("Removing Snigdha OS keyring OK")
-
- rc = fn.remove_snigdhaos_repos()
- if rc == 0:
- fn.logger.info("Snigdha OS repos removed from %s" % fn.pacman_conf)
- widget.set_active(False)
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to update pacman conf",
- "Errors occurred during update of the pacman config file",
- rc,
- "error",
- True,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- widget.set_active(True)
- widget.set_state(True)
- return True
- else:
- fn.logger.error("Failed to remove Snigdha OS keyring")
- message_dialog = MessageDialog(
- "Error",
- "Failed to remove Snigdha OS keyring",
- "Errors occurred during removal of the Snigdha OS keyring",
- "Command run = %s\n\n Error = %s"
- % (remove_keyring["cmd_str"], remove_keyring["output"]),
- "error",
- True,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- widget.set_active(False)
- widget.set_state(False)
- return True
-
- def snigdhaos_mirrorlist_toggle(self, widget, data):
- # self.toggle_popover()
- # toggle is currently off
-
- if widget.get_state() == False and widget.get_active() == True:
- widget.set_active(True)
- widget.set_state(True)
-
- # before installing the mirrorlist make sure the pacman.conf file does not have any references to /etc/pacman.d/arcolinux-mirrorlist
- # otherwise the mirrorlist package will not install
- rc_remove = fn.remove_snigdhaos_repos()
- if rc_remove == 0:
- install_mirrorlist = fn.install_snigdhaos_mirrorlist()
-
- if install_mirrorlist == 0:
- fn.logger.info("Installation of Snigdha OS mirrorlist = OK")
-
- rc_add = fn.add_snigdhaos_repos()
- if rc_add == 0:
- fn.logger.info("Snigdha OS repos added into %s" % fn.pacman_conf)
- self.pacman_db_sync()
-
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to update pacman conf",
- "Errors occurred during update of the pacman config file",
- rc_add,
- "error",
- True,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- widget.set_active(False)
- widget.set_state(False)
-
- return True
-
- else:
- fn.logger.error("Failed to install Snigdha OS mirrorlist")
-
- message_dialog = MessageDialog(
- "Error",
- "Failed to install Snigdha OS mirrorlist",
- "Errors occurred during install of the Snigdha OS mirrorlist",
- "Command run = %s\n\n Error = %s"
- % (install_mirrorlist["cmd_str"], install_mirrorlist["output"]),
- "error",
- True,
- )
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- widget.set_active(False)
- widget.set_state(False)
-
- return True
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to update pacman conf",
- "Errors occurred during update of the pacman config file",
- rc,
- "error",
- True,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- widget.set_active(False)
- widget.set_state(False)
-
- return True
- # toggle is currently on
- if widget.get_state() == True and widget.get_active() == False:
- widget.set_active(False)
- widget.set_state(False)
-
- fn.logger.info("Removing Snigdha OS mirrorlist")
-
- remove_mirrorlist = fn.remove_snigdhaos_mirrorlist()
-
- if remove_mirrorlist == 0:
- fn.logger.info("Removing Snigdha OS mirrorlist OK")
-
- rc = fn.remove_snigdhaos_repos()
- if rc == 0:
- fn.logger.info("Snigdha OS repos removed from %s" % fn.pacman_conf)
- widget.set_active(False)
- else:
- message_dialog = MessageDialog(
- "Error",
- "Failed to update pacman conf",
- "Errors occurred during update of the pacman config file",
- rc,
- "error",
- True,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- widget.set_active(True)
- widget.set_state(True)
-
- return True
- else:
- fn.logger.error("Failed to remove Snigdha OS mirrorlist")
-
- message_dialog = MessageDialog(
- "Error",
- "Failed to remove Snigdha OS mirrorlist",
- "Errors occurred during removal of the Snigdha OS mirrorlist",
- "Command run = %s\n\n Error = %s"
- % (remove_mirrorlist["cmd_str"], remove_mirrorlist["output"]),
- "error",
- True,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- widget.set_active(True)
- widget.set_state(True)
-
- return True
-
- return True
-
- def version_toggle(self, widget, data):
- if widget.get_active() == True:
- fn.logger.debug("Showing package versions")
-
- self.display_versions = True
- GLib.idle_add(
- self.refresh_main_gui,
- priority=GLib.PRIORITY_DEFAULT,
- )
- else:
- fn.logger.debug("Hiding package versions")
- self.display_versions = False
- GLib.idle_add(
- self.refresh_main_gui,
- priority=GLib.PRIORITY_DEFAULT,
- )
-
- def refresh_main_gui(self):
- self.remove(self.vbox)
- GUI.setup_gui(self, Gtk, Gdk, GdkPixbuf, base_dir, os, Pango, None)
- self.show_all()
-
- def on_pacman_log_clicked(self, widget):
- try:
- self.toggle_popover()
-
- thread_addlog = "thread_addPacmanLogQueue"
- self.thread_add_pacmanlog_alive = fn.is_thread_alive(thread_addlog)
-
- if self.thread_add_pacmanlog_alive == False:
- fn.logger.info("Starting thread to monitor Pacman Log file")
-
- th_add_pacmanlog_queue = fn.threading.Thread(
- name=thread_addlog,
- target=fn.add_pacmanlog_queue,
- args=(self,),
- daemon=True,
- )
- th_add_pacmanlog_queue.start()
-
- if self.thread_add_pacmanlog_alive is True:
- # need to recreate the textview, can't use existing reference as it throws a seg fault
-
- self.textview_pacmanlog = Gtk.TextView()
- self.textview_pacmanlog.set_property("editable", False)
- self.textview_pacmanlog.set_property("monospace", True)
- self.textview_pacmanlog.set_border_width(10)
- self.textview_pacmanlog.set_vexpand(True)
- self.textview_pacmanlog.set_hexpand(True)
-
- # use the reference to the text buffer initialized before the logtimer thread started
- self.textview_pacmanlog.set_buffer(self.textbuffer_pacmanlog)
-
- window_pacmanlog = PacmanLogWindow(
- self.textview_pacmanlog,
- self.modelbtn_pacmanlog,
- )
- window_pacmanlog.show_all()
-
- self.start_logtimer = window_pacmanlog.start_logtimer
-
- else:
- # keep a handle on the textbuffer, this is needed again later, if the pacman log file dialog is closed
- # since the textbuffer will already hold textdata at that point
-
- # textview is used inside another thread to update as the pacmanlog file is read into memory
- self.textbuffer_pacmanlog = Gtk.TextBuffer()
-
- self.textview_pacmanlog = Gtk.TextView()
- self.textview_pacmanlog.set_property("editable", False)
- self.textview_pacmanlog.set_property("monospace", True)
- self.textview_pacmanlog.set_border_width(10)
- self.textview_pacmanlog.set_vexpand(True)
- self.textview_pacmanlog.set_hexpand(True)
-
- self.textview_pacmanlog.set_buffer(self.textbuffer_pacmanlog)
-
- window_pacmanlog = PacmanLogWindow(
- self.textview_pacmanlog,
- self.modelbtn_pacmanlog,
- )
- window_pacmanlog.show_all()
-
- thread_logtimer = "thread_startLogTimer"
- thread_logtimer_alive = False
-
- thread_logtimer_alive = fn.is_thread_alive(thread_logtimer)
-
- # a flag to indicate that the textview will need updating, used inside fn.start_log_timer
- self.start_logtimer = True
-
- if thread_logtimer_alive == False:
- th_logtimer = fn.threading.Thread(
- name=thread_logtimer,
- target=fn.start_log_timer,
- args=(self, window_pacmanlog),
- daemon=True,
- )
- th_logtimer.start()
-
- self.thread_add_pacmanlog_alive = True
- self.modelbtn_pacmanlog.set_sensitive(False)
-
- except Exception as e:
- fn.logger.error("Exception in on_pacman_log_clicked() : %s" % e)
-
- def package_progress_toggle(self, widget, data):
- if widget.get_active() is True:
- self.display_package_progress = True
- if widget.get_active() is False:
- self.display_package_progress = False
-
-def signal_handler(sig, frame):
- fn.logger.info("Blackbox is closing.")
- if os.path.exists("/tmp/blackbox.lock"):
- os.unlink("/tmp/blackbox.lock")
-
- if os.path.exists("/tmp/blackbox.pid"):
- os.unlink("/tmp/blackbox.pid")
- Gtk.main_quit(0)
-
-if __name__ == "__main__":
- try:
- signal.signal(signal.SIGINT, signal_handler)
-
- if not os.path.isfile("/tmp/blackbox.lock"):
- with open("/tmp/blackbox.pid", "w") as f:
- f.write(str(os.getpid()))
-
- style_provider = Gtk.CssProvider()
- style_provider.load_from_path(base_dir + "/blackbox.css")
-
- Gtk.StyleContext.add_provider_for_screen(
- Gdk.Screen.get_default(),
- style_provider,
- Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
- )
- w = Main()
- w.show_all()
-
- fn.logger.info("App Started")
-
- Gtk.main()
- else:
- fn.logger.info("Blackbox lock file found")
-
- md = Gtk.MessageDialog(
- parent=Main(),
- flags=0,
- message_type=Gtk.MessageType.INFO,
- buttons=Gtk.ButtonsType.YES_NO,
- text="Blackbox Lock File Found",
- )
- md.format_secondary_markup(
- "A Blackbox lock file has been found. This indicates there is already an instance of Blackbox running.\n\
- Click 'Yes' to remove the lock file and try running again"
- ) # noqa
-
- result = md.run()
- md.destroy()
-
- if result in (Gtk.ResponseType.OK, Gtk.ResponseType.YES):
- pid = ""
- if os.path.exists(fn.blackbox_pidfile):
- with open("/tmp/blackbox.pid", "r") as f:
- line = f.read()
- pid = line.rstrip().lstrip()
-
- if fn.check_if_process_running(int(pid)):
- # needs to be fixed - todo
-
- # md2 = Gtk.MessageDialog(
- # parent=Main,
- # flags=0,
- # message_type=Gtk.MessageType.INFO,
- # buttons=Gtk.ButtonsType.OK,
- # title="Application Running!",
- # text="You first need to close the existing application",
- # )
- # md2.format_secondary_markup(
- # "You first need to close the existing application"
- # )
- # md2.run()
- fn.logger.info(
- "You first need to close the existing application"
- )
- else:
- os.unlink("/tmp/blackbox.lock")
- sys.exit(1)
- else:
- # in the rare event that the lock file is present, but the pid isn't
- os.unlink("/tmp/blackbox.lock")
- sys.exit(1)
- else:
- sys.exit(1)
- except Exception as e:
- fn.logger.error("Exception in __main__: %s" % e)
diff --git a/usr/share/blackbox/defaults/blackbox.yaml b/usr/share/blackbox/defaults/blackbox.yaml
deleted file mode 100644
index 7917fa0..0000000
--- a/usr/share/blackbox/defaults/blackbox.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- name: "Display Package Versions"
- description: "Show package version labels alongside the package description "
- enabled: False
-
-- name: "Display Package Progress"
- description: "Show the package install/uninstall progress window "
- enabled: False
-
-- name: "Debug Loggings"
- description: "Enable debug logging for more verbose app logging "
- enabled: False
\ No newline at end of file
diff --git a/usr/share/blackbox/images/blackbox.png b/usr/share/blackbox/images/blackbox.png
deleted file mode 100644
index 910da9b..0000000
Binary files a/usr/share/blackbox/images/blackbox.png and /dev/null differ
diff --git a/usr/share/blackbox/images/panel.png b/usr/share/blackbox/images/panel.png
deleted file mode 100644
index 564b434..0000000
Binary files a/usr/share/blackbox/images/panel.png and /dev/null differ
diff --git a/usr/share/blackbox/images/splash.png b/usr/share/blackbox/images/splash.png
deleted file mode 100644
index 910da9b..0000000
Binary files a/usr/share/blackbox/images/splash.png and /dev/null differ
diff --git a/usr/share/blackbox/scripts/get-keys.sh b/usr/share/blackbox/scripts/get-keys.sh
deleted file mode 100644
index c438af6..0000000
--- a/usr/share/blackbox/scripts/get-keys.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-
-# Install 'Wget' via pacman
-sudo pacman -S wget --noconfirm --needed
-
-URL_KEYRING=""
-PACKAGE_FILE=""
-echo
-echo "Downloading Snigdha OS Keyring..."
-echo
-
-sudo wget "$URL_KEYRING" -O /tmp/$PACKAGE_FILE
-
-# Installing File Locally
-sudo pacman -U --noconfirm --needed /tmp/$PACKAGE_FILE
-
-if grep -q snigdhaos- /etc/pacman.conf; then
- echo
- echo "Snigdha OS Repository/Mirrorlist already installed!"
- echo
-else
- echo '
- [snigdhaos-core]
- SigLevel = Never
- Include = /etc/pacman.d/snigdhaos-mirrorlist
-
- [snigdhaos-extra]
- SigLevel = Never
- Include = /etc/pacman.d/snigdhaos-mirrorlist' |
- sudo tee --append /etc/pacman.conf
-fi
-
-echo
-echo "Finished! Now Synchronize DB..."
-echo
diff --git a/usr/share/blackbox/ui/AboutDialog.py b/usr/share/blackbox/ui/AboutDialog.py
deleted file mode 100644
index 788ac5c..0000000
--- a/usr/share/blackbox/ui/AboutDialog.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/bin/python
-
-# This class stores static information about the app, and is displayed in the about dialog
-
-import os
-
-import gi
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-
-class AboutDialog(Gtk.Dialog):
- def __init__(self):
- Gtk.Dialog.__init__(self)
-
- app_name = "Blackbox"
- app_title = "About Blackbox"
- app_main_description = "%s - %s" % (app_name, "Software Installer Remover")
- app_secondary_message = "Install or remove software"
- app_secondary_description = "Report issues to make it even better"
- app_version = "pkgversion-pkgrelease"
- app_discord = "#"
- app_website = "https://snigdhaos.org"
- app_github = "https://github.com/Snigdha-OS/snigdhaos-blackbox"
- app_authors = []
- app_authors.append(("Cameron Percival", None))
- app_authors.append(("Fennec", None))
- app_authors.append(("Erik Dubois", None))
-
- pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
- os.path.join(base_dir, "images/blackbox.png"), 100, 100
- )
- app_image = Gtk.Image().new_from_pixbuf(pixbuf)
-
- self.set_resizable(False)
- self.set_size_request(560, 350)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
- self.set_border_width(10)
-
- headerbar = Gtk.HeaderBar()
- headerbar.set_show_close_button(True)
- headerbar.set_title(app_title)
- self.set_titlebar(headerbar)
-
- btn_about_close = Gtk.Button(label="OK")
- btn_about_close.connect("clicked", self.on_response, "response")
-
- stack = Gtk.Stack()
- stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
- stack.set_transition_duration(350)
- stack.set_hhomogeneous(False)
- stack.set_vhomogeneous(False)
-
- stack_switcher = Gtk.StackSwitcher()
- stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
- stack_switcher.set_stack(stack)
- stack_switcher.set_homogeneous(True)
-
- lbl_main_description = Gtk.Label(xalign=0, yalign=0)
- lbl_main_description.set_markup(
- " %s" % app_main_description
- )
-
- lbl_secondary_message = Gtk.Label(xalign=0, yalign=0)
- lbl_secondary_message.set_text(
- " %s" % app_secondary_message
- )
-
- lbl_secondary_description = Gtk.Label(xalign=0, yalign=0)
- lbl_secondary_description.set_text(
- " %s" % app_secondary_description
- )
-
- lbl_version = Gtk.Label(xalign=0, yalign=0)
- lbl_version.set_markup(
- " Version: %s" % app_version
- )
-
- ivbox_about = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
- ivbox_about.pack_start(app_image, True, True, 0)
- ivbox_about.pack_start(lbl_main_description, True, True, 0)
- ivbox_about.pack_start(lbl_version, True, True, 0)
- ivbox_about.pack_start(lbl_secondary_message, True, True, 0)
- ivbox_about.pack_start(lbl_secondary_description, True, True, 0)
-
- stack.add_titled(ivbox_about, "About BlackBox", "About")
-
- grid_support = Gtk.Grid()
-
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text(" ")
-
- grid_support.attach(lbl_padding1, 0, 1, 1, 1)
-
- lbl_support_title = Gtk.Label(xalign=0, yalign=0)
- lbl_support_title.set_markup("Discord ")
-
- lbl_support_value = Gtk.Label(xalign=0, yalign=0)
- lbl_support_value.set_markup("%s" % (app_discord, app_discord))
-
- lbl_website_title = Gtk.Label(xalign=0, yalign=0)
- lbl_website_title.set_markup("ArcoLinux website ")
-
- lbl_website_value = Gtk.Label(xalign=0, yalign=0)
- lbl_website_value.set_markup("%s" % (app_website, app_website))
-
- lbl_github_title = Gtk.Label(xalign=0, yalign=0)
- lbl_github_title.set_markup("GitHub ")
-
- lbl_github_value = Gtk.Label(xalign=0, yalign=0)
- lbl_github_value.set_markup("%s" % (app_github, app_github))
-
- grid_support.attach(lbl_support_title, 0, 2, 1, 1)
-
- grid_support.attach_next_to(
- lbl_support_value, lbl_support_title, Gtk.PositionType.RIGHT, 20, 1
- )
-
- grid_support.attach(lbl_website_title, 0, 3, 1, 1)
- grid_support.attach_next_to(
- lbl_website_value, lbl_website_title, Gtk.PositionType.RIGHT, 20, 1
- )
-
- grid_support.attach(lbl_github_title, 0, 4, 1, 1)
- grid_support.attach_next_to(
- lbl_github_value, lbl_github_title, Gtk.PositionType.RIGHT, 20, 1
- )
-
- stack.add_titled(grid_support, "Support", "Support")
-
- box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
- box_outer.set_border_width(10)
-
- lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding2.set_text(" ")
-
- lbl_padding3 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding3.set_text(" ")
-
- lbl_authors_title = Gtk.Label(xalign=0, yalign=0)
- lbl_authors_title.set_text(
- "The following people have contributed to the development of %s" % app_name
- )
-
- listbox = Gtk.ListBox()
- listbox.set_selection_mode(Gtk.SelectionMode.NONE)
-
- box_outer.pack_start(lbl_authors_title, True, True, 0)
- box_outer.pack_start(listbox, True, True, 0)
-
- treestore_authors = Gtk.TreeStore(str, str)
- for item in app_authors:
- treestore_authors.append(None, list(item))
-
- treeview_authors = Gtk.TreeView(model=treestore_authors)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn(None, renderer, text=0)
-
- treeview_authors.append_column(column)
-
- path = Gtk.TreePath.new_from_indices([0])
-
- selection = treeview_authors.get_selection()
-
- selection.select_path(path)
-
- treeview_authors.expand_all()
- treeview_authors.columns_autosize()
-
- row_authors = Gtk.ListBoxRow()
- vbox_authors = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- row_authors.add(vbox_authors)
-
- vbox_authors.pack_start(treeview_authors, True, True, 0)
-
- listbox.add(row_authors)
-
- stack.add_titled(box_outer, "Authors", "Authors")
-
- self.connect("response", self.on_response)
-
- self.vbox.add(stack_switcher)
- self.vbox.add(stack)
-
- self.show_all()
-
- def on_response(self, dialog, response):
- self.hide()
- self.destroy()
diff --git a/usr/share/blackbox/ui/AppFrameGUI.py b/usr/share/blackbox/ui/AppFrameGUI.py
deleted file mode 100644
index 0a00c4a..0000000
--- a/usr/share/blackbox/ui/AppFrameGUI.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/bin/python
-
-from socket import TIPC_ADDR_NAME
-from urllib.parse import scheme_chars
-import Functions as fn
-
-class AppFrameGUI:
- def build_ui_frame(self, Gtk, vbox_stack, category, packages_list):
- try:
- # Lets set some variables that we know we will need later
- # hboxes and items to make the page look sensible
- cat_name = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- seperator = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- lbl1 = Gtk.Label(xalign=0)
- lbl1.set_text(category)
- lbl1.set_name("title")
- hseparator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
- seperator.pack_start(hseparator, True, True, 0)
- cat_name.pack_start(lbl1, False, False, 0)
-
- # Stack for the different subcategories - I like crossfade as a transition, but you choose
- stack = Gtk.Stack()
- stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
- stack.set_transition_duration(350)
- stack.set_hhomogeneous(False)
- stack.set_vhomogeneous(False)
-
- # Stack needs a stack switcher to allow the user to make different choices
- stack_switcher = Gtk.StackSwitcher()
- stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
- stack_switcher.set_stack(stack)
- stack_switcher.set_homogeneous(True)
-
- # We will need a vbox later for storing the stack and stack switcher together at the end
- vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
-
- # create scroller for when/if these items go "off the page"
- scrolled_switch = Gtk.ScrolledWindow()
- scrolled_switch.add(stack_switcher)
-
- # These lists will ensure that we can keep track of the individual windows and their names
- # stack of vboxes
- vbox_stacks = []
- # name of each vbox - derived from the sub category name
- vbox_stacknames = []
- sep_text = " "
- subcats = {}
- # index for the grid
- index = 0
-
- """
- Store a list of unique sub-categories
- e.g.
- category --> applications
- sub category --> Accessories
- sub category --> Conky
- """
- sub_catlabels = []
- # store unique subcategory names into a dictionary
- for package in packages_list:
- subcats[package.subcategory] = package
- # we now iterate across the dictionary keys
- # each Stack has an associated subcategory
- for subcat in subcats.keys():
- vbox_stacks.append(
- Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- )
- # for the sub-cat page title
- sub_catlabels.append(Gtk.Label(xalign=0))
-
- vbox_stacknames.append(subcat)
- # iterate across a list of packages
- for package in packages_list:
- if package.subcategory == subcat:
- page = vbox_stacks.pop()
-
- if len(sub_catlabels) > 0:
- lbl_title = sub_catlabels.pop()
- lbl_desc = Gtk.Label(xalign=0)
- lbl_desc.set_markup(
- "Description: "
- + package.subcategory_description
- + ""
- )
- lbl_title.set_markup("" + package.subcategory + "")
-
- lbl_padding_page1 = Gtk.Label(xalign=0)
- lbl_padding_page1.set_text("")
-
- page.pack_start(lbl_title, False, False, 0)
- page.pack_start(lbl_desc, False, False, 0)
- page.pack_start(lbl_padding_page1, False, False, 0)
-
- grid = Gtk.Grid()
- grid.insert_row(index)
-
- lbl_sep1 = Gtk.Label(xalign=0, yalign=0)
- lbl_sep1.set_text(sep_text)
- grid.attach(lbl_sep1, 0, index, 1, 1)
- lbl_package = Gtk.Label(xalign=0, yalign=0) # was in for loop
-
- lbl_package.set_markup("%s" % package.name)
-
- ###### switch widget starts ######
-
- # construct new switch
- switch = Gtk.Switch()
- switch.set_valign(Gtk.Align.CENTER)
-
- """
- Changed to use signal state-set for switch widget.
- set_state(boolean) allows the switch state to be enabled/disabled.
- When a pkg install/uninstall fails, the switch widget is enabled/disabled inside a thread.
-
- Changing the switch using set_active(bool), and using the signal notify::active
- caused a never-ending loop which would call app_toggle.
- """
- switch.set_state(fn.query_pkg(package.name))
- switch.connect(
- "state-set",
- self.app_toggle,
- package,
- )
-
- # add switch widget to grid
- # attach_next_to(child, sibling, side, width, height)
-
- grid.attach_next_to(
- switch, lbl_sep1, Gtk.PositionType.LEFT, 1, 1
- )
-
- # add space seperator next to switch
- lbl_sep_switch = Gtk.Label(xalign=0, yalign=0)
- lbl_sep_switch.set_text(sep_text)
-
- grid.attach_next_to(
- lbl_sep_switch, switch, Gtk.PositionType.LEFT, 1, 1
- )
-
- ###### switch widget ends ######
- ###### pkg name label widget starts ######
-
- lbl_sep_package1 = Gtk.Label(xalign=0, yalign=0)
- lbl_sep_package1.set_text(sep_text)
-
- # add space seperator next to switch for extra padding
-
- grid.attach_next_to(
- lbl_sep_package1, switch, Gtk.PositionType.RIGHT, 1, 1
- )
-
- lbl_sep_package2 = Gtk.Label(xalign=0, yalign=0)
- lbl_sep_package2.set_text(sep_text)
-
- # add pkg name label widget to grid
-
- grid.attach_next_to(
- lbl_package, lbl_sep_package1, Gtk.PositionType.RIGHT, 1, 1
- )
-
- ###### pkg name label widget ends
-
- ###### pkg desc label widget starts ######
-
- lbl_sep_package_desc = Gtk.Label(xalign=0, yalign=0)
- lbl_sep_package_desc.set_text(sep_text)
-
- # add space seperator next to pkg name for extra padding
-
- grid.attach_next_to(
- lbl_sep_package_desc,
- lbl_package,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- lbl_package_desc = Gtk.Label(xalign=0, yalign=0)
- lbl_package_desc.set_text(package.description)
-
- # add pkg desc label widget to grid
-
- grid.attach_next_to(
- lbl_package_desc,
- lbl_sep_package_desc,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- ###### pkg desc label widget ends
-
- ##### add pkg version label widget starts #####
-
- if self.display_versions is True:
- lbl_package_version = Gtk.Label(xalign=0, yalign=0)
- lbl_package_version.set_text(package.version)
- lbl_package_version.set_name("lbl_package_version")
-
- lbl_sep_package_version = Gtk.Label(xalign=0, yalign=0)
- lbl_sep_package_version.set_text(sep_text)
-
- grid.attach_next_to(
- lbl_sep_package_version,
- lbl_package_desc,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid.attach_next_to(
- lbl_package_version,
- lbl_sep_package_version,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- ##### pkg version ends #####
-
- # make the page scrollable
- grid_sc = Gtk.ScrolledWindow()
-
- # hide the horizontal scrollbar showing on each grid row if the window width is resized
- grid_sc.set_policy(
- Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC
- )
- grid_sc.add(grid)
-
- grid_sc.set_propagate_natural_height(True)
- # pack the grid to the page.
-
- page.pack_start(grid_sc, True, True, 0)
- # save the page - put it back (now populated)
-
- """
- UI note.
- To remove the extra padding around the switch buttons
- Comment out the references to grid_sc
- Then just have page.pack_start(grid,True, True, 0)
- """
- vbox_stacks.append(page)
-
- # reset the things that we need to.
- # packages.clear()
- grid = Gtk.Grid()
-
- index += 1
-
- # Now we pack the stack
- item_num = 0
-
- for item in vbox_stacks:
- stack.add_titled(
- item,
- "stack" + str(item_num),
- vbox_stacknames[item_num],
- )
- item_num += 1
-
- # Place the stack switcher and the stack together into a vbox
- vbox.pack_start(scrolled_switch, False, False, 0)
-
- scrolled_window = Gtk.ScrolledWindow()
- scrolled_window.set_propagate_natural_height(True)
- scrolled_window.add(stack)
- vbox.pack_start(scrolled_window, True, True, 0)
-
- # Stuff the vbox with the title and seperator to create the page
- vbox_stack.pack_start(cat_name, False, False, 0)
- vbox_stack.pack_start(seperator, False, False, 0)
- vbox_stack.pack_start(vbox, False, False, 0)
-
- except Exception as e:
- fn.logger.error("Exception in App_Frame_GUI.GUI(): %s" % e)
-
diff --git a/usr/share/blackbox/ui/GUI.py b/usr/share/blackbox/ui/GUI.py
deleted file mode 100644
index ddb9bf7..0000000
--- a/usr/share/blackbox/ui/GUI.py
+++ /dev/null
@@ -1,691 +0,0 @@
-#!/bin/python
-
-import Functions as fn
-from ui.AppFrameGUI import AppFrameGUI
-from multiprocessing import cpu_count
-from queue import Queue
-from threading import Thread
-
-import gi
-gi.require_version("Gtk", "3.0")
-from gi.repository import Pango
-
-base_dir = fn.os.path.abspath(fn.os.path.join(fn.os.path.dirname(__file__), ".."))
-
-class GUI_Worker(Thread):
- def __init__(self, queue):
- Thread.__init__(self)
- self.queue = queue
-
- def run(self):
- while True:
- # pull what we need from the queue so we can process properly.
- items = self.queue.get()
- try:
- # make sure we have the required number of items on the queue
- if items is not None:
- self, Gtk, vbox_stack, category, packages = items
- AppFrameGUI.build_ui_frame(
- self,
- Gtk,
- vbox_stack,
- category,
- packages,
- )
-
- except Exception as e:
- fn.logger.error("Exception on run(): %s" % e)
- finally:
- if items is None:
- fn.logger.debug("Stopping GUI Worker thread")
- self.queue.task_done()
- return False
- self.queue.task_done()
-
-class GUI:
- def setup_gui_search(
- self,
- Gtk,
- Gdk,
- GdkPixbuf,
- base_dir,
- os,
- Pango,
- search_results,
- search_term,
- settings,
- ):
- try:
- # remove previous vbox
- if self.search_activated == False:
- self.remove(self.vbox)
- else:
- self.remove(self.vbox_search)
-
- # lets quickly create the latest installed list.
- fn.get_current_installed()
-
- setup_headerbar(self, Gtk, settings)
-
- hbox0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
-
- self.notification_revealer = Gtk.Revealer()
- self.notification_revealer.set_reveal_child(False)
-
- self.notification_label = Gtk.Label()
-
- pb_panel = GdkPixbuf.Pixbuf().new_from_file(base_dir + "/images/panel.png")
- panel = Gtk.Image().new_from_pixbuf(pb_panel)
-
- overlay_frame = Gtk.Overlay()
- overlay_frame.add(panel)
- overlay_frame.add_overlay(self.notification_label)
-
- self.notification_revealer.add(overlay_frame)
-
- hbox0.pack_start(self.notification_revealer, True, False, 0)
-
- # ==========================================================
- # CONTAINER
- # ==========================================================
-
- self.vbox_search = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
- vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
- hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
-
- self.vbox_search.pack_start(hbox, True, True, 0)
- self.add(self.vbox_search)
-
- # ==========================================================
- # PREP WORK
- # ==========================================================
-
-
-
- # ==========================================================
- # GENERATE STACK
- # ==========================================================
- stack = Gtk.Stack()
- # stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
- stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
- stack.set_transition_duration(350)
-
- vbox_stack = []
- stack_item = 0
-
- # Max Threads
- """
- Fatal Python error: Segmentation fault
- This error happens randomly, due to the for loop iteration on the cpu_count
- old code: for x in range(cpu_count()):
- """
-
- # spawn only 1 GUI_Worker threads, as any number greater causes a Segmentation fault
-
- search_worker = GUI_Worker(self.queue)
- search_worker.name = "thread_GUI_search_worker"
- # Set the worker to be True to allow processing, and avoid Blocking
- # search_worker.daemon = True
- search_worker.start()
-
- # This code section might look a little weird. It is because it was
- # derived from another function before this version was required.
-
- for category in search_results:
- # NOTE: IF the yaml file name standard changes, be sure to update this, or weirdness will follow.
-
- # subcategory = search_results[category][0].subcategory
- vbox_stack.append(
- Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
- )
- stack.add_titled(
- vbox_stack[stack_item],
- str("stack" + str(len(vbox_stack))),
- category,
- )
-
- # subcategory_desc = search_results[category][0].subcategory_description
- search_res_lst = search_results[category]
-
- # Multithreading!
-
- self.queue.put(
- (
- self,
- Gtk,
- vbox_stack[stack_item],
- category,
- search_res_lst,
- )
- )
-
- stack_item += 1
-
- # send a signal that no further items are to be put on the queue
- self.queue.put(None)
- # safety to ensure that we finish threading before we continue on.
- self.queue.join()
- fn.logger.debug("GUI Worker thread completed")
-
- stack_switcher = Gtk.StackSidebar()
- stack_switcher.set_name("sidebar")
- stack_switcher.set_stack(stack)
-
- # =====================================================
- # LOGO
- # =====================================================
-
- ivbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
- pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
- os.path.join(base_dir, "images/blackbox.png"), 45, 45
- )
- image = Gtk.Image().new_from_pixbuf(pixbuf)
-
- # remove the focus on startup from search entry
- ivbox.set_property("can-focus", True)
- Gtk.Window.grab_focus(ivbox)
-
- # =====================================================
- # RECACHE BUTTON
- # =====================================================
-
- btn_recache = Gtk.Button(label="Recache Applications")
- btn_recache.connect("clicked", self.recache_clicked)
-
- # =====================================================
- # QUIT BUTTON
- # =====================================================
-
- btn_quit_app = Gtk.Button(label="Quit")
- btn_quit_app.set_size_request(100, 30)
- btn_quit_app.connect("clicked", self.on_close, "delete-event")
- btn_context = btn_quit_app.get_style_context()
- btn_context.add_class("destructive-action")
-
- # =====================================================
- # SEARCH BOX
- # =====================================================
-
- self.searchentry = Gtk.SearchEntry()
- self.searchentry.set_text(search_term)
- self.searchentry.connect("activate", self.on_search_activated)
- self.searchentry.connect("icon-release", self.on_search_cleared)
-
- iv_searchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
-
- # =====================================================
- # PACKS
- # =====================================================
-
- # hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
- # hbox2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
- # hbox3 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
-
- # hbox3.pack_start(btnReCache, False, False, 0)
-
- iv_searchbox.pack_start(self.searchentry, False, False, 0)
-
- ivbox.pack_start(image, False, False, 0)
- ivbox.pack_start(iv_searchbox, False, False, 0)
- ivbox.pack_start(stack_switcher, True, True, 0)
-
- ivbox.pack_start(btn_quit_app, False, False, 0)
-
- vbox1.pack_start(hbox0, False, False, 0)
- vbox1.pack_start(stack, True, True, 0)
-
- hbox.pack_start(ivbox, False, True, 0)
- hbox.pack_start(vbox1, True, True, 0)
-
- stack.set_hhomogeneous(False)
- stack.set_vhomogeneous(False)
-
- self.show_all()
-
- except Exception as err:
- fn.logger.error("Exception in GUISearch(): %s" % err)
-
- def setup_gui(self, Gtk, Gdk, GdkPixbuf, base_dir, os, Pango, settings): # noqa
- try:
- # reset back to main box
- if self.search_activated:
- # remove the search vbox
- self.remove(self.vbox_search)
- self.show_all()
-
- # lets quickly create the latest installed list.
- fn.get_current_installed()
-
- # =======================================================
- # HeaderBar
- # =======================================================
-
- setup_headerbar(self, Gtk, settings)
-
- # =======================================================
- # App Notifications
- # =======================================================
-
- hbox0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
-
- self.notification_revealer = Gtk.Revealer()
- self.notification_revealer.set_reveal_child(False)
-
- self.notification_label = Gtk.Label()
-
- pb_panel = GdkPixbuf.Pixbuf().new_from_file(base_dir + "/images/panel.png")
- panel = Gtk.Image().new_from_pixbuf(pb_panel)
-
- overlay_frame = Gtk.Overlay()
- overlay_frame.add(panel)
- overlay_frame.add_overlay(self.notification_label)
-
- self.notification_revealer.add(overlay_frame)
-
- hbox0.pack_start(self.notification_revealer, True, False, 0)
-
- # ==========================================================
- # CONTAINER
- # ==========================================================
-
- self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
- vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
- hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
-
- self.vbox.pack_start(hbox, True, True, 0)
- self.add(self.vbox)
-
- # ==========================================================
- # PREP WORK
- # ==========================================================
-
- # This section sets up the tabs, and the array for dealing with the tab content
- """
- yaml_files_unsorted = []
- path = base_dir + "/yaml/"
- for file in os.listdir(path):
- if file.endswith(".yaml"):
- yaml_files_unsorted.append(file)
- else:
- print(
- "Unsupported configuration file type. Please contact Snigdha OS Support."
- )
- # Need to sort the list (Or do we? I choose to)
- yaml_files = sorted(yaml_files_unsorted)
- """
-
- # Check github for updated files
- # fn.check_github(yaml_files)
- # ==========================================================
- # GENERATE STACK
- # ==========================================================
- stack = Gtk.Stack()
- # stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
- stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
- stack.set_transition_duration(350)
-
- vbox_stack = []
- stack_item = 0
-
- # Max Threads
- """
- Fatal Python error: Segmentation fault
- This error happens randomly, due to the for loop iteration on the cpu_count
- old code: for x in range(cpu_count()):
- """
-
- # spawn only 1 GUI_Worker threads, as any number greater causes a Segmentation fault
-
- worker = GUI_Worker(self.queue)
- worker.name = "thread_GUI_Worker"
- # Set the worker to be True to allow processing, and avoid Blocking
- # worker.daemon = True
- worker.start()
-
- for category in self.packages:
- # NOTE: IF the yaml file name standard changes, be sure to update this, or weirdness will follow.
-
- # this is the side stack listing all categories
- vbox_stack.append(
- Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
- )
- stack.add_titled(
- vbox_stack[stack_item],
- str("stack" + str(len(vbox_stack))),
- category,
- )
-
- packages_lst = self.packages[category]
-
- # Multithreading!
- self.queue.put(
- (
- self,
- Gtk,
- vbox_stack[stack_item],
- category,
- packages_lst,
- )
- )
- stack_item += 1
-
- # send a signal that no further items are to be put on the queue
- self.queue.put(None)
- # safety to ensure that we finish threading before we continue on.
-
- self.queue.join()
- fn.logger.debug("GUI Worker thread completed")
-
- stack_switcher = Gtk.StackSidebar()
- stack_switcher.set_name("sidebar")
- stack_switcher.set_stack(stack)
-
- # =====================================================
- # LOGO
- # =====================================================
-
- ivbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
- pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
- os.path.join(base_dir, "images/blackbox.png"), 45, 45
- )
- image = Gtk.Image().new_from_pixbuf(pixbuf)
-
- # remove the focus on startup from search entry
- ivbox.set_property("can-focus", True)
- Gtk.Window.grab_focus(ivbox)
-
- # =====================================================
- # RECACHE BUTTON
- # =====================================================
-
- # btnReCache = Gtk.Button(label="Recache Applications")
- # btnReCache.connect("clicked", self.recache_clicked)
- # btnReCache.set_property("has-tooltip", True)
- # btnReCache.connect("query-tooltip", self.tooltip_callback,
- # "Refresh the application cache")
-
- # =====================================================
- # REPOS
- # =====================================================
-
- # =====================================================
- # QUIT BUTTON
- # =====================================================
- btn_quit_app = Gtk.Button(label="Quit")
- btn_quit_app.set_size_request(100, 30)
- btn_quit_app.connect("clicked", self.on_close, "delete-event")
- btn_context = btn_quit_app.get_style_context()
- btn_context.add_class("destructive-action")
- # =====================================================
- # SEARCH BOX
- # =====================================================
- self.searchentry = Gtk.SearchEntry()
- self.searchentry.set_placeholder_text("Search...")
- self.searchentry.connect("activate", self.on_search_activated)
- self.searchentry.connect("icon-release", self.on_search_cleared)
-
- ivsearchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
-
- ivsearchbox.pack_start(self.searchentry, False, False, 0)
-
- ivbox.pack_start(image, False, False, 0)
- ivbox.pack_start(ivsearchbox, False, False, 0)
- ivbox.pack_start(stack_switcher, True, True, 0)
- ivbox.pack_start(btn_quit_app, False, False, 0)
-
- vbox1.pack_start(hbox0, False, False, 0)
- vbox1.pack_start(stack, True, True, 0)
-
- hbox.pack_start(ivbox, False, True, 0)
- hbox.pack_start(vbox1, True, True, 0)
-
- stack.set_hhomogeneous(False)
- stack.set_vhomogeneous(False)
-
- if self.search_activated:
- self.show_all()
-
- except Exception as e:
- fn.logger.error("Exception in GUI(): %s" % e)
-
-
-# setup headerbar including popover settings
-def setup_headerbar(self, Gtk, settings):
- try:
- header_bar_title = "BlackBox"
- headerbar = Gtk.HeaderBar()
- headerbar.set_title(header_bar_title)
- headerbar.set_show_close_button(True)
-
- self.set_titlebar(headerbar)
-
- toolbutton = Gtk.ToolButton()
- # icon-name open-menu-symbolic / open-menu-symbolic.symbolic
- toolbutton.set_icon_name("open-menu-symbolic")
-
- toolbutton.connect("clicked", self.on_settings_clicked)
-
- headerbar.pack_end(toolbutton)
-
- self.popover = Gtk.Popover()
- self.popover.set_relative_to(toolbutton)
-
- vbox = Gtk.Box(spacing=0, orientation=Gtk.Orientation.VERTICAL)
- vbox.set_border_width(15)
-
- # switches
-
- # switch to display package versions
- self.switch_package_version = Gtk.Switch()
-
- if settings != None:
- if settings["Display Package Versions"]:
- self.display_versions = settings["Display Package Versions"]
-
- if self.display_versions == True:
- self.switch_package_version.set_active(True)
- else:
- self.switch_package_version.set_active(False)
-
- self.switch_package_version.connect("notify::active", self.version_toggle)
-
- # switch to import arcolinux keyring
- self.switch_snigdhaos_keyring = Gtk.Switch()
-
- if (
- fn.check_package_installed("snigdhaos-keyring") is False
- or fn.verify_snigdhaos_pacman_conf() is False
- ):
- self.switch_snigdhaos_keyring.set_state(False)
-
- else:
- self.switch_snigdhaos_keyring.set_state(True)
-
- self.switch_snigdhaos_keyring.connect("state-set", self.snigdhaos_keyring_toggle)
-
- # switch to import arcolinix mirrorlist
- self.switch_snigdhaos_mirrorlist = Gtk.Switch()
-
- if (
- fn.check_package_installed("snigdhaos-mirrorlist") is False
- or fn.verify_snigdhaos_pacman_conf() is False
- ):
- self.switch_snigdhaos_mirrorlist.set_state(False)
-
- else:
- self.switch_snigdhaos_mirrorlist.set_state(True)
-
- self.switch_snigdhaos_mirrorlist.connect("state-set", self.snigdhaos_mirrorlist_toggle)
-
- # switch to display package progress window
- self.switch_package_progress = Gtk.Switch()
-
- if settings != None:
- if settings["Display Package Progress"]:
- self.display_package_progress = settings["Display Package Progress"]
-
- if self.display_package_progress == True:
- self.switch_package_progress.set_active(True)
- else:
- self.switch_package_progress.set_active(False)
- self.switch_package_progress.connect(
- "notify::active", self.package_progress_toggle
- )
-
- # modalbuttons
-
- # button to open the pacman log monitoring dialog
- self.modelbtn_pacmanlog = Gtk.ModelButton()
- self.modelbtn_pacmanlog.connect("clicked", self.on_pacman_log_clicked)
- self.modelbtn_pacmanlog.set_name("modelbtn_popover")
- self.modelbtn_pacmanlog.props.centered = False
- self.modelbtn_pacmanlog.props.text = "Open Pacman Log File"
-
- # button to display installed packages window
- modelbtn_packages_export = Gtk.ModelButton()
- modelbtn_packages_export.connect("clicked", self.on_packages_export_clicked)
- modelbtn_packages_export.set_name("modelbtn_popover")
- modelbtn_packages_export.props.centered = False
- modelbtn_packages_export.props.text = "Show Installed Packages"
-
- # button to display import packages window
- modelbtn_packages_import = Gtk.ModelButton()
- modelbtn_packages_import.connect("clicked", self.on_packages_import_clicked)
- modelbtn_packages_import.set_name("modelbtn_popover")
- modelbtn_packages_import.props.centered = False
- modelbtn_packages_import.props.text = "Import Packages"
-
- # button to show about dialog
- modelbtn_about_app = Gtk.ModelButton()
- modelbtn_about_app.connect("clicked", self.on_about_app_clicked)
- modelbtn_about_app.set_name("modelbtn_popover")
- modelbtn_about_app.props.centered = False
- modelbtn_about_app.props.text = "About BlackBox"
-
- # button to show iso package lists window
- # modelbtn_iso_packages_list = Gtk.ModelButton()
- # modelbtn_iso_packages_list.connect(
- # "clicked", self.on_arcolinux_iso_packages_clicked
- # )
- # modelbtn_iso_packages_list.set_name("modelbtn_popover")
- # modelbtn_iso_packages_list.props.centered = False
- # modelbtn_iso_packages_list.props.text = "Explore ArcoLinux ISO Packages"
-
- # button to show package search window
- modelbtn_package_search = Gtk.ModelButton()
- modelbtn_package_search.connect("clicked", self.on_package_search_clicked)
- modelbtn_package_search.set_name("modelbtn_popover")
- modelbtn_package_search.props.centered = False
- modelbtn_package_search.props.text = "Open Package Search"
-
- # grid for the switch options
- grid_switches = Gtk.Grid()
- grid_switches.set_row_homogeneous(True)
-
- lbl_package_version = Gtk.Label(xalign=0)
- lbl_package_version.set_text("Display Package Versions")
-
- lbl_package_version_padding = Gtk.Label(xalign=0)
- lbl_package_version_padding.set_text(" ")
-
- lbl_package_progress = Gtk.Label(xalign=0)
- lbl_package_progress.set_text("Display Package Progress")
-
- lbl_package_progress_padding = Gtk.Label(xalign=0)
- lbl_package_progress_padding.set_text(" ")
-
- lbl_snigdhaos_keyring = Gtk.Label(xalign=0)
- lbl_snigdhaos_keyring.set_text("Import Snigdha OS Keyring")
-
- lbl_snigdhaos_keyring_padding = Gtk.Label(xalign=0)
- lbl_snigdhaos_keyring_padding.set_text(" ")
-
- lbl_snigdhaos_mirrorlist = Gtk.Label(xalign=0)
- lbl_snigdhaos_mirrorlist.set_text("Import Snigdha OS Mirrorlist")
-
- lbl_snigdhaos_mirrorlist_padding = Gtk.Label(xalign=0)
- lbl_snigdhaos_mirrorlist_padding.set_text(" ")
-
- grid_switches.attach(lbl_package_version, 0, 1, 1, 1)
- grid_switches.attach_next_to(
- lbl_package_version_padding,
- lbl_package_version,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach_next_to(
- self.switch_package_version,
- lbl_package_version_padding,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach(lbl_package_progress, 0, 2, 1, 1)
- grid_switches.attach_next_to(
- lbl_package_progress_padding,
- lbl_package_progress,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach_next_to(
- self.switch_package_progress,
- lbl_package_progress_padding,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach(lbl_snigdhaos_keyring, 0, 3, 1, 1)
- grid_switches.attach_next_to(
- lbl_snigdhaos_keyring_padding,
- lbl_snigdhaos_keyring,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach_next_to(
- self.switch_snigdhaos_keyring,
- lbl_snigdhaos_keyring_padding,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach(lbl_snigdhaos_mirrorlist, 0, 4, 1, 1)
- grid_switches.attach_next_to(
- lbl_snigdhaos_mirrorlist_padding,
- lbl_snigdhaos_mirrorlist,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- grid_switches.attach_next_to(
- self.switch_snigdhaos_mirrorlist,
- lbl_snigdhaos_mirrorlist_padding,
- Gtk.PositionType.RIGHT,
- 1,
- 1,
- )
-
- vbox_buttons = Gtk.Box(spacing=1, orientation=Gtk.Orientation.VERTICAL)
- vbox_buttons.pack_start(self.modelbtn_pacmanlog, False, True, 0)
- vbox_buttons.pack_start(modelbtn_packages_export, False, True, 0)
- vbox_buttons.pack_start(modelbtn_packages_import, False, True, 0)
- # vbox_buttons.pack_start(modelbtn_iso_packages_list, False, True, 0)
- vbox_buttons.pack_start(modelbtn_package_search, False, True, 0)
- vbox_buttons.pack_start(modelbtn_about_app, False, True, 0)
-
- vbox.pack_start(grid_switches, False, False, 0)
- vbox.pack_start(vbox_buttons, False, False, 0)
-
- self.popover.add(vbox)
- self.popover.set_position(Gtk.PositionType.BOTTOM)
- except Exception as e:
- fn.logger.error("Exception in setup_headerbar(): %s" % e)
diff --git a/usr/share/blackbox/ui/MessageDialog.py b/usr/share/blackbox/ui/MessageDialog.py
deleted file mode 100644
index 45cc776..0000000
--- a/usr/share/blackbox/ui/MessageDialog.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# This class is used to create a modal dialog window showing detailed information about an event
-
-import os
-import gi
-import Functions as fn
-
-gi.require_version("Gtk", "3.0")
-from gi.repository import Gtk
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-# base_dir = os.path.dirname(os.path.realpath(__file__))
-
-
-class MessageDialog(Gtk.Dialog):
- # message_type is a string, either one of "info", "warning", "error" to show which infobar to display
- # extended argument when set to true shows a textview inside the dialog
- # extended argument when set to false only shows a standard dialog
- def __init__(
- self, title, subtitle, first_msg, secondary_msg, message_type, extended
- ):
- Gtk.Dialog.__init__(self)
-
- headerbar = Gtk.HeaderBar()
- headerbar.set_title(title)
- headerbar.set_show_close_button(True)
-
- self.set_resizable(True)
-
- self.set_border_width(10)
-
- self.set_titlebar(headerbar)
-
- btn_ok = Gtk.Button(label="OK")
- btn_ok.set_size_request(100, 30)
- btn_ok.connect("clicked", on_message_dialog_ok_response, self)
- btn_ok.set_halign(Gtk.Align.END)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
-
- infobar = Gtk.InfoBar()
-
- if message_type == "info":
- infobar.set_name("infobar_info")
- if message_type == "error":
- infobar.set_name("infobar_error")
- if message_type == "warning":
- infobar.set_name("infobar_warning")
-
- lbl_title_message = Gtk.Label(xalign=0, yalign=0)
- lbl_title_message.set_markup("%s" % subtitle)
- content = infobar.get_content_area()
- content.add(lbl_title_message)
-
- infobar.set_revealed(True)
-
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text("")
-
- lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding2.set_text("")
-
- grid_message = Gtk.Grid()
-
- grid_message.attach(infobar, 0, 0, 1, 1)
- grid_message.attach(lbl_padding1, 0, 1, 1, 1)
-
- if extended is True:
- scrolled_window = Gtk.ScrolledWindow()
- textview = Gtk.TextView()
- textview.set_property("editable", False)
- textview.set_property("monospace", True)
- textview.set_border_width(10)
- textview.set_vexpand(True)
- textview.set_hexpand(True)
-
- msg_buffer = textview.get_buffer()
- msg_buffer.insert(
- msg_buffer.get_end_iter(),
- "Event timestamp = %s\n"
- % fn.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
- )
- msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % first_msg)
- msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % secondary_msg)
-
- # move focus away from the textview, to hide the cursor at load
- headerbar.set_property("can-focus", True)
- Gtk.Window.grab_focus(headerbar)
-
- scrolled_window.add(textview)
-
- grid_message.attach(scrolled_window, 0, 2, 1, 1)
- grid_message.attach(lbl_padding2, 0, 3, 1, 1)
-
- self.set_default_size(800, 600)
-
- else:
- # do not display textview
- lbl_first_message = Gtk.Label(xalign=0, yalign=0)
- lbl_first_message.set_text(first_msg)
-
- lbl_second_message = Gtk.Label(xalign=0, yalign=0)
- lbl_second_message.set_markup("%s" % secondary_msg)
-
- grid_message.attach(lbl_first_message, 0, 2, 1, 1)
- grid_message.attach(lbl_second_message, 0, 3, 1, 1)
-
- self.set_default_size(600, 100)
- self.set_resizable(False)
-
- vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
- vbox_close.pack_start(btn_ok, True, True, 1)
-
- self.vbox.add(grid_message)
- self.vbox.add(vbox_close)
-
-
-def on_message_dialog_ok_response(self, widget):
- # widget.hide()
- widget.destroy()
diff --git a/usr/share/blackbox/ui/PackageListDialog.py b/usr/share/blackbox/ui/PackageListDialog.py
deleted file mode 100644
index c5e59c0..0000000
--- a/usr/share/blackbox/ui/PackageListDialog.py
+++ /dev/null
@@ -1,283 +0,0 @@
-# This class is used to create a modal dialog window to display currently installed packages
-
-import os
-import gi
-import Functions as fn
-from ui.MessageDialog import MessageDialog
-from queue import Queue
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-# base_dir = os.path.dirname(os.path.realpath(__file__))
-
-
-class PackageListDialog(Gtk.Dialog):
- def __init__(self):
- Gtk.Dialog.__init__(self)
-
- # Create a queue for storing package list exports to display inside PackageListDialog
- self.pkg_export_queue = Queue()
-
- self.filename = "%s/packages-x86_64.txt" % (fn.export_dir,)
-
- self.set_resizable(True)
- self.set_size_request(1050, 700)
- self.set_modal(True)
-
- self.set_border_width(10)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
-
- self.connect("delete-event", self.on_close)
-
- self.installed_packages_list = None
-
- self.headerbar = Gtk.HeaderBar()
- self.headerbar.set_title("Loading please wait ..")
- self.headerbar.set_show_close_button(True)
-
- self.set_titlebar(self.headerbar)
-
- self.grid_packageslst = Gtk.Grid()
- self.grid_packageslst.set_column_homogeneous(True)
-
- self.lbl_info = Gtk.Label(xalign=0, yalign=0)
- self.lbl_info.set_text("Export destination %s" % self.filename)
-
- # get a list of installed packages on the system
-
- self.pacman_export_cmd = ["pacman", "-Qien"]
-
- fn.Thread(
- target=fn.get_installed_package_data,
- args=(self,),
- daemon=True,
- ).start()
-
- fn.Thread(target=self.check_queue, daemon=True).start()
-
- def setup_gui(self):
- if len(self.installed_packages_list) > 0:
- self.set_title(
- "Showing %s installed packages" % len(self.installed_packages_list)
- )
-
- search_entry = Gtk.SearchEntry()
- search_entry.set_placeholder_text("Search...")
-
- # remove the focus on startup from search entry
- self.headerbar.set_property("can-focus", True)
- Gtk.Window.grab_focus(self.headerbar)
-
- treestore_packages = Gtk.TreeStore(str, str, str, str, str)
- for item in sorted(self.installed_packages_list):
- treestore_packages.append(None, list(item))
-
- treeview_packages = Gtk.TreeView()
- treeview_packages.set_search_entry(search_entry)
-
- treeview_packages.set_model(treestore_packages)
-
- for i, col_title in enumerate(
- [
- "Name",
- "Installed Version",
- "Latest Version",
- "Installed Size",
- "Installed Date",
- ]
- ):
- renderer = Gtk.CellRendererText()
- col = Gtk.TreeViewColumn(col_title, renderer, text=i)
- treeview_packages.append_column(col)
-
- # allow sorting by installed date
-
- col_installed_date = treeview_packages.get_column(4)
- col_installed_date.set_sort_column_id(4)
-
- treestore_packages.set_sort_func(4, self.compare_install_date, None)
-
- path = Gtk.TreePath.new_from_indices([0])
-
- selection = treeview_packages.get_selection()
- selection.select_path(path)
-
- treeview_packages.expand_all()
- treeview_packages.columns_autosize()
-
- scrolled_window = Gtk.ScrolledWindow()
- scrolled_window.set_vexpand(True)
- scrolled_window.set_hexpand(True)
-
- self.grid_packageslst.attach(scrolled_window, 0, 0, 8, 10)
-
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text("")
-
- self.grid_packageslst.attach_next_to(
- lbl_padding1, scrolled_window, Gtk.PositionType.BOTTOM, 1, 1
- )
-
- btn_dialog_export = Gtk.Button(label="Export")
- btn_dialog_export.connect("clicked", self.on_dialog_export_clicked)
- btn_dialog_export.set_size_request(100, 30)
- btn_dialog_export.set_halign(Gtk.Align.END)
-
- btn_dialog_export_close = Gtk.Button(label="Close")
- btn_dialog_export_close.connect("clicked", self.on_close, "delete-event")
- btn_dialog_export_close.set_size_request(100, 30)
- btn_dialog_export_close.set_halign(Gtk.Align.END)
-
- scrolled_window.add(treeview_packages)
-
- grid_btn = Gtk.Grid()
- grid_btn.attach(btn_dialog_export, 0, 1, 1, 1)
-
- lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding2.set_text(" ")
-
- grid_btn.attach_next_to(
- lbl_padding2, btn_dialog_export, Gtk.PositionType.RIGHT, 1, 1
- )
-
- grid_btn.attach_next_to(
- btn_dialog_export_close, lbl_padding2, Gtk.PositionType.RIGHT, 1, 1
- )
-
- grid_btn.set_halign(Gtk.Align.END)
-
- vbox_btn = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
- vbox_btn.pack_start(grid_btn, True, True, 1)
-
- lbl_padding3 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding3.set_text("")
-
- self.vbox.add(search_entry)
- self.vbox.add(lbl_padding3)
- self.vbox.add(self.grid_packageslst)
- self.vbox.add(self.lbl_info)
- self.vbox.add(vbox_btn)
-
- self.show_all()
-
- def check_queue(self):
- while True:
- self.installed_packages_list = self.pkg_export_queue.get()
-
- if self.installed_packages_list is not None:
- break
-
- self.pkg_export_queue.task_done()
-
- GLib.idle_add(self.setup_gui, priority=GLib.PRIORITY_DEFAULT)
-
- def on_close(self, dialog, event):
- self.hide()
- self.destroy()
-
- def on_dialog_export_clicked(self, dialog):
- try:
- if not os.path.exists(fn.export_dir):
- fn.makedirs(fn.export_dir)
- fn.permissions(fn.export_dir)
-
- with open(self.filename, "w", encoding="utf-8") as f:
- f.write(
- "# This file was auto-generated by BlackBox on %s at %s\n"
- % (
- fn.datetime.today().date(),
- fn.datetime.now().strftime("%H:%M:%S"),
- )
- )
-
- f.write(
- "# Exported explicitly installed packages using %s\n"
- % " ".join(self.pacman_export_cmd)
- )
-
- for package in sorted(self.installed_packages_list):
- f.write("%s\n" % (package[0]))
-
- if os.path.exists(self.filename):
- fn.logger.info("Export completed")
-
- # fix permissions, file is owned by root
- fn.permissions(self.filename)
-
- message_dialog = MessageDialog(
- "Info",
- "Package export complete",
- "Package list exported to %s" % self.filename,
- "",
- "info",
- False,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- message_dialog.destroy()
-
- else:
- fn.logger.error("Export failed")
-
- message_dialog = MessageDialog(
- "Error",
- "Package export failed",
- "Failed to export package list to %s." % self.filename,
- "",
- "error",
- False,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
- message_dialog.destroy()
-
- except Exception as e:
- fn.logger.error("Exception in on_dialog_export_clicked(): %s" % e)
-
- # noqa: any locales other than en_GB.UTF-8 / en_US.UTF-8 are untested
- def compare_install_date(self, model, row1, row2, user_data):
- try:
- sort_column, _ = model.get_sort_column_id()
- str_value1 = model.get_value(row1, sort_column)
- str_value2 = model.get_value(row2, sort_column)
-
- datetime_value1 = None
- datetime_value2 = None
-
- # convert string into datetime object, check if time format is 12H format with AM/PM
- if str_value1.lower().find("am") > 0 or str_value1.lower().find("pm") > 0:
- # 12H format
- datetime_value1 = fn.datetime.strptime(
- str_value1, "%a %d %b %Y %I:%M:%S %p %Z"
- ).replace(tzinfo=None)
- datetime_value2 = fn.datetime.strptime(
- str_value2, "%a %d %b %Y %I:%M:%S %p %Z"
- ).replace(tzinfo=None)
- else:
- # 24H format
- datetime_value1 = fn.datetime.strptime(
- str_value1, "%a %d %b %Y %H:%M:%S %Z"
- ).replace(tzinfo=None)
- datetime_value2 = fn.datetime.strptime(
- str_value2, "%a %d %b %Y %H:%M:%S %Z"
- ).replace(tzinfo=None)
-
- if datetime_value1 is not None and datetime_value2 is not None:
- if datetime_value1 < datetime_value2:
- return -1
- elif datetime_value1 == datetime_value2:
- return 0
- else:
- return 1
- except ValueError as ve:
- # fn.logger.error("ValueError in compare_install_date: %s" % ve)
- # compare fails due to the format of the datetime string, which hasn't been tested
- pass
- except Exception as e:
- fn.logger.error("Exception in compare_install_date: %s" % e)
diff --git a/usr/share/blackbox/ui/PackageSearchWindow.py b/usr/share/blackbox/ui/PackageSearchWindow.py
deleted file mode 100644
index ed17411..0000000
--- a/usr/share/blackbox/ui/PackageSearchWindow.py
+++ /dev/null
@@ -1,542 +0,0 @@
-# This class is used to create a window for package name searches and to display package information
-
-import os
-import gi
-
-import Functions as fn
-from ui.MessageDialog import MessageDialog
-
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-
-
-class PackageSearchWindow(Gtk.Window):
- def __init__(self):
- Gtk.Window.__init__(self)
-
- self.headerbar = Gtk.HeaderBar()
- self.headerbar.set_title("Package Search")
- self.headerbar.set_show_close_button(True)
-
- # remove the focus on startup from search entry
- self.headerbar.set_property("can-focus", True)
- Gtk.Window.grab_focus(self.headerbar)
-
- self.set_resizable(True)
- self.set_size_request(700, 500)
- self.set_border_width(10)
- self.set_titlebar(self.headerbar)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
- self.search_package_activated = False
- self.build_gui()
-
- def build_gui(self):
- self.stack = Gtk.Stack()
- self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
- self.stack.set_transition_duration(350)
- self.stack.set_hhomogeneous(False)
- self.stack.set_vhomogeneous(False)
-
- stack_switcher = Gtk.StackSwitcher()
- stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
- stack_switcher.set_stack(self.stack)
- stack_switcher.set_homogeneous(True)
-
- searchentry = Gtk.SearchEntry()
- searchentry.set_placeholder_text("Search using package name...")
- searchentry.set_size_request(400, 0)
- searchentry.connect("activate", self.on_search_package_activated)
- searchentry.connect("icon-release", self.on_search_package_cleared)
-
- btn_ok = Gtk.Button(label="OK")
- btn_ok.set_size_request(100, 30)
- btn_ok.connect("clicked", self.on_close)
- btn_ok.set_halign(Gtk.Align.END)
-
- grid_bottom = Gtk.Grid()
- grid_bottom.attach(btn_ok, 0, 1, 1, 1)
- grid_bottom.set_halign(Gtk.Align.END)
-
- vbox_bottom = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
- lbl_padding_bottom = Gtk.Label(xalign=0, yalign=0)
- lbl_padding_bottom.set_text("")
-
- vbox_bottom.pack_start(lbl_padding_bottom, False, True, 0)
- vbox_bottom.pack_start(grid_bottom, False, True, 0)
-
- self.stack.add_titled(searchentry, "Package Search", "Package Search")
-
- vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
- vbox.set_border_width(10)
-
- vbox.pack_start(stack_switcher, False, False, 0)
- vbox.pack_start(self.stack, False, False, 0)
- vbox.pack_end(vbox_bottom, False, True, 0)
-
- self.add(vbox)
- self.show_all()
-
- thread_pacman_sync_file_db = fn.threading.Thread(
- name="thread_pacman_sync_file_db",
- target=fn.sync_file_db,
- daemon=True,
- )
- thread_pacman_sync_file_db.start()
-
- def on_close(self, widget):
- self.hide()
- self.destroy()
-
- def on_search_package_activated(self, searchentry):
- if searchentry.get_text_length() == 0 and self.search_package_activated:
- self.search_package_activated = False
- self.stack.get_child_by_name("Package Information").destroy()
-
- self.stack.get_child_by_name("Package Files").destroy()
- Gtk.Window.grab_focus(self.headerbar)
- else:
- self.perform_search(searchentry)
-
- def on_search_package_cleared(self, searchentry, icon_pos, event):
- searchentry.set_placeholder_text("Search using package name...")
- if self.search_package_activated is True:
- self.search_package_activated = False
- self.stack.get_child_by_name("Package Information").destroy()
-
- self.stack.get_child_by_name("Package Files").destroy()
-
- Gtk.Window.grab_focus(self.headerbar)
-
- def perform_search(self, searchentry):
- try:
- if (
- len(searchentry.get_text().rstrip().lstrip()) > 0
- and not searchentry.get_text().isspace()
- ):
- term = searchentry.get_text().rstrip().lstrip()
-
- if len(term) > 0:
- fn.logger.info("Searching pacman file database")
-
- package_metadata = fn.get_package_information(term)
-
- if package_metadata is not None:
- # package information
-
- if self.search_package_activated is True:
- self.stack.get_child_by_name(
- "Package Information"
- ).destroy()
-
- self.stack.get_child_by_name("Package Files").destroy()
-
- box_outer = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=5
- )
-
- listbox = Gtk.ListBox()
- listbox.set_selection_mode(Gtk.SelectionMode.NONE)
- box_outer.pack_start(listbox, True, True, 0)
-
- # package name
- row_package_title = Gtk.ListBoxRow()
- vbox_package_title = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_title.add(vbox_package_title)
- lbl_package_name_title = Gtk.Label(xalign=0)
- lbl_package_name_title.set_markup("Package Name")
-
- lbl_package_name_value = Gtk.Label(xalign=0)
- lbl_package_name_value.set_text(package_metadata["name"])
- vbox_package_title.pack_start(
- lbl_package_name_title, True, True, 0
- )
- vbox_package_title.pack_start(
- lbl_package_name_value, True, True, 0
- )
-
- listbox.add(row_package_title)
-
- # repository
-
- row_package_repo = Gtk.ListBoxRow()
- vbox_package_repo = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_repo.add(vbox_package_repo)
- lbl_package_repo_title = Gtk.Label(xalign=0)
- lbl_package_repo_title.set_markup("Repository")
-
- lbl_package_repo_value = Gtk.Label(xalign=0)
- lbl_package_repo_value.set_text(package_metadata["repository"])
- vbox_package_repo.pack_start(
- lbl_package_repo_title, True, True, 0
- )
- vbox_package_repo.pack_start(
- lbl_package_repo_value, True, True, 0
- )
-
- listbox.add(row_package_repo)
-
- # description
-
- row_package_description = Gtk.ListBoxRow()
- vbox_package_description = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_description.add(vbox_package_description)
- lbl_package_description_title = Gtk.Label(xalign=0)
- lbl_package_description_title.set_markup("Description")
-
- lbl_package_description_value = Gtk.Label(xalign=0)
- lbl_package_description_value.set_text(
- package_metadata["description"]
- )
- vbox_package_description.pack_start(
- lbl_package_description_title, True, True, 0
- )
- vbox_package_description.pack_start(
- lbl_package_description_value, True, True, 0
- )
-
- listbox.add(row_package_description)
-
- # arch
-
- row_package_arch = Gtk.ListBoxRow()
- vbox_package_arch = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_arch.add(vbox_package_arch)
- lbl_package_arch_title = Gtk.Label(xalign=0)
- lbl_package_arch_title.set_markup("Architecture")
-
- lbl_package_arch_value = Gtk.Label(xalign=0)
- lbl_package_arch_value.set_text(package_metadata["arch"])
- vbox_package_arch.pack_start(
- lbl_package_arch_title, True, True, 0
- )
- vbox_package_arch.pack_start(
- lbl_package_arch_value, True, True, 0
- )
-
- listbox.add(row_package_arch)
-
- # url
-
- row_package_url = Gtk.ListBoxRow()
- vbox_package_url = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_url.add(vbox_package_url)
- lbl_package_url_title = Gtk.Label(xalign=0)
- lbl_package_url_title.set_markup("URL")
-
- lbl_package_url_value = Gtk.Label(xalign=0)
- lbl_package_url_value.set_markup(
- "%s"
- % (package_metadata["url"], package_metadata["url"])
- )
- vbox_package_url.pack_start(
- lbl_package_url_title, True, True, 0
- )
- vbox_package_url.pack_start(
- lbl_package_url_value, True, True, 0
- )
-
- listbox.add(row_package_url)
-
- # download size
-
- row_package_size = Gtk.ListBoxRow()
- vbox_package_size = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_size.add(vbox_package_size)
- lbl_package_size_title = Gtk.Label(xalign=0)
- lbl_package_size_title.set_markup("Download size")
-
- lbl_package_size_value = Gtk.Label(xalign=0)
- lbl_package_size_value.set_text(
- package_metadata["download_size"]
- )
- vbox_package_size.pack_start(
- lbl_package_size_title, True, True, 0
- )
- vbox_package_size.pack_start(
- lbl_package_size_value, True, True, 0
- )
-
- listbox.add(row_package_size)
-
- # installed size
-
- row_package_installed_size = Gtk.ListBoxRow()
- vbox_package_installed_size = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_installed_size.add(vbox_package_installed_size)
- lbl_package_installed_size_title = Gtk.Label(xalign=0)
- lbl_package_installed_size_title.set_markup(
- "Installed size"
- )
-
- lbl_package_installed_size_value = Gtk.Label(xalign=0)
- lbl_package_installed_size_value.set_text(
- package_metadata["installed_size"]
- )
- vbox_package_installed_size.pack_start(
- lbl_package_installed_size_title, True, True, 0
- )
- vbox_package_installed_size.pack_start(
- lbl_package_installed_size_value, True, True, 0
- )
-
- listbox.add(row_package_installed_size)
-
- # build date
-
- row_package_build_date = Gtk.ListBoxRow()
- vbox_package_build_date = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_build_date.add(vbox_package_build_date)
- lbl_package_build_date_title = Gtk.Label(xalign=0)
- lbl_package_build_date_title.set_markup("Build date")
-
- lbl_package_build_date_value = Gtk.Label(xalign=0)
- lbl_package_build_date_value.set_text(
- package_metadata["build_date"]
- )
- vbox_package_build_date.pack_start(
- lbl_package_build_date_title, True, True, 0
- )
- vbox_package_build_date.pack_start(
- lbl_package_build_date_value, True, True, 0
- )
-
- listbox.add(row_package_build_date)
-
- # packager
-
- row_package_maintainer = Gtk.ListBoxRow()
- vbox_package_maintainer = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_maintainer.add(vbox_package_maintainer)
- lbl_package_maintainer_title = Gtk.Label(xalign=0)
- lbl_package_maintainer_title.set_markup("Packager")
-
- lbl_package_maintainer_value = Gtk.Label(xalign=0)
- lbl_package_maintainer_value.set_text(
- package_metadata["packager"]
- )
- vbox_package_maintainer.pack_start(
- lbl_package_maintainer_title, True, True, 0
- )
- vbox_package_maintainer.pack_start(
- lbl_package_maintainer_value, True, True, 0
- )
-
- listbox.add(row_package_maintainer)
-
- # depends on
-
- expander_depends_on = Gtk.Expander()
- expander_depends_on.set_expanded(True)
- expander_depends_on.set_use_markup(True)
- expander_depends_on.set_resize_toplevel(True)
- expander_depends_on.set_label("Depends on")
-
- row_package_depends_on = Gtk.ListBoxRow()
- expander_depends_on.add(row_package_depends_on)
- vbox_package_depends_on = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_depends_on.add(vbox_package_depends_on)
-
- if len(package_metadata["depends_on"]) > 0:
- treestore_depends = Gtk.TreeStore(str, str)
-
- for item in package_metadata["depends_on"]:
- treestore_depends.append(None, list(item))
-
- treeview_depends = Gtk.TreeView(model=treestore_depends)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("Package", renderer, text=0)
-
- treeview_depends.append_column(column)
-
- vbox_package_depends_on.pack_start(
- treeview_depends, True, True, 0
- )
-
- else:
- lbl_package_depends_value = Gtk.Label(xalign=0, yalign=0)
- lbl_package_depends_value.set_text("None")
-
- vbox_package_depends_on.pack_start(
- lbl_package_depends_value, True, True, 0
- )
-
- listbox.add(expander_depends_on)
-
- # conflicts with
-
- expander_conflicts_with = Gtk.Expander()
- expander_conflicts_with.set_use_markup(True)
- expander_conflicts_with.set_expanded(True)
- expander_conflicts_with.set_resize_toplevel(True)
- expander_conflicts_with.set_label("Conflicts with")
-
- row_package_conflicts_with = Gtk.ListBoxRow()
- expander_conflicts_with.add(row_package_conflicts_with)
- vbox_package_conflicts_with = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_conflicts_with.add(vbox_package_conflicts_with)
-
- if len(package_metadata["conflicts_with"]) > 0:
- treestore_conflicts = Gtk.TreeStore(str, str)
-
- for item in package_metadata["conflicts_with"]:
- treestore_conflicts.append(None, list(item))
-
- treeview_conflicts = Gtk.TreeView(model=treestore_conflicts)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("Package", renderer, text=0)
-
- treeview_conflicts.append_column(column)
-
- vbox_package_conflicts_with.pack_start(
- treeview_conflicts, True, True, 0
- )
-
- else:
- lbl_package_conflicts_with_value = Gtk.Label(
- xalign=0, yalign=0
- )
- lbl_package_conflicts_with_value.set_text("None")
-
- vbox_package_conflicts_with.pack_start(
- lbl_package_conflicts_with_value, True, True, 0
- )
-
- listbox.add(expander_conflicts_with)
-
- checkbtn_installed = Gtk.CheckButton(label="Installed")
- checkbtn_installed.set_active(False)
- checkbtn_installed.set_sensitive(False)
-
- # is the package installed
- installed = fn.check_package_installed(term)
-
- if installed is True:
- checkbtn_installed.set_active(True)
-
- # box_outer.pack_start(checkbtn_installed, True, True, 0)
-
- scrolled_window_package_info = Gtk.ScrolledWindow()
- scrolled_window_package_info.set_propagate_natural_height(True)
- scrolled_window_package_info.add(box_outer)
-
- vbox_package_info = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
-
- lbl_padding_vbox = Gtk.Label(xalign=0, yalign=0)
- lbl_padding_vbox.set_text("")
-
- vbox_package_info.pack_start(
- scrolled_window_package_info, True, True, 0
- )
- vbox_package_info.pack_start(lbl_padding_vbox, True, True, 0)
- vbox_package_info.pack_start(checkbtn_installed, True, True, 0)
-
- self.stack.add_titled(
- vbox_package_info,
- "Package Information",
- "Package Information",
- )
-
- # package files
-
- package_files = fn.get_package_files(term)
- if package_files is not None:
- lbl_package_title = Gtk.Label(xalign=0, yalign=0)
- lbl_package_title.set_markup("Package")
-
- lbl_package_title_value = Gtk.Label(xalign=0, yalign=0)
-
- lbl_package_title_value.set_text(package_metadata["name"])
-
- treestore_filelist = Gtk.TreeStore(str, str)
-
- for file in package_files:
- treestore_filelist.append(None, list(file))
-
- treeview_files = Gtk.TreeView(model=treestore_filelist)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("Files", renderer, text=0)
-
- treeview_files.append_column(column)
-
- vbox_package_files = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
-
- vbox_package_files.pack_start(
- lbl_package_title, True, True, 0
- )
- vbox_package_files.pack_start(
- lbl_package_title_value, True, True, 0
- )
-
- lbl_padding_package_files = Gtk.Label(xalign=0, yalign=0)
- lbl_padding_package_files.set_text("")
-
- vbox_package_files.pack_start(
- lbl_padding_package_files, True, True, 0
- )
-
- scrolled_window_package_files = Gtk.ScrolledWindow()
- scrolled_window_package_files.set_propagate_natural_height(
- True
- )
- scrolled_window_package_files.add(treeview_files)
-
- vbox_package_files.pack_start(
- scrolled_window_package_files, True, True, 0
- )
-
- self.stack.add_titled(
- vbox_package_files,
- "Package Files",
- "Package Files",
- )
-
- self.search_package_activated = True
- self.show_all()
-
- else:
- message_dialog = MessageDialog(
- "Info",
- "Search returned 0 results",
- "Failed to find package name",
- "Are the correct pacman mirrorlists configured ?\nOr try to search again using the exact package name",
- "info",
- False,
- )
-
- message_dialog.show_all()
- message_dialog.run()
- message_dialog.hide()
-
- except Exception as e:
- fn.logger.error("Exception in perform_search(): %s" % e)
\ No newline at end of file
diff --git a/usr/share/blackbox/ui/PackagesImportDialog.py b/usr/share/blackbox/ui/PackagesImportDialog.py
deleted file mode 100644
index 3415b7f..0000000
--- a/usr/share/blackbox/ui/PackagesImportDialog.py
+++ /dev/null
@@ -1,223 +0,0 @@
-import os
-import gi
-import Functions as fn
-from queue import Queue
-from ui.MessageDialog import MessageDialog
-
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-
-
-class PackagesImportDialog(Gtk.Dialog):
- """create a gui"""
-
- def __init__(self, package_file, packages_list, logfile):
- Gtk.Dialog.__init__(self)
-
- # Create a queue for storing package import messages from pacman
- self.pkg_import_queue = Queue()
-
- # Create a queue for storing package install errors
- self.pkg_err_queue = Queue()
-
- # Create a queue for storing package install status
- self.pkg_status_queue = Queue()
-
- self.package_file = package_file
- self.packages_list = packages_list
- self.logfile = logfile
-
- self.stop_thread = False
-
- self.set_resizable(True)
- self.set_border_width(10)
- self.set_size_request(800, 700)
- self.set_modal(True)
-
- headerbar = Gtk.HeaderBar()
- headerbar.set_title("Import packages")
- headerbar.set_show_close_button(True)
-
- self.set_titlebar(headerbar)
-
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
-
- hbox_title = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- lbl_packages_title = Gtk.Label(xalign=0)
- lbl_packages_title.set_name("title")
- lbl_packages_title.set_text("Packages")
-
- hbox_title.pack_start(lbl_packages_title, False, False, 0)
-
- hbox_title_install = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- label_install_title = Gtk.Label(xalign=0)
- label_install_title.set_markup(" Install Packages")
-
- hbox_title_install.pack_start(label_install_title, False, False, 0)
-
- hbox_sep = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- hsep = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
- hbox_sep.pack_start(hsep, True, True, 0)
-
- frame_install = Gtk.Frame(label="")
- frame_install_label = frame_install.get_label_widget()
- frame_install_label.set_markup("Install Packages")
-
- hbox_install = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
- label_install_desc = Gtk.Label(xalign=0, yalign=0)
- label_install_desc.set_markup(
- f""
- f" WARNING: Proceed with caution this will install packages onto your system!\n"
- f" Packages from the AUR are not supported \n"
- f" This also performs a full system upgrade\n\n"
- f" - A list of packages are sourced from {self.package_file}\n"
- f" - To ignore a package, add a # in front of the package name\n"
- f" - Log file: {self.logfile}\n"
- f" - A reboot is recommended when core Linux packages are installed\n"
- )
-
- self.scrolled_window = Gtk.ScrolledWindow()
-
- self.textview = Gtk.TextView()
- self.textview.set_name("textview_log")
- self.textview.set_property("editable", False)
- self.textview.set_property("monospace", True)
- self.textview.set_border_width(10)
- self.textview.set_vexpand(True)
- self.textview.set_hexpand(True)
-
- msg_buffer = self.textview.get_buffer()
- msg_buffer.insert(
- msg_buffer.get_end_iter(),
- "\n Click Yes to confirm install of the following packages:\n\n",
- )
-
- lbl_title_message = Gtk.Label(xalign=0, yalign=0)
- lbl_title_message.set_markup(
- "There are %s packages to install, proceed ?"
- % len(self.packages_list)
- )
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text("")
-
- lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding2.set_text("")
-
- self.infobar = Gtk.InfoBar()
-
- content = self.infobar.get_content_area()
- content.add(lbl_title_message)
-
- self.infobar.set_revealed(True)
-
- for package in sorted(self.packages_list):
- msg_buffer.insert(msg_buffer.get_end_iter(), " - %s\n" % package)
-
- # move focus away from the textview, to hide the cursor at load
- headerbar.set_property("can-focus", True)
- Gtk.Window.grab_focus(headerbar)
-
- self.scrolled_window.add(self.textview)
-
- self.button_yes = self.add_button("Yes", Gtk.ResponseType.OK)
- self.button_yes.set_size_request(100, 30)
- btn_yes_context = self.button_yes.get_style_context()
- btn_yes_context.add_class("destructive-action")
-
- self.button_no = self.add_button("Close", Gtk.ResponseType.CANCEL)
- self.button_no.set_size_request(100, 30)
-
- self.connect("response", self.on_response)
-
- vbox_log_dir = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
-
- btn_open_log_dir = Gtk.Button(label="Open log directory")
- btn_open_log_dir.connect("clicked", self.on_open_log_dir_clicked)
- btn_open_log_dir.set_size_request(100, 30)
-
- vbox_log_dir.pack_start(btn_open_log_dir, False, False, 0)
-
- grid_message = Gtk.Grid()
-
- grid_message.attach(label_install_desc, 0, 0, 1, 1)
- grid_message.attach(self.infobar, 0, 1, 1, 1)
- grid_message.attach(lbl_padding1, 0, 2, 1, 1)
-
- grid_message.attach(self.scrolled_window, 0, 3, 1, 1)
- grid_message.attach(lbl_padding2, 0, 4, 1, 1)
- grid_message.attach(vbox_log_dir, 0, 5, 1, 1)
-
- self.vbox.add(grid_message)
-
- def on_open_log_dir_clicked(self, widget):
- fn.open_log_dir()
-
- def display_progress(self):
- self.textview.destroy()
- self.infobar.destroy()
- self.button_yes.destroy()
-
- self.label_package_status = Gtk.Label(xalign=0, yalign=0)
- self.label_package_count = Gtk.Label(xalign=0, yalign=0)
-
- label_warning_close = Gtk.Label(xalign=0, yalign=0)
- label_warning_close.set_markup(
- "Do not close this window during package installation"
- )
-
- self.textview = Gtk.TextView()
- self.textview.set_name("textview_log")
- self.textview.set_property("editable", False)
- self.textview.set_property("monospace", True)
- self.textview.set_border_width(10)
- self.textview.set_vexpand(True)
- self.textview.set_hexpand(True)
-
- self.scrolled_window.add(self.textview)
-
- self.msg_buffer = self.textview.get_buffer()
-
- self.vbox.add(label_warning_close)
- self.vbox.add(self.label_package_status)
- self.vbox.add(self.label_package_count)
-
- fn.Thread(
- target=fn.monitor_package_import,
- args=(self,),
- daemon=True,
- ).start()
-
- self.show_all()
-
- fn.logger.info("Installing packages")
- event = "%s [INFO]: Installing packages\n" % fn.datetime.now().strftime(
- "%Y-%m-%d-%H-%M-%S"
- )
-
- fn.logger.info("Log file = %s" % self.logfile)
-
- self.pkg_import_queue.put(event)
-
- # debug install, overrride packages_list
-
- # starts 2 threads one to install the packages, and another to check install status
-
- fn.Thread(
- target=fn.import_packages,
- args=(self,),
- daemon=True,
- ).start()
-
- fn.Thread(target=fn.log_package_status, args=(self,), daemon=True).start()
-
- def on_response(self, dialog, response):
- if response in (Gtk.ResponseType.OK, Gtk.ResponseType.YES):
- self.stop_thread = False
- self.display_progress()
-
- else:
- self.stop_thread = True
- dialog.hide()
- dialog.destroy()
\ No newline at end of file
diff --git a/usr/share/blackbox/ui/PacmanLogWindow.py b/usr/share/blackbox/ui/PacmanLogWindow.py
deleted file mode 100644
index 2c47bf6..0000000
--- a/usr/share/blackbox/ui/PacmanLogWindow.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# This class is used to create a window to monitor the pacman log file inside /var/log/pacman.log
-
-import os
-import gi
-import Functions as fn
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-# base_dir = os.path.dirname(os.path.realpath(__file__))
-
-
-class PacmanLogWindow(Gtk.Window):
- def __init__(self, textview_pacmanlog, btn_pacmanlog):
- Gtk.Window.__init__(self)
-
- self.start_logtimer = True
- self.textview_pacmanlog = textview_pacmanlog
- self.btn_pacmanlog = btn_pacmanlog
- headerbar = Gtk.HeaderBar()
-
- headerbar.set_show_close_button(True)
-
- self.set_titlebar(headerbar)
-
- self.set_title("BlackBox - Pacman log file viewer")
- self.set_default_size(800, 600)
- self.set_resizable(True)
- self.set_border_width(10)
- self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
- self.connect("delete-event", self.on_close)
-
- btn_pacmanlog_ok = Gtk.Button(label="OK")
- btn_pacmanlog_ok.connect("clicked", self.on_response, "response")
- btn_pacmanlog_ok.set_size_request(100, 30)
- btn_pacmanlog_ok.set_halign(Gtk.Align.END)
-
- pacmanlog_scrolledwindow = Gtk.ScrolledWindow()
- pacmanlog_scrolledwindow.set_size_request(750, 500)
- pacmanlog_scrolledwindow.add(self.textview_pacmanlog)
-
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text("")
-
- vbox_pacmanlog = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
-
- vbox_pacmanlog.pack_start(pacmanlog_scrolledwindow, True, True, 0)
- vbox_pacmanlog.pack_start(lbl_padding1, False, False, 0)
- vbox_pacmanlog.pack_start(btn_pacmanlog_ok, False, False, 0)
-
- self.add(vbox_pacmanlog)
-
- def on_close(self, widget, data):
- fn.logger.debug("Closing pacman log monitoring window")
- self.start_logtimer = False
- self.btn_pacmanlog.set_sensitive(True)
-
- self.hide()
- self.destroy()
-
- def on_response(self, widget, response):
- # stop updating the textview
- fn.logger.debug("Closing pacman log monitoring dialog")
- self.start_logtimer = False
- self.btn_pacmanlog.set_sensitive(True)
-
- # self.remove(self)
- self.hide()
- self.destroy()
\ No newline at end of file
diff --git a/usr/share/blackbox/ui/ProgressBarWindow.py b/usr/share/blackbox/ui/ProgressBarWindow.py
deleted file mode 100644
index 610c8d8..0000000
--- a/usr/share/blackbox/ui/ProgressBarWindow.py
+++ /dev/null
@@ -1,87 +0,0 @@
-from gi.repository import Gtk, GLib
-import gi
-
-
-# Since a system can have multiple versions
-# of GTK + installed, we want to make
-# sure that we are importing GTK + 3.
-gi.require_version("Gtk", "3.0")
-
-
-class ProgressBarWindow(Gtk.Window):
- new_value = 0.0
-
- def __init__(self):
- Gtk.Window.__init__(self, title="Progress Bar")
- self.set_border_width(10)
-
- vbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
- self.add(vbox)
-
- # Create a ProgressBar
- self.progressbar = Gtk.ProgressBar()
- vbox.pack_start(self.progressbar, True, True, 0)
-
- # Create CheckButton with labels "Show text",
- # "Activity mode", "Right to Left" respectively
- # button = Gtk.CheckButton(label="Show text")
- # button.connect("toggled", self.on_show_text_toggled)
- # vbox.pack_start(button, True, True, 0)
-
- # button = Gtk.CheckButton(label="Activity mode")
- # button.connect("toggled", self.on_activity_mode_toggled)
- # vbox.pack_start(button, True, True, 0)
-
- # button = Gtk.CheckButton(label="Right to Left")
- # button.connect("toggled", self.on_right_to_left_toggled)
- # vbox.pack_start(button, True, True, 0)
-
- # self.timeout_id = GLib.timeout_add(5000, self.on_timeout, None)
- self.activity_mode = False
-
- def set_text(self, text):
- self.progressbar.set_text(text)
- self.progressbar.set_show_text(True)
-
- def reset_timer(self):
- new_value = 0.0
- self.progressbar.set_fraction(new_value)
-
- def on_activity_mode_toggled(self, button):
- self.activity_mode = button.get_active()
- if self.activity_mode:
- self.progressbar.pulse()
- else:
- self.progressbar.set_fraction(0.0)
-
- def on_right_to_left_toggled(self, button):
- value = button.get_active()
- self.progressbar.set_inverted(value)
-
- def update(self, fraction):
- new_value = self.progressbar.get_fraction() + fraction
- self.progressbar.set_fraction(new_value)
- if new_value >= 1.0:
- return False
- return True
-
- def get_complete(self):
- if self.progressbar.get_fraction() >= 1.0:
- return True
- return False
-
- def on_timeout(self, user_data=0.01):
- """
- Update value on the progress bar
- """
- if self.activity_mode:
- self.progressbar.pulse()
- else:
- new_value = self.progressbar.get_fraction() + user_data
-
- if new_value > 1:
- new_value = 0.0
- return False
-
- self.progressbar.set_fraction(new_value)
- return True
\ No newline at end of file
diff --git a/usr/share/blackbox/ui/ProgressDialog.py b/usr/share/blackbox/ui/ProgressDialog.py
deleted file mode 100644
index 73d42bf..0000000
--- a/usr/share/blackbox/ui/ProgressDialog.py
+++ /dev/null
@@ -1,400 +0,0 @@
-# This class is used to create a modal dialog window showing progress of a package install/uninstall and general package information
-
-import os
-import gi
-import Functions as fn
-from ui.MessageDialog import MessageDialog
-from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
-
-gi.require_version("Gtk", "3.0")
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-# base_dir = os.path.dirname(os.path.realpath(__file__))
-
-
-class ProgressDialog(Gtk.Dialog):
- def __init__(self, action, package, command, package_metadata):
- Gtk.Dialog.__init__(self)
-
- self.package_found = True
- # this gets package information using pacman -Si or pacman -Qi whichever returns output
- # package_metadata = fn.get_package_information(pkg.name)
-
- # if a mirrorlist isn't configured properly, pacman will not be able to query its repository
- # so the following is a condition to make sure the data returned isn't an error
-
- if type(package_metadata) is dict:
- package_progress_dialog_headerbar = Gtk.HeaderBar()
- package_progress_dialog_headerbar.set_show_close_button(True)
- self.set_titlebar(package_progress_dialog_headerbar)
-
- self.connect("delete-event", package_progress_dialog_on_close, self, action)
-
- if action == "install":
- self.set_title("BlackBox - installing package %s" % package.name)
-
- elif action == "uninstall":
- self.set_title("BlackBox - removing package %s" % package.name)
-
- self.btn_package_progress_close = Gtk.Button(label="OK")
- self.btn_package_progress_close.connect(
- "clicked",
- on_package_progress_close_response,
- self,
- )
- self.btn_package_progress_close.set_sensitive(False)
- self.btn_package_progress_close.set_size_request(100, 30)
- self.btn_package_progress_close.set_halign(Gtk.Align.END)
-
- self.set_resizable(True)
- self.set_size_request(850, 700)
- self.set_modal(True)
- self.set_border_width(10)
- self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
- self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
-
- lbl_pacman_action_title = Gtk.Label(xalign=0, yalign=0)
- lbl_pacman_action_title.set_text("Running command:")
-
- lbl_pacman_action_value = Gtk.Label(xalign=0, yalign=0)
- lbl_pacman_action_value.set_markup("%s" % command)
-
- stack = Gtk.Stack()
- stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
- stack.set_transition_duration(350)
- stack.set_hhomogeneous(False)
- stack.set_vhomogeneous(False)
-
- stack_switcher = Gtk.StackSwitcher()
- stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
- stack_switcher.set_stack(stack)
- stack_switcher.set_homogeneous(True)
-
- package_progress_grid = Gtk.Grid()
-
- self.infobar = Gtk.InfoBar()
- self.infobar.set_name("infobar_info")
-
- content = self.infobar.get_content_area()
- content.add(lbl_pacman_action_title)
- content.add(lbl_pacman_action_value)
-
- self.infobar.set_revealed(True)
-
- lbl_padding_header1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding_header1.set_text("")
-
- package_progress_grid.attach(lbl_padding_header1, 0, 1, 1, 1)
- package_progress_grid.attach(self.infobar, 0, 2, 1, 1)
-
- package_progress_grid.set_property("can-focus", True)
- Gtk.Window.grab_focus(package_progress_grid)
-
- lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding1.set_text("")
-
- lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
- lbl_padding2.set_text("")
- lbl_padding2.set_halign(Gtk.Align.END)
-
- package_progress_grid.attach(lbl_padding1, 0, 3, 1, 1)
-
- package_progress_scrolled_window = Gtk.ScrolledWindow()
- self.package_progress_textview = Gtk.TextView()
- self.package_progress_textview.set_property("editable", False)
- self.package_progress_textview.set_property("monospace", True)
- self.package_progress_textview.set_border_width(10)
- self.package_progress_textview.set_vexpand(True)
- self.package_progress_textview.set_hexpand(True)
- buffer = self.package_progress_textview.get_buffer()
- self.package_progress_textview.set_buffer(buffer)
-
- package_progress_scrolled_window.set_size_request(700, 430)
-
- package_progress_scrolled_window.add(self.package_progress_textview)
- package_progress_grid.attach(package_progress_scrolled_window, 0, 4, 1, 1)
-
- vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
-
- vbox_close.pack_start(lbl_padding2, True, True, 0)
- vbox_close.pack_start(self.btn_package_progress_close, True, True, 0)
-
- stack.add_titled(package_progress_grid, "Progress", "Package Progress")
-
- # package information
- box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
-
- listbox = Gtk.ListBox()
- listbox.set_selection_mode(Gtk.SelectionMode.NONE)
- box_outer.pack_start(listbox, True, True, 0)
-
- # package name
- row_package_title = Gtk.ListBoxRow()
- vbox_package_title = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_title.add(vbox_package_title)
- lbl_package_name_title = Gtk.Label(xalign=0)
- lbl_package_name_title.set_markup("Package Name")
-
- lbl_package_name_value = Gtk.Label(xalign=0)
- lbl_package_name_value.set_text(package_metadata["name"])
- vbox_package_title.pack_start(lbl_package_name_title, True, True, 0)
- vbox_package_title.pack_start(lbl_package_name_value, True, True, 0)
-
- listbox.add(row_package_title)
-
- # repository
-
- row_package_repo = Gtk.ListBoxRow()
- vbox_package_repo = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- row_package_repo.add(vbox_package_repo)
- lbl_package_repo_title = Gtk.Label(xalign=0)
- lbl_package_repo_title.set_markup("Repository")
-
- lbl_package_repo_value = Gtk.Label(xalign=0)
- lbl_package_repo_value.set_text(package_metadata["repository"])
- vbox_package_repo.pack_start(lbl_package_repo_title, True, True, 0)
- vbox_package_repo.pack_start(lbl_package_repo_value, True, True, 0)
-
- listbox.add(row_package_repo)
-
- # description
-
- row_package_description = Gtk.ListBoxRow()
- vbox_package_description = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_description.add(vbox_package_description)
- lbl_package_description_title = Gtk.Label(xalign=0)
- lbl_package_description_title.set_markup("Description")
-
- lbl_package_description_value = Gtk.Label(xalign=0)
- lbl_package_description_value.set_text(package_metadata["description"])
- vbox_package_description.pack_start(
- lbl_package_description_title, True, True, 0
- )
- vbox_package_description.pack_start(
- lbl_package_description_value, True, True, 0
- )
-
- listbox.add(row_package_description)
-
- # arch
-
- row_package_arch = Gtk.ListBoxRow()
- vbox_package_arch = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- row_package_arch.add(vbox_package_arch)
- lbl_package_arch_title = Gtk.Label(xalign=0)
- lbl_package_arch_title.set_markup("Architecture")
-
- lbl_package_arch_value = Gtk.Label(xalign=0)
- lbl_package_arch_value.set_text(package_metadata["arch"])
- vbox_package_arch.pack_start(lbl_package_arch_title, True, True, 0)
- vbox_package_arch.pack_start(lbl_package_arch_value, True, True, 0)
-
- listbox.add(row_package_arch)
-
- # url
-
- row_package_url = Gtk.ListBoxRow()
- vbox_package_url = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- row_package_url.add(vbox_package_url)
- lbl_package_url_title = Gtk.Label(xalign=0)
- lbl_package_url_title.set_markup("URL")
-
- lbl_package_url_value = Gtk.Label(xalign=0)
- lbl_package_url_value.set_markup(
- "%s"
- % (package_metadata["url"], package_metadata["url"])
- )
- vbox_package_url.pack_start(lbl_package_url_title, True, True, 0)
- vbox_package_url.pack_start(lbl_package_url_value, True, True, 0)
-
- listbox.add(row_package_url)
-
- # download size
-
- row_package_size = Gtk.ListBoxRow()
- vbox_package_size = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
- row_package_size.add(vbox_package_size)
- lbl_package_size_title = Gtk.Label(xalign=0)
- lbl_package_size_title.set_markup("Download size")
-
- lbl_package_size_value = Gtk.Label(xalign=0)
- lbl_package_size_value.set_text(package_metadata["download_size"])
- vbox_package_size.pack_start(lbl_package_size_title, True, True, 0)
- vbox_package_size.pack_start(lbl_package_size_value, True, True, 0)
-
- listbox.add(row_package_size)
-
- # installed size
-
- row_package_installed_size = Gtk.ListBoxRow()
- vbox_package_installed_size = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_installed_size.add(vbox_package_installed_size)
- lbl_package_installed_size_title = Gtk.Label(xalign=0)
- lbl_package_installed_size_title.set_markup("Installed size")
-
- lbl_package_installed_size_value = Gtk.Label(xalign=0)
- lbl_package_installed_size_value.set_text(
- package_metadata["installed_size"]
- )
- vbox_package_installed_size.pack_start(
- lbl_package_installed_size_title, True, True, 0
- )
- vbox_package_installed_size.pack_start(
- lbl_package_installed_size_value, True, True, 0
- )
-
- listbox.add(row_package_installed_size)
-
- # build date
-
- row_package_build_date = Gtk.ListBoxRow()
- vbox_package_build_date = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_build_date.add(vbox_package_build_date)
- lbl_package_build_date_title = Gtk.Label(xalign=0)
- lbl_package_build_date_title.set_markup("Build date")
-
- lbl_package_build_date_value = Gtk.Label(xalign=0)
- lbl_package_build_date_value.set_text(package_metadata["build_date"])
- vbox_package_build_date.pack_start(
- lbl_package_build_date_title, True, True, 0
- )
- vbox_package_build_date.pack_start(
- lbl_package_build_date_value, True, True, 0
- )
-
- listbox.add(row_package_build_date)
-
- # packager
-
- row_package_maintainer = Gtk.ListBoxRow()
- vbox_package_maintainer = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_maintainer.add(vbox_package_maintainer)
- lbl_package_maintainer_title = Gtk.Label(xalign=0)
- lbl_package_maintainer_title.set_markup("Packager")
-
- lbl_package_maintainer_value = Gtk.Label(xalign=0)
- lbl_package_maintainer_value.set_text(package_metadata["packager"])
- vbox_package_maintainer.pack_start(
- lbl_package_maintainer_title, True, True, 0
- )
- vbox_package_maintainer.pack_start(
- lbl_package_maintainer_value, True, True, 0
- )
-
- listbox.add(row_package_maintainer)
-
- # depends on
-
- expander_depends_on = Gtk.Expander()
- expander_depends_on.set_use_markup(True)
- expander_depends_on.set_resize_toplevel(True)
- expander_depends_on.set_label("Depends on")
-
- row_package_depends_on = Gtk.ListBoxRow()
- expander_depends_on.add(row_package_depends_on)
- vbox_package_depends_on = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_depends_on.add(vbox_package_depends_on)
-
- if len(package_metadata["depends_on"]) > 0:
- treestore_depends = Gtk.TreeStore(str, str)
-
- for item in package_metadata["depends_on"]:
- treestore_depends.append(None, list(item))
-
- treeview_depends = Gtk.TreeView(model=treestore_depends)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("Package", renderer, text=0)
-
- treeview_depends.append_column(column)
-
- vbox_package_depends_on.pack_start(treeview_depends, True, True, 0)
-
- else:
- lbl_package_depends_value = Gtk.Label(xalign=0, yalign=0)
- lbl_package_depends_value.set_text("None")
-
- vbox_package_depends_on.pack_start(
- lbl_package_depends_value, True, True, 0
- )
-
- listbox.add(expander_depends_on)
-
- # conflicts with
-
- expander_conflicts_with = Gtk.Expander()
- expander_conflicts_with.set_use_markup(True)
- expander_conflicts_with.set_resize_toplevel(True)
- expander_conflicts_with.set_label("Conflicts with")
-
- row_package_conflicts_with = Gtk.ListBoxRow()
- expander_conflicts_with.add(row_package_conflicts_with)
- vbox_package_conflicts_with = Gtk.Box(
- orientation=Gtk.Orientation.VERTICAL, spacing=0
- )
- row_package_conflicts_with.add(vbox_package_conflicts_with)
-
- if len(package_metadata["conflicts_with"]) > 0:
- treestore_conflicts = Gtk.TreeStore(str, str)
-
- for item in package_metadata["conflicts_with"]:
- treestore_conflicts.append(None, list(item))
-
- treeview_conflicts = Gtk.TreeView(model=treestore_conflicts)
-
- renderer = Gtk.CellRendererText()
- column = Gtk.TreeViewColumn("Package", renderer, text=0)
-
- treeview_conflicts.append_column(column)
-
- vbox_package_conflicts_with.pack_start(
- treeview_conflicts, True, True, 0
- )
-
- else:
- lbl_package_conflicts_with_value = Gtk.Label(xalign=0, yalign=0)
- lbl_package_conflicts_with_value.set_text("None")
-
- vbox_package_conflicts_with.pack_start(
- lbl_package_conflicts_with_value, True, True, 0
- )
-
- listbox.add(expander_conflicts_with)
-
- package_metadata_scrolled_window = Gtk.ScrolledWindow()
-
- package_metadata_scrolled_window.add(box_outer)
-
- stack.add_titled(
- package_metadata_scrolled_window, "Package Information", "Information"
- )
-
- self.vbox.add(stack_switcher)
- self.vbox.add(stack)
- self.vbox.add(vbox_close)
-
-
-def on_package_progress_close_response(self, widget):
- self.pkg_dialog_closed = True
- fn.logger.debug("Closing package progress dialog")
- widget.hide()
- widget.destroy()
-
-
-def package_progress_dialog_on_close(widget, data, self, action):
- self.pkg_dialog_closed = True
- fn.logger.debug("Closing package progress dialog")
- widget.hide()
- widget.destroy()
\ No newline at end of file
diff --git a/usr/share/blackbox/ui/SplashScreen.py b/usr/share/blackbox/ui/SplashScreen.py
deleted file mode 100644
index f2ad00d..0000000
--- a/usr/share/blackbox/ui/SplashScreen.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import gi
-from Functions import os
-
-gi.require_version("Gtk", "3.0")
-from gi.repository import Gtk, GdkPixbuf, Gdk # noqa
-
-base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-# base_dir = os.path.dirname(os.path.realpath(__file__))
-
-
-class SplashScreen(Gtk.Window):
- def __init__(self):
- Gtk.Window.__init__(self, Gtk.WindowType.POPUP, title="")
- self.set_decorated(False)
- self.set_resizable(False)
- self.set_size_request(600, 400)
- self.set_position(Gtk.WindowPosition.CENTER)
-
- main_vbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=1)
- self.add(main_vbox)
-
- self.image = Gtk.Image()
- pimage = GdkPixbuf.Pixbuf().new_from_file_at_size(
- base_dir + "/images/splash.png", 600, 400
- )
- self.image.set_from_pixbuf(pimage)
-
- main_vbox.pack_start(self.image, True, True, 0)
-
- self.show_all()
diff --git a/usr/share/blackbox/yaml/netinstall-fonts.yaml b/usr/share/blackbox/yaml/netinstall-fonts.yaml
deleted file mode 100644
index 7e9d194..0000000
--- a/usr/share/blackbox/yaml/netinstall-fonts.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-- name: "Fonts"
- description: "Fonts"
- critical: false
- hidden: false
- selected: false
- expanded: true
- packages:
- - adobe-source-code-pro-fonts
- - adobe-source-sans-fonts
- - adobe-source-serif-fonts
- - awesome-terminal-fonts
- - libertinus-font
- - lohit-fonts
- - nerd-fonts-source-code-pro
- - noto-fonts
- - noto-fonts-emoji
- - ttf-anonymous-pro
- - ttf-bitstream-vera
- - ttf-caladea
- - ttf-carlito
- - ttf-cascadia-code
- - ttf-cormorant
- - ttf-croscore
- - ttf-dejavu
- - ttf-droid
- - ttf-eurof
- - ttf-fantasque-sans-mono
- - ttf-fira-code
- - ttf-fira-mono
- - ttf-fira-sans
- - ttf-font-awesome
- - ttf-hack
- - ttf-hactor
- - ttf-hellvetica
- - ttf-ibm-plex
- - ttf-inconsolata
- - ttf-iosevka-nerd
- - ttf-jetbrains-mono
- - ttf-jetbrains-mono-nerd
- - ttf-joypixels
- - ttf-lato
- - ttf-liberation
- - ttf-linux-libertine
- - ttf-linux-libertine-g
- - ttf-meslo-nerd-font-powerlevel10k
- - ttf-mac-fonts
- - ttf-monofur
- - ttf-ms-fonts
- - ttf-nerd-fonts-symbols
- - ttf-nerd-fonts-symbols-mono
- - ttf-opensans
- - ttf-proggy-clean
- - ttf-roboto
- - ttf-roboto-mono
- - ttf-ubuntu-font-family
\ No newline at end of file
diff --git a/usr/share/icons/hicolor/scalable/apps/blackbox.svg b/usr/share/icons/hicolor/scalable/apps/blackbox.svg
deleted file mode 100644
index be8bd6a..0000000
--- a/usr/share/icons/hicolor/scalable/apps/blackbox.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/usr/share/polkit-1/org.snigdhaos.blackbox.policy b/usr/share/polkit-1/org.snigdhaos.blackbox.policy
deleted file mode 100644
index 6a232ba..0000000
--- a/usr/share/polkit-1/org.snigdhaos.blackbox.policy
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Snigdha OS
- http://snigdhaos.org/
- package-x-generic
-
- Change your own user data
- Authentication is required to change your own user data
-
- auth_admin
- auth_admin
- auth_admin
-
- /usr/share/blackbox/blackbox.py
- true
-
-
\ No newline at end of file