{"id":50697971,"url":"https://github.com/hacklabr/kbtool","last_synced_at":"2026-06-09T07:35:36.290Z","repository":{"id":357160093,"uuid":"1230215713","full_name":"hacklabr/kbtool","owner":"hacklabr","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-11T14:55:10.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T16:40:38.012Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hacklabr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-05T19:39:05.000Z","updated_at":"2026-05-11T15:07:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hacklabr/kbtool","commit_stats":null,"previous_names":["hacklabr/kbtool"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/hacklabr/kbtool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fkbtool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fkbtool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fkbtool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fkbtool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hacklabr","download_url":"https://codeload.github.com/hacklabr/kbtool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hacklabr%2Fkbtool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34096952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-09T07:35:35.747Z","updated_at":"2026-06-09T07:35:36.284Z","avatar_url":"https://github.com/hacklabr.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kbtool\n\nSimplificador de operações com kubectl — gerenciamento de kubeconfigs, autodescoberta de pods, cópia de arquivos em chunks, dumps de banco de dados e terminais com prompt colorido.\n\n## Instalação\n\n```bash\n# Copiar para algum diretório no PATH\nsudo cp kbtool /usr/local/bin/kbtool\nsudo chmod +x /usr/local/bin/kbtool\n\n# Ou via symlink\nln -s $(pwd)/kbtool ~/bin/kbtool\n```\n\n### Autocomplete\n\n**Bash:**\n\n```bash\necho 'source /caminho/para/kbtool-completion.bash' \u003e\u003e ~/.bashrc\n```\n\n**Zsh:**\n\n```bash\necho 'autoload -U +X bashcompinit \u0026\u0026 bashcompinit' \u003e\u003e ~/.zshrc\necho 'source /caminho/para/kbtool-completion.bash' \u003e\u003e ~/.zshrc\n```\n\n## Gerenciamento de Clusters\n\nOs kubeconfigs são salvos em `~/.config/kbtool/clusters/\u003cslug\u003e.yaml`. O cluster ativo é por sessão de terminal (cada terminal pode usar um cluster diferente).\n\n### Comandos\n\n| Comando | Descrição |\n|---------|-----------|\n| `cluster add \u003cslug\u003e` | Adiciona kubeconfig interativamente |\n| `cluster rm \u003cslug\u003e` | Remove kubeconfig (pede confirmação) |\n| `cluster update \u003cslug\u003e` | Atualiza kubeconfig interativamente |\n| `cluster list` | Lista clusters cadastrados (`*` = ativo) |\n| `use \u003cslug\u003e` | Ativa cluster na sessão atual |\n| `use` | Mostra cluster ativo na sessão atual |\n\n### Fluxo\n\n```bash\n# 1. Adicionar cluster (pede para colar o kubeconfig)\nkbtool cluster add production\n# Paste the kubeconfig content, then press Ctrl-D to finish:\n\u003ccolar conteúdo do kubeconfig\u003e\n^D\n✓ Cluster 'production' added successfully\n\n# 2. Ativar cluster na sessão\nkbtool use production\n✓ Now using cluster: production\n\n# 3. Usar comandos normalmente\nkbtool bash production api\nkbtool pgdump production db ./dump.sql\n\n# 4. Trocar de cluster em outro terminal\nkbtool use staging\n\n# 5. Listar clusters\nkbtool cluster list\n  * production\n    staging\n\n# 6. Atualizar kubeconfig\nkbtool cluster update production\n\n# 7. Remover cluster\nkbtool cluster rm production\nRemove cluster 'production'? [y/N] y\n✓ Cluster 'production' removed\n```\n\n### Validação\n\nAo colar o kubeconfig, o kbtool verifica automaticamente se contém `apiVersion` e `kind: Config`. Conteúdo inválido é rejeitado.\n\n### Armazenamento\n\n| Caminho | Descrição |\n|---------|-----------|\n| `~/.config/kbtool/clusters/*.yaml` | Kubeconfigs salvos (chmod 600) |\n| `/tmp/kbtool_active_\u003ctty\u003e` | Cluster ativo por sessão de terminal |\n\n## Comandos de Pod\n\n```\nkbtool \u003ccomando\u003e \u003cnamespace\u003e [args...]\n```\n\n| Comando | Descrição |\n|---------|-----------|\n| `cp \u003cns\u003e \u003csrc\u003e \u003cdst\u003e` | Copia arquivos entre pod e local |\n| `bash \u003cns\u003e \u003cpod\u003e` | Shell interativo no pod |\n| `mariadb \u003cns\u003e \u003cpod\u003e` | Console MariaDB |\n| `mysql \u003cns\u003e \u003cpod\u003e` | Console MySQL |\n| `psql \u003cns\u003e \u003cpod\u003e` | Console PostgreSQL |\n| `pgdump \u003cns\u003e \u003cpod\u003e \u003coutput\u003e` | Dump PostgreSQL |\n| `mariadb_dump \u003cns\u003e \u003cpod\u003e \u003coutput\u003e` | Dump MariaDB |\n| `mysql_dump \u003cns\u003e \u003cpod\u003e \u003coutput\u003e` | Dump MySQL |\n\n### Autodescoberta de Pods\n\nNão é preciso digitar o nome completo do pod — basta um substring:\n\n```bash\nkbtool bash production api        # encontra \"api-deployment-7b8f9c-x2k4j\"\nkbtool mysql staging db           # encontra \"mysql-5dcdf866d5-xv62j\"\n```\n\n- **1 match** → usa automaticamente\n- **Múltiplos matches** → lista e pede seleção interativa\n- **0 matches** → mostra pods disponíveis\n\nSe o pod tiver múltiplos containers, também será pedido para escolher.\n\n### Copiar Arquivos\n\nTransferência em chunks com validação de tamanho, retry automático e barra de progresso com ETA:\n\n```bash\n# Download (remoto → local)\nkbtool cp production api:/var/log/app.log ./app.log\n\n# Upload (local → remoto)\nkbtool cp production ./config.yaml api:/app/config.yaml\n```\n\n### Shell Interativo\n\nPrompt colorido com namespace (amarelo) e pod (verde) em vermelho:\n\n```bash\nkbtool bash production api\n# [production:api-7b8f9c-x2k4j] /app #\n```\n\n### Consoles de Banco de Dados\n\nCredenciais lidas automaticamente das variáveis de ambiente do container (`MYSQL_USER`, `MYSQL_PASSWORD`, `POSTGRES_USER`, etc.). Prompt colorido igual ao bash:\n\n```bash\nkbtool mariadb production db\nkbtool mysql production db\nkbtool psql production db\n```\n\n### Dumps de Banco de Dados\n\nO dump é feito em 3 etapas para evitar o erro `unexpected EOF` do `kubectl cp`:\n\n1. Dump + compressão (gzip) no pod\n2. Transferência em chunks com validação e retry\n3. Remontagem local\n\nO formato de saída depende da extensão:\n\n```bash\n# .sql → descompactado\nkbtool pgdump production db ./dump.sql\n\n# .gz → mantém compactado\nkbtool mariadb_dump production db ./dump.sql.gz\n```\n\n## Configuração\n\n### Valores Padrão\n\nPersistido em `~/.config/kbtool/config`:\n\n```bash\n# Ver config atual\nkbtool config\n\n# Alterar padrões\nkbtool config chunk-size=10M\nkbtool config retries=25\n\n# Ambos de uma vez\nkbtool config chunk-size=10M retries=25\n```\n\n### Prioridade\n\n```\nCLI flags (--chunk-size=10M) \u003e config file \u003e env vars \u003e defaults (3M / 20)\n```\n\n| Opção | Env var | Default | Descrição |\n|-------|---------|---------|-----------|\n| `--chunk-size=SIZE` | `KBTOOL_CHUNK_SIZE` | `3M` | Tamanho dos chunks para transferência |\n| `--retries=N` | `KBTOOL_RETRIES` | `20` | Tentativas por chunk em caso de falha |\n\nAs opções CLI podem ser passadas em qualquer posição:\n\n```bash\nkbtool cp --chunk-size=1M production api:/big.sql ./big.sql\nkbtool pgdump --retries=5 --chunk-size=5M production db ./dump.sql\n```\n\nOu via variável de ambiente:\n\n```bash\nKBTOOL_CHUNK_SIZE=1M kbtool cp production api:/big.sql ./big.sql\n```\n\n## Requisitos\n\n- `kubectl` configurado e com acesso ao cluster\n- Bash 3.2+\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhacklabr%2Fkbtool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhacklabr%2Fkbtool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhacklabr%2Fkbtool/lists"}