🛠 refactor(construct): going on+

This commit is contained in:
Eshan Roy
2024-12-02 22:42:55 +05:30
parent 41cc0dc213
commit debc718dc8

View File

@@ -4,12 +4,15 @@ import subprocess
import logging import logging
from logging import Logger from logging import Logger
import locale import locale
import shutil
import tomlkit
import sys
import gi import gi
from gi.repository import Gtk from gi.repository import Gtk
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__))) BaseDir = os.path.abspath(os.path.join(os.path.dirname(__file__)))
sudousername = os.getlogin() SudoUsername = os.getlogin()
logger = logging.getLogger("logger") logger = logging.getLogger("logger")
ch = logging.StreamHandler() ch = logging.StreamHandler()
# source: https://stackoverflow.com/questions/3220284/how-to-customize-the-time-format-for-python-logging # source: https://stackoverflow.com/questions/3220284/how-to-customize-the-time-format-for-python-logging
@@ -17,17 +20,166 @@ formatter = logging.Formatter("%(asctime)s:%(levelname)s > %(message)s", "%Y-%m-
ch.setFormatter(formatter) ch.setFormatter(formatter)
logger.addHandler(ch) logger.addHandler(ch)
locale.setlocale(locale.LC_ALL, "C.utf-8") locale.setlocale(locale.LC_ALL, "C.utf-8")
locale_env = os.environ LocalEnv = os.environ
locale_env["LC_ALL"] = "C.utf-8" LocalEnv["LC_ALL"] = "C.utf-8"
def permissions(dst): def permissions(dst):
try: try:
groups = subprocess.run(["sh", "-c", "id " + sudousername],shell=False,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env=locale_env) groups = subprocess.run(["sh", "-c", "id " + SudoUsername],shell=False,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env=LocalEnv)
for i in groups.stdout.decode().split(" "): for i in groups.stdout.decode().split(" "):
if "gid" in i: if "gid" in i:
g = i.split("(")[1] g = i.split("(")[1]
group = g.replace(")", "".strip()) group = g.replace(")", "".strip())
subprocess.call(["chown", "-R", sudousername + ":" + group, dst],shell=False,env=locale_env) subprocess.call(["chown", "-R", SudoUsername + ":" + group, dst],shell=False,env=LocalEnv)
except Exception as e: except Exception as e:
logger.error("Found error in permissions() ! Type: %s" %e) logger.error("Found error in permissions() ! Type: %s" %e)
HomeDir = "/home/" + str(SudoUsername)
default_ConfigFile = "%s/default/config.toml" %BaseDir
ConfigDir = "%s/.config/snigdhaos-kernel-switcher" %HomeDir
ConfigFile = "%s/.config/snigdhaos-kernel-switcher/config.toml" %ConfigDir
def setupConfig(self):
try:
if not os.path.exists(ConfigDir):
makedirs(ConfigDir)
if not os.path.exists(ConfigFile):
shutil.copy(default_ConfigFile,ConfigDir)
permissions(ConfigDir)
return readConfig(self)
except Exception as e:
logger.error("Found error in setupConfig() ! Type: %s" %e)
SupportedKernelDict = {}
CommunityKernelDict = {}
def readConfig(self):
try:
logger.info("Reading config file: %s"%ConfigFile)
ConfigData = None
with open(ConfigFile, "rb") as f:
ConfigData = tomlkit.load(f)
if ConfigData.get("kernels") and "official" in ConfigData["kernels"] is not None:
for OfficialKernel in ConfigData["kernels"]["official"]:
SupportedKernelDict[OfficialKernel["name"]] = (OfficialKernel["description"], OfficialKernel["headers"])
if ConfigData.get("kernels") and "community" in ConfigData["kernels"] is not None:
for CommunityKernel in ConfigData["kernels"]["community"]:
CommunityKernelDict[CommunityKernel["name"]] = (CommunityKernel["description"], CommunityKernel["headers"], CommunityKernel["repository"])
if ConfigData.get("logging") is not None and "loglevel" in ConfigData["logging"] is not None:
loglevel = ConfigData["logging"]["loglevel"].lower()
logger.info("Setting LogLevel: %s" %loglevel)
if loglevel == "debug":
logger.setLevel(logging.DEBUG)
elif loglevel == "info":
logger.setLevel(logging.INFO)
else:
logger.warning("Invalid logging level set, use info / debug")
logger.setLevel(logging.INFO)
else:
logger.setLevel(logging.INFO)
return ConfigData
except Exception as e:
logger.error("Found error in readConfig() ! Type: %s"%e)
sys.exit(1)
def updateConfig(ConfigData, BootLoader):
try:
logger.info("Updating config data...")
with open(ConfigFile, "w") as f:
tomlkit.dump(ConfigData, f)
return True
except Exception as e:
logger.error("Found error in updateConfig() ! Type: %s"%e)
return False
CacheDir = "%s/.cache/snigdhaos-kernel-switcher" % HomeDir
CacheFile = "%s/kernels.toml" % CacheDir
CacheUpdate = "%s/update" % CacheDir
def createCacheDir():
try:
if not os.path.exists(CacheDir):
makedirs(CacheDir)
logger.info("Cache directory = %s" % CacheDir)
permissions(CacheDir)
except Exception as e:
logger.error("Found error in createCacheDir() ! Type: %s" %e)
LogDir = "/var/log/snigdhaos-kernel-switcher"
EventLogFile = "%s/event.log" %LogDir
def createLogDir():
try:
if not os.path.exists(LogDir):
makedirs(LogDir)
logger.info("Log directory : %s" %LogDir)
except Exception as e:
logger.error("Found error in create_log_dir() ! Type: %s" %e)
import datetime
FetchedKernelsDict = {}
ArchlinuxMirrorArchiveUrl = "https://archive.archlinux.org"
headers = {
"Content-Type": "text/plain;charset=UTF-8",
"User-Agent": "Mozilla/5.0 (Linux x86_64) Gecko Firefox",
}
def writeCache():
try:
if len(FetchedKernelsDict) > 0:
with open(CacheFile, "w", encoding="utf-8") as f:
f.write('title = "Arch Linux Kernels"\n\n')
f.write('timestamp = "%s"\n'%datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S"))
f.write('source = "%s"\n\n' % ArchlinuxMirrorArchiveUrl)
for kernel in FetchedKernelsDict.values():
f.write("[[kernel]]\n")
f.write('name = "%s"\nheaders = "%s"\nversion = "%s"\nsize = "%s"\nfile_format = "%s"\nlast_modified = "%s"\n\n'% (kernel.name,kernel.headers,kernel.version,kernel.size,kernel.file_format,kernel.last_modified))
permissions(CacheFile)
except Exception as e:
logger.error("Found error in write_cache() ! Type: %s" % e)
CacheDays = 5
CachedKernelsList = []
def readCache(self):
try:
self.timestamp = None
with open(CacheFile, "rb") as f:
data = tomlkit.load(f)
if len(data) == 0:
logger.error("%s is empty, delete it and open the app again" % CacheFile)
name = None
headers = None
version = None
size = None
last_modified = None
file_format = None
if len(data) > 0:
self.timestamp = data["timestamp"]
self.cache_timestamp = data["timestamp"]
if self.timestamp:
self.timestamp = datetime.datetime.strptime(self.timestamp, "%Y-%m-%d %H-%M-%S")
delta = datetime.datetime.now() - self.timestamp
if delta.days >= CacheDays:
logger.info("Cache is older than 5 days, refreshing ..")
refresh_cache(self)
else:
if delta.days > 0:
logger.debug("Cache is %s days old" % delta.days)
else:
logger.debug("Cache is newer than 5 days")
kernels = data["kernel"]
if len(kernels) > 1:
for k in kernels:
if (datetime.datetime.now().year - datetime.datetime.strptime(k["last_modified"], "%d-%b-%Y %H:%M").year <= 2):
CachedKernelsList.append(Kernel(k["name"],k["headers"],k["version"],k["size"],k["last_modified"],k["file_format"]))
name = None
headers = None
version = None
size = None
last_modified = None
file_format = None
if len(CachedKernelsList) > 0:
sorted(CachedKernelsList)
logger.info("Kernels cache data processed")
else:
logger.error("Cached file is invalid, remove it and try again")
else:
logger.error("Failed to read cache file")
except Exception as e:
logger.error("Exception in read_cache(): %s" % e)