various cli changes

* ensure database file is correctly named in docker container
* add `--skip-questions` option to setup command
* ask to proceed with setup if private key already exists
This commit is contained in:
Izalia Mae 2024-04-02 13:36:08 -04:00
parent 7064adb000
commit 71de40dfca

View file

@ -1,11 +1,10 @@
from __future__ import annotations from __future__ import annotations
import Crypto
import aputils import aputils
import asyncio import asyncio
import click import click
import json
import os import os
import platform
import typing import typing
from pathlib import Path from pathlib import Path
@ -40,14 +39,36 @@ def cli(ctx: click.Context, config: Path | None) -> None:
if IS_DOCKER: if IS_DOCKER:
config = Path("/data/relay.yaml") config = Path("/data/relay.yaml")
# The database was named "relay.jsonld" even though it's an sqlite file. Fix it.
db = Path('/data/relay.sqlite3')
wrongdb = Path('/data/relay.jsonld')
if wrongdb.exists() and not db.exists():
try:
with wrongdb.open('rb') as fd:
json.load(fd)
except json.JSONDecodeError:
wrongdb.rename(db)
ctx.obj = Application(config) ctx.obj = Application(config)
@cli.command('setup') @cli.command('setup')
@click.option('--skip-questions', '-s', is_flag = True, help = 'Just setup the database')
@click.pass_context @click.pass_context
def cli_setup(ctx: click.Context) -> None: def cli_setup(ctx: click.Context, skip_questions: bool) -> None:
'Generate a new config and create the database' 'Generate a new config and create the database'
if ctx.obj.signer is not None:
if not click.prompt('The database is already setup. Are you sure you want to continue?'):
return
if skip_questions and ctx.obj.config.domain.endswith('example.com'):
click.echo('You cannot skip the questions if the relay is not configured yet')
return
if not skip_questions:
while True: while True:
ctx.obj.config.domain = click.prompt( ctx.obj.config.domain = click.prompt(
'What domain will the relay be hosted on?', 'What domain will the relay be hosted on?',
@ -179,34 +200,15 @@ def cli_setup(ctx: click.Context) -> None:
def cli_run(ctx: click.Context, dev: bool = False) -> None: def cli_run(ctx: click.Context, dev: bool = False) -> None:
'Run the relay' 'Run the relay'
if ctx.obj.config.domain.endswith('example.com') or not ctx.obj.signer: if ctx.obj.config.domain.endswith('example.com') or ctx.obj.signer is None:
if not IS_DOCKER: if not IS_DOCKER:
click.echo( click.echo('Relay is not set up. Please run "activityrelay setup".')
'Relay is not set up. Please edit your relay config or run "activityrelay setup".'
)
return return
cli_setup.callback() # type: ignore cli_setup.callback() # type: ignore
return return
vers_split = platform.python_version().split('.')
pip_command = 'pip3 uninstall pycrypto && pip3 install pycryptodome'
if Crypto.__version__ == '2.6.1':
if int(vers_split[1]) > 7:
click.echo(
'Error: PyCrypto is broken on Python 3.8+. Please replace it with pycryptodome ' +
'before running again. Exiting...'
)
click.echo(pip_command)
return
click.echo('Warning: PyCrypto is old and should be replaced with pycryptodome')
click.echo(pip_command)
return
ctx.obj['dev'] = dev ctx.obj['dev'] = dev
ctx.obj.run() ctx.obj.run()