From fe2b0dd7c86a1a53515c62670adb43f050b95e4a Mon Sep 17 00:00:00 2001 From: Krateng Date: Fri, 25 Dec 2020 04:41:33 +0100 Subject: [PATCH] Reworked initial determination of user folders, GH-63 --- .../{ => config}/clients/example_file.tsv | 0 .../{ => config}/rules/predefined/.gitignore | 0 .../predefined/krateng_artistsingroups.tsv | 0 .../rules/predefined/krateng_cpop.tsv | 0 .../predefined/krateng_firefly-soundtrack.tsv | 0 .../rules/predefined/krateng_jeremysoule.tsv | 0 .../predefined/krateng_kpopgirlgroups.tsv | 0 .../predefined/krateng_lotr-soundtrack.tsv | 0 .../rules/predefined/krateng_masseffect.tsv | 0 .../rules/predefined/krateng_monstercat.tsv | 0 .../rules/predefined/predefined.info | 0 .../data_files/{ => config}/rules/rules.info | 0 .../{ => config}/settings/default.ini | 9 + maloja/data_files/scrobbles/dummy | 0 maloja/data_files/{ => state}/auth/dummy | 0 maloja/data_files/{ => state}/backups/dummy | 0 .../{ => state}/images/artists/dummy | 0 .../data_files/{ => state}/images/images.info | 0 .../{ => state}/images/tracks/dummy | 0 .../{logs => state/scrobbles}/dummy | 0 maloja/globalconf.py | 161 ++++++++++++++---- setup.py | 1 - 22 files changed, 141 insertions(+), 30 deletions(-) rename maloja/data_files/{ => config}/clients/example_file.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/.gitignore (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_artistsingroups.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_cpop.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_firefly-soundtrack.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_jeremysoule.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_kpopgirlgroups.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_lotr-soundtrack.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_masseffect.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/krateng_monstercat.tsv (100%) rename maloja/data_files/{ => config}/rules/predefined/predefined.info (100%) rename maloja/data_files/{ => config}/rules/rules.info (100%) rename maloja/data_files/{ => config}/settings/default.ini (86%) delete mode 100644 maloja/data_files/scrobbles/dummy rename maloja/data_files/{ => state}/auth/dummy (100%) rename maloja/data_files/{ => state}/backups/dummy (100%) rename maloja/data_files/{ => state}/images/artists/dummy (100%) rename maloja/data_files/{ => state}/images/images.info (100%) rename maloja/data_files/{ => state}/images/tracks/dummy (100%) rename maloja/data_files/{logs => state/scrobbles}/dummy (100%) diff --git a/maloja/data_files/clients/example_file.tsv b/maloja/data_files/config/clients/example_file.tsv similarity index 100% rename from maloja/data_files/clients/example_file.tsv rename to maloja/data_files/config/clients/example_file.tsv diff --git a/maloja/data_files/rules/predefined/.gitignore b/maloja/data_files/config/rules/predefined/.gitignore similarity index 100% rename from maloja/data_files/rules/predefined/.gitignore rename to maloja/data_files/config/rules/predefined/.gitignore diff --git a/maloja/data_files/rules/predefined/krateng_artistsingroups.tsv b/maloja/data_files/config/rules/predefined/krateng_artistsingroups.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_artistsingroups.tsv rename to maloja/data_files/config/rules/predefined/krateng_artistsingroups.tsv diff --git a/maloja/data_files/rules/predefined/krateng_cpop.tsv b/maloja/data_files/config/rules/predefined/krateng_cpop.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_cpop.tsv rename to maloja/data_files/config/rules/predefined/krateng_cpop.tsv diff --git a/maloja/data_files/rules/predefined/krateng_firefly-soundtrack.tsv b/maloja/data_files/config/rules/predefined/krateng_firefly-soundtrack.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_firefly-soundtrack.tsv rename to maloja/data_files/config/rules/predefined/krateng_firefly-soundtrack.tsv diff --git a/maloja/data_files/rules/predefined/krateng_jeremysoule.tsv b/maloja/data_files/config/rules/predefined/krateng_jeremysoule.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_jeremysoule.tsv rename to maloja/data_files/config/rules/predefined/krateng_jeremysoule.tsv diff --git a/maloja/data_files/rules/predefined/krateng_kpopgirlgroups.tsv b/maloja/data_files/config/rules/predefined/krateng_kpopgirlgroups.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_kpopgirlgroups.tsv rename to maloja/data_files/config/rules/predefined/krateng_kpopgirlgroups.tsv diff --git a/maloja/data_files/rules/predefined/krateng_lotr-soundtrack.tsv b/maloja/data_files/config/rules/predefined/krateng_lotr-soundtrack.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_lotr-soundtrack.tsv rename to maloja/data_files/config/rules/predefined/krateng_lotr-soundtrack.tsv diff --git a/maloja/data_files/rules/predefined/krateng_masseffect.tsv b/maloja/data_files/config/rules/predefined/krateng_masseffect.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_masseffect.tsv rename to maloja/data_files/config/rules/predefined/krateng_masseffect.tsv diff --git a/maloja/data_files/rules/predefined/krateng_monstercat.tsv b/maloja/data_files/config/rules/predefined/krateng_monstercat.tsv similarity index 100% rename from maloja/data_files/rules/predefined/krateng_monstercat.tsv rename to maloja/data_files/config/rules/predefined/krateng_monstercat.tsv diff --git a/maloja/data_files/rules/predefined/predefined.info b/maloja/data_files/config/rules/predefined/predefined.info similarity index 100% rename from maloja/data_files/rules/predefined/predefined.info rename to maloja/data_files/config/rules/predefined/predefined.info diff --git a/maloja/data_files/rules/rules.info b/maloja/data_files/config/rules/rules.info similarity index 100% rename from maloja/data_files/rules/rules.info rename to maloja/data_files/config/rules/rules.info diff --git a/maloja/data_files/settings/default.ini b/maloja/data_files/config/settings/default.ini similarity index 86% rename from maloja/data_files/settings/default.ini rename to maloja/data_files/config/settings/default.ini index 206f460..4d0ecd2 100644 --- a/maloja/data_files/settings/default.ini +++ b/maloja/data_files/config/settings/default.ini @@ -2,6 +2,15 @@ # Instead, simply write an entry with the same name in your own settings.ini file # Category headers in [brackets] are only for organization and not necessary +[Directories] +# DATA_DIR determines the base directory. It should be specified as environment +# variable because this file itself is loaded from it. +# Configuration is always in this base directory. Other data defaults to be here +# too, but can be customized with the options below. +DATA_DIR_STATE = None # This is /var/lib/maloja per XDG +DATA_DIR_LOGS = None # this is /var/log/maloja per XDG +DATA_DIR_CACHE = None # this is /var/cache/maloja per XDG + [HTTP] WEB_PORT = 42010 diff --git a/maloja/data_files/scrobbles/dummy b/maloja/data_files/scrobbles/dummy deleted file mode 100644 index e69de29..0000000 diff --git a/maloja/data_files/auth/dummy b/maloja/data_files/state/auth/dummy similarity index 100% rename from maloja/data_files/auth/dummy rename to maloja/data_files/state/auth/dummy diff --git a/maloja/data_files/backups/dummy b/maloja/data_files/state/backups/dummy similarity index 100% rename from maloja/data_files/backups/dummy rename to maloja/data_files/state/backups/dummy diff --git a/maloja/data_files/images/artists/dummy b/maloja/data_files/state/images/artists/dummy similarity index 100% rename from maloja/data_files/images/artists/dummy rename to maloja/data_files/state/images/artists/dummy diff --git a/maloja/data_files/images/images.info b/maloja/data_files/state/images/images.info similarity index 100% rename from maloja/data_files/images/images.info rename to maloja/data_files/state/images/images.info diff --git a/maloja/data_files/images/tracks/dummy b/maloja/data_files/state/images/tracks/dummy similarity index 100% rename from maloja/data_files/images/tracks/dummy rename to maloja/data_files/state/images/tracks/dummy diff --git a/maloja/data_files/logs/dummy b/maloja/data_files/state/scrobbles/dummy similarity index 100% rename from maloja/data_files/logs/dummy rename to maloja/data_files/state/scrobbles/dummy diff --git a/maloja/globalconf.py b/maloja/globalconf.py index 61adb2c..ffa0def 100644 --- a/maloja/globalconf.py +++ b/maloja/globalconf.py @@ -2,41 +2,144 @@ import os from doreah.settings import get_settings from doreah.settings import config as settingsconfig +pthj = os.path.join + +try: + HOME_DIR = os.environ["XDG_DATA_HOME"].split(":")[0] + assert os.path.exists(HOME_DIR) +except: + HOME_DIR = os.path.join(os.environ["HOME"],".local/share/") -# check environment variables for data directory -# otherwise, go with defaults -setting_datadir = get_settings("DATA_DIRECTORY",files=[],environ_prefix="MALOJA_") -if setting_datadir is not None and os.path.exists(setting_datadir): - DATA_DIR = setting_datadir +# if DATA_DIRECTORY is specified, this is the directory to use for EVERYTHING, no matter what +# but with asynnetrical structure, cache and logs in subfolders +# otherwise, each directory is treated seperately +# in that case, individual settings for each are respected +# DIRECRORY_CONFIG, DIRECRORY_STATE, DIRECTORY_LOGS and DIRECTORY_CACHE +# config can only be determined by environment variable, the others can be loaded +# from the config files +# explicit settings will always be respected. if there are none: +# first check if there is any indication of one of the possibilities being populated already +# if not, use the first we have permissions for +# after we decide which to use, fix it in settings to avoid future heuristics + + +usrfol = pthj(HOME_DIR,"maloja") +etccfg = '/etc/maloja' +varlib = '/var/lib/maloja' +varcac = '/var/cache/maloja' +varlog = '/var/log/maloja' + +dir_settings = { + "config":None, + "state":None, + "logs":None, + "cache":None, +# "clients":None, +# "rules":None, +# "settings":None, +# "auth":None, +# "backups":None, +# "images":None, +# "scrobbles":None, +# "logs":None, +# "cache":None +} + +dir_options = { + "config":[ + "/etc/maloja", + pthj(HOME_DIR,"maloja") + ], + "state":[ + "/var/lib/maloja", + "/etc/maloja", + pthj(HOME_DIR,"maloja") + ], + "logs":[ + "/var/log/maloja", + "/etc/maloja/logs", + pthj(HOME_DIR,"maloja","logs") + ], + "cache":[ + "/var/cache/maloja", + "/etc/maloja/cache", + pthj(HOME_DIR,"maloja","cache") + ] +} + +sentinels = { + "config":"settings", + "state":"scrobbles", + "logs":None, + "cache":None, +} + +# check environ variables +stng_data = get_settings("DATA_DIRECTORY",files=[],environ_prefix="MALOJA_") +if stng_data is not None: + dir_settings['config'] = stng_data + dir_settings['state'] = stng_data + dir_settings['cache'] = pthj(stng_data,'cache') + dir_settings['logs'] = pthj(stng_data,'logs') else: - try: - HOME_DIR = os.environ["XDG_DATA_HOME"].split(":")[0] - assert os.path.exists(HOME_DIR) - except: - HOME_DIR = os.path.join(os.environ["HOME"],".local/share/") - - OLD_DATA_DIR = os.path.join(HOME_DIR,"maloja") - NEW_DATA_DIR = "/etc/maloja" - - if os.path.exists(OLD_DATA_DIR): - DATA_DIR = OLD_DATA_DIR - else: - try: - #check if we have permissions - os.makedirs(NEW_DATA_DIR,exist_ok=True) - os.mknod(os.path.join(NEW_DATA_DIR,".test")) - os.remove(os.path.join(NEW_DATA_DIR,".test")) - DATA_DIR = NEW_DATA_DIR - except: - DATA_DIR = OLD_DATA_DIR - -os.makedirs(DATA_DIR,exist_ok=True) + dir_settings['config'], dir_settings['state'], dir_settings['cache'], dir_settings['logs'] = get_settings("DIRECTORY_CONFIG","DIRECTORY_STATE","DIRECTORY_LOGS","DIRECTORY_CACHE",files=[],environ_prefix="MALOJA_") + # as soon as we know the config directory, we can load from settings file + if dir_settings['config'] is not None: + settingsfiles = [pthj(dir_settings['config'],'settings','default.ini'),pthj(dir_settings['config'],'settings','settings.ini')] + dir_settings['config'], dir_settings['state'], dir_settings['cache'], dir_settings['logs'] = get_settings("DIRECTORY_CONFIG","DIRECTORY_STATE","DIRECTORY_LOGS","DIRECTORY_CACHE",files=settingsfiles,environ_prefix="MALOJA_") +# now to the stuff no setting has explicitly defined +for dirtype in dir_settings: + if dir_settings[dirtype] is None: + for option in dir_options[dirtype]: + if os.path.exists(option): + # check if this is really the directory used for this category (/etc/maloja could be used for state or just config) + if sentinels[dirtype] is None or os.path.exists(pthj(option,sentinels[dirtype])): + dir_settings[dirtype] = option + break -def datadir(*args): - return os.path.join(DATA_DIR,*args) +# if no directory seems to exist, use the first writable one +for dirtype in dir_settings: + if dir_settings[dirtype] is None: + for option in dir_options[dirtype]: + try: + os.makedirs(option,exist_ok=True) + os.mknod(pthj(option,".test")) + os.remove(pthj(option,".test")) + dir_settings[dirtype] = option + break + except: + pass + + +print("") +print("") +print(dir_settings) +print("") +print("") + +if any((dir_settings[s] is None) for s in dir_settings): + print("NOT ALL DIRECTORIES SET!") + + +data_directories = { + "auth":pthj(dir_settings['state'],"auth"), + "backups":pthj(dir_settings['state'],"backups"), + "images":pthj(dir_settings['state'],"images"), + "scrobbles":pthj(dir_settings['state'],"scrobbles"), + "rules":pthj(dir_settings['config'],"rules"), + "clients":pthj(dir_settings['config'],"clients"), + "settings":pthj(dir_settings['config'],"settings"), + "logs":pthj(dir_settings['logs']), + "cache":pthj(dir_settings['cache']), +} + + +data_dir = { + k:lambda *x: pthj(data_directories[k],*x) for k in data_directories +} diff --git a/setup.py b/setup.py index 77fdeb3..9af2d0e 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,6 @@ sys.path.insert(0,".") pkginfo = importlib.import_module(".__pkginfo__",package=packagename) pkginfo = pkginfo.__dict__ -print(pkginfo) # extract info