136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import re
|
|
import sys
|
|
|
|
from subprocess import run, PIPE
|
|
from glob import glob
|
|
from os import path
|
|
|
|
from HardcodeTray.const import DB_FOLDER, USERHOME
|
|
|
|
HARDCORE_TRAY_PACKAGES = ['hardcode-tray-git', 'hardcode-tray']
|
|
BLACKLIST = ['mullvad'] # Added cause got /usr/bin in it paths
|
|
|
|
CONVERSION_TOOL = 'RSVGConvert' # None if not needed
|
|
THEME = 'Papirus-Dark' # None if not needed
|
|
|
|
|
|
class Hook:
|
|
userhome_re = r"{userhome}"
|
|
|
|
def __init__(self, packages):
|
|
self.__packages = packages
|
|
self.__db = self.read_db_files()
|
|
|
|
|
|
def read_db_files(self):
|
|
""" Reading all package paths """
|
|
|
|
files = glob("{0}*.json".format(path.join(DB_FOLDER, "")))
|
|
db = {}
|
|
|
|
for db_file in files:
|
|
script_name = path.splitext(path.basename(db_file))[0]
|
|
|
|
if script_name in BLACKLIST:
|
|
continue
|
|
|
|
with open(db_file, 'r') as db_file:
|
|
app_path = json.load(db_file)['app_path']
|
|
db[script_name] = [re.sub(Hook.userhome_re, USERHOME, sctipt_path) for sctipt_path in app_path]
|
|
|
|
return db
|
|
|
|
def get_package_paths(self, package):
|
|
""" Reading all package paths from pacman """
|
|
|
|
regex = r"^%s\s+" % re.escape(package)
|
|
proc = run(
|
|
[
|
|
"pacman", "-Ql",
|
|
package
|
|
],
|
|
stdout=PIPE,
|
|
stderr=PIPE,
|
|
)
|
|
|
|
if proc.returncode == 0:
|
|
output = str(proc.stdout, "utf-8").split('\n')
|
|
return [re.sub(regex, '',line) for line in output if re.match(regex, line)]
|
|
else:
|
|
return []
|
|
|
|
def get_supported_scripts(self):
|
|
""" Finding supported scripts """
|
|
|
|
supported_scripts = [];
|
|
|
|
for package in self.__packages:
|
|
package_paths = self.get_package_paths(package)
|
|
for path in package_paths:
|
|
for script_name, script_paths in self.__db.items():
|
|
if path in script_paths:
|
|
supported_scripts.append(script_name)
|
|
|
|
return set(supported_scripts)
|
|
|
|
def run_hadcode_tray(self, packages = None):
|
|
""" Hardcode tray bit execution """
|
|
|
|
args = ["hardcode-tray"]
|
|
|
|
if CONVERSION_TOOL != None:
|
|
args += ["--conversion-tool", CONVERSION_TOOL]
|
|
|
|
if THEME != None:
|
|
args += ["--theme", THEME]
|
|
|
|
if packages != None:
|
|
args += ["--only", ','.join(packages)]
|
|
|
|
args.append("--apply")
|
|
|
|
proc = run(
|
|
args,
|
|
stdout=PIPE,
|
|
stderr=PIPE,
|
|
)
|
|
|
|
return (proc.returncode == 0)
|
|
|
|
def execute(self):
|
|
""" Execution method running hardcode-tray for supported apps"""
|
|
|
|
for package in self.__packages:
|
|
if package in HARDCORE_TRAY_PACKAGES:
|
|
if self.run_hadcode_tray():
|
|
print("All packages are updated.")
|
|
return True
|
|
else:
|
|
print("Packages update failed.")
|
|
return False
|
|
|
|
packages_for_update = self.get_supported_scripts()
|
|
|
|
if len(packages_for_update) == 0:
|
|
print("No packages for update has been found.")
|
|
return True
|
|
else:
|
|
if self.run_hadcode_tray(packages_for_update):
|
|
print("Packages: %s - updated." % ', '.join(packages_for_update))
|
|
return True
|
|
else:
|
|
print("Packages: %s - failed." % ', '.join(packages_for_update))
|
|
return False
|
|
|
|
return True
|
|
|
|
input_str = sys.stdin.read()
|
|
packages = [x for x in input_str.split('\n') if x]
|
|
hook = Hook(packages)
|
|
|
|
if not hook.execute():
|
|
sys.exit('Hook failed')
|