1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00

221 lines
5.5 KiB
Python
Raw Normal View History

2020-01-21 01:08:28 -07:00
"""CLI Command definitions."""
2020-02-03 02:35:11 -07:00
# Standard Library
2020-02-15 12:18:03 -07:00
import sys
2020-02-15 16:16:03 -07:00
from getpass import getuser
2020-01-21 01:08:28 -07:00
from pathlib import Path
2020-02-03 02:35:11 -07:00
# Third Party
import inquirer
2020-02-16 00:51:31 -07:00
from click import group, option, confirm, help_option
2020-01-21 01:08:28 -07:00
2020-02-03 02:35:11 -07:00
# Project
2020-04-13 01:06:03 -07:00
from hyperglass.util import cpu_count
from hyperglass.cli.echo import error, label, cmd_help
2020-04-13 01:06:03 -07:00
from hyperglass.cli.util import build_ui
2020-02-13 21:13:19 -07:00
from hyperglass.cli.static import LABEL, CLI_HELP, E
from hyperglass.cli.formatting import HelpColorsGroup, HelpColorsCommand, random_colors
2020-01-21 01:08:28 -07:00
# Define working directory
WORKING_DIR = Path(__file__).parent
2020-02-15 12:18:03 -07:00
supports_color = "utf" in sys.getfilesystemencoding().lower()
2020-01-21 01:08:28 -07:00
2020-02-16 00:51:31 -07:00
def _print_version(ctx, param, value):
from hyperglass import __version__
if not value or ctx.resilient_parsing:
return
label("hyperglass version: {v}", v=__version__)
ctx.exit()
@group(
2020-01-21 01:08:28 -07:00
cls=HelpColorsGroup,
help=CLI_HELP,
2020-02-16 00:51:31 -07:00
context_settings={"help_option_names": ["-h", "--help"], "color": supports_color},
2020-01-21 01:08:28 -07:00
help_headers_color=LABEL,
help_options_custom_colors=random_colors("build-ui", "start", "secret", "setup"),
2020-01-21 01:08:28 -07:00
)
2020-02-16 00:51:31 -07:00
@option(
"-v",
"--version",
is_flag=True,
callback=_print_version,
expose_value=False,
is_eager=True,
help=cmd_help(E.NUMBERS, "hyperglass version", supports_color),
)
@help_option(
"-h",
"--help",
help=cmd_help(E.FOLDED_HANDS, "Show this help message", supports_color),
)
2020-01-21 01:08:28 -07:00
def hg():
"""Initialize Click Command Group."""
pass
2020-02-15 12:18:03 -07:00
@hg.command(
"build-ui", help=cmd_help(E.BUTTERFLY, "Create a new UI build", supports_color)
)
2020-01-21 17:28:32 -07:00
def build_frontend():
2020-01-21 01:08:28 -07:00
"""Create a new UI build.
Raises:
click.ClickException: Raised on any errors.
"""
2020-01-21 17:28:32 -07:00
return build_ui()
2020-01-21 01:08:28 -07:00
@hg.command(
"start",
2020-02-15 12:18:03 -07:00
help=cmd_help(E.ROCKET, "Start web server", supports_color),
2020-01-21 01:08:28 -07:00
cls=HelpColorsCommand,
2020-04-13 01:06:03 -07:00
help_options_custom_colors=random_colors("-b", "-d", "-w"),
2020-01-21 01:08:28 -07:00
)
@option("-b", "--build", is_flag=True, help="Render theme & build frontend assets")
2020-04-13 01:06:03 -07:00
@option(
"-d",
"--direct",
is_flag=True,
default=False,
help="Start hyperglass directly instead of through process manager",
)
@option(
"-w",
"--workers",
type=int,
required=False,
default=0,
help=f"Number of workers. By default, calculated from CPU cores [{cpu_count(2)}]",
)
def start(build, direct, workers):
2020-01-21 01:08:28 -07:00
"""Start web server and optionally build frontend assets."""
try:
2020-04-13 01:06:03 -07:00
from hyperglass.main import start
from hyperglass.api import start as uvicorn_start
2020-01-21 01:08:28 -07:00
except ImportError as e:
2020-04-13 01:06:03 -07:00
error("Error importing hyperglass: {}", str(e))
kwargs = {}
if workers != 0:
kwargs["workers"] = workers
2020-01-21 01:08:28 -07:00
if build:
build_complete = build_ui()
2020-04-13 01:06:03 -07:00
if build_complete and not direct:
start(**kwargs)
elif build_complete and direct:
uvicorn_start(**kwargs)
2020-01-21 01:08:28 -07:00
2020-04-13 01:06:03 -07:00
if not build and not direct:
start(**kwargs)
elif not build and direct:
uvicorn_start(**kwargs)
2020-01-21 01:08:28 -07:00
@hg.command(
"secret",
2020-02-15 12:18:03 -07:00
help=cmd_help(E.LOCK, "Generate agent secret", supports_color),
2020-01-21 01:08:28 -07:00
cls=HelpColorsCommand,
help_options_custom_colors=random_colors("-l"),
)
@option(
2020-01-21 01:08:28 -07:00
"-l", "--length", "length", default=32, help="Number of characters [default: 32]"
)
def generate_secret(length):
"""Generate secret for hyperglass-agent.
Arguments:
length {int} -- Length of secret
"""
import secrets
gen_secret = secrets.token_urlsafe(length)
label("Secret: {s}", s=gen_secret)
@hg.command(
2020-02-14 22:54:31 -07:00
"setup",
2020-02-15 12:18:03 -07:00
help=cmd_help(E.TOOLBOX, "Run the setup wizard", supports_color),
2020-02-14 22:54:31 -07:00
cls=HelpColorsCommand,
help_options_custom_colors=random_colors("-d"),
)
@option(
"-d",
"--use-defaults",
"unattended",
default=False,
is_flag=True,
help="Use hyperglass defaults (requires no input)",
)
2020-02-14 22:54:31 -07:00
def setup(unattended):
"""Define application directory, move example files, generate systemd service."""
2020-02-15 20:02:47 -07:00
from hyperglass.cli.util import (
create_dir,
move_files,
make_systemd,
write_to_file,
migrate_static_assets,
2020-02-28 01:26:42 -07:00
install_systemd,
2020-02-15 20:02:47 -07:00
)
user_path = Path.home() / "hyperglass"
root_path = Path("/etc/hyperglass/")
install_paths = [
inquirer.List(
"install_path",
message="Choose a directory for hyperglass",
choices=[user_path, root_path],
)
]
2020-02-14 22:54:31 -07:00
if not unattended:
answer = inquirer.prompt(install_paths)
2020-02-28 01:26:42 -07:00
if answer is None:
error("A directory for hyperglass is required")
2020-02-14 22:54:31 -07:00
install_path = answer["install_path"]
2020-02-28 01:26:42 -07:00
2020-02-14 22:54:31 -07:00
elif unattended:
install_path = user_path
ui_dir = install_path / "static" / "ui"
custom_dir = install_path / "static" / "custom"
create_dir(install_path)
create_dir(ui_dir, parents=True)
create_dir(custom_dir, parents=True)
2020-02-28 01:26:42 -07:00
migrate_static_assets(install_path)
example_dir = WORKING_DIR.parent / "examples"
files = example_dir.iterdir()
2020-02-14 22:54:31 -07:00
do_move = True
if not unattended and not confirm(
"Do you want to install example configuration files? (This is non-destructive)"
):
2020-02-14 22:54:31 -07:00
do_move = False
if do_move:
move_files(example_dir, install_path, files)
if install_path == user_path:
2020-02-15 16:16:03 -07:00
user = getuser()
else:
user = "root"
2020-02-14 22:54:31 -07:00
do_systemd = True
if not unattended and not confirm(
"Do you want to generate a systemd service file?"
):
do_systemd = False
if do_systemd:
systemd_file = install_path / "hyperglass.service"
systemd = make_systemd(user)
write_to_file(systemd_file, systemd)
2020-02-28 01:26:42 -07:00
install_systemd(install_path)