Compare commits
	
		
			No commits in common. "28c95aab40158fd6ae1d389ec296c80974f4a262" and "0d850c8e65281add0bba0ff58bc8ab8c435c83f5" have entirely different histories.
		
	
	
		
			28c95aab40
			...
			0d850c8e65
		
	
		
					 7 changed files with 420 additions and 489 deletions
				
			
		
							
								
								
									
										33
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								README.md
									
									
									
									
									
								
							|  | @ -67,8 +67,6 @@ 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 | ||||||
| 
 | 
 | ||||||
|  | @ -188,37 +186,6 @@ 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: | ||||||
|  |  | ||||||
|  | @ -1,250 +0,0 @@ | ||||||
| #!/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
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								bin/fj_login.sh
									
									
									
									
									
								
							|  | @ -1,185 +0,0 @@ | ||||||
| #!/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 "$@" |  | ||||||
							
								
								
									
										245
									
								
								bin/forgejo_project.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										245
									
								
								bin/forgejo_project.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,245 @@ | ||||||
|  | #!/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 | ||||||
|  | @ -30,7 +30,6 @@ 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")" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -290,3 +290,178 @@ 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -40,23 +40,3 @@ 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." |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue