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