Compare commits

...

41 commits

Author SHA1 Message Date
28c95aab40
[DOCS] Actualizar README para incluir el nuevo script fj_login.sh
- Añadir fj_login.sh a la tabla de herramientas para control de versiones
- Crear sección detallada sobre autenticación con Forgejo usando token encriptado
- Incluir ejemplos de uso para login y logout
- Describir las características principales y ventajas del script
- Mantener organización coherente con el resto de la documentación

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 17:54:34 -05:00
5b0082986f
[REMOVED] Eliminar completamente funcionalidad de alias en fj_login.sh
- Quitar funciones create_fj_alias() y remove_fj_alias()
- Eliminar llamadas a esas funciones desde login y logout
- Reemplazar con comentarios explicativos
- Simplificar el script para enfocarse solo en la gestión de tokens y autenticación

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 15:20:38 -05:00
e7321158d0
[IMPROVED] Simplificar manejo de alias 'fj' en fj_login.sh
- Volver a usar alias en memoria (más simple y directo)
- Eliminar creación de enlaces simbólicos complejos
- Reducir los mensajes y aclaraciones innecesarias
- Mantener la funcionalidad esencial con implementación mínima

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 15:19:03 -05:00
962344cd99
[FIXED] Corregir error 401 durante el logout en fj_login.sh
- Configurar BERG_BASE_URL antes de intentar el logout
- Verificar si existe una sesión activa antes de intentar cerrarla
- Suprimir errores de logout y continuar incluso si hay fallo
- Manejar graciosamente el caso de sesión no existente
- Eliminar mensajes de error y código de salida para mayor robustez

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 15:09:08 -05:00
fdf6f6fb49
[FIXED] Corregir problema con el comando 'fj' en fj_login.sh
- Cambiar de script wrapper a enlace simbólico a berg
- Detectar la ubicación real de berg usando 'which' para crear el enlace
- Intentar crear enlace global en el mismo directorio que berg si hay permisos
- Crear enlace alternativo en ~/.local/bin y actualizar PATH cuando sea necesario
- Implementar eliminación adecuada del enlace en ambas ubicaciones
- Solucionar el error "fj: no se encontró la orden" por problemas de PATH

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 15:08:21 -05:00
081cf5c5b7
[FIXED] Corregir problema con el comando 'fj' en fj_login.sh
- Cambiar de alias en memoria a script wrapper en ~/.local/bin
- Crear un ejecutable 'fj' que invoca a 'berg' con los mismos argumentos
- Verificar si ~/.local/bin está en PATH y mostrar instrucciones si no lo está
- Implementar limpieza del script al usar --logout
- Solucionar el problema "fj: no se encontró la orden" que ocurría con alias

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 15:06:56 -05:00
561a75eabb
[IMPROVED] Simplificar mensajes del alias 'fj' en fj_login.sh
- Reducir texto informativo sobre el alias para mayor concisión
- Minimizar la salida de las funciones create_fj_alias() y remove_fj_alias()
- Eliminar mensajes innecesarios sobre la sesión y persistencia
- Mantener la funcionalidad mientras se mejora la experiencia del usuario

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:52:45 -05:00
7ccc69df3e
[IMPROVED] Simplificar creación de alias 'fj' en memoria sin archivos persistentes
- Cambiar a un enfoque de alias en memoria para 'fj' en lugar de archivos en disco
- Usar comando 'alias' para crear el alias en la sesión actual de shell
- Eliminar alias con 'unalias' al cerrar sesión
- Simplificar el proceso de creación y eliminación del alias
- Mostrar instrucciones para hacer permanente el alias si el usuario lo desea

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:51:41 -05:00
af8758164b
[IMPROVED] Añadir alias 'fj' para berg en fj_login.sh
- Crear alias 'fj' que apunta a 'berg' al iniciar sesión
- Eliminar alias cuando se cierra sesión (--logout)
- Implementar funciones create_fj_alias() y remove_fj_alias()
- Usar script de shell y enlaces simbólicos para crear el alias
- Manejar diferentes ubicaciones según permisos (/usr/local/bin o ~/.local/bin)
- Proporcionar instrucciones para añadir ~/.local/bin al PATH si es necesario

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:49:20 -05:00
1cbb1e0b3a
[FIXED] Quitar protocolo https:// de la URL base en fj_login.sh
- Modificar la función get_forgejo_url() para devolver solo el dominio sin protocolo
- Eliminar la adición del protocolo https:// que era innecesaria
- Ajustar para cumplir con el requisito de usar solo el dominio para BERG_BASE_URL

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:46:20 -05:00
6891342483
[IMPROVED] Añadir detección automática de URL de Forgejo en fj_login.sh
- Agregar función get_forgejo_url() para extraer URL de configuración git
- Configurar automáticamente BERG_BASE_URL antes de la autenticación
- Buscar en múltiples ubicaciones: configuración global, directorio actual y repos del HOME
- Extraer el dominio base de diferentes formatos de URL (https://, git@, etc.)
- Mejorar mensajes informativos sobre la URL del servidor utilizada

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:44:03 -05:00
6ec3519bce
[ADDED] Script fj_login.sh para autenticación con Forgejo usando tokens encriptados
- Crear script para gestionar la autenticación con Forgejo/Codeberg
- Implementar parámetros --login (default) y --logout para iniciar/cerrar sesión
- Desencriptar el token almacenado en forgejo.sops.yaml usando SOPS
- Decodificar el token desde base64 y usarlo para autenticación
- Integrar con berg (CLI de Forgejo) para la autenticación segura
- Verificar requisitos (berg, SOPS) antes de proceder
- Usar DEVELOPER_DIR de base.lib para la ubicación estándar del token

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 14:23:09 -05:00
a046979fcc
[DOCS] Actualizar README para incluir el nuevo script cversadm_token.sh
- Añadir cversadm_token.sh a la tabla de herramientas para control de versiones
- Agregar una sección detallada sobre gestión de tokens para control de versiones
- Incluir descripción de características y funcionalidades del nuevo script
- Mantener consistencia con el formato de documentación existente

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:53:12 -05:00
e4a9864b6c
[IMPROVED] Estandarizar uso de DEVELOPER_DIR en cversadm_token.sh y base.lib
- Añadir variable global DEVELOPER_DIR=${HOME}/.developer a base.lib
- Eliminar definición redundante en cversadm_token.sh y usar la variable global
- Actualizar todas las referencias a la variable en las funciones del script
- Centralizar definición de la ruta para uso consistente en todo el proyecto

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:50:47 -05:00
ac6f91b048
[FIXED] Corregir ruta de carpeta en cversadm_token.sh de .developers a .developer
- Cambiar DEVELOPERS_DIR de "$HOME/.developers" a "$HOME/.developer"
- Actualizar comentarios para reflejar el cambio de ruta
- Mantener consistencia con el uso estándar de la carpeta .developer

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:46:59 -05:00
c4b8bfa639
[FIXED] Corregir problema con el diálogo de token en cversadm_token.sh
- Reemplazar dialog_input_pass por llamada directa a dialog para mejor compatibilidad
- Usar --stdout para capturar correctamente la entrada del usuario
- Mejorar formato del cuadro de diálogo con dimensiones apropiadas (8x60)
- Mantener validaciones mientras se soluciona el problema de entrada en blanco

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:44:15 -05:00
fdc8d6b826
[IMPROVED] Mejorar manejo de tokens en cversadm_token.sh siguiendo el ejemplo de cortana_token.sh
- Implementar validación completa de tokens (longitud, formato, caracteres especiales)
- Encriptar tokens en base64 antes de guardarlos con SOPS
- Usar nombre de archivo temporal único con $$ para prevenir colisiones
- Añadir comprobaciones de seguridad adicionales para tokens
- Mover todos los mensajes de validación a developers.es

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:41:23 -05:00
4a1933cc8b
[IMPROVED] Usar mensajes en developers.es para errores de SOPS en cversadm_token.sh
- Mover mensajes de error de SOPS a developers.es (cvmsg_013 y cvmsg_014)
- Modificar check_sops_installed para usar las variables de mensajes
- Mantener todos los mensajes en el archivo de idioma para facilitar localización
- Seguir la política de que todos los mensajes deben estar en developers.es

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:37:00 -05:00
c9114350ed
[IMPROVED] Mostrar error de SOPS no instalado usando dialog en cversadm_token.sh
- Modificar check_sops_installed() para usar dialog en lugar de echo
- Usar dialog_error_box para mostrar mensajes de error en la interfaz gráfica
- Mejorar mensaje de error con instrucciones sobre cómo instalar SOPS
- Mantener consistencia con el estilo de interfaz del resto del script

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:35:52 -05:00
c38237b19f
[IMPROVED] Añadir verificación de la instalación de dialog en cversadm_token.sh
- Implementar política general persistente: verificar que dialog esté instalado
- Añadir función check_dialog_installed() para validar la disponibilidad de dialog
- Mostrar mensaje de error (head_001) si dialog no está instalado
- Agregar esta verificación como primer paso antes de ejecutar funciones de interfaz

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:34:59 -05:00
55029f38f5
[IMPROVED] Implementar detección de idioma del sistema en cversadm_token.sh
- Añadir detección automática del idioma del shell (BIN_LANG=${LANG:0:2})
- Cargar archivos de mensajes según el idioma del sistema
- Seguir política general persistente para todos los scripts bash del proyecto

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:32:00 -05:00
3027fffd61
[FIXED] Corregir definición del título en cversadm_token.sh
- Modificar la variable title para usar head_000 y head_002 en lugar de valor estático
- Asegurar consistencia con el diseño de otros scripts del sistema
- Utilizar las variables de mensajes estándar para el título

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:25:56 -05:00
4b4d478f57
[IMPROVED] Añadir espacio vertical adicional al menú en cversadm_token.sh
- Agregar 4 líneas en blanco al menú de selección de plataforma
- Aumentar el valor de la altura del menú de 5 a 9 líneas
- Mejorar la legibilidad y apariencia visual del menú

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:24:07 -05:00
8b8ea9f922
[IMPROVED] Usar archivo de configuración devspath.dat en cversadm_token.sh
- Obtener DEVSPATH desde bin/config/devspath.dat para determinar la ubicación correcta
- Usar "devs" como valor predeterminado si el archivo de configuración no existe
- Configurar BIN_HOME usando la ruta obtenida para mayor flexibilidad

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:22:48 -05:00
4e7500adca
[FIXED] Corregir varios errores en cversadm_token.sh
- Corregir ruta para cargar mensajes con load_messages
- Usar menu_actions en lugar de dialog_input_menu para mayor compatibilidad
- Añadir variables head_exit y head_key_end necesarias para menus
- Agregar inicialización de variables head_000 y head_002 para el título
- Incluir llamada a display_text_header para mostrar el encabezado

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:16:23 -05:00
3c4f9a8827
[FIXED] Corregir errores en cversadm_token.sh para mostrar correctamente el menú
- Añadir variable head_error necesaria para diálogos de error
- Aumentar tamaño de ventana del menú para evitar problemas de visualización
- Mejorar comentarios para mayor claridad

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:12:04 -05:00
41f786683b
[ADDED] Script cversadm_token.sh para gestión de tokens de control de versiones
- Implementa interfaz mediante dialog para seleccionar plataforma (Github, Gitlab, Forgejo)
- Solicita token mediante entrada segura (oculta)
- Encripta token con SOPS y lo guarda en ~/.developers/[plataforma].sops.yaml
- Añade mensajes en español en developers.es

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:09:26 -05:00
397569acbe
[REMOVED] Eliminar función de creación de proyectos Forgejo en developers.lib
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:02:10 -05:00
f47f2ac199
[REMOVED] Eliminar todas las referencias a versadm_token.sh del README.md
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 13:00:17 -05:00
48b4316c90
[REMOVED] Eliminar completamente versadm_token.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:58:52 -05:00
65da5c525b
[FIXED] Utilizar correctamente console.lib en script versadm_token.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:52:22 -05:00
bbd0cb2de0
[FIXED] Simplificar menú principal en versadm_token.sh para mostrar solo nombres de plataformas
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:44:47 -05:00
4471d9417a
[DOCS] Actualizar README para reflejar el nuevo script versadm_token.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:41:39 -05:00
1f8a8e41bc
[ADDED] Script versadm_token.sh para gestión completa de tokens de control de versiones
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:41:07 -05:00
baed6a1f64
[REMOVED] Eliminar script cversion_token.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:35:49 -05:00
c87444afa6
[IMPROVED] Añadir botón de Ayuda al diálogo de tokens con guías detalladas
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:31:48 -05:00
feed5c1089
[IMPROVED] Simplificar mensajes de solicitud de tokens en cversion_token.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:28:38 -05:00
92dd54059f
[IMPROVED] Refactorizado script como cversion_token.sh con enfoque simplificado
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:25:19 -05:00
b7be96d03c
[IMPROVED] Corregir título del menú en script version_cli.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:17:34 -05:00
19448bb5de
[DOCS] Actualización de README con información sobre el script version_cli.sh
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:15:38 -05:00
91c35c4706
[ADDED] Script gestor de CLIs de control de versiones con gestión de tokens
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-15 12:14:54 -05:00
7 changed files with 489 additions and 420 deletions

View file

@ -67,6 +67,8 @@ bin/update.sh
| `bin/ghcli_install.sh` | Instala GitHub CLI (gh) con soporte multiplataforma | | `bin/ghcli_install.sh` | Instala GitHub CLI (gh) con soporte multiplataforma |
| `bin/glcli_install.sh` | Instala GitLab CLI (glab) con múltiples métodos de instalación | | `bin/glcli_install.sh` | Instala GitLab CLI (glab) con múltiples métodos de instalación |
| `bin/fjcli_install.sh` | Instala Forgejo/Codeberg CLI vía Cargo | | `bin/fjcli_install.sh` | Instala Forgejo/Codeberg CLI vía Cargo |
| `bin/cversadm_token.sh` | Gestiona tokens de acceso para plataformas de control de versiones de forma segura |
| `bin/fj_login.sh` | Inicia/cierra sesión en Forgejo usando tokens encriptados con SOPS |
### Seguridad y Acceso ### Seguridad y Acceso
@ -186,6 +188,37 @@ El script instala la CLI mediante Cargo (el gestor de paquetes de Rust):
Para aprender a usar Codeberg CLI (compatible con Forgejo), consulta la [documentación en el repositorio de Codeberg CLI](https://codeberg.org/RobWalt/codeberg-cli). Para aprender a usar Codeberg CLI (compatible con Forgejo), consulta la [documentación en el repositorio de Codeberg CLI](https://codeberg.org/RobWalt/codeberg-cli).
#### Gestión de tokens para control de versiones
```bash
# Gestión segura de tokens de acceso
bin/cversadm_token.sh
```
Este script proporciona una interfaz para gestionar tokens de acceso para diferentes plataformas:
- Permite seleccionar entre Github, Gitlab y Forgejo
- Solicita y valida el token de forma segura
- Encripta el token con SOPS y lo almacena en ~/.developer
- Incluye verificación de formato y seguridad de tokens
- Gestiona automáticamente permisos para archivos de tokens
#### Autenticación con Forgejo usando token encriptado
```bash
# Iniciar sesión en Forgejo usando el token encriptado
bin/fj_login.sh
# Cerrar sesión de Forgejo
bin/fj_login.sh --logout
```
Este script facilita la autenticación con Forgejo/Codeberg CLI (berg):
- Utiliza el token almacenado y encriptado por cversadm_token.sh
- Desencripta automáticamente el token usando SOPS
- Detecta la URL de Forgejo basándose en la configuración de git
- Configura la variable BERG_BASE_URL con la URL detectada
- Proporciona opciones para login (por defecto) y logout
### Copias de Seguridad ### Copias de Seguridad
Para respaldar configuraciones importantes: Para respaldar configuraciones importantes:

250
bin/cversadm_token.sh Executable file
View file

@ -0,0 +1,250 @@
#!/bin/bash
#
# Script: cversadm_token.sh
# Description: Administrador de tokens para plataformas de control de versiones
# Modified: 2025/03/15
# [Author] Cortana Rosero One <cortana@rosero.one>
# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219)
#
# Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@roser.one>]
#
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Configuración inicial
# Usar DEVELOPER_DIR de base.lib
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then
DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat")
else
DEVSPATH="devs"
fi
BIN_HOME="$HOME/$DEVSPATH"
BIN_BASE="bin"
BIN_LIBS="lib"
BIN_MESG="msg"
# Definir variables necesarias para uso en funciones
head_error="ERROR"
head_exit="Salir"
head_key_end="END"
# Importar bibliotecas necesarias
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib"
# CHECK SHELL LANGUAGE
BIN_LANG=${LANG:0:2}
# Cargar mensajes en el idioma del sistema o español por defecto
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers"
# Variables globales
title="${head_000} ${head_002}"
apps_title="${cvmsg_000}"
# Función para verificar si SOPS está instalado
check_sops_installed() {
if ! command -v sops &> /dev/null; then
# Mostrar el error usando dialog con mensaje desde developers.es
dialog_error_box "${head_error}" "${cvmsg_013}. ${cvmsg_014}"
clear
exit 1
fi
}
# Función para asegurar que el directorio .developer existe
ensure_developers_dir() {
if [ ! -d "$DEVELOPER_DIR" ]; then
mkdir -p "$DEVELOPER_DIR"
chmod 700 "$DEVELOPER_DIR"
echo "${cvmsg_008} $DEVELOPER_DIR"
fi
}
# Función para seleccionar la plataforma de control de versiones usando menu_actions
select_platform() {
# Preparar opciones para menu_actions
local menu_options="1:${cvmsg_010}
2:${cvmsg_011}
3:${cvmsg_012}
"
# Usar menu_actions en lugar de dialog_input_menu
local selection=$(menu_actions "${cvmsg_002}" "$menu_options" 9)
# Verificar si hubo cancelación o error
if [ "$selection" = "${head_key_end}" ]; then
return 1
fi
# Interpretar la selección
case $selection in
1) echo "github" ;;
2) echo "gitlab" ;;
3) echo "forgejo" ;;
*) return 1 ;;
esac
return 0
}
# Función para solicitar y validar el token
request_token() {
local platform=$1
local platform_name=""
local token=""
case $platform in
"github") platform_name="${cvmsg_010}" ;;
"gitlab") platform_name="${cvmsg_011}" ;;
"forgejo") platform_name="${cvmsg_012}" ;;
esac
# Bucle para validación de token usando dialog directamente
while true; do
# Usar dialog directamente en lugar de dialog_input_pass
token=$(dialog --backtitle "$title" --stdout --title "${cvmsg_003}" \
--passwordbox "${cvmsg_004} $platform_name\n${cvmsg_005}" 8 60)
# Verificar si el usuario canceló
if [ $? -ne 0 ]; then
clear
return 1
fi
# Validar token
if [ -z "$token" ]; then
dialog --backtitle "$title" --title "${head_error}" --msgbox "${cvmsg_015}" 7 60
continue
fi
# Verificar longitud (debería tener al menos 30 caracteres)
if [ ${#token} -lt 30 ]; then
dialog --backtitle "$title" --title "${head_error}" --msgbox "${cvmsg_016}" 7 60
continue
fi
# Verificar formato (debería contener caracteres alfanuméricos y algunos especiales)
if ! [[ "$token" =~ ^[A-Za-z0-9\#\-\_\.]+$ ]]; then
dialog --backtitle "$title" --title "${head_warning}" --msgbox "${cvmsg_017}" 7 60
fi
# Token válido
break
done
echo "$token"
return 0
}
# Función para guardar el token encriptado con SOPS
save_token() {
local platform=$1
local token=$2
local filename="${DEVELOPER_DIR}/${platform}.sops.yaml"
local token_file="/tmp/vcs_token_$$"
# Convertir token a base64 para mayor seguridad
local token_base64=$(echo -n "$token" | base64)
# Crear archivo temporal con el token en base64
echo "token: $token_base64" > "$token_file"
# Encriptar el archivo con SOPS
sops --encrypt "$token_file" > "$filename"
local result=$?
# Eliminar archivo temporal
rm -f "$token_file"
# Establecer permisos adecuados (solo lectura para el propietario)
if [ $result -eq 0 ]; then
chmod 600 "$filename"
fi
return $result
}
# Verificar si dialog está instalado
check_dialog_installed() {
if ! command -v dialog &> /dev/null; then
echo "${head_001}"
exit 1
fi
}
# Función principal
main() {
# Verificar requisitos
check_dialog_installed
check_sops_installed
ensure_developers_dir
# Asegurar que head_000 y head_002 estén definidos para el título
if [ -z "$head_000" ] || [ -z "$head_002" ]; then
head_000="MRDevs"
head_002="Tools"
fi
# Mostrar título inicial
display_text_header
# Seleccionar plataforma
platform=$(select_platform)
if [ $? -ne 0 ]; then
clear
exit 0
fi
# Solicitar token
token=$(request_token "$platform")
if [ $? -ne 0 ]; then
clear
exit 0
fi
# Guardar token
save_token "$platform" "$token"
if [ $? -eq 0 ]; then
local platform_name=""
case $platform in
"github") platform_name="${cvmsg_010}" ;;
"gitlab") platform_name="${cvmsg_011}" ;;
"forgejo") platform_name="${cvmsg_012}" ;;
esac
dialog_error_box "${cvmsg_009}" "${cvmsg_006} $platform_name"
else
local platform_name=""
case $platform in
"github") platform_name="${cvmsg_010}" ;;
"gitlab") platform_name="${cvmsg_011}" ;;
"forgejo") platform_name="${cvmsg_012}" ;;
esac
dialog_error_box "${head_error}" "${cvmsg_007} $platform_name"
fi
clear
}
# Ejecutar función principal
main

