dynamically generate default config on first run

This commit is contained in:
Harvey Tindall 2020-06-29 23:06:58 +01:00
parent 4606415a38
commit 55d26b541a
8 changed files with 94 additions and 210 deletions

6
.gitignore vendored
View File

@ -4,13 +4,13 @@ MANIFEST.in
dist/ dist/
build/ build/
test.txt test.txt
data/node_modules/ jellyfin_accounts/data/node_modules/
jellyfin_accounts/data/config-default.ini
*.egg-info/ *.egg-info/
pw-reset/ pw-reset/
jfa/ jfa/
colors.txt colors.txt
theme.css theme.css
data/static/bootstrap-jf.css jellyfin_accounts/data/static/bootstrap-jf.css
old/ old/
.jf-accounts/ .jf-accounts/
tools/__pycache__/

View File

@ -49,10 +49,13 @@ first_run = False
if data_dir.exists() is False or (data_dir / "config.ini").exists() is False: if data_dir.exists() is False or (data_dir / "config.ini").exists() is False:
if not data_dir.exists(): if not data_dir.exists():
Path.mkdir(data_dir) 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: if args.config is None:
config_path = data_dir / "config.ini" 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.") print("Setup through the web UI, or quit and edit the configuration manually.")
first_run = True first_run = True
else: else:

View File

@ -1,118 +1,115 @@
[jellyfin] [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 username = username
password = password 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 server = http://jellyfin.local:8096
; Publicly accessible Jellyfin address, used on invite form. ; publicly accessible jellyfin address for invite form. leave blank to reuse the above address.
; Leave blank to use the same address as above.
public_server = https://jellyf.in:443 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 client = jf-accounts
version = 0.1 version = 0.2.4
device = jf-accounts device = jf-accounts
device_id = jf-accounts-0.1 device_id = jf-accounts-0.2.4
[ui] [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 host = 0.0.0.0
port = 8056 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 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 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 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 password = your password
debug = false debug = false
; displayed at bottom of all pages except admin
; Displayed at the bottom of all pages except admin
contact_message = Need help? contact me. contact_message = Need help? contact me.
; Displayed at top of form page. ; display at top of invite form.
help_message = Enter your details to create an account. help_message = Enter your details to create an account.
; Displayed when an account is created. ; displayed when a user creates an account
success_message = Your account has been created. Click below to continue to Jellyfin. success_message = Your account has been created. Click below to continue to Jellyfin.
[password_validation] [password_validation]
; Enables password validation. ; password validation (minimum length, etc.)
enabled = true enabled = true
; Min. password length
min_length = 8 min_length = 8
; Min. number of uppercase characters
upper = 1 upper = 1
; Min. number of lowercase characters
lower = 0 lower = 0
; Min. number of numbers
number = 1 number = 1
; Min. number of special characters
special = 0 special = 0
[email] [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 no_username = false
; Leave the rest of this section if you aren't using any email-related features.
use_24h = true use_24h = true
; Date format follows datetime's strftime. ; date format used in emails. follows datetime.strftime format.
date_format = %d/%m/%y date_format = %d/%m/%y
; Displayed at bottom of emails ; message displayed at bottom of emails.
message = Need help? contact me. message = Need help? contact me.
; Mail methods: mailgun, smtp ; method of sending email to use.
method = smtp method = smtp
; Address to send from ; address to send emails from
address = jellyfin@jellyf.in address = jellyfin@jellyf.in
; The name of the sender ; the name of the sender
from = Jellyfin from = Jellyfin
[password_resets] [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 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 watch_directory = /path/to/jellyfin
; Path to custom email html. If blank, uses the internal template. ; path to custom email html
email_html = email_html =
; Path to alternate plaintext email. If blank, uses the internal template. ; path to custom email in plain text
email_text = email_text =
; Subject of emails ; subject of password reset emails.
subject = Password Reset - Jellyfin subject = Password Reset - Jellyfin
[invite_emails] [invite_emails]
; If enabled, allows one to send an invite directly to an email address. ; settings for sending invites directly to users.
enabled = true enabled = true
; Path to custom email html. If blank, uses the internal template. ; path to custom email html
email_html = email_html =
; Path to alternate plaintext email. If blank, uses the internal template. ; path to custom email in plain text
email_text = email_text =
; subject of invite emails.
subject = Invite - Jellyfin 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 url_base = http://accounts.jellyf.in:8056/invite
[mailgun] [mailgun]
; mailgun api connection settings
api_url = https://api.mailgun.net... api_url = https://api.mailgun.net...
api_key = your api key api_key = your api key
[smtp] [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 encryption = starttls
; smtp server address.
server = smtp.jellyf.in server = smtp.jellyf.in
; Uses SMTP_SSL, so make sure the port is for this, not starttls.
port = 465 port = 465
password = smtp password password = smtp password
[files] [files]
; When the below paths are left blank, files are stored in ~/.jf-accounts/. ; optional settings for changing storage locations.
; location of stored invites (json).
; Path to store valid invites.
invites = invites =
; Path to store emails addresses in JSON ; location of stored email addresses (json).
emails = emails =
; Path to the user policy template. Can be acquired with get-defaults (jf-accounts -g). ; location of stored user policy template (json).
user_template = user_template =
; Path to the user configuration template (part of homescreen layout). Can be acquired with get-defaults (jf-accounts -g). ; location of stored user configuration template (used for setting homescreen layout) (json)
user_configuration = user_configuration =
; Path to the user display preferences template (part of homescreen layout). Can be acquired with get-defaults (jf-accounts -g). ; location of stored displaypreferences template (also used for homescreen layout) (json)
user_displayprefs = user_displayprefs =
; Path to custom bootstrap.css ; location of custom bootstrap css.
custom_css = custom_css =

View File

@ -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

View File

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "jellyfin-accounts" name = "jellyfin-accounts"
version = "0.2.3" version = "0.2.4"
readme = "README.md" readme = "README.md"
description = "A simple account management system for Jellyfin" description = "A simple account management system for Jellyfin"
authors = ["Harvey Tindall <harveyltindall@gmail.com>"] authors = ["Harvey Tindall <harveyltindall@gmail.com>"]

View File

@ -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 =

View File

@ -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.")