26 lines
1.3 KiB
Python
26 lines
1.3 KiB
Python
"""Configure a new deployment; never reads secrets from shell arguments."""
|
|
import argparse,os,re,secrets
|
|
from pathlib import Path
|
|
from dotenv import dotenv_values,set_key
|
|
|
|
def main():
|
|
parser=argparse.ArgumentParser()
|
|
parser.add_argument('--domain',required=True)
|
|
parser.add_argument('--env',default='/etc/dilib-dashboard/dashboard.env')
|
|
args=parser.parse_args()
|
|
if not re.fullmatch(r'[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?',args.domain):
|
|
parser.error('Domain ohne Protokoll oder Port angeben')
|
|
path=Path(args.env)
|
|
if not path.is_file():parser.error('Env-Datei fehlt; zuerst install-central.sh ausführen')
|
|
current=dotenv_values(path)
|
|
# Updating the domain does not rotate existing secrets or change the database.
|
|
changes={'ALLOWED_HOSTS':args.domain+',127.0.0.1,localhost',
|
|
'CSRF_TRUSTED_ORIGINS':'https://'+args.domain}
|
|
for key in ('DJANGO_SECRET_KEY','NICEGUI_STORAGE_SECRET'):
|
|
if not current.get(key) or current[key].startswith('CHANGE_ME'):
|
|
changes[key]=secrets.token_urlsafe(64)
|
|
os.umask(0o077)
|
|
for key,value in changes.items():set_key(path,key,value,quote_mode='never')
|
|
print('Domain und gegebenenfalls Secrets gesetzt. DATABASE_URL und SMTP separat konfigurieren.')
|
|
if __name__=='__main__':main()
|