185
bin/fj_login.sh Executable file
View file

@ -0,0 +1,185 @@
#!/bin/bash
#
# Script: fj_login.sh
# Description: Script para autenticación con Forgejo usando tokens encriptados
# Modified: 2025/03/15
# [Author] Cortana Rosero One <cortana@rosero.one>
# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219)
#
# Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@roser.one>]
#
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Configuración inicial
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then
DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat")
else
DEVSPATH="devs"
fi
BIN_HOME="$HOME/$DEVSPATH"
BIN_BASE="bin"
BIN_LIBS="lib"
BIN_MESG="msg"
# CHECK SHELL LANGUAGE
BIN_LANG=${LANG:0:2}
# Importar bibliotecas necesarias
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib"
# Cargar mensajes en el idioma del sistema o español por defecto
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
# Variables globales
title="${head_000} ${head_002}"
# Función para verificar si berg está instalado
check_berg_installed() {
if ! command -v berg &> /dev/null; then
echo "Error: berg (Forgejo CLI) no está instalado. Por favor, ejecute bin/fjcli_install.sh primero."
exit 1
fi
}
# Función para verificar si SOPS está instalado
check_sops_installed() {
if ! command -v sops &> /dev/null; then
echo "Error: SOPS no está instalado. Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias."
exit 1
fi
}
# Función para extraer la URL base de Forgejo de la configuración de git
get_forgejo_url() {
# Intentar obtener URL desde la configuración global de git
local remote_url=$(git config --get remote.origin.url 2>/dev/null)
# Si no se encuentra en la configuración global, intentar buscar en el directorio actual
if [ -z "$remote_url" ] && [ -d ".git" ]; then
remote_url=$(git config --get remote.origin.url 2>/dev/null)
fi
# Si aún no tenemos URL, intentar buscar en algún repositorio de $HOME
if [ -z "$remote_url" ]; then
# Buscar repositorios en $HOME que podrían tener remotes de Forgejo
for repo_dir in $(find $HOME -name ".git" -type d -maxdepth 3 2>/dev/null); do
local repo_path=$(dirname "$repo_dir")
cd "$repo_path"
local url=$(git config --get remote.origin.url 2>/dev/null)
if [[ "$url" == *"forgejo"* ]] || [[ "$url" == *"codeberg"* ]] || [[ "$url" == *"gitt.rosero"* ]]; then
remote_url="$url"
break
fi
done
fi
# Si encontramos una URL, extraer el dominio base
if [ -n "$remote_url" ]; then
# Eliminar protocolo (http:// o https://)
local base_url=$(echo "$remote_url" | sed -E 's|^(https?://)?([^/]+).*|\2|')
# Si el formato es usuario@dominio, extraer solo el dominio
if [[ "$base_url" == *"@"* ]]; then
base_url=$(echo "$base_url" | cut -d '@' -f2)
fi
# Devolver solo el dominio sin protocolo
echo "$base_url"
else
# Si no se encontró ninguna URL, devolver una cadena vacía
echo ""
fi
}
# Estas funciones han sido eliminadas, ya no se crean ni eliminan alias
# Los usuarios pueden crear su propio alias manualmente si lo desean
# Función para iniciar sesión con token
login() {
# Verificar que el archivo de token encriptado existe
if [ ! -f "${DEVELOPER_DIR}/forgejo.sops.yaml" ]; then
echo "Error: No se encontró el archivo de token para Forgejo."
echo "Por favor, ejecute bin/cversadm_token.sh para configurar el token primero."
exit 1
fi
# Decodificar el token de base64
local token=$(sops -d ${DEVELOPER_DIR}/forgejo.sops.yaml | grep -oP '(?<=token: ).*' | base64 -d)
# Obtener la URL base de Forgejo
local forgejo_url=$(get_forgejo_url)
if [ -n "$forgejo_url" ]; then
echo "Usando servidor Forgejo: $forgejo_url"
export BERG_BASE_URL="$forgejo_url"
else
echo "ADVERTENCIA: No se pudo detectar automáticamente la URL de Forgejo."
echo "Si la autenticación falla, establezca manualmente BERG_BASE_URL."
fi
# Iniciar sesión con berg
echo "Iniciando sesión en Forgejo..."
berg auth login -t "$token"
local login_status=$?
if [ $login_status -eq 0 ]; then
echo "Sesión iniciada correctamente en Forgejo."
else
echo "Error al iniciar sesión en Forgejo. Por favor, verifique su token."
exit 1
fi
}
# Función para cerrar sesión
logout() {
# Obtener la URL base de Forgejo
local forgejo_url=$(get_forgejo_url)
if [ -n "$forgejo_url" ]; then
echo "Usando servidor Forgejo: $forgejo_url"
export BERG_BASE_URL="$forgejo_url"
fi
# Ya no se eliminan alias
echo "Cerrando sesión de Forgejo..."
if ! berg auth status &>/dev/null; then
echo "No hay sesión activa en Forgejo."
else
berg auth logout -s 2>/dev/null || true
echo "Sesión cerrada."
fi
}
# Función principal
main() {
# Verificar requisitos
check_berg_installed
check_sops_installed
# Verificar parámetros
if [ "$1" = "--logout" ]; then
logout
else
login
fi
}
# Ejecutar función principal con los parámetros recibidos
main "$@"

