clickhouse-users-cli 0.1.2__tar.gz → 0.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/PKG-INFO +2 -1
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/README.md +1 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/__init__.py +1 -1
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/app.py +49 -1
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/sql_builder.py +13 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/PKG-INFO +2 -1
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/LICENSE +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/db.py +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/session.py +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/style.py +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/validators.py +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/SOURCES.txt +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/dependency_links.txt +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/entry_points.txt +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/requires.txt +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/top_level.txt +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/pyproject.toml +0 -0
- {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clickhouse-users-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Keywords: clickhouse,cli,users,access-control,least-privilege
|
|
@@ -76,6 +76,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
|
|
|
76
76
|
|
|
77
77
|
- **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
|
|
78
78
|
- **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
|
|
79
|
+
- **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
|
|
79
80
|
- **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
|
|
80
81
|
- **Reativar** → `ALTER USER \`nome\` HOST ANY`;
|
|
81
82
|
- **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).
|
|
@@ -52,6 +52,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
|
|
|
52
52
|
|
|
53
53
|
- **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
|
|
54
54
|
- **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
|
|
55
|
+
- **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
|
|
55
56
|
- **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
|
|
56
57
|
- **Reativar** → `ALTER USER \`nome\` HOST ANY`;
|
|
57
58
|
- **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).
|
|
@@ -17,6 +17,7 @@ from clickhouse_users_cli.sql_builder import (
|
|
|
17
17
|
build_all_statements,
|
|
18
18
|
build_deactivate_user_sql,
|
|
19
19
|
build_drop_user_sql,
|
|
20
|
+
build_edit_grants_statements,
|
|
20
21
|
)
|
|
21
22
|
from clickhouse_users_cli.style import APP_STYLE, banner, console, error, info, make_table, step, success, warn
|
|
22
23
|
from clickhouse_users_cli.session import SESSION_FILE
|
|
@@ -418,7 +419,7 @@ def ask_main_action(show_forget: bool = False) -> str:
|
|
|
418
419
|
choices = [
|
|
419
420
|
Q.Choice("Criar usuário — com privilégio mínimo", value="create"),
|
|
420
421
|
Q.Choice("Listar usuários — SHOW USERS + grants", value="list"),
|
|
421
|
-
Q.Choice("Gerenciar usuário — desativar / reativar / excluir", value="manage"),
|
|
422
|
+
Q.Choice("Gerenciar usuário — acessos, desativar / reativar / excluir", value="manage"),
|
|
422
423
|
]
|
|
423
424
|
if show_forget:
|
|
424
425
|
choices.append(Q.Choice("Esquecer sessão — apagar YAML salvo", value="forget"))
|
|
@@ -504,6 +505,49 @@ def flow_list_users(admin: ClickHouseAdmin) -> None:
|
|
|
504
505
|
show_user_details(admin, target)
|
|
505
506
|
|
|
506
507
|
|
|
508
|
+
def flow_edit_grants(admin: ClickHouseAdmin, username: str) -> None:
|
|
509
|
+
"""Redefine os acessos: REVOKE ALL + GRANTs novos (perfil + escopo + hosts intactos)."""
|
|
510
|
+
step("Usuários · Editar permissões", "Os acessos atuais serão zerados e reaplicados. Nada muda sem confirmação.")
|
|
511
|
+
if username == admin.conn.username:
|
|
512
|
+
warn(f"'{username}' é o usuário conectado agora. Zerar os próprios acessos pode te derrubar.")
|
|
513
|
+
|
|
514
|
+
profile = ask_profile()
|
|
515
|
+
privileges, grant_option = ask_privileges(profile)
|
|
516
|
+
if profile == "admin":
|
|
517
|
+
grant_option = True
|
|
518
|
+
databases = ask_databases(admin)
|
|
519
|
+
scopes = ask_tables(admin, databases)
|
|
520
|
+
|
|
521
|
+
statements = build_edit_grants_statements(username, privileges, scopes, grant_option)
|
|
522
|
+
table = make_table(f"Novos acessos de '{username}'")
|
|
523
|
+
table.add_column("Privilégios", style="bold")
|
|
524
|
+
table.add_column("Escopo", style="bold")
|
|
525
|
+
table.add_column("Grant option", style="dim")
|
|
526
|
+
for s in scopes:
|
|
527
|
+
table.add_row(", ".join(privileges), s.on_clause(), "sim" if grant_option else "não")
|
|
528
|
+
console.print(table)
|
|
529
|
+
|
|
530
|
+
console.print("[dim]SQL a executar (ordem importa: primeiro zera, depois concede):[/]")
|
|
531
|
+
from rich.panel import Panel as RichPanel
|
|
532
|
+
|
|
533
|
+
for sql in statements:
|
|
534
|
+
console.print(RichPanel(Syntax(sql + ";", "sql", theme="monokai"), border_style="dim"))
|
|
535
|
+
|
|
536
|
+
go = _ask_or_abort(Q.confirm(f"Aplicar novos acessos a '{username}' agora?", default=False, style=APP_STYLE, qmark="›"))
|
|
537
|
+
if not go:
|
|
538
|
+
console.print("[dim]Nada foi executado.[/]")
|
|
539
|
+
return
|
|
540
|
+
|
|
541
|
+
with console.status("[cyan]Aplicando acessos…[/]", spinner="dots"):
|
|
542
|
+
try:
|
|
543
|
+
admin.execute_statements(statements)
|
|
544
|
+
except Exception as e:
|
|
545
|
+
error(f"Falha ao editar acessos: {e}")
|
|
546
|
+
info("Dica: a conta precisa de GRANT/REVOKE nos escopos envolvidos. Os acessos antigos podem ter sido zerados — confira com Listar.")
|
|
547
|
+
return
|
|
548
|
+
success(f"Acessos de '{username}' atualizados ({len(statements)} comando(s)).")
|
|
549
|
+
|
|
550
|
+
|
|
507
551
|
def flow_manage_users(admin: ClickHouseAdmin) -> None:
|
|
508
552
|
step("Usuários · Gerenciar", "Desativar = HOST NONE (reversível). Excluir = DROP USER (definitivo).")
|
|
509
553
|
with console.status("[cyan]Listando usuários…[/]", spinner="dots"):
|
|
@@ -537,6 +581,7 @@ def flow_manage_users(admin: ClickHouseAdmin) -> None:
|
|
|
537
581
|
else:
|
|
538
582
|
options.append(Q.Choice("Desativar — ALTER USER … HOST NONE (reversível)", value="deactivate"))
|
|
539
583
|
options += [
|
|
584
|
+
Q.Choice("Editar permissões — bancos/tabelas + tipo de acesso", value="edit"),
|
|
540
585
|
Q.Choice("Excluir — DROP USER (definitivo!)", value="drop"),
|
|
541
586
|
Q.Choice("Voltar ao menu", value="back"),
|
|
542
587
|
]
|
|
@@ -545,6 +590,9 @@ def flow_manage_users(admin: ClickHouseAdmin) -> None:
|
|
|
545
590
|
)
|
|
546
591
|
if action == "back":
|
|
547
592
|
return
|
|
593
|
+
if action == "edit":
|
|
594
|
+
flow_edit_grants(admin, target)
|
|
595
|
+
return
|
|
548
596
|
|
|
549
597
|
preview = {
|
|
550
598
|
"deactivate": build_deactivate_user_sql(target),
|
{clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/sql_builder.py
RENAMED
|
@@ -114,3 +114,16 @@ def build_drop_user_sql(username: str, if_exists: bool = True) -> str:
|
|
|
114
114
|
"""Exclui o usuário em definitivo."""
|
|
115
115
|
ine = "IF EXISTS " if if_exists else ""
|
|
116
116
|
return f"DROP USER {ine}{escape_ident(username)}"
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def build_revoke_all_sql(username: str) -> str:
|
|
120
|
+
"""Remove todos os privilégios em todos os escopos (zera antes de reaplicar)."""
|
|
121
|
+
return f"REVOKE ALL ON *.* FROM {escape_ident(username)}"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def build_edit_grants_statements(
|
|
125
|
+
username: str, privileges: list[str], scopes: list[GrantScope], grant_option: bool = False
|
|
126
|
+
) -> list[str]:
|
|
127
|
+
"""Edição de acessos: REVOKE ALL + GRANTs novos (com preview + confirmação no CLI)."""
|
|
128
|
+
spec = UserSpec(username=username, password="", privileges=privileges, scopes=scopes, grant_option=grant_option)
|
|
129
|
+
return [build_revoke_all_sql(username), *build_grant_sql(spec)]
|
{clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clickhouse-users-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Keywords: clickhouse,cli,users,access-control,least-privilege
|
|
@@ -76,6 +76,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
|
|
|
76
76
|
|
|
77
77
|
- **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
|
|
78
78
|
- **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
|
|
79
|
+
- **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
|
|
79
80
|
- **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
|
|
80
81
|
- **Reativar** → `ALTER USER \`nome\` HOST ANY`;
|
|
81
82
|
- **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/validators.py
RENAMED
|
File without changes
|
{clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/requires.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|