feat: readonly config support read-only filesystem

This commit is contained in:
ThinkChaos 2024-02-05 21:27:26 -05:00
parent ac5c58c919
commit a816147e2e
No known key found for this signature in database
4 changed files with 38 additions and 17 deletions

View File

@ -15,13 +15,15 @@ class CleanerAgent:
def updateRules(self): def updateRules(self):
rawrules = [] rawrules = []
for f in os.listdir(data_dir["rules"]()): try:
if f.split('.')[-1].lower() != 'tsv': continue for f in os.listdir(data_dir["rules"]()):
filepath = data_dir["rules"](f) if f.split('.')[-1].lower() != 'tsv': continue
with open(filepath,'r') as filed: filepath = data_dir["rules"](f)
reader = csv.reader(filed,delimiter="\t") with open(filepath,'r') as filed:
rawrules += [[col for col in entry if col] for entry in reader if len(entry)>0 and not entry[0].startswith('#')] reader = csv.reader(filed,delimiter="\t")
rawrules += [[col for col in entry if col] for entry in reader if len(entry)>0 and not entry[0].startswith('#')]
except FileNotFoundError:
pass
self.rules_belongtogether = [r[1] for r in rawrules if r[0]=="belongtogether"] self.rules_belongtogether = [r[1] for r in rawrules if r[0]=="belongtogether"]
self.rules_notanartist = [r[1] for r in rawrules if r[0]=="notanartist"] self.rules_notanartist = [r[1] for r in rawrules if r[0]=="notanartist"]

View File

@ -19,12 +19,16 @@ def load_associated_rules():
# load from file # load from file
rawrules = [] rawrules = []
for f in os.listdir(data_dir["rules"]()): try:
if f.split('.')[-1].lower() != 'tsv': continue for f in os.listdir(data_dir["rules"]()):
filepath = data_dir["rules"](f) if f.split('.')[-1].lower() != 'tsv': continue
with open(filepath,'r') as filed: filepath = data_dir["rules"](f)
reader = csv.reader(filed,delimiter="\t") with open(filepath,'r') as filed:
rawrules += [[col for col in entry if col] for entry in reader if len(entry)>0 and not entry[0].startswith('#')] reader = csv.reader(filed,delimiter="\t")
rawrules += [[col for col in entry if col] for entry in reader if len(entry)>0 and not entry[0].startswith('#')]
except FileNotFoundError:
return
rules = [{'source_artist':r[1],'target_artist':r[2]} for r in rawrules if r[0]=="countas"] rules = [{'source_artist':r[1],'target_artist':r[2]} for r in rawrules if r[0]=="countas"]
#for rule in rules: #for rule in rules:

View File

@ -311,6 +311,12 @@ data_directories = {
} }
for identifier,path in data_directories.items(): for identifier,path in data_directories.items():
if path is None:
continue
if malojaconfig.readonly and (path == dir_settings['config'] or path.startswith(dir_settings['config']+'/')):
continue
try: try:
os.makedirs(path,exist_ok=True) os.makedirs(path,exist_ok=True)
if not is_dir_usable(path): raise PermissionError(f"Directory {path} is not usable!") if not is_dir_usable(path): raise PermissionError(f"Directory {path} is not usable!")
@ -321,7 +327,7 @@ for identifier,path in data_directories.items():
print("Cannot use",path,"for cache, finding new folder...") print("Cannot use",path,"for cache, finding new folder...")
data_directories['cache'] = dir_settings['cache'] = malojaconfig['DIRECTORY_CACHE'] = find_good_folder('cache') data_directories['cache'] = dir_settings['cache'] = malojaconfig['DIRECTORY_CACHE'] = find_good_folder('cache')
else: else:
print("Directory",path,"is not usable.") print(f"Directory for {identifier} ({path}) is not writeable.")
print("Please change permissions or settings!") print("Please change permissions or settings!")
print("Make sure Maloja has write and execute access to this directory.") print("Make sure Maloja has write and execute access to this directory.")
raise raise
@ -344,8 +350,10 @@ auth = doreah.auth.AuthManager(singleuser=True,cookieprefix='maloja',stylesheets
doreah.logging.defaultlogger.logfolder = data_dir['logs']() if malojaconfig["LOGGING"] else None doreah.logging.defaultlogger.logfolder = data_dir['logs']() if malojaconfig["LOGGING"] else None
try:
custom_css_files = [f for f in os.listdir(data_dir['css']()) if f.lower().endswith('.css')] custom_css_files = [f for f in os.listdir(data_dir['css']()) if f.lower().endswith('.css')]
except FileNotFoundError:
custom_css_files = []
from ..database.sqldb import set_maloja_info from ..database.sqldb import set_maloja_info
set_maloja_info({'last_run_version':VERSION}) set_maloja_info({'last_run_version':VERSION})

View File

@ -24,6 +24,12 @@ ext_apikeys = [
def copy_initial_local_files(): def copy_initial_local_files():
with resources.files("maloja") / 'data_files' as folder: with resources.files("maloja") / 'data_files' as folder:
for cat in dir_settings: for cat in dir_settings:
if dir_settings[cat] is None:
continue
if cat == 'config' and malojaconfig.readonly:
continue
distutils.dir_util.copy_tree(os.path.join(folder,cat),dir_settings[cat],update=False) distutils.dir_util.copy_tree(os.path.join(folder,cat),dir_settings[cat],update=False)
charset = list(range(10)) + list("abcdefghijklmnopqrstuvwxyz") + list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") charset = list(range(10)) + list("abcdefghijklmnopqrstuvwxyz") + list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
@ -37,7 +43,6 @@ def setup():
SKIP = malojaconfig["SKIP_SETUP"] SKIP = malojaconfig["SKIP_SETUP"]
try: try:
print("Various external services can be used to display images. If not enough of them are set up, only local images will be used.") print("Various external services can be used to display images. If not enough of them are set up, only local images will be used.")
for k in ext_apikeys: for k in ext_apikeys:
keyname = malojaconfig.get_setting_info(k)['name'] keyname = malojaconfig.get_setting_info(k)['name']
@ -45,6 +50,8 @@ def setup():
if key is False: if key is False:
print(f"\tCurrently not using a {col['red'](keyname)} for image display.") print(f"\tCurrently not using a {col['red'](keyname)} for image display.")
elif key is None or key == "ASK": elif key is None or key == "ASK":
if malojaconfig.readonly:
continue
promptmsg = f"\tPlease enter your {col['gold'](keyname)}. If you do not want to use one at this moment, simply leave this empty and press Enter." promptmsg = f"\tPlease enter your {col['gold'](keyname)}. If you do not want to use one at this moment, simply leave this empty and press Enter."
key = prompt(promptmsg,types=(str,),default=False,skip=SKIP) key = prompt(promptmsg,types=(str,),default=False,skip=SKIP)
malojaconfig[k] = key malojaconfig[k] = key