From 37666c7daf43f12d47e5bd37af1ab86f36f84dcd Mon Sep 17 00:00:00 2001 From: Terry Geng Date: Fri, 21 Jan 2022 23:58:49 -0500 Subject: [PATCH] feat(config): Detect unexpected config items from config files. --- configuration.default.ini | 192 +++++++++++++++++++------------------ configuration.example.ini | 6 +- media/url.py | 4 +- media/url_from_playlist.py | 4 +- mumbleBot.py | 31 ++++-- util.py | 13 +++ 6 files changed, 142 insertions(+), 108 deletions(-) diff --git a/configuration.default.ini b/configuration.default.ini index 1109e7b..bf79c89 100644 --- a/configuration.default.ini +++ b/configuration.default.ini @@ -18,70 +18,73 @@ # ======================================================== [server] -host = 127.0.0.1 -port = 64738 -password = -channel = -tokens = certificate = +channel = +host = 127.0.0.1 +password = +port = 64738 +tokens = + [bot] -username = botamusique -comment = "Hi, I'm here to play radio, local music or youtube/soundcloud music. Have fun!" -<<<<<<< HEAD -avatar = -# default volume from 0 to 1. -======= ->>>>>>> 5d58f6d (fix(config): Reorganize) -volume = 0.1 -stereo = True -bandwidth = 96000 -playback_mode = one-shot -autoplay_length = 5 -clear_when_stop_in_oneshot = False -target_version = git admin = -music_folder = music_folder/ -tmp_folder = /tmp/ -pip3_path = venv/bin/pip -auto_check_update = True -logfile = -tmp_folder_max_size = 10 -download_attempts = 2 -ignored_folders = tmp -ignored_files = Thumbs.db -announce_current_music = True allow_other_channel_message = False allow_private_message = True -save_music_library = True -refresh_cache_on_startup = True -save_playlist = True -max_track_playlist = 20 -max_track_duration = 60 +announce_current_music = True +auto_check_update = True +autoplay_length = 5 +avatar = +bandwidth = 96000 +clear_when_stop_in_oneshot = False +comment = "Hi, I'm here to play radio, local music or youtube/soundcloud music. Have fun!" +database_path = +delete_allowed = True +download_attempts = 2 ducking = False -ducking_volume = 0.05 ducking_threshold = 3000 +ducking_volume = 0.05 +ignored_files = Thumbs.db +ignored_folders = tmp +language = en_US +logfile = +max_track_duration = 60 +max_track_playlist = 20 +music_database_path = +music_folder = music_folder/ +pip3_path = venv/bin/pip +playback_mode = one-shot +redirect_stderr = True +refresh_cache_on_startup = True +save_music_library = True +save_playlist = True +stereo = True +target_version = git +tmp_folder = /tmp/ +tmp_folder_max_size = 10 +username = botamusique +volume = 0.1 when_nobody_in_channel = nothing +youtube_query_cookie = [webinterface] +access_address = http://127.0.0.1:8181 +auth_method = none enabled = False +flask_secret = ChangeThisPassword is_web_proxified = True listening_addr = 127.0.0.1 listening_port = 8181 -web_logfile = -auth_method = none -user = -password = max_attempts = 10 -access_address = http://127.0.0.1:8181 -flask_secret = ChangeThisPassword -upload_enabled = True max_upload_file_size = 30M +password = +upload_enabled = True +user = +web_logfile = [debug] ffmpeg = False +mumble_connection = False redirect_ffmpeg_log = True -mumbleConnection = False youtube_dl = False [radio] @@ -91,64 +94,65 @@ radiobrony = http://62.210.138.34:8000/live "Brony music of a friend" jazz = http://jazz-wr04.ice.infomaniak.ch/jazz-wr04-128.mp3 "Jazz Yeah !" [youtube_dl] +cookie_file = source_address = -cookiefile = user_agent = [commands] -command_symbol = !:! -split_username_at_space = False -play_file = file, f -play_file_match = filematch, fm -play_url = url -play_radio = radio -play_playlist = playlist -rb_query = rbquery -rb_play = rbplay -yt_search = ysearch -yt_play = yplay -help = help -pause = pause -play = p, play -stop = stop -remove = rm -clear = clear -skip = skip -last = last -current_music = np, now -volume = volume -kill = kill -stop_and_getout = oust -joinme = joinme -queue = queue -repeat = repeat -random = random -version = version -mode = mode -update = update -list_file = listfile -play_tag = tag -add_tag = addtag -remove_tag = untag -find_tagged = findtagged, ft -search = search -delete_from_library = delete add_from_shortlist = shortlist, sl -user_ban = userban -user_unban = userunban -url_ban = urlban -url_ban_list = urlbanlist -url_unban = urlunban -url_whitelist = urlwhitelist, urlw -url_unwhitelist = urlunwhitelist, urlunw -url_whitelist_list = urlwhitelistlist, urlwls +add_tag = addtag +add_webinterface_user = webuseradd +change_user_password = password +clear = clear +command_symbol = !:! +current_music = np, now +delete_from_library = delete +drop_database = dropdatabase ducking = duck ducking_threshold = duckthres ducking_volume = duckv -drop_database = dropdatabase -rescan = rescan -requests_webinterface_access = web +find_tagged = findtagged, ft +help = help +joinme = joinme +kill = kill +last = last +list_file = listfile list_webinterface_user = webuserlist -add_webinterface_user = webuseradd +mode = mode +pause = pause +play = p, play +play_file = file, f +play_file_match = filematch, fm +play_playlist = playlist +play_radio = radio +play_tag = tag +play_url = url +queue = queue +random = random +rb_play = rbplay +rb_query = rbquery +remove = rm +remove_tag = untag remove_webinterface_user = webuserdel -change_user_password = password +repeat = repeat +requests_webinterface_access = web +rescan = rescan +search = search +skip = skip +split_username_at_space = False +stop = stop +stop_and_getout = oust +update = update +url_ban = urlban +url_ban_list = urlbanlist +url_unban = urlunban +url_unwhitelist = urlunwhitelist, urlunw +url_whitelist = urlwhitelist, urlw +url_whitelist_list = urlwhitelistlist, urlwls +user_ban = userban +user_unban = userunban +version = version +volume = volume +yt_play = yplay +yt_search = ysearch + diff --git a/configuration.example.ini b/configuration.example.ini index 9f1fbad..68668a7 100644 --- a/configuration.example.ini +++ b/configuration.example.ini @@ -180,7 +180,7 @@ port = 64738 # [debug] stores some debug settings. [debug] #ffmpeg = False # Set ffmpeg to True if you want to display DEBUG level log of ffmpeg. -#mumbleConnection = False # Set to True if you need to debug mumble connection (pymumble lib) +#mumble_connection = False # Set to True if you need to debug mumble connection (pymumble lib) #youtube_dl = False # Set to True if you need debug log from youtube-dl # [radio] is a list of default radio stations. @@ -193,8 +193,8 @@ port = 64738 [youtube_dl] # source_address , use '::' to force ipv6, "0.0.0.0" to force ipv4, or put the ip addresse you want to use. # source_address = '::' -# cookiefile , path of the cookie file (usefull if you reach youtube limits https://github.com/ytdl-org/youtube-dl#http-error-429-too-many-requests-or-402-payment-required) -# cookiefile = '/tmp/cooke_ydl' +# cookie_file , path of the cookie file (usefull if you reach youtube limits https://github.com/ytdl-org/youtube-dl#http-error-429-too-many-requests-or-402-payment-required) +# cookie_file = '/tmp/cooke_ydl' # user-agent allow the user to force the user-agent of youtube-dl # user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0" diff --git a/media/url.py b/media/url.py index f03455c..6e84c4e 100644 --- a/media/url.py +++ b/media/url.py @@ -170,9 +170,9 @@ class URLItem(BaseItem): 'verbose': var.config.getboolean('debug', 'youtube_dl') } - cookie = var.config.get('youtube_dl', 'cookiefile', fallback=None) + cookie = var.config.get('youtube_dl', 'cookie_file', fallback=None) if cookie: - ydl_opts['cookiefile'] = var.config.get('youtube_dl', 'cookiefile', fallback=None) + ydl_opts['cookiefile'] = var.config.get('youtube_dl', 'cookie_file', fallback=None) user_agent = var.config.get('youtube_dl', 'user_agent', fallback=None) if user_agent: diff --git a/media/url_from_playlist.py b/media/url_from_playlist.py index 22be223..3345fe3 100644 --- a/media/url_from_playlist.py +++ b/media/url_from_playlist.py @@ -15,9 +15,9 @@ def get_playlist_info(url, start_index=0, user=""): 'verbose': var.config.getboolean('debug', 'youtube_dl') } - cookie = var.config.get('youtube_dl', 'cookiefile', fallback=None) + cookie = var.config.get('youtube_dl', 'cookie_file', fallback=None) if cookie: - ydl_opts['cookiefile'] = var.config.get('youtube_dl', 'cookiefile', fallback=None) + ydl_opts['cookiefile'] = var.config.get('youtube_dl', 'cookie_file', fallback=None) user_agent = var.config.get('youtube_dl', 'user_agent', fallback=None) if user_agent: diff --git a/mumbleBot.py b/mumbleBot.py index ece1c53..ef32618 100644 --- a/mumbleBot.py +++ b/mumbleBot.py @@ -115,7 +115,7 @@ class MumbleBot: self.mumble = pymumble.Mumble(host, user=self.username, port=port, password=password, tokens=tokens, stereo=self.stereo, - debug=var.config.getboolean('debug', 'mumbleConnection'), + debug=var.config.getboolean('debug', 'mumble_connection'), certfile=certificate) self.mumble.callbacks.set_callback(pymumble.constants.PYMUMBLE_CLBK_TEXTMESSAGERECEIVED, self.message_received) @@ -798,11 +798,28 @@ if __name__ == '__main__': # ====================== config = configparser.ConfigParser(interpolation=None, allow_no_value=True) + default_config = configparser.ConfigParser(interpolation=None, allow_no_value=True) var.config = config - parsed_configs = config.read([util.solve_filepath('configuration.default.ini'), util.solve_filepath(args.config)], - encoding='utf-8') - if len(parsed_configs) == 0: - logging.error('Could not read configuration from file \"{}\"'.format(args.config)) + + if len(default_config.read( + util.solve_filepath('configuration.default.ini'), + encoding='utf-8')) == 0: + logging.error("Could not read default configuration file 'configuration.default.ini', please check" + "your installation.") + sys.exit() + + if len(config.read( + [util.solve_filepath('configuration.default.ini'), util.solve_filepath(args.config)], + encoding='utf-8')) == 0: + logging.error(f'Could not read configuration from file "{args.config}"') + sys.exit() + + extra_configs = util.check_extra_config(config, default_config) + if extra_configs: + extra_str = ", ".join([f"'[{k}] {v}'" for (k, v) in extra_configs]) + logging.error(f'Unexpected config items {extra_str} defined in your config file. ' + f'This is likely caused by a recent change in the names of config items, ' + f'or the removal of obsolete config items. Please refer to the changelog.') sys.exit() # ====================== @@ -845,9 +862,9 @@ if __name__ == '__main__': sanitized_username = "".join([x if x.isalnum() else "_" for x in username]) var.settings_db_path = args.db if args.db is not None else util.solve_filepath( - config.get("bot", "database_path", fallback=f"settings-{sanitized_username}.db")) + config.get("bot", "database_path", fallback="") or f"settings-{sanitized_username}.db") var.music_db_path = args.music_db if args.music_db is not None else util.solve_filepath( - config.get("bot", "music_database_path", fallback="music.db")) + config.get("bot", "music_database_path", fallback="") or "music.db") var.db = SettingsDatabase(var.settings_db_path) diff --git a/util.py b/util.py index 7dc9c83..82dc86f 100644 --- a/util.py +++ b/util.py @@ -561,3 +561,16 @@ def clear_tmp_folder(path, size): except (FileNotFoundError, OSError): continue return + + +def check_extra_config(config, template): + extra = [] + + for key in config.sections(): + if key in ['radio']: + continue + for opt in config.options(key): + if not template.has_option(key, opt): + extra.append((key, opt)) + + return extra \ No newline at end of file