From 55d26b541ac67a5bfb7263b9a518953944280e19 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Mon, 29 Jun 2020 23:06:58 +0100 Subject: [PATCH] dynamically generate default config on first run --- .gitignore | 6 +- jellyfin_accounts/__init__.py | 7 +- .../data}/config-base.json | 0 jellyfin_accounts/data/config-default.ini | 109 ++++++++--------- jellyfin_accounts/generate_ini.py | 32 +++++ pyproject.toml | 2 +- tools/config.ini | 115 ------------------ tools/generate-config.py | 33 ----- 8 files changed, 94 insertions(+), 210 deletions(-) rename {tools => jellyfin_accounts/data}/config-base.json (100%) create mode 100644 jellyfin_accounts/generate_ini.py delete mode 100644 tools/config.ini delete mode 100644 tools/generate-config.py diff --git a/.gitignore b/.gitignore index ad134ed..6096704 100644 --- a/.gitignore +++ b/.gitignore @@ -4,13 +4,13 @@ MANIFEST.in dist/ build/ test.txt -data/node_modules/ +jellyfin_accounts/data/node_modules/ +jellyfin_accounts/data/config-default.ini *.egg-info/ pw-reset/ jfa/ colors.txt theme.css -data/static/bootstrap-jf.css +jellyfin_accounts/data/static/bootstrap-jf.css old/ .jf-accounts/ -tools/__pycache__/ diff --git a/jellyfin_accounts/__init__.py b/jellyfin_accounts/__init__.py index 697f117..f07edb4 100755 --- a/jellyfin_accounts/__init__.py +++ b/jellyfin_accounts/__init__.py @@ -49,10 +49,13 @@ first_run = False if data_dir.exists() is False or (data_dir / "config.ini").exists() is False: if not data_dir.exists(): Path.mkdir(data_dir) - print(f"Config dir not found, so created at {str(data_dir)}") + print(f"Config dir not found, so generating at {str(data_dir)}") if args.config is None: config_path = data_dir / "config.ini" - shutil.copy(str(local_dir / "config-default.ini"), str(config_path)) + from jellyfin_accounts.generate_ini import generate_ini + default_path = local_dir / "config-default.ini" + generate_ini(local_dir / "config-base.json", default_path) + shutil.copy(str(default_path), str(config_path)) print("Setup through the web UI, or quit and edit the configuration manually.") first_run = True else: diff --git a/tools/config-base.json b/jellyfin_accounts/data/config-base.json similarity index 100% rename from tools/config-base.json rename to jellyfin_accounts/data/config-base.json diff --git a/jellyfin_accounts/data/config-default.ini b/jellyfin_accounts/data/config-default.ini index 3c1541d..31631d2 100644 --- a/jellyfin_accounts/data/config-default.ini +++ b/jellyfin_accounts/data/config-default.ini @@ -1,118 +1,115 @@ [jellyfin] -; It is reccommended to create a limited admin account for this program. +; settings for connecting to jellyfin +; it is recommended to create a limited admin account for this program. username = username password = password -; Jellyfin server address. Can be public, or local for security purposes. +; jellyfin server address. can be public, or local for security purposes. server = http://jellyfin.local:8096 -; Publicly accessible Jellyfin address, used on invite form. -; Leave blank to use the same address as above. +; publicly accessible jellyfin address for invite form. leave blank to reuse the above address. public_server = https://jellyf.in:443 +; this and below settings will show on the jellyfin dashboard when the program connects. you may as well leave them alone. client = jf-accounts -version = 0.1 +version = 0.2.4 device = jf-accounts -device_id = jf-accounts-0.1 +device_id = jf-accounts-0.2.4 [ui] -; Set 0.0.0.0 to run localhost +; settings related to the ui and program functionality. +; set 0.0.0.0 to run on localhost host = 0.0.0.0 port = 8056 -; Enable this to use Jellyfin users instead of the below username and pw. +; enable this to use jellyfin users instead of the below username and pw. jellyfin_login = true -; Allows only admin users on Jellyfin to access admin page. +; allows only admin users on jellyfin to access the admin page. admin_only = true -; Username to use on admin page... (leave blank if using jellyfin_login) +; username for admin page (leave blank if using jellyfin_login) username = your username -; ..and its corresponding password (leave blank if using jellyfin_login) +; password for admin page (leave blank if using jellyfin_login) password = your password - debug = false - -; Displayed at the bottom of all pages except admin +; displayed at bottom of all pages except admin contact_message = Need help? contact me. -; Displayed at top of form page. -help_message = Enter your details to create an account. -; Displayed when an account is created. +; display at top of invite form. +help_message = Enter your details to create an account. +; displayed when a user creates an account success_message = Your account has been created. Click below to continue to Jellyfin. [password_validation] -; Enables password validation. -enabled = true -; Min. password length +; password validation (minimum length, etc.) +enabled = true min_length = 8 -; Min. number of uppercase characters upper = 1 -; Min. number of lowercase characters lower = 0 -; Min. number of numbers number = 1 -; Min. number of special characters special = 0 [email] -; When true, disables username input on invite form and sets the Jellyfin username to the email address +; general email settings. ignore if not using email features. +; use email address from invite form as username on jellyfin. no_username = false -; Leave the rest of this section if you aren't using any email-related features. use_24h = true -; Date format follows datetime's strftime. +; date format used in emails. follows datetime.strftime format. date_format = %d/%m/%y -; Displayed at bottom of emails +; message displayed at bottom of emails. message = Need help? contact me. -; Mail methods: mailgun, smtp +; method of sending email to use. method = smtp -; Address to send from +; address to send emails from address = jellyfin@jellyf.in -; The name of the sender +; the name of the sender from = Jellyfin [password_resets] -; Enable to store provided email addresses, monitor jellyfin directory for pw-resets, and send pin +; settings for the password reset handler. +; enable to store provided email addresses, monitor jellyfin directory for pw-resets, and send reset pins enabled = true -; Directory to monitor for passwordReset*.json files. Usually the jellyfin config directory +; path to the folder jellyfin puts password-reset files. watch_directory = /path/to/jellyfin -; Path to custom email html. If blank, uses the internal template. -email_html = -; Path to alternate plaintext email. If blank, uses the internal template. +; path to custom email html +email_html = +; path to custom email in plain text email_text = -; Subject of emails +; subject of password reset emails. subject = Password Reset - Jellyfin [invite_emails] -; If enabled, allows one to send an invite directly to an email address. +; settings for sending invites directly to users. enabled = true -; Path to custom email html. If blank, uses the internal template. -email_html = -; Path to alternate plaintext email. If blank, uses the internal template. +; path to custom email html +email_html = +; path to custom email in plain text email_text = +; subject of invite emails. subject = Invite - Jellyfin -; Base url for jf-accounts. This necessary because most will use a reverse proxy, so the program has no other way of knowing what URL to send. +; base url for jf-accounts. this is necessary because using a reverse proxy means the program has no way of knowing the url itself. url_base = http://accounts.jellyf.in:8056/invite [mailgun] - +; mailgun api connection settings api_url = https://api.mailgun.net... api_key = your api key [smtp] -; Choose between ssl_tls and starttls. Your provider should tell you which to use, but generally SSL/TLS is 465, STARTTLS 587 +; smtp server connection settings. +; your email provider should provide different ports for each encryption method. generally 465 for ssl_tls, 587 for starttls. encryption = starttls +; smtp server address. server = smtp.jellyf.in -; Uses SMTP_SSL, so make sure the port is for this, not starttls. port = 465 password = smtp password [files] -; When the below paths are left blank, files are stored in ~/.jf-accounts/. - -; Path to store valid invites. +; optional settings for changing storage locations. +; location of stored invites (json). invites = -; Path to store emails addresses in JSON +; location of stored email addresses (json). emails = -; Path to the user policy template. Can be acquired with get-defaults (jf-accounts -g). -user_template = -; Path to the user configuration template (part of homescreen layout). Can be acquired with get-defaults (jf-accounts -g). -user_configuration = -; Path to the user display preferences template (part of homescreen layout). Can be acquired with get-defaults (jf-accounts -g). -user_displayprefs = -; Path to custom bootstrap.css +; location of stored user policy template (json). +user_template = +; location of stored user configuration template (used for setting homescreen layout) (json) +user_configuration = +; location of stored displaypreferences template (also used for homescreen layout) (json) +user_displayprefs = +; location of custom bootstrap css. custom_css = diff --git a/jellyfin_accounts/generate_ini.py b/jellyfin_accounts/generate_ini.py new file mode 100644 index 0000000..1c78bfd --- /dev/null +++ b/jellyfin_accounts/generate_ini.py @@ -0,0 +1,32 @@ +import configparser +import json +from pathlib import Path + +def generate_ini(base_file, ini_file): + """ + Generates .ini file from config-base file. + """ + with open(Path(base_file), 'r') as f: + config_base = json.load(f) + + ini = configparser.RawConfigParser(allow_no_value=True) + + for section in config_base: + ini.add_section(section) + for entry in config_base[section]: + if 'description' in config_base[section][entry]: + ini.set(section, + '; ' + config_base[section][entry]['description']) + if entry != 'meta': + value = config_base[section][entry]['value'] + if isinstance(value, bool): + value = str(value).lower() + else: + value = str(value) + ini.set(section, + entry, + value) + + with open(Path(ini_file), 'w') as config_file: + ini.write(config_file) + return True diff --git a/pyproject.toml b/pyproject.toml index dfbe439..eae05d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "jellyfin-accounts" -version = "0.2.3" +version = "0.2.4" readme = "README.md" description = "A simple account management system for Jellyfin" authors = ["Harvey Tindall "] diff --git a/tools/config.ini b/tools/config.ini deleted file mode 100644 index 31631d2..0000000 --- a/tools/config.ini +++ /dev/null @@ -1,115 +0,0 @@ -[jellyfin] -; settings for connecting to jellyfin -; it is recommended to create a limited admin account for this program. -username = username -password = password -; jellyfin server address. can be public, or local for security purposes. -server = http://jellyfin.local:8096 -; publicly accessible jellyfin address for invite form. leave blank to reuse the above address. -public_server = https://jellyf.in:443 -; this and below settings will show on the jellyfin dashboard when the program connects. you may as well leave them alone. -client = jf-accounts -version = 0.2.4 -device = jf-accounts -device_id = jf-accounts-0.2.4 - -[ui] -; settings related to the ui and program functionality. -; set 0.0.0.0 to run on localhost -host = 0.0.0.0 -port = 8056 -; enable this to use jellyfin users instead of the below username and pw. -jellyfin_login = true -; allows only admin users on jellyfin to access the admin page. -admin_only = true -; username for admin page (leave blank if using jellyfin_login) -username = your username -; password for admin page (leave blank if using jellyfin_login) -password = your password -debug = false -; displayed at bottom of all pages except admin -contact_message = Need help? contact me. -; display at top of invite form. -help_message = Enter your details to create an account. -; displayed when a user creates an account -success_message = Your account has been created. Click below to continue to Jellyfin. - -[password_validation] -; password validation (minimum length, etc.) -enabled = true -min_length = 8 -upper = 1 -lower = 0 -number = 1 -special = 0 - -[email] -; general email settings. ignore if not using email features. -; use email address from invite form as username on jellyfin. -no_username = false -use_24h = true -; date format used in emails. follows datetime.strftime format. -date_format = %d/%m/%y -; message displayed at bottom of emails. -message = Need help? contact me. -; method of sending email to use. -method = smtp -; address to send emails from -address = jellyfin@jellyf.in -; the name of the sender -from = Jellyfin - -[password_resets] -; settings for the password reset handler. -; enable to store provided email addresses, monitor jellyfin directory for pw-resets, and send reset pins -enabled = true -; path to the folder jellyfin puts password-reset files. -watch_directory = /path/to/jellyfin -; path to custom email html -email_html = -; path to custom email in plain text -email_text = -; subject of password reset emails. -subject = Password Reset - Jellyfin - -[invite_emails] -; settings for sending invites directly to users. -enabled = true -; path to custom email html -email_html = -; path to custom email in plain text -email_text = -; subject of invite emails. -subject = Invite - Jellyfin -; base url for jf-accounts. this is necessary because using a reverse proxy means the program has no way of knowing the url itself. -url_base = http://accounts.jellyf.in:8056/invite - -[mailgun] -; mailgun api connection settings -api_url = https://api.mailgun.net... -api_key = your api key - -[smtp] -; smtp server connection settings. -; your email provider should provide different ports for each encryption method. generally 465 for ssl_tls, 587 for starttls. -encryption = starttls -; smtp server address. -server = smtp.jellyf.in -port = 465 -password = smtp password - -[files] -; optional settings for changing storage locations. -; location of stored invites (json). -invites = -; location of stored email addresses (json). -emails = -; location of stored user policy template (json). -user_template = -; location of stored user configuration template (used for setting homescreen layout) (json) -user_configuration = -; location of stored displaypreferences template (also used for homescreen layout) (json) -user_displayprefs = -; location of custom bootstrap css. -custom_css = - diff --git a/tools/generate-config.py b/tools/generate-config.py deleted file mode 100644 index 1d35ab9..0000000 --- a/tools/generate-config.py +++ /dev/null @@ -1,33 +0,0 @@ -import configparser, json -from pathlib import Path - -print("This tool generates a config.ini from the base JSON config format.") - -# path = Path(input("Path to config-base.json: ")) -path = 'config-base.json' - -with open(path, 'r') as f: - config_base = json.load(f) - -ini = configparser.RawConfigParser(allow_no_value=True) - -for section in config_base: - ini.add_section(section) - for entry in config_base[section]: - if 'description' in config_base[section][entry]: - ini.set(section, - '; ' + config_base[section][entry]['description']) - if entry != 'meta': - value = config_base[section][entry]['value'] - print(f'{entry} : {type(value)} : should be {config_base[section][entry]["type"]}') - if isinstance(value, bool): - value = str(value).lower() - else: - value = str(value) - ini.set(section, - entry, - value) - -with open('config.ini', 'w') as config_file: - ini.write(config_file) -print("written.")