mirror of
https://github.com/apache/superset.git
synced 2026-04-07 18:35:15 +00:00
84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import sys
|
|
|
|
import click
|
|
from flask import current_app
|
|
from flask.cli import with_appcontext
|
|
from werkzeug.security import check_password_hash
|
|
|
|
|
|
@click.command()
|
|
@with_appcontext
|
|
@click.option("--username", prompt="Admin Username", help="Admin Username")
|
|
@click.option(
|
|
"--silent",
|
|
is_flag=True,
|
|
prompt=(
|
|
"Are you sure you want to reset Superset? "
|
|
"This action cannot be undone. Continue?"
|
|
),
|
|
help="Confirmation flag",
|
|
)
|
|
@click.option(
|
|
"--exclude-users",
|
|
default=None,
|
|
help="Comma separated list of users to exclude from reset",
|
|
)
|
|
@click.option(
|
|
"--exclude-roles",
|
|
default=None,
|
|
help="Comma separated list of roles to exclude from reset",
|
|
)
|
|
def factory_reset(
|
|
username: str, silent: bool, exclude_users: str, exclude_roles: str
|
|
) -> None:
|
|
"""Factory Reset Apache Superset"""
|
|
|
|
# Check feature flag inside the command
|
|
if not current_app.config.get("FEATURE_FLAGS", {}).get(
|
|
"ENABLE_FACTORY_RESET_COMMAND"
|
|
):
|
|
click.secho(
|
|
"Factory reset command is disabled. Enable "
|
|
"ENABLE_FACTORY_RESET_COMMAND feature flag.",
|
|
fg="red",
|
|
)
|
|
sys.exit(1)
|
|
|
|
# pylint: disable=import-outside-toplevel
|
|
from superset import security_manager
|
|
from superset.commands.security.reset import ResetSupersetCommand
|
|
|
|
# Validate the user
|
|
password = click.prompt("Admin Password", hide_input=True)
|
|
user = security_manager.find_user(username)
|
|
if not user or not check_password_hash(user.password, password):
|
|
click.secho("Invalid credentials", fg="red")
|
|
sys.exit(1)
|
|
if not any(role.name == "Admin" for role in user.roles):
|
|
click.secho("Permission Denied", fg="red")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
ResetSupersetCommand(silent, user, exclude_users, exclude_roles).run()
|
|
click.secho("Factory reset complete", fg="green")
|
|
except Exception as ex: # pylint: disable=broad-except
|
|
click.secho(f"Factory reset failed: {ex}", fg="red")
|
|
sys.exit(1)
|