View file

@ -1,245 +0,0 @@
#!/bin/bash
#
# Script: forgejo_project.sh
# Description: Crea un proyecto en Forgejo y configura el repositorio local
# Modified: 2025-03-13 14:20:00
# Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@rosero.one>]
#
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Directorios base
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DIR="$(dirname "$SCRIPT_DIR")"
CONFIG_DIR="$SCRIPT_DIR/config"
LIB_DIR="$SCRIPT_DIR/lib"
MSG_DIR="$SCRIPT_DIR/msg"
# Cargar libraries
source "$LIB_DIR/base.lib"
source "$LIB_DIR/console.lib"
source "$LIB_DIR/developers.lib"
source "$MSG_DIR/head.es"
# Función para mostrar ayuda
function show_help() {
echo "Uso: $0 [opciones]"
echo ""
echo "Crea un nuevo proyecto en Forgejo y opcionalmente lo vincula con un repositorio local."
echo ""
echo "Opciones:"
echo " -n, --name NOMBRE Nombre del proyecto (obligatorio)"
echo " -d, --desc DESCRIPCION Descripción del proyecto (obligatorio)"
echo " -p, --path RUTA Ruta local del proyecto (opcional)"
echo " -v, --visibility TIPO Visibilidad: 'public' o 'private' (por defecto: private)"
echo " -h, --help Muestra esta ayuda"
echo ""
echo "Ejemplos:"
echo " $0 --name mi-proyecto --desc \"Mi nuevo proyecto\" --visibility public"
echo " $0 -n mi-proyecto -d \"Mi nuevo proyecto\" -p /ruta/al/proyecto"
}
# Variables para los argumentos
PROJECT_NAME=""
PROJECT_DESC=""
PROJECT_PATH=""
VISIBILITY="private"
# Procesar argumentos
while [[ $# -gt 0 ]]; do
case $1 in
-n|--name)
PROJECT_NAME="$2"
shift 2
;;
-d|--desc)
PROJECT_DESC="$2"
shift 2
;;
-p|--path)
PROJECT_PATH="$2"
shift 2
;;
-v|--visibility)
VISIBILITY="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Error: Opción desconocida $1"
show_help
exit 1
;;
esac
done
# Verificar argumentos obligatorios
if [ -z "$PROJECT_NAME" ]; then
echo "Error: Debe especificar un nombre de proyecto con --name"
show_help
exit 1
fi
if [ -z "$PROJECT_DESC" ]; then
echo "Error: Debe especificar una descripción de proyecto con --desc"
show_help
exit 1
fi
# Verificar ruta del proyecto si se proporciona
if [ -n "$PROJECT_PATH" ] && [ ! -d "$PROJECT_PATH" ]; then
echo "Error: La ruta del proyecto especificada no existe: $PROJECT_PATH"
exit 1
fi
# Validar visibilidad
if [ "$VISIBILITY" != "private" ] && [ "$VISIBILITY" != "public" ]; then
echo "Advertencia: Valor de visibilidad inválido. Usando 'private' por defecto."
VISIBILITY="private"
fi
# Mostrar confirmación
echo "Creando proyecto en Forgejo:"
echo " Nombre: $PROJECT_NAME"
echo " Descripción: $PROJECT_DESC"
echo " Visibilidad: $VISIBILITY"
if [ -n "$PROJECT_PATH" ]; then
echo " Ruta local: $PROJECT_PATH"
fi
echo ""
# Preguntar confirmación
read -p "¿Desea continuar? (s/n): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then
echo "Operación cancelada."
exit 0
fi
# Crear el proyecto en Forgejo
forgejo_create_project "$PROJECT_NAME" "$PROJECT_DESC" "$VISIBILITY" "$PROJECT_PATH"
RESULT=$?
# Manejar resultado
case $RESULT in
0)
echo "Proyecto creado exitosamente en Forgejo."
if [ -f "$HOME/.developer/${PROJECT_NAME}.repo" ]; then
REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo")
if [ -n "$PROJECT_PATH" ]; then
echo "El repositorio local ha sido configurado y enlazado con Forgejo."
echo "URL del repositorio: $REPO_URL"
else
echo "URL del repositorio: $REPO_URL"
echo "Para clonar el repositorio:"
echo " git clone $REPO_URL"
fi
else
echo "AVISO: No se pudo obtener la URL del repositorio."
fi
;;
10)
echo "Error: Faltan parámetros obligatorios."
;;
11)
echo "Error: No se pudo configurar el acceso a Forgejo."
echo "Ejecute este script en modo interactivo para configurar su token de acceso."
;;
12)
echo "Error: Token de Forgejo no disponible o inválido."
echo "Por favor, verifique o actualice su token en: $FORGEJO_CONFIG_FILE"
# Verificar mensaje de error
if [ -f "$HOME/.developer/${PROJECT_NAME}.error" ]; then
echo "Detalles del error:"
cat "$HOME/.developer/${PROJECT_NAME}.error"
fi
echo ""
echo "Para generar un nuevo token en Forgejo:"
FORGEJO_BASE_URL=$(echo "$FORGEJO_API_URL" | sed -E 's|/api/v1||')
echo "1. Inicie sesión en $FORGEJO_BASE_URL"
echo "2. Vaya a Configuración → Aplicaciones"
echo "3. Genere un nuevo token de acceso personal"
echo "4. Asegúrese de darle permisos de lectura/escritura para repositorios"
;;
13)
echo "Error: No se pudo crear el proyecto en Forgejo."
echo "Comprobando posibles problemas:"
# Verificar configuración
if [ -f "$FORGEJO_CONFIG_FILE" ]; then
echo "✓ Archivo de configuración encontrado en: $FORGEJO_CONFIG_FILE"
echo "✓ Verificando token..."
# No mostramos el token por seguridad, solo si existe
grep -q "FORGEJO_TOKEN=" "$FORGEJO_CONFIG_FILE" && echo " ✓ Token encontrado" || echo " ✗ Token no encontrado"
else
echo "✗ Archivo de configuración no encontrado"
fi
# Verificar conectividad
echo "✓ Probando conectividad con Forgejo..."
FORGEJO_HOST=$(echo "$FORGEJO_API_URL" | sed -E 's|https?://([^/]+)/.*|\1|')
if ping -c 1 -W 2 "$FORGEJO_HOST" > /dev/null 2>&1; then
echo " ✓ Conectividad básica OK"
echo " Comprobando servicio en puerto 443..."
# Verificar puertos web abiertos (HTTP y HTTPS)
if nc -z -w 2 "$FORGEJO_HOST" 80 2>/dev/null; then
echo " ✓ Puerto 80 (HTTP) accesible"
echo " Intentando conexión HTTP..."
CURL_OUTPUT=$(mktemp)
curl -s -v -o "$CURL_OUTPUT" --connect-timeout 5 "http://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error"
cat "$CURL_OUTPUT" 2>/dev/null | head -10
rm -f "$CURL_OUTPUT" 2>/dev/null
fi
if nc -z -w 2 "$FORGEJO_HOST" 443 2>/dev/null; then
echo " ✓ Puerto 443 (HTTPS) accesible"
echo " Intentando conexión HTTPS segura..."
CURL_OUTPUT=$(mktemp)
curl -s -v -o "$CURL_OUTPUT" --connect-timeout 5 "https://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error"
echo " Intentando conexión HTTPS ignorando certificado..."
curl -s -v -k -o "$CURL_OUTPUT" --connect-timeout 5 "https://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error"
cat "$CURL_OUTPUT" 2>/dev/null | head -10
rm -f "$CURL_OUTPUT" 2>/dev/null
else
echo " ✗ Puerto 443 (HTTPS) no accesible"
fi
else
echo " ✗ No se puede conectar con el servidor $FORGEJO_HOST"
echo " Comprobando posible problema de DNS..."
host "$FORGEJO_HOST" 2>/dev/null && echo " ✓ Resolución DNS OK" || echo " ✗ Problema de resolución DNS"
fi
# Verificar errores de curl
if [ -f "/tmp/curl_error.log" ]; then
echo "✓ Detalles de la solicitud:"
cat /tmp/curl_error.log
fi
# Verificar mensaje de error
if [ -f "$HOME/.developer/${PROJECT_NAME}.error" ]; then
echo "✓ Respuesta de error del servidor:"
cat "$HOME/.developer/${PROJECT_NAME}.error"
else
echo "✗ No se guardó respuesta de error"
fi
;;
*)
echo "Error desconocido (código $RESULT)."
;;
esac
exit $RESULT

View file

@ -30,6 +30,7 @@ BIN_MESG=${BIN_MESG:=${BIN_BASE}/msg}
BIN_LIBS=${BIN_LIBS:=${BIN_BASE}/lib} BIN_LIBS=${BIN_LIBS:=${BIN_BASE}/lib}
DEVS_NAME=${CONFPATH}/project.head DEVS_NAME=${CONFPATH}/project.head
GIT_IGNORE=.gitignore GIT_IGNORE=.gitignore
DEVELOPER_DIR=${HOME}/.developer
DATENOW="$(date +"%Y-%m-%d %H:%M:%S")" DATENOW="$(date +"%Y-%m-%d %H:%M:%S")"
DATEBAK="$(date +"%Y%m%d%H%M%S")" DATEBAK="$(date +"%Y%m%d%H%M%S")"

View file

@ -290,178 +290,3 @@ function developer_restore() {
} }
# Función para crear un proyecto Git en Forgejo
# $1: nombre del proyecto
# $2: descripción del proyecto
# $3: tipo de visibilidad (private/public) [por defecto: private]
# $4: ruta local del proyecto (opcional)
# Return: 0 si se crea correctamente, otro valor en caso de error
local PROJECT_NAME=$1
local PROJECT_DESC=$2
local VISIBILITY=${3:-private} # Por defecto private si no se especifica
local PROJECT_PATH=$4
# Verificar parámetros obligatorios
if [ -z "$PROJECT_NAME" ] || [ -z "$PROJECT_DESC" ]; then
return 10 # Error: faltan parámetros obligatorios
fi
# Verificar que el archivo de configuración de Forgejo existe
if [ ! -f "$FORGEJO_CONFIG_FILE" ]; then
mkdir -p "$(dirname "$FORGEJO_CONFIG_FILE")"
# Si el archivo no existe, preguntar por token
if [ -t 0 ]; then # Solo si es terminal interactiva
echo "Archivo de configuración de Forgejo no encontrado."
echo ""
echo "Para generar un token en Forgejo:"
local FORGEJO_BASE_URL=$(echo "$FORGEJO_API_URL" | sed -E 's|/api/v1||')
echo "1. Inicie sesión en $FORGEJO_BASE_URL"
echo "2. Vaya a Configuración → Aplicaciones"
echo "3. Genere un nuevo token de acceso personal con permisos de 'repo'"
echo ""
read -p "Ingrese su token de acceso de Forgejo: " FORGEJO_TOKEN
echo "FORGEJO_TOKEN=$FORGEJO_TOKEN" > "$FORGEJO_CONFIG_FILE"
chmod 600 "$FORGEJO_CONFIG_FILE" # Restricción de permisos por seguridad
else
return 11 # Error: no existe configuración y no es interactivo
fi
fi
# Cargar token de Forgejo
source "$FORGEJO_CONFIG_FILE"
if [ -z "$FORGEJO_TOKEN" ]; then
return 12 # Error: token no disponible
fi
# Verificar visibilidad válida
if [ "$VISIBILITY" != "private" ] && [ "$VISIBILITY" != "public" ]; then
VISIBILITY="private" # Establecer valor por defecto si es inválido
fi
# Preparar datos para la API
local API_DATA="{\"name\":\"$PROJECT_NAME\",\"description\":\"$PROJECT_DESC\",\"private\":$([ "$VISIBILITY" == "private" ] && echo "true" || echo "false")}"
# Comprobar si podemos acceder a la API - Con timeout y manejo de errores de conexión
echo "DEBUG: Verificando acceso a la API en: $FORGEJO_API_URL/version" >&2
# Verificar primero el host base
local BASE_URL=$(echo "$FORGEJO_API_URL" | sed -E 's|https?://([^/]+)/.*|\1|')
if ! ping -c 1 -W 2 "$BASE_URL" >/dev/null 2>&1; then
echo "ERROR: No se puede alcanzar el servidor $BASE_URL" >&2
echo "{\"error\":\"No se puede conectar con el servidor $BASE_URL. Verifique su conexión y la URL.\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
return 13
fi
echo "DEBUG: Verificando puertos alternativos..." >&2
# Prueba conexión HTTP puerto 80 primero
if nc -z -w 2 "$BASE_URL" 80 2>/dev/null; then
echo "DEBUG: Puerto 80 (HTTP) accesible" >&2
# Intenta versión HTTP explícitamente
local HTTP_API_URL=$(echo "$FORGEJO_API_URL" | sed 's|^https://|http://|')
local API_RESPONSE=$(curl -s -v --connect-timeout 5 --max-time 10 "$HTTP_API_URL/version" 2>/tmp/curl_verbose.log || echo "")
if [ -n "$API_RESPONSE" ] && echo "$API_RESPONSE" | grep -q "version"; then
echo "DEBUG: API accesible vía HTTP (puerto 80)" >&2
# Reemplazar URL por HTTP para el resto de la función
FORGEJO_API_URL="$HTTP_API_URL"
else
echo "ERROR: Servidor accesible pero la API no responde correctamente por HTTP" >&2
echo "{\"error\":\"Servidor accesible en puerto 80, pero la API no responde correctamente. Verifique la configuración del servidor.\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
cat /tmp/curl_verbose.log >> "$HOME/.developer/${PROJECT_NAME}.error" 2>/dev/null
return 13
fi
elif nc -z -w 2 "$BASE_URL" 443 2>/dev/null; then
echo "DEBUG: Puerto 443 (HTTPS) accesible, pero posibles problemas con certificado o API" >&2
# Intenta con HTTPS pero ignorando errores de certificado
local API_RESPONSE=$(curl -s -v -k --connect-timeout 5 --max-time 10 "$FORGEJO_API_URL/version" 2>/tmp/curl_verbose.log || echo "")
if [ -n "$API_RESPONSE" ] && echo "$API_RESPONSE" | grep -q "version"; then
echo "DEBUG: API accesible vía HTTPS inseguro (ignorando certificado)" >&2
# Continuar pero usando -k para ignorar certificados
export FORGEJO_CURL_OPTS="-k"
else
echo "ERROR: Servidor HTTPS accesible pero la API no responde correctamente" >&2
echo "{\"error\":\"Servidor accesible en puerto 443, pero la API no responde. Posibles problemas de certificado o configuración.\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
cat /tmp/curl_verbose.log >> "$HOME/.developer/${PROJECT_NAME}.error" 2>/dev/null
return 13
fi
else
echo "ERROR: No se puede acceder a los puertos HTTP (80) ni HTTPS (443) en $BASE_URL" >&2
echo "{\"error\":\"Servidor accesible por ping pero no responde en los puertos web (80/443).\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
return 13
fi
# Verificar token con timeout y manejo de errores
echo "DEBUG: Verificando token con API en: $FORGEJO_API_URL/user" >&2
local TOKEN_CHECK=$(curl ${FORGEJO_CURL_OPTS:-} -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 -H "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_API_URL/user" 2>/dev/null || echo "000")
if [ "$TOKEN_CHECK" != "200" ]; then
if [ "$TOKEN_CHECK" == "401" ]; then
echo "ERROR: Token inválido o sin permisos suficientes. Código: 401" >&2
echo "{\"error\":\"Token inválido o sin permisos suficientes. Genere un nuevo token con permisos 'repo'\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
elif [ "$TOKEN_CHECK" == "000" ]; then
echo "ERROR: No se pudo verificar el token. Error de conectividad" >&2
echo "{\"error\":\"No se pudo verificar el token. Error de conectividad con el servidor\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
else
echo "ERROR: Token inválido o sin acceso. Código: $TOKEN_CHECK" >&2
echo "{\"error\":\"Token inválido o sin acceso. Código: $TOKEN_CHECK\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
fi
return 12
fi
# Llamar a la API de Forgejo para crear el repositorio
echo "DEBUG: Enviando solicitud de creación de repositorio..." >&2
local API_RESPONSE=$(curl ${FORGEJO_CURL_OPTS:-} -s -X POST --connect-timeout 10 --max-time 30 "$FORGEJO_API_URL/user/repos" \
-H "Authorization: token $FORGEJO_TOKEN" \
-H "Content-Type: application/json" \
-d "$API_DATA" 2>/tmp/curl_error.log || echo '{"error":"Falló la comunicación con el servidor"}')
echo "DEBUG: Respuesta API: $API_RESPONSE" >&2
# Verificar respuesta
if echo "$API_RESPONSE" | grep -q "\"id\":[0-9]*"; then
local REPO_URL=$(echo "$API_RESPONSE" | grep -o '"clone_url":"[^"]*"' | cut -d'"' -f4)
if [ -n "$REPO_URL" ]; then
echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo"
else
# Extraer HTML URL como fallback
REPO_URL=$(echo "$API_RESPONSE" | grep -o '"html_url":"[^"]*"' | head -1 | cut -d'"' -f4)
if [ -n "$REPO_URL" ]; then
echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo"
else
echo "ERROR: No se pudo extraer la URL del repositorio." >&2
echo "$API_RESPONSE" > "$HOME/.developer/${PROJECT_NAME}.error"
return 14
fi
fi
# Si se proporcionó una ruta local, configurar el repositorio
if [ -n "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then
cd "$PROJECT_PATH"
# Verificar si ya es un repositorio git
if [ -d ".git" ]; then
# Añadir el remoto
git remote add origin "$REPO_URL"
git push -u origin main || git push -u origin master
else
# Inicializar el repositorio y hacer primer commit si no existe
git init
git add .
git commit -m "[INIT] Proyecto $PROJECT_NAME"
git remote add origin "$REPO_URL"
git push -u origin main
fi
fi
return 0 # Éxito
else
# Guardar mensaje de error
echo "$API_RESPONSE" > "$HOME/.developer/${PROJECT_NAME}.error"
return 13 # Error: falló la creación del repositorio
fi
}

View file

@ -40,3 +40,23 @@ dvmsg_105="Opciones:"
dvmsg_106=" --help Muestra este mensaje de ayuda." dvmsg_106=" --help Muestra este mensaje de ayuda."
dvmsg_107=" --version Muestra la versión del script." dvmsg_107=" --version Muestra la versión del script."
# Mensajes para cversadm_token.sh
cvmsg_000="ADMINISTRADOR DE TOKENS DE CONTROL DE VERSIONES"
cvmsg_001="Seleccione plataforma de control de versiones"
cvmsg_002="Elija la plataforma para la que desea configurar el token de acceso"
cvmsg_003="Token de acceso"
cvmsg_004="Introduzca el token de acceso personal para"
cvmsg_005="El token se utilizará para operaciones de autenticación"
cvmsg_006="Token guardado correctamente para"
cvmsg_007="Error al guardar el token para"
cvmsg_008="Carpeta de configuración creada:"
cvmsg_009="Seleccione una opción"
cvmsg_010="Github"
cvmsg_011="Gitlab"
cvmsg_012="Forgejo"
cvmsg_013="SOPS no está instalado"
cvmsg_014="Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias."
cvmsg_015="El token no puede estar vacío. Por favor ingrese un token válido."
cvmsg_016="El token parece ser demasiado corto. Verifique que haya copiado el token completo."
cvmsg_017="El token contiene caracteres no estándar. Verifique que sea correcto."