Compare commits
	
		
			41 commits
		
	
	
		
			0d850c8e65
			...
			28c95aab40
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 28c95aab40 | |||
| 5b0082986f | |||
| e7321158d0 | |||
| 962344cd99 | |||
| fdf6f6fb49 | |||
| 081cf5c5b7 | |||
| 561a75eabb | |||
| 7ccc69df3e | |||
| af8758164b | |||
| 1cbb1e0b3a | |||
| 6891342483 | |||
| 6ec3519bce | |||
| a046979fcc | |||
| e4a9864b6c | |||
| ac6f91b048 | |||
| c4b8bfa639 | |||
| fdc8d6b826 | |||
| 4a1933cc8b | |||
| c9114350ed | |||
| c38237b19f | |||
| 55029f38f5 | |||
| 3027fffd61 | |||
| 4b4d478f57 | |||
| 8b8ea9f922 | |||
| 4e7500adca | |||
| 3c4f9a8827 | |||
| 41f786683b | |||
| 397569acbe | |||
| f47f2ac199 | |||
| 48b4316c90 | |||
| 65da5c525b | |||
| bbd0cb2de0 | |||
| 4471d9417a | |||
| 1f8a8e41bc | |||
| baed6a1f64 | |||
| c87444afa6 | |||
| feed5c1089 | |||
| 92dd54059f | |||
| b7be96d03c | |||
| 19448bb5de | |||
| 91c35c4706 | 
					 7 changed files with 489 additions and 420 deletions
				
			
		
							
								
								
									
										33
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								README.md
									
									
									
									
									
								
							|  | @ -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
									
								
							
							
						
						
									
										250
									
								
								bin/cversadm_token.sh
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										185
									
								
								bin/fj_login.sh
									
									
									
									
									
										Executable 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 "$@" | ||||||
|  | @ -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 |  | ||||||
|  | @ -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")" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -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." | ||||||
|  | